Inzwischen konnte ich das Beispiel umsetzen, Anzeige wie in #18.
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
TFT_eSprite ziel_1 = TFT_eSprite(&tft); // Sprite object stext2
TFT_eSprite ziel_2 = TFT_eSprite(&tft); // Sprite object stext2
#define FONT2 2
void setup() {
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.drawString("Abfahrtszeiten", 30, 0, FONT2);
ziel_1.setColorDepth(8);
ziel_1.createSprite(160, 20);
ziel_1.fillSprite(TFT_BLUE);
ziel_1.setTextColor(TFT_WHITE, TFT_BLUE); // White text, no background
ziel_2.setColorDepth(8);
ziel_2.createSprite(160, 20);
ziel_2.fillSprite(TFT_BLUE);
ziel_2.setTextColor(TFT_WHITE, TFT_BLUE); // White text, no background
}
void loop() {
char zielTxt_1[] = {"Berlin Hauptbahnhof - "};
char verspTxt_1[] = " 5 Min ";
static int16_t pos_1 = 0;
anzeige(ziel_1, 25, zielTxt_1, verspTxt_1, pos_1);
char zielTxt_2[] = {"Berlin Brandenburger Tor - "};
char verspTxt_2[] = " 10 Min ";
static int16_t pos_2 = 0;
anzeige(ziel_2, 45, zielTxt_2, verspTxt_2, pos_2);
delay(50);
}
void anzeige(TFT_eSprite & ziel, const byte ypos, char * zielTxt, char * verspTxt, int16_t & pos)
{
uint32_t txtLaenge = ziel.textWidth(zielTxt, FONT2);
ziel.drawString(zielTxt, pos, 2, FONT2);
ziel.drawString(zielTxt, pos + txtLaenge, 2, FONT2);
ziel.drawString(verspTxt, 110, 2, FONT2);
ziel.pushSprite(0, ypos);
pos--;
if (pos <= -txtLaenge) pos = 0;
}
Erst wird im µC-Speicher (Sprite) ein Textteil zusammengestellt, dann mittels pushSprite in den Displayspeicher übertragen. Dadurch entfällt das Flackern. Diese Vorgehensweise wird auch in #18 verwendet, nur wird dort die Zeichenbreite eines proportionalen Fonts verwendet, während hier die Pixelbreite der gesamten Nachricht berechnet wird.
Eventuell könnte man auch nur ein Sprite verwenden. Vermutlich schlummert in den Sprites auch noch nicht von mir erkanntes Potential 