tft Display Zahlendarstellung Frage

Hallo,

ich Frage Daten eines Rotary Encoders ab und lasse diese Zahlenwerte auf dem Display des TFT anzeigen.

Soweit funktioniert das auch recht gut. Mein Problem ist, das wenn ich von zweistellig zurück auf anstellig gehe immer die Reste der zweistelligen Zahlen angezeigt werden.

Ich habe auch den Hinweis der UTFT Library gelesen. Finde dort aber nicht dir Möglichkeit dies zu verhindern. Ich bin halt recht neu in der Arduino Programmierung.

Mein Gedanke war das wenn der Wert unter 10 ist, die Farben zu tauschen bzw. das Display zu leeren. Das kann es ja aber auch nicht sein.

Ich habe mir schon die Finger ab-gegoogelt

Folgendes Display habe ich im Einsatz:

Mit dem Shield:

Der Encoder ist Standart (China)

Hier ist mein Sketch soweit:

#include <UTouch.h>

#include <memorysaver.h>
#include <UTFT.h>

int messungPin1 = LOW;
int messungPin1Alt = LOW;
int encoderWert = 0;
int x, y;
  
//==== Creating Objects
UTFT    myGLCD(SSD1289,38,39,40,41); //Parameters should be adjusted to your Display/Schield model
UTouch  myTouch( 6, 5, 4, 3, 2);

//==== Defining Variables
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];

void setup() {
// Initial setup
  Serial.begin(9600);

 pinMode(12, INPUT); //encoder
 pinMode(13, INPUT); //encoder

  
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  myGLCD.setColor(100, 155, 203);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.setBackColor(100, 155, 203);
}

void loop() { 
  
  
    if (myTouch.dataAvailable()) {
      myTouch.read();
      x=myTouch.getX(); // X coordinate where the screen has been pressed
      y=myTouch.getY(); // Y coordinates where the screen has been pressed
      myGLCD.clrScr(); // Clears the screen
        }
       
  
 messungPin1 = digitalRead(12);
  if ((messungPin1 == HIGH) && (messungPin1Alt == LOW)) {
    if (digitalRead(13) == HIGH) {
      encoderWert++;
    } else {
 encoderWert--;
  }
 
 if (encoderWert < 0) { //verhindern von minus Werten
    encoderWert = 0;
 }   

 if (encoderWert > 60) { //verhindern von Zeiten länger als 60 Minuten
    encoderWert = 60;
 } 
 
  myGLCD.setColor(100, 155, 203);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.setBackColor(100, 155, 203);
  myGLCD.printNumI(encoderWert, CENTER, 76); // Ausgabe der Werte auf dem TFT-Display
  
  Serial.println(encoderWert); // ist nur zur Kontrolle eingefügt.
 }
 messungPin1Alt = messungPin1;   

     
 }//ende loop

Deine ersten Gedanken waren schon richtig.
Du musst die Farben des Displays entsprechend anpassen um die überflüssigen Zeichen zu überschreiben.

Das kann es ja aber auch nicht sein.

Na ja.

Üblich ist, bei Bedarf gezielt Leerzeichen zu schreiben oder bei Grafik-Displays ein Rechteck in Hintergrundfarbe zu malen.
Wenn du denkst, mit der Angabe CENTER dich um Details nicht kümmern zu müssen, musst du halt großzügiger löschen.

Gibt auch den Ansatz zu löschen, indem man den alten Text nochmal - in Hintergrundfarbe - schreibt.

Oha, erschütternd :slight_smile:

Dann malen wir uns mal ein Rechteck.

Vielen Dank an euch. Hatte schon Stundenlang gesucht.

Gruß

Michael

Ein Rechteck zu zeichnen ist aber langsam. Das flackert meistens deutlich und störend. Es ist viel einfacher und schneller Zahlen auf eine konstante Breite zu definieren. Dafür gibt es auch fertige Funktionen wie sprintf() oder dtostrf().

Die UTFT Library hat da auch Funktionen dazu. Schau mal in die Doku:
http://www.rinkydinkelectronics.com/resource/UTFT/UTFT.pdf
printNumI() und printNumF()
Length für die Breite angegeben. Und das Leerzeichen als Füllzeichen