Hallo,
die von mir bisher genutzten LCD oder OLED-Displays haben es mir durch die eingesetzte Library immer leicht gemacht, bestimmte Zeichen auf dem Display zu überschreiben. Beispielsweise jede Sekunde die Sekunden der Uhrzeit erneuern.
Das aktuell von mir genutzte TFT-Display mit den Libraries (Adafruit_ILI9341.h und Adafruit_GFX.h) bereitet mir Probleme.
Da habe ich bisher keine einfache Lösung gefunden.
Aktuell muss ich die Zeichen, die ich neu setzen möchte, mit einem "Kasten" schwärzen.
// Anzeige Innentemperatur
tft.fillRect(110, 75, 70, 22, ILI9341_BLACK);
tft.setCursor(110, 75);
tft.print(I_temperatur, 1);
tft.setCursor(170, 75);
tft.write(247);
tft.print("C");
// Ende Anzeige Innentemperatur
Einfaches Überschreiben geht nicht.
Hat evtl. jemand eine Idee, wie ich das vereinfachen kann ?
Auch ist das beim Zeichnen der "Kästen" recht langsam und dadurch nicht wirklich brauchbar.
Aktuell wird der Inhalt in 6 Zeilen (Werten) geändert.
Evtl. gibt es ja eine Library, die dafür besser geeignet ist und ich brauche nur die Zeichen überschreiben, was hier nicht funktioniert.
Danke für die nachfolgenden Tipps.
HotSystems:
... Da habe ich bisher keine einfache Lösung gefunden. ...
Das Einzige, was mir dazu einfällt:
Das Überschreiben geht wohl nicht, weil die Funktion zum Zeichnen eines Zeichens nur die Pixel setzt, die im Zeichensatz gesetzt sind. Die anderen Pixel werden offensichtlich nicht behandelt.
Genau das könntest Du „nachrüsten“. Dann würden nicht mehr nur Pixel gesetzt, sondern auch gelöscht.
... stell' ich mir jetzt so vor.
Gruß
Gregor
Statt das gesamte Rechteck mit schwarz zu füllen, könnte man den alten Inhalt (den vorherigen Temperaturwert) noch einmal schreiben lassen mit der Hintergrundfarbe (schwarz).
Außerdem solltest Du nur die geänderten Werte neu schreiben. Also das Gradzeichen sowie das "C" nicht jedesmal neu schreiben.
Das erfordert zwar ein rechtsbündiges Schreiben der Werte, aber IMHO sieht das sowieso besser aus.
Von Vorteil ist dabei ein Zeichensatz mit gleicher Breite der einzelnen Zeichen.
Evtl. kann man beim Schreiben eine Hintergrundfarbe angeben. Bei manchen Libs geht es, bei anderen dummerweise nicht. Da nehm ich auch den Kasten
tft.setTextColor(ILI9341_YELLOW, ILI9341_BLUE);
Hallo,
das geht einfach so:
setup
{
tft.fillScreen(ILI9341_BLUE);
}
tft.setTextColor(ILI9341_WHITE, ILI9341_BLUE);
uhrzeit schreiben
Du mußt einfach die Textfarbe (WHITE) auf den richtigen Hintergrund (BLUE)
setzen.
Gruß und Spaß
Andreas
P.S.
willst Du jetzt hier schreiben..tft.fillRect(110, 75, 70, 22, ILI9341_BLACK);
dann
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
uhrzeit schreiben
Hallo und Danke für die bisherigen Antworten.
@gregorss
Ja, das wäre ne Lösung. Aber einfach ist es nicht. 
@slartibartfast
Habe ich auch (Wert in Hintergrundfarbe) gemacht, aber funktioniert nicht. Das mit den zusätzlichen (°C) Zeichen ist Feintunig und wird noch kommen.
@ElEspanol
Siehe vorherige Info.
@SkobyMobil
Den gesamten Hintergrund neu zeichnen dauert ja noch länger, ist somit keine Option.
Oder versteh ich das falsch?
Hallo,
hier erst einmal Dein °C…
tft.setTextSize(1);
tft.drawRect(67, 153, 3, 3, ILI9341_WHITE);
tft.setCursor(72,153);
tft.print("C");
im Sketch sieht es doch so aus…
setup
{
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLUE);
tft.setTextColor(ILI9341_YELLOW, ILI9341_BLUE);
tft.setTextSize(2);
}
das wird einmal gemacht.
die Hintergrundfarbe ist blau
die Textfarbe ist YELLOW auf BLUE-Hintergrund
jetzt änders Du das:
tft.fillRect(110, 75, 70, 22, ILI9341_BLACK);
Du willst die Uhrzeit im BLACK-Hintergrund Rechteck
also
tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);
willst Du jetzt wieder ausserhalb des Rechteck schreiben…
dann
tft.setTextColor(ILI9341_YELLOW, ILI9341_BLUE);
allse klar?
Gruß und Spaß
Andreas
SkobyMobil:
allse klar?
Ok, Andreas.
Hatte mir das in deinem letzten Post, nachdem mich ElEspanol mit der Nase drauf gestoßen hat, nochmal in Ruhe angesehen, dann hat es geklickt.
Es funktioniert so:
// Anzeige Innentemperatur -----------------------------------------------------------------------
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.setTextSize(2);
tft.setCursor(110, 75);
tft.print(I_temperatur, 1);
tft.setCursor(170, 75);
tft.write(247);
tft.print("C");
// Ende Anzeige Innentemperatur ------------------------------------------------------------------
Das mit dem "°C" sehe ich mir gleich noch an.
Aber das eigentliche Problem ist gelöst.
Vielen Dank für eure Antworten und Tipps.
Edit:
Das mit dem Grad-Zeichen in deiner (Andreas) Version, finde ich optisch nicht so schön.
Werde es mit der "247" belassen.
Nochmals vielen Dank.
Hallo,
ja, das paßt bei tft.setTextSize(2)- aber nicht bei tft.setTextSize(1)
Also, viel Spaß noch dabei
Gruß
Andreas
SkobyMobil:
Hallo,
ja, das paßt bei tft.setTextSize(2)- aber nicht bei tft.setTextSize(1)
Also, viel Spaß noch dabei
Gruß
Andreas
Ja, das stimmt.
Bei tft.setTextSize(3) sieht es auch nicht mehr so schön aus.
Ich habe es schon mit einem Kreis versucht, aber auch da gefiel mir das nicht.
Jetzt ist es ok.
@slartibartfast
Leider kann ich die Empfehlung "°C" festzusetzen nicht übernehmen, da ich die Textfarbe der Werte je nach Temperatur ändere. Da soll natürlich auch die Farbe von "°C" passen. 
Wenn es nicht zeitkritisch ist, kann man die Zeile komplett überschreiben. Nur wenn man mit den Lösch-Rechtecken arbeiten muss, sollte man nur das überschreiben, was sich geändert hat, sonst sieht es arg unschön aus.
Zeitkritisch ist es in meinem Projekt nicht. Die Zeit wird auch nur in Minuten angezeigt.
Die Lösung, nur die Werte plus Maßeinheit zu überschreiben, ist für mich jetzt die optimale Lösung und sieht auch ordentlich aus, ohne flackern.
Ich werde aber mal testen, wie es bei einer Sekundenanzeige aussieht.
wenn das mit der Hintergrundfarbe bei deiner Lib geht, flackert da auch nichts. Aktualisieren alle Sekunde, aber das weisst du ja sicher 
Aber das Forum ist ja auch für die da, die es noch nicht wissen