Evtl. Fehler bei tft.setTextPadding() in TFT_eSPI

Hallo,

aktuell versuche ich mich an der Library "TFT_eSPI" auf dem ESP32-C3 und da mit der Funktion "tft.setTextPadding()"
Nur leider ohne Erfolg.
Lt. Beschreibung soll dadurch der ältere Text einer Ausgabe bei neuem, kürzeren Texten verschwinden.
Das macht er leider bei mir nicht.

Vermutlich mache ich einen Fehler in meiner Ausgabe.

Der nachfolgenen Funktion gebe ich nacheinander folgende Texte mit:
dark, dim, medium, bright, sunny

Nach medium bleibt immer am Ende etwas erhalten.

Hier die Funktion, die dafür zuständig ist.

void printText(String newText)
{
  tft.setCursor(27, 55, 2);
  tft.setTextSize(3);
    
  tft.setTextPadding(tft.textWidth("medium", 2));  
  tft.setTextColor(TFT_YELLOW, TFT_BLACK);
  
  tft.print(newText);
  tft.setTextPadding(0);
}

Evtl. hat ja jemand eine Idee, was ich falsch mache.
Vielen Dank

Ich kenne diese Funktion aus einer anderen Programmiersprache. Da funktioniert das SO.

tft.textWidth ("medium", 2) <- Berechnet die Anzahl von Pixel die du braucht um en Text in der Klammer darzustellen.

Anders ausgedrückt.
Das Wort "medium" ist ein WORT KEIN WERT.

Du musst also das Wort "medium" , gegen den Wert aus tauschen was AKTUELL da steht. Dabei die Schrift und Höhe des Wortes was AKTUELL da Steht beachten.

Die Funktion berechnet dann die Breite und Höhe des realen Textes. Da das alles skalierbare Schriften sind ist das leider heutzutage erforderlich.

Danach wird der berechnete Bereich gelöscht, und kann neu gefüllt werden.

Der Vorteil diese Technik ist, das du nur ein kleinen Bereich neu zeichnen musst.

Tausche einfach Testweise das Wort "medium" gegen das Wort aus was aktuell an der Stelle steht. Dann sollte es funktionieren.

Hier ein Link wo das (in eng :wink: ) erklärt ist.
https://github.com/Bodmer/TFT_eSPI/blob/master/examples/480%20x%20320/TFT_Padding_demo/TFT_Padding_demo.ino

Code-Zitat aus den Link :

  padding = tft.textWidth("Quick brown", font); // get the width of the widest text in pixels
                                                // could set this to any number up to screen width
  tft.setTextPadding(padding);

  tft.setTextColor(TFT_GREEN, TFT_BLUE);

Gruß

Pucki

Was im Beispiel auffällt, es wird immer drawFloat, drawString oder drawNumber genutzt.
Du nutzt print.
Vielleicht macht dies den entscheidenden Unterschied.

void printText(String newText)
{
  tft.setCursor(27, 55, 2);
  tft.setTextSize(3);
    
  tft.setTextPadding(tft.textWidth("medium", 2));  
  tft.setTextColor(TFT_YELLOW, TFT_BLACK);
  
  tft.drawString(newText);
  tft.setTextPadding(0);
}
1 Like

Mit print wie schon @Plumps vermutet hat geht das nicht.
Wichtig ist das "medium", vorher die breite zugewiesen bekommt.

tft.setTextPadding(tft.textWidth("medium", 2)); 

was die 2 soll verstehe nicht.
Wen man jedoch so schreibt

tft.setTextPadding(tft.textWidth(" xxxxx "));

Padding wird berechnet nach Zahl der Zeichen was in Klammer stehen also hier wird platz für 7 Zeichen berechnet 5 + zwei Space .
Bei der nutzung vom Padding ist empfohlen gleichzeitig die Formatierung mit geben z.B.

tft.setTextDatum(BL_DATUM);

alle Möglichkeiten stehen in der .h

  TL_DATUM (0)  //   Alle Formatierungen werden verworfen , auch die mit M, C, R am Anfang
  TL_DATUM   // Top left (default)
  TC_DATUM  // Top centre
  TR_DATUM  // Top right
  ML_DATUM   // Middle left
  CL_DATUM   // Centre left, same as above
  MC_DATUM   // Middle centre
  CC_DATUM  // Centre centre, same as above
  MR_DATUM   // Middle right
  CR_DATUM   // Centre right, same as above
  BL_DATUM  // Bottom left
  BC_DATUM   // Bottom centre
  BR_DATUM   // Bottom right
  L_BASELINE    // Left character baseline (Line the 'A' character would sit on)
  C_BASELINE   // Centre character baseline
  R_BASELINE   // Right character baseline

Der ausgegebener Text wird formatiert wie beschrieben, z.B.

 tft.setTextDatum(BL_DATUM);
  tft.setTextColor(TFT_YELLOW, TFT_BLACK);
  tft.setTextPadding(tft.textWidth(" 44:44:44 "));  // String width + margin
  tft.drawString(timeNow, 58, 47);

Der Text wird angezeigt Linksbindig in pos X, Y das ist klar,
Achtung wen man centre nimmt und man zeigt an z.B. Uhrzeit kan pasieren das die Anzeige wird unruhig die zeichenschriftbreite wird sich ändern
" 11:11:11" wird angezeigt viel schmaler als "22:22:22", wem man aber links, oder rechts formatiert ändert sich die Breite nicht.
Das ganze erklären ohne das zeigen auf Display ist sehr schwierig.
Ach ja man muss nicht unbedingt die Formatierung nutzen, man kann schreiben auch so wie in anderen Bibliotheken.
.

1 Like

Herr Bodmer stellt zu Verfügung auch ein paar Schriftarten im Ordner Fonts.
Wie oben beschrieben alle Formatierungen funktionieren nur mit

drawString, drawFloat, drawInt

um das Fragmentierung vom RAM zu begrenzen sollte man die Schrift und Formatierungen aus dem Ram löschen sofort nach der nutzung mit

  tft.unloadFont();                            //Schrift aus dem Speicher löschen 
  tft.setTextDatum(TL_DATUM);   //Alle Formatierungen auf "0" setzen
  tft.setTextPadding(0);                 //Pading löschen
1 Like

Hallo Plumps, hallo fony,

danke für die Tipps.
@Plumps
Das mit drawString ist mir tatsächlich nicht aufgefallen, auch weil ich bisher nur "print" dafür eingesetzt habe.
Somit funktioniert das jetzt mit "drawString".

@fony
Die 2 in dieser Anweisung

tft.setTextPadding(tft.textWidth("medium", 2));

definiert lt. Doku den Font zum berechnen der Paddingweite.

Nochmals danke euch beiden, Problem gelöst.

Funktionierender Sketchteil:

void printText(String newText)
{
  tft.setTextSize(3);
  tft.setTextPadding(tft.textWidth("88888888", 2));    
  tft.setTextColor(TFT_YELLOW, TFT_BLACK);
  tft.drawString(newText, 27, 55);
  tft.setTextPadding(0);
}

Und ob ich tatsächlich den Font aus dem Speicher
tft.unloadFont();
löschen muss, werde ich noch prüfen.

1 Like

OK, ist mir nicht aufgefallen, aus dem Grunde ich nutze mit TFT_eSPI nur eigene Font's
mit der Endung .vlw die schiebe ich in data Ordner auf den ESP, somit brauche nicht die interne Fond's, der Padding ist somit ohne der zwei.
Wenn Interesse am eigenen Font hat Bodmer das erklärt in

Ich mache meine Schriftarten mit Processing , bin der Meinung geht schneller :wink:

1 Like

Danke, aktuell habe ich keinen Bedarf.
In den meisten Projekten nutze ich die Nextion-TFT.
Da, wo ich die SPI-TFT und TFT_eSPI als Lib einsetze reichen mir die vorhandenen Fonts aus.

Aktuell nutze ich das TFT zum testen an einem ESP32_C3 und I2C als Slave um auch hier eine Anzeige zu haben. Auch da reichen die vorhandenen Fonts. Und das läuft jetzt soweit gut.

Ist Richtig.

Ich möchte aber darauf hinweisen, das das auch mit einer String - Variable geht.
Ist vielleicht wichtig, wenn man den Platz flexible nutzen will.

Kleiner Tipp am Rande.
Wenn man normalen Text RECHTS-Bündig anzeigen will, geht das so.

Text_position = Rechter_punkt - tft.textWidth (text_den_ich_will)

Dann den Text an Text_position starten. Fertig.

Durch die Textwidth-Funktion kann ich jeden Text so sauber an jede Stelle positionieren. Ist auch für Einrückungen interessant. :wink:

Nebenbei. Für die Textheight-Funktion IMMER ein Y nehmen. Sonst könnte man ein Problem bekommen :wink:

Gruß

Pucki

Stimmt nicht ganz :wink: für nicht Zahlenausgabe darf man auch andere Buchstaben nehmen, es hat sich nur so "Eingebürgert" das man x , oder y nimmt.
Für Zahlen sollte man schon zahlen benutzen so wie die ankommen
8888, 88.8 oder 22:22:22 oder oder :wink:

Ist nur gut für Text was ist auf der gleicher Höhe man haben will, ist das gleiche wie R_BASELINE oder xR_DATUM, wo bei man muss keine Kunststücke machen und das Rad neu erfinden.
Will man jedoch was betonen nimmt man xx_DATUM, dadurch wird die Ausgabe ein wenig höher oder tiefer gesetzt an der Cursorposition, Oli Krauz nutzt so was auch in seiner Lib, wie das aber deklariert wird müsste in die Lib schauen.

Ich mag mich nicht streiten. Aber das Y ist einer der Größe Buchstabe im Alphabet.
Weshalb ich dann die Maximale Höhe habe.

Beim Programmieren setze ich dann zeile_hoch = text.Textheight ("Y")

Nach den Schreiben einer Zeile kommt als nächstes immer y = y + zeile_hoch

Hin und wieder auch y = y + (zeile_hoch * 2) Falls ich eine Leerzeile haben will.

Nun kommt. (Je nach Software unterschiedliche Syntax)
Textposition = (x,y )
Leg los.

Bevor einer Frage was das hier zu suchen hat. Man kann SO JEDES Display / Ausdruck etc. in JEDER Programmiersprache aufbauen.

Das kann man so weitermachen bis der definierte Wert von Papier_hoch /Display_hoch erreicht ist. Hier wäre Display_hoch dann 320. Ist wichtig wenn man die Ausgabe scrollen will. :wink:

Ach und nur so nebenbei. Wenn man den Code für andere Displays/Ausgaben skalieren will, muss man einfach nur den Skalierungsfaktor ausrechnen (Größe auf den der Code erstellt wurde x neue Größe) und die Font multiplizieren mit den Faktor (Ergebnis muss abgerundeter Integer sein).

Die Abweichungen sind dann minimal zum Original und fallen i.d.R. nicht optisch auf. :wink:

Gruß

Pucki

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.