Arduino farbige Fonts (ESP32)

1. Für jeden Buchstaben

1.1 Einzelnen Buchstaben markieren

1.2  Markierung Kopieren (Strg+C)

1.3 Einfügen als Neues Bild (Strg+Shift+V)

1.4 Bild auf Inhalt zuschneiden(Shortcut in den Settings vergeben)

2.5 Speichern als „A.xcf“ (Strg+S)

3. Installieren des Davids Batch Processor und erster Schritt

3.1 Input: Add all XCF Files

3.2 Output as BMP

3.3 Bilderordner öffnen und in der ansicht Breite und Höhe Spalten anzeigen lassen

3.4 Bilder nach Breite und Höhe sortieren und höchste wie breiteste Pixel aufschreiben.

3.5 Gegebenfalls einzelne sehr breite /Hohe Buchstaben nacheditieren (Zum Beispiel W)

4.1 Add BMPs from Folder in Batch Processor

4.2 Gehe zu Resize, Enable, absolute Centered with Padding Background Black

4.3 Resize zum höchsten und breitesten Pixeln

5. IrfanView Batch Renaming

5.1 Bilder zur Stapelverarbeitung hinzufügen  und nach P# umbenennen

6. Konvertiere Bilder zu Image.bin und array.h Datei

6.1 Dazu habe ich ein kleines Javatool entwickelt das PNummer.bmp durchnummerierte Bilder im gleichen Ordner als Image.bin / test.h byte array konvertiert.

Wahlweise RGB8,RGB565, RGB24

Zum testen benutze ich die langsame Methode über das Imagefile im SPIFF, für den schnellen Bilderaufbau grösser 25fps benutze ich das Byte Array .. ein Bild mit 480x320px*3Bytes benötigt 80ms via 40Mhz SPI. Bei Bildern mit zum Beispiel 100×90 Pixeln werden im update 100FPS erreicht.

Downloadlink TFT-Tool

TFT_ESPI Example Script ILI9488:

#include <Wire.h>
#include "RTClib.h"
#include "EEPROM.h"
#define EEPROM_SIZE 64
#include <TimeLib.h>
#include "FS.h"
#include "SPIFFS.h"
#include <TFT_eSPI.h>
#include <SPI.h>
//#include "test.h"
#include "esp_spi_flash.h"

TFT_eSPI tft = TFT_eSPI();

#define SPI2_NSS_PIN 28
static const int spiClk = 40000000; // 1 MHz
SPIClass * vspi = NULL;


unsigned long bgstart = 675000UL;
void setup() {
  Serial.begin(115200);
  if (!SPIFFS.begin(true)) {
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }
  btStop();


  vspi = new SPIClass(VSPI);
  vspi->begin();

  Serial.begin(115200);
  tft.begin();
  tft.setRotation(1);  // landscape

  tft.fillScreen(TFT_BLACK);
  //Background
  bigImage(702000, 702000, 0, 0, 480, 320, 0xFFFFFF);
  //void DrawString( uint32_t check, int x, int y, int width, int height, String text, bool compare, bool transp,int asciioffset)
  DrawString(  0  , 0, 0, 90, 100, "HELLO", false, false, 65);
  DrawString(  0  , 0, 100, 90, 100, "ITS", false, false, 65);
  DrawString(  0  , 0, 200, 90, 100, "FUN", false, false, 65);
}
void loop() {

}

void DrawString( uint32_t check, int x, int y, int width, int height, String text, bool compare, bool transp, uint32_t asciioffset) {
  int lengthl = text.length();
  for (int l = 0; l < lengthl; l++)
  {
    uint32_t charpos = ((uint32_t)((uint32_t)text.charAt(l) - (uint32_t)asciioffset) * (uint32_t)width * height * 3);

    //void transparentImage(uint32_t startpic, uint32_t startbackground, int x, int y, int width, int height, uint32_t tcolor)
    transparentImage( check + charpos, 702000, x + ( l * width), y, width, height, 0xFFFFFF);
    Serial.println(charpos);

  }
}

void transparentImage(uint32_t startpic, uint32_t startbackground, int x, int y, int width, int height, uint32_t tcolor) {
  tft.setWindow(x, y, x + width - 1, y + height - 1);
  //read background clipping
  File f = SPIFFS.open( "/test.bin", "r");
  char *buf = (char*)malloc(width * height * 3);
  char *temp = (char*)malloc(width * 3);
  unsigned long offset = 0;
  for (int i = 0; i < height; i++) {
    // unsigned long offset = startbackground + (x * width*3 - (width*3 - (width-y*3)) + (i * width * 3));
    unsigned long offsetbg = startbackground + ((y + i) * 480 * 3 ) + (x * 3) ;
    f.seek(offsetbg, SeekSet);
    f.readBytes((char*)temp, width * 3) ;
    memcpy( buf + (i * width * 3), temp, (width * 3) );

  }

  for (int i = 0; i < height; i++) {
    unsigned long offset = startpic + i * width * 3;
    f.seek(offset, SeekSet);
    f.readBytes((char*)temp, width * 3) ;
    for (int h = 0; h < width * 3; h = h + 3)
    {
      uint32_t bp = temp[ h];
      bp = (bp << 8) | temp[h + 1];
      bp = (bp << 16) | temp[ h + 2];
      if (bp >= 0x111111 || y + i > 300) {
        buf[width * i * 3 + h] = temp[h];
        buf[width * i * 3 + h + 1] = temp[h + 1];
        buf[width * i * 3 + h + 2] = temp[h + 2];
      }
    }
  }

  vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(5, LOW); //pull SS slow to prep other end for transfer
  vspi->writeBytes((uint8_t*)buf, width * height  * 3);
  digitalWrite(5, HIGH); //pull ss high to signify end of data transfer
  vspi->endTransaction();
  f.close();
  Serial.println("test");
  free(buf);
  free(temp);
}

void bigImage(uint32_t startpic, uint32_t startbackground, int x, int y, int width, int height, uint32_t tcolor) {
  tft.setWindow(x, y, x + width - 1, y + height - 1);
  //read background clipping
  File f = SPIFFS.open( "/test.bin", "r");
  char *buf = (char*)malloc(width * height * 3);
  char *temp = (char*)malloc(width * 3);
  unsigned long offset = 0;
  vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(5, LOW); //pull SS slow to prep other end for transfer
  for (int i = 0; i < height; i++) {
    unsigned long offset = startbackground + (i * width * 3);
    f.seek(offset, SeekSet);
    f.readBytes((char*)temp, width * 3) ;

    vspi->writeBytes((uint8_t*)temp, width * 3);
  }
  digitalWrite(5, HIGH); //pull ss high to signify end of data transfer
  vspi->endTransaction();
  f.close();

  free(buf);
  free(temp);
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Denkhilfe *

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.