arduino_aero:
leider auch ohne Erfolg da überschreibt er wieder die vorherigen Pixel.
Stimmt leider, habe ich jetzt auch probiert.
arduino_aero:
Was kann ich mir unter konstante Breite formatieren vorstellen? Bzw wie wird so etwas in der Praxis realisiert?
Es gibt proportionale Fonts wie TimesNewRoman, wo die Buchstaben unterschiedliche Breiten haben. Also ein "i" ist schmaler als ein "m". Bei anderen Fonts wie CourierNew haben alle Zeichen gleiche Breite, da ist ein "i" genauso breit wie ein "m":
iiii
mmmm
arduino_aero:
Die Variante, die Hintergrundfarbe hinzuzufügen, war ein voller Erfolg. Nun habe ich einen sauberen Übergang. Vielen Dank hierfür.
Bitte gerne, die Idee habe ich mal hier aus dem Forum gelernt 
arduino_aero:
Mit den fonds habe ich auch so meine Probleme aber das gehört nicht in dieses Thema mit rein.
Darf ich bitte trotzdem? Inzwischen habe ich auch eine blinkfreie Lösung für die Zusatzfonts gefunden. Dazu folgende Überlegung: Es blinkt nur die Ziffer, die inhaltlich unverändert bleibt und daher überflüssigerweise gelöscht wird.
Die Idee: Die Zahl aufteilen in inhaltlich neue und unveränderte. Die unveränderten werden nicht gelöscht, sondern einfach überschrieben, was unsichtbar bleibt. Die neuen werden mit dem alten Wert in Hintergrundfarbe überschrieben, dann mit der Vordergrund der neue Wert.
Folgender Sketch soll meine Überlegungen testen:
// Getestet mit Mega2560
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#define FONT FreeMono18pt7b
#include "Fonts/FreeMono18pt7b.h"
#define LCD_CS 31 // Chip Select
#define LCD_CD A15 // Command/Data
#define LCD_WR A14 // LCD Write
#define LCD_RD 30 // LCD Read
#define LCD_RESET 0 // direkt mit Arduinos Resetpin verbunden
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
#include <SPI.h>
const uint8_t chipSelect = SS; // SD chip select pin
void setup() {
tft.reset();
tft.begin(0x9341);
tft.invert(); // funktioniert nur mit der Bibliotheksanpassung
tft.setRotation(2);
tft.fillScreen(0x0000);
tft.setTextSize(2);
tft.print(" ");
tft.setTextSize(4);
tft.println("Zaehler");
tft.setTextColor(0xFFFF); // es entsteht ein weißer Block
for (byte z = 0; z < 20; z++) {
tft.setCursor(50, 50);
if (z < 10) tft.print(" ");
tft.print(z);
delay(100);
}
tft.setTextColor(0xFFFF, 0x0000); // so funktioniert es ohne Blinken
for (byte z = 0; z < 20; z++) {
tft.setCursor(50, 100);
if (z < 10) tft.print(" ");
tft.print(z);
delay(100);
}
tft.setFont(&FONT);
tft.setTextSize(2);
byte z = 0;
byte a = z;
do {
tft.setCursor(0, 200);
anzeige(a, z, 0xFFFF, 0x0000, 4);
a = z;
z += 1;
delay(100);
} while (z < 222);
z = 0;
do {
tft.setCursor(50, 300);
tft.setTextColor(0x0000); // so funktioniert es mit Blinken
if (z < 10) tft.print(" ");
tft.print(z);
z++;
tft.setCursor(50, 300);
tft.setTextColor(0xFFFF);
if (z < 10) tft.print(" ");
tft.print(z);
delay(100);
} while (z < 19);
}
void anzeige(uint16_t alt, uint16_t neu, const uint16_t vor, uint16_t hint, byte stellen) {
uint16_t di = pow(float(10), float(stellen)) + 0.5; // die 0.5 zum Aufrunden
while (di > 1) {
byte ta = alt % di * 10 / di;
byte tn = neu % di * 10 / di;
di /= 10;
if (neu < di) {
tft.setTextColor(hint, hint);
tft.print(" ");
} else {
if (ta == tn) {
tft.setTextColor(vor);
tft.print(tn);
} else {
int16_t cx = tft.getCursorX();
int16_t cy = tft.getCursorY();
tft.setTextColor(hint);
tft.print(ta);
tft.setCursor(cx, cy);
tft.setTextColor(vor);
tft.print(tn);
}
}
}
}
void loop() {}
Anmerkungen zu den Zusatzfonts:
- Der Ursprung ist links unten, bei Standardfont links oben.
- Zusatsfonts brauchen viel Speicher. Sollen nur Ziffern angezeigt werden, kann man die von der Bibliothek mitgelieferten Dateien kürzen.