Adafruit_ILI9341.h einzelnes Zeichen überschreiben

#7515499
Lesenswert?

Hallo Forum,

ich habe das o.a. Display in Benutzung und möchte nur die geänderten neunen Zahlen überschreiben.

Hat jemand eine Idee, wie ich ein entsprechendes volles Kästchen aus den Pixeln in der jeweilgen Schriftgröße in Hintergrundfarbe (Befehl ist klar) schreiben kann oder gibt es das schon ? Ich habe zumindest nichts in der Libary gefunden.

1
      if (Einer != Old_Einer)                     // Wenn alter und neuer Wert unterschiedlich
2
        {
3
        tft.setTextColor(ILI9341_BLACK);          // Farbe wie Hintergrund
4
        tft.setTextSize(15);                                              
5
        tft.setCursor(82, 10);
6
        Befehl für Kästchen?;                      // überschreibe vorherige Zahl mit leerem zeichen
7
        tft.setTextColor(ILI9341_WHITE);           // Farbe wie Vordergrund
8
        tft.println(Einer);                        // schreibe neue Zahl
9
        }

Vielen Dank schon mal

#7515502
Lesenswert?

Daniel E. schrieb:

Hat jemand eine Idee, wie ich ein entsprechendes volles Kästchen aus den Pixeln in der jeweilgen Schriftgröße in Hintergrundfarbe (Befehl ist klar) schreiben kann oder gibt es das schon ?

Ein Leerzeichen?

Ich habe zumindest nichts

in der Libary gefunden. if (Einer != Old_Einer) // Wenn alter und neuer Wert unterschiedlich

Apfelmus ist Mus aus Äpfeln. Der Kommentar ist hyperliquide. Siehe Strukturierte Programmierung auf Mikrocontrollern

Die meisten anderen Kommentare auch.

Gibt es keinen Schreibmodus, welcher die Zeichen vollständig und direkt überschreibt? Sprich, der Hinter- und Vordergrund neu schreibt.

#7515520
Lesenswert?

J. S. schrieb:

hier tft.setTextColor(ILI9341_WHITE); noch die Hintergrundfarbe als 2. Argument angeben, so müsste es gehen. Allerdings nur die fixed Fonts, nicht für die mit variabler Zeichenbreite.

Danke für das Feedback. Es sind nur Zahlen in gleicher Größe. Gemäß meiner Recherche müssten das schon mal die fixed fonts sein.

Könntest du mir bitte das 2. Argument erläutern und was da genau gemacht wird und wie der Befehl komplett aussieht ? Letztendlich soll ja zum Beispiel eine 8 mit 1 aktualisiert werden.

Vielen Dank !

#7515522
Lesenswert?

Ein Leerzeichen?

Hab ich schon probiert und das geht nicht, Leerzeichen = keine Pixel

Gibt es keinen Schreibmodus, welcher die Zeichen vollständig und direkt überschreibt? Sprich, der Hinter- und Vordergrund neu schreibt.

Das dauert ewig und ist deutlich sichtbar, warum diesen Weg, wenn in anderen Posts immer darauf gedrängt wird nur das zu überschreiben was sich geändert hat ?

Danke

#7515524
Lesenswert?

Daniel E. schrieb:

Könntest du mir bitte das 2. Argument erläutern und was da genau gemacht wird und wie der Befehl komplett aussieht ? Letztendlich soll ja zum Beispiel eine 8 mit 1 aktualisiert werden.

Bitte? Du musst die Zahl nur überschreiben! Kann ja wohl nicht so schwer sein!

Wenn man wissen will, wie die Parameter für die Funktionen lauten und was sie tun, muss man in die Headerfiles der Lib schauen. Hier

Adafruit_GFX.h

Die liegt in deinem Libraries Ordner deiner Arduino-Installation bzw. im Pfad deines Sketchbooks.

1
  /**********************************************************************/
2
  /*!
3
    @brief   Set text font color with transparant background
4
    @param   c   16-bit 5-6-5 Color to draw text with
5
    @note    For 'transparent' background, background and foreground
6
             are set to same color rather than using a separate flag.
7
  */
8
  /**********************************************************************/
9
  void setTextColor(uint16_t c) { textcolor = textbgcolor = c; }
10

11
  /**********************************************************************/
12
  /*!
13
    @brief   Set text font color with custom background color
14
    @param   c   16-bit 5-6-5 Color to draw text with
15
    @param   bg  16-bit 5-6-5 Color to draw background/fill with
16
  */
17
  /**********************************************************************/
18
  void setTextColor(uint16_t c, uint16_t bg) {
19
    textcolor = c;
20
    textbgcolor = bg;
21
  }

Die Funktion ist überladen (C++) und kann in 2 Versionen aufgerufen werden.

#7515528
Lesenswert?

Daniel E. schrieb:

Gibt es keinen Schreibmodus, welcher die Zeichen vollständig und direkt überschreibt? Sprich, der Hinter- und Vordergrund neu schreibt.

Das dauert ewig

Was soll daran ewig dauern? Natürlich sollen nur die Zeichen geschrieben werden, welche sich ändern!

und ist deutlich sichtbar, warum diesen Weg, wenn in anderen Posts immer darauf gedrängt wird nur das zu überschreiben was sich geändert hat ?

Das habe ich ja gesagt. Das Problem liegt darin, daß die Lib auch einen Modus anbietet, welcher mit transparentem Hintergrund schreibt, dabei wird ein altes Zeichen eben NICHT vollständig überschrieben, im Gegenteil, man sieht die beiden Zeichen überlagert. Das ist aber mit der richtigen Einstellung von Vorder- und Hintergrundfarbe lösbar, siehe oben! Eben OHNE transparenten Hintergrund!

#7515532
Lesenswert?

1
if (Einer != Old_Einer) {
2
    // Farben für Vorder- und Hintergrund setzen
3
    // dadurch vollständiges Überschreiben der alten Zeichen   
4
    tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE); 
5
    tft.setTextSize(15);                                              
6
    tft.setCursor(82, 10);
7
    tft.println(Einer);
8
    Old_Einer = Einer;
9
}
#7515541
Lesenswert?

Falk B. schrieb:

Daniel E. schrieb:

Könntest du mir bitte das 2. Argument erläutern und was da genau gemacht wird und wie der Befehl komplett aussieht ? Letztendlich soll ja zum Beispiel eine 8 mit 1 aktualisiert werden.

Bitte? Du musst die Zahl nur überschreiben! Kann ja wohl nicht so schwer sein!

Gut, da hab ich was missverstanden. Das ist mir klar, muss mir halt nur den letzten geschriebenen Wert merken

Ich habe aber etwas bedenken, je nachdem wie der Code durchläuft ( Interrupt, Berechnungen) das irgendwann schreib/ Pixelfehler auftreten und würde daher gern das ganze Feld schreiben.

Was spricht dagegen? der fehlende Schreibbefehl ?

Ich kann ja die Pixelfelder herausfinden und ggf. ein extra Zeichen kreieren, evtl. gibts ja wie gesagt sowas schon, was mir unbekannt ist.

#7515550
Lesenswert?

Daniel E. schrieb:

Ich habe aber etwas bedenken, je nachdem wie der Code durchläuft ( Interrupt, Berechnungen) das irgendwann schreib/ Pixelfehler auftreten und würde daher gern das ganze Feld schreiben.

Dann tu das doch einfach!

Was spricht dagegen?

NICHTS!

der fehlende Schreibbefehl ?

Nö, dein fehlendes Wissen zum Thema.

Ich kann ja die Pixelfelder herausfinden und ggf. ein extra Zeichen kreieren,

AUA!

evtl. gibts ja wie gesagt sowas schon, was mir unbekannt ist.

Liest du auch ab und an die Beiträge anderer Leute? Das Problem ist längst gelöst!

Beitrag #7515596 wurde von einem Moderator gelöscht.
#7515747
Lesenswert?

Ich habe es gerade mal mit meinem ollen 1,8 Zoll TFT getestet. Da gibt es einen Fehler in Adafruit_GFX.cpp in

1
void Adafruit_GFX::text(const char * text, int16_t x, int16_t y) 
2
{
3
  if (!useStroke)
4
    return;
5
  
6
  setTextWrap(false);
7
  //setTextColor(strokeColor);
8
  setCursor(x, y);
9
  print(text);
10
}

Welcher Depp setzt dort nochmal die Farbe so, daß man IMMER mit transparentem Hintergund schreibt? Man muss die Zeile wie oben auskommentieren und sein Projekt neu kompilieren, dann geht das flackerfreie Überschreiben butterweich.

#7515755
Lesenswert?

Hallo zusammen,

hab mal verschiedene Sachen probiert, Zahl mit selbiger überschreiben und Rechteck drüber schreiben.

Alles beides ist shit und für meine Anwendung und als Tacho (große Zahlen)/ Km Zähler (kleinere zahlen) völlig ungeeignet.

https://drive.google.com/file/d/1JLWbUT3ZVsdMNp0yrE92ZCNP3V5ijTSA/view?usp=sharing

https://drive.google.com/file/d/126FU2WvVdOqadxrbY1ACWbk_fWM19DjM/view?usp=sharing

Hat jemand noch Ideen wie das anders gelöst werden könnte, so dass mein Display 3-4x in der Sekunde blitzschnell refreshed werden kann?

Danke

#7515760
Lesenswert?

Falk B. schrieb:

Da gibt es einen Fehler in Adafruit_GFX.cpp in

die Methode 'text' gibt es im original Adafruit-GFX nicht. Woher soll man wissen welchen verbastelten Fork du benutzt?

Daniel E. schrieb:

Hat jemand noch Ideen wie das anders gelöst werden könnte, so dass mein Display 3-4x in der Sekunde blitzschnell refreshed werden kann?

Einen geeigneten µC und eine Schnittstelle mit hoher Bandbreite benutzen.

#7515763
Lesenswert?

J. S. schrieb:

Da gibt es einen Fehler in Adafruit_GFX.cpp in

die Methode 'text' gibt es im original Adafruit-GFX nicht. Woher soll man wissen welchen verbastelten Fork du benutzt?

Das Ding hab ich vor Jahren mal installiert. Es ist TFT von Adafruit, 1.0.6, gemäß Bibliotheksmanager die neueste Version. Auf dem Ding baut auch die Lib für das Display vom OP auf!

Ich würde mal vorsichtig behaupten, daß der Fehler hier eher bei dir liegt. Schau nochmal genau in die Lib.

Angehängte Dateien:
#7515801
Lesenswert?

J. S. schrieb:

Und selbst da gibt es deine Codezeilen nicht: https://github.com/adafruit/Adafruit-ST7735-Library/blob/1.0.6/Adafruit_ST7735.cpp

Das ist ja auch die falsche Datei.

und auch wenn Code von Arduino gepflegt wird heisst es nicht das er nicht verbastelt sein kann...

Ist halt ne uralte Version. Egal. Der OP sollte dennoch die Methode testen. Und ggf. die text-Methode in den Untiefen der Klassenvererbung suchen und finden und ggf. reparieren.

#7515803
Lesenswert?

Hat jemand noch Ideen wie das anders gelöst werden könnte, so dass mein Display 3-4x in der Sekunde blitzschnell refreshed werden kann?

Einen geeigneten µC und eine Schnittstelle mit hoher Bandbreite benutzen.

Ein LCD mit 8 Bit Schnittstelle könnte schon ausreichen mit dem Mega 2560 oder ?

Würde ein PIC18F mit dem Adafruit Display auch gehen?

Mir fehlt das bissel die Erfahrung.

Danke

#7515819
Lesenswert?

Da gibt es keine Untiefen der Vererbung. Die Krux sind die verdammten ZIP Files, Code gehört einfach nicht in zip. Das zip und die git Quellen stimmen nicht überein, trotz gleicher Versionsnummer.

Ich benutze solche Displays nicht mit AVR oder anderen 8 Bit uC, die gehören für mich nicht zu ,geeigneten uC‘. RP2040 mit der Bodmer/TFT_eSPI Lib wäre etwas schnelles.

Gast #7516007
Lesenswert?

Falk B. schrieb:

Welcher Depp setzt dort nochmal die Farbe so, daß man IMMER mit transparentem Hintergund schreibt?

Auf PC ist das so üblich. Ich nehme an, dass Adafruit hier das default Verhalten so wenig überraschend wie möglich machen wollte.

Ja ich weiß, dass das es fast alle anderen Bibliotheken aus dem µC Umfeld anders handhaben. Vermutlich auch fast alle Displays mit integriertem Zeichengenerator. Das wird Adafruit aber nun wohl nicht mehr ändern, schließlich hängen viele bestehende Projekte und Produkte daran.

#7516011
Lesenswert?

wenn man so grobpixelige Anzeigen mag und mit dem Retro Look zufrieden ist, dann geht das vielleicht so. Dann wäre aber ein LED Matrix Display effizienter.

Eine Alternative wäre noch drawBitmap() zu probieren. Das kann als Quelle ein 1 BPP in ein 16 BPP Image in das Display zeichnen. Das geht noch relativ schnell weil 1 Bit nur in 2 SPI Byte übertragen werden muss. Eine Ziffer in z.B. 128x96 braucht dann 1,2 kB im Flash, 10 Ziffern passen in den Mega2560 rein. Dafür kann man dann beliebig schöne Fonts verwenden.

#7516153
Lesenswert?

Hallo zusammen und danke für das Feedback.

Mit dem Adafruit scheint es ja nicht wie gewünscht zu funktionieren.

Jetzt bin ich wieder beim LCD Display 2x8 oder 2x16 und 9 mm oder 11 mm Zeichenhöhe, so dass die Anwendungen relativ brauchbar wird.

Sollte eigentlich was mit dem Arduino damit werden oder? Über ein paar Kommentare dazu würde ich mich freuen.

Danke

#7516162
Lesenswert?

Daniel E. schrieb:

Mit dem Adafruit scheint es ja nicht wie gewünscht zu funktionieren.

Das Display mit dem ILI9341 ist auch mit SPI so schnell dass man Zahlen ohne Flimmern problemlos darstellen kann. Falk hat es ja bereits gezeigt. Eventuell ist einfach die verwendete Bibliothek nur langsam programmiert. Einfach mal eine andere ausprobieren, auf Github gibt es genügend davon.

(Firma: 1984now) #7516167
Lesenswert?

Stefan F. schrieb:

Falk B. schrieb:

Welcher Depp setzt dort nochmal die Farbe so, daß man IMMER mit transparentem Hintergund schreibt?

Auf PC ist das so üblich.

???

"Auf dem PC" ist ja nun doch ein sehr weites Feld. Offensichtlich hast du nur einen sehr kleinen Teil davon beackert.

Also nein: Es ist im Gegenteil absolut unüblich, Schrift per default mit transparentem Hintergrund auszugeben. Schon allein deshalb, weil das die (Rechenzeit-)Kosten der Schriftausgabe aus nachvollziehbaren Gründen (RMW statt WO) per default massiv in die Höhe treiben würde.

Oder andersum: was auch immer dieses default-Verhalten haben sollte (ich kenne nichts, was sich so verhält), wäre jedenfalls definitiv ziemlicher Mist.

Magst du "auf dem PC" vielleicht mal genauer spezifizieren?

#7516187
Lesenswert?

Adafruit ist nicht langsam, damit muss es auch gehen. Zwei Zeichen a 128x96 bei 16 BPP sind ca. 400.000 Bit, @ 4 MHz SPI sind das 100 ms für die reine Übertragung. Dazu kommt noch das was die CPU braucht, aber mit den Bitmaps sollte es nicht Zuviel sein. Mit einem RP2040 wäre SPI min 10x schneller, da sind >10 Hz drin. Gleiches Display, Arduino Code genauso und der Controller ist billiger als ein Mega2560.

#7516199
Lesenswert?

Falk B. schrieb:

https://youtu.be/U99jaHkLALc

Daniel E. schrieb:

Hätte nicht gedacht das es so viele verschiedene Library’s gibt und Adafruit so langsam ist …

Jaja, es sind immer Andere schuld . . .

Sorry, wo hab ich geschrieben das andere Schuld sind?

Nochmal, wenn Du so einen Plan davon hast, müssen das andere nicht haben und man kann seine Message auch anders rüber bringen. Zumindest hab ich diese Message nicht "willkommen" aufgenommen.

Danke für deinen Support !

#7516207
Lesenswert?

Daniel E. schrieb:

Hätte nicht gedacht das es so viele verschiedene Library’s gibt und Adafruit so langsam ist …

Jaja, es sind immer Andere schuld . . .

Sorry, wo hab ich geschrieben das andere Schuld sind?

"Adafruit so langsam ist"

Nochmal, wenn Du so einen Plan davon hast, müssen das andere nicht haben und man kann seine Message auch anders rüber bringen. Zumindest hab ich diese Message nicht "willkommen" aufgenommen.

Tja, Kritikompetenz ist nicht jedermanns Sache.

https://de.wikipedia.org/wiki/Kritikkompetenz#Passive_Kritikkompetenz

Danke für deinen Support !

Support? Bin ich eine äonische Säule?

Gast #7516269
Lesenswert?

Ob S. schrieb:

Auf PC ist das so üblich.

???

"Auf dem PC" ist ja nun doch ein sehr weites Feld. Offensichtlich hast du nur einen sehr kleinen Teil davon beackert.

Also nein: Es ist im Gegenteil absolut unüblich, Schrift per default mit transparentem Hintergrund auszugeben.

Dann schau dir mal das angehängte Beispiel an. Am Screenshot siehst du, dass der Text wie mit einem Stift gezeichnet wird. Der Hintergrund wird nicht automatisch gelöscht.

Das ist der Default unter Linux, Windows und eben auch bei der Adafruit Bibliothek.

Angehängte Dateien:
#7516295
Lesenswert?

Rolf M. schrieb:

void setTextColor(uint16_t c) { textcolor = textbgcolor = c; }

Das heißt, wenn man diese Funktion nutzt, wird Vorder- und Hintergrundfarbe auf den selben Wert gesetzt?

Ja, aber das ist ein Trick, denn praktisch würde damit keinerlei Schrift sichtbar werden.

Das erscheint mir wenig zweckmäßig.

Damit wird der Software mitgeteilt, den Hintergrund transparent zu halten, d.h. die "weißen" Stellen der Schriftzeichen überschreiben den Bildschirminhalt NICHT. Das könnte man auch anders lösen, indem man einen expliziten Farbcode für Transparent erfindet. Hat man aber nicht.

#7516297
Lesenswert?

Stefan F. schrieb:

Dann schau dir mal das angehängte Beispiel an. Am Screenshot siehst du, dass der Text wie mit einem Stift gezeichnet wird. Der Hintergrund wird nicht automatisch gelöscht.

Das ist der Default unter Linux, Windows und eben auch bei der Adafruit Bibliothek.

Das mag ja, sein aber durch die Funktion in der Methode text ist es die EINZIGE Schreibmöglichkeit! Das nervt!

Gast #7516298
Lesenswert?

Rolf M. schrieb:

Das heißt, wenn man diese Funktion nutzt, wird Vorder- und Hintergrundfarbe auf den selben Wert gesetzt? Das erscheint mir wenig zweckmäßig.

Einfach mal den Kommentar lesen, der direkt darüber im Quelltext steht:

For 'transparent' background, background and foreground are set to same color rather than using a separate flag.

Alles klar? So schwer ist das nicht zu begreifen.

#7516353
Lesenswert?

Stefan F. schrieb:

Einfach mal den Kommentar lesen, der direkt darüber im Quelltext steht:

Ach, wer liest schon Kommentare? ;-) Aber ja, hätte ich lesen können. Bei der zweiten Funktion fehlt diese Info übrigens, obwohl sie da genauso gilt.

For 'transparent' background, background and foreground are set to same color rather than using a separate flag.

Alles klar? So schwer ist das nicht zu begreifen.

Naja, so richtig elegant ist das aber auch nicht.

#7523814
Lesenswert?

Daniel E. schrieb:

Guckst hier:

https://drive.google.com/file/d/1hxkgZNgkjiBPyoYnEuoumAc_CV_7xy0B/view?usp=sharing

Läuft flüssiger mit anderer Libary :-)

Flüssig genug für die Anwendung und deine persönlichen Wünsche?

Großes Zeichen dauert 20 ms und kleines 7 ms.

Naja. Ich hab meine TFT-Lib handoptimiert, von erstmal 10ms/Zeichen bei Zoofaktor 4 auf ca, 4,5ms/Zeichen.

Long Zahl in EEPROM schreiben dauert 3,3 ms

Hat mit der Anzeige nix zu tun.

#7523862
Lesenswert?

Die höhere Geschwindigkeit der anderen Lib dürfte durch eine geringere Farbtiefe erkauft worden sein. Bei kleineren Zeichen wird die Datenmenge auch gleich quadratisch kleiner. Und man muss so grobe Klötze in den Zeichen schön finden…

Aber in diesem Thread ging es ja gerade um einen universellen Pedelec Controller und die Verwendung des Displays daraus: Beitrag "Arduino unter Windows stellt sich dumm an"

Die Kingmeter bieten da schon alles, großes Display, (hoffentlich) wetterfestes Gehäuse und seriell ansteuerbar. Und teuer sind die auch nicht.

#7524059
Lesenswert?

Flüssig genug für die Anwendung und deine persönlichen Wünsche?

Ja, reicht vollkommen

Großes Zeichen dauert 20 ms und kleines 7 ms.

Naja. Ich hab meine TFT-Lib handoptimiert, von erstmal 10ms/Zeichen bei Zoofaktor 4 auf ca, 4,5ms/Zeichen.

Da bin ich nicht der Spezialist für sowas, Glückwunsch wenn du es drauf hast, hab mich aber noch nicht damit beschäftigt

Long Zahl in EEPROM schreiben dauert 3,3 ms

Hat mit der Anzeige nix zu tun.

Ist mir vollkommen klar, sollte eher für andere als Information/ Hilfe sein…

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren