Statusabfrage Visualisieren (TFT-Display)

Hallo Arduino Gemeinde,

ich möchte gerne den Status (1/0) mehrere Digitale Eingänge lesen und diese dann auf einem TFT-Display ausgeben. Grundlage für das TFT-Display ist die UTFT Libary von Henning Karlsen.

Zunächst habe ich meinen Code ohne das Display ausprobiert, mittels Ansteuerung einer LED, läuft ohne Probleme.

Ausgeben:

int ledPin = 12;

void setup()
{
  Serial.begin(9600);
  pinMode(ledPin,OUTPUT);
}
void loop()
{
  if(Serial.available() >0)
  {
    byte buttonState = Serial.read();
    if (buttonState == 'H') 
    {
    digitalWrite(ledPin, HIGH);
    }
    else if (buttonState == 'L')
    {
    digitalWrite(ledPin, LOW);
    }
  }
}

Einlesen:

const int buttonPin = 53;     
int buttonState = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
}

void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
  delay(5000);
    Serial.print("H");
}
else {
  delay(5000);
    Serial.print("L");

}
}

Wie kann ich diesen Status(-änderung) auf meinem Display als Text darstellen?

Gruß Daniel

In utft.h findest du

void printChar(byte c, int x, int y);

Damit kannst du ein ‘H’ oder ‘L’ an jede beliebige Stelle schreiben.

Nachtrag: Vielseitiger ist natürlich

 void	print(char *st, int x, int y, int deg=0);

Dazu gibts auch BeispielCode in
UTFT.rar\UTFT\examples\Arduino (AVR)\UTFT_Textrotation_Demo

Was ist dein Problem ?

(Ausser deinem delay(5000);, was viel Geduld erfordert :wink:

Obwohl ich den Code nicht verändert habe läuft es jetzt, dennoch danke für deine Antwort.

Nun habe ich aber das Problem, wenn ein neuer Text eingeblendet wird, wird der alte nicht vollständig gelöscht. Es bleiben immer die letzten beiden Buchstaben stehen. Wie lösche ich das Display in dem Fall?

myGLCD.clrScr(); scheint mir zwecklos, denn dann würde das Bild ja flackern...

Weil der zweite string kürzer ist? Einfach die nicht benötigten Zeichen mit Leerzeichen überschreiben.

Wenn du einen string namens "str" hast, gibt dir strlen(str) die Länge des strings zurück. Bei einzelnen chars musst du per Hand zählen wie viele du geschrieben hast.

Danke, das war mir nicht bewusst, jetzt funktioniert es wie gewollt.

Hallo !
Ich hab da ein ähnliche Problem:
Ich lese einen ds2450 via 1Wire aus und möchte den Wert auf einem TFT anzeigen.
Die serielle Ausgabe funktioniert ganz gut.
Nun habe ich aber auch das Problem, dass wenn neue Werte des ADC´s eingehen, die alten Zeichen nicht vollständig gelöscht werden.

@Serenifly:
kannst du das bitte als Code ausdrücke ?

Weil der zweite string kürzer ist? Einfach die nicht benötigten Zeichen mit Leerzeichen überschreiben.

Wenn du einen string namens “str” hast, gibt dir strlen(str) die Länge des strings zurück. Bei einzelnen chars musst du per Hand zählen wie viele du geschrieben hast

Ich versteh das einfach nicht …
Ich häng noch meinen Code an - vlt. kann mir jemand nen Tip geben.
Gruß Passant

#include <OneWire.h>
#include <UTFT.h>
#include <DS2450.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
UTFT myGLCD(ITDB32S,38,39,40,41);   // Remember to change the model parameter to suit your display module!

DeviceAddress HVAC = { 0x20, 0xA6, 0xE6, 0x09, 0x00, 0x00, 0x00, 0xD4 };
int vrange = 0;        // 0 = 2.56v, 1 = 5.12v
int rez = 8;           // rez = 0-f bits where 0 = 16
bool parasite = 0;     // parasite power?
float vdiv = 0.000039;      // voltage divider circuit value - @ 2,5V :0.000039
OneWire oneWire(12);
ds2450 my2450(&oneWire, HVAC, vrange, rez, parasite, vdiv);


void setup( void ) 
{
  Serial.begin(9600);
  my2450.begin();
  
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.fillScr(VGA_BLUE); // Fill the screen with orange
  myGLCD.setColor(VGA_RED);
  myGLCD.setBackColor(VGA_BLUE);
  myGLCD.setFont(BigFont);



}


void loop(void) 
{


 int wert = 0 ; 
 int sensorMin = 1024 ;        // minimum sensor value
 int sensorMax = 12800;           // maximum sensor value

char buffer [12];
  my2450.measure();
   
  wert = map((int)my2450.voltChA(), sensorMin, sensorMax, 0, 318);   
   myGLCD.printNumI(wert,1,220);    //printNumI(num, x, y[, length[, filler]]);  


  myGLCD.fillRect(1, 10, wert + 1, 20);
  
  myGLCD.printNumI((int)my2450.voltChA(),1,120); 

itoa (wert, buffer ,10); 
myGLCD.print(buffer,1,170);

  Serial.print("wert = ");
  Serial.print(wert);
 Serial.print( "\n");          // n wie newline ... zeilenumruch
 Serial.print("chA = ");
  Serial.println((int)my2450.voltChA());
  //Serial.print("chB = ");
  //Serial.println((int)my2450.voltChB());
  //Serial.print("chC = ");
  //Serial.println((int)my2450.voltChC());
  //Serial.print("chD = ");
  //Serial.println((int)my2450.voltChD());
//delay (2000);


}

Achja nochwas :
Das mit den Leerzeichen ist auch nur so ne Hand am Arm Methode.
Ich würde gerne die Werte als Bargraphen dartsellen. Da klappt das mit den Leerzeichen bestimmt nicht.

Ich habe es so gemacht:

const int SERIAL_BUFFER_SIZE = 31;
char serialBuffer[SERIAL_BUFFER_SIZE];

void loop()
{
	static byte previousLength;
	
	if(checkSerial())
	{
		byte currentLength = strlen(serialBuffer);
		if(currentLength < previousLength)
		{
			for(int i = currentLength; i < previousLength; i++)
				serialBuffer[i] = ' ';
		}

		display.setColor(VGA_WHITE);
		displayPrintBigFont(serialBuffer, 0, 0);        //kapselt nur display.print so dass ich nicht immer den Font angeben muss
		previousLength = currentLength;
	}
}

Ist mehr eine Test-Funktion. Dafür ist das gut genug.

Das geht auch so mit Ziffern wenn du mit > 1000, > 100, etc. abfragst. Bei 16x2 LCDs wird das auch so gemacht, aber da kann man auch einfacher char für char schreiben und muss nicht die genaue Position für jeden angeben.

Ich hab da ein ähnliche Problem:
Ich lese einen ds2450 via 1Wire aus und möchte den Wert auf einem TFT anzeigen.
Die serielle Ausgabe funktioniert ganz gut.
Nun habe ich aber auch das Problem, dass wenn neue Werte des ADC´s eingehen, die alten Zeichen nicht vollständig gelöscht werden.

Das geht auch mit sprintf():

int val = 10;
char buf[8];   //muss mindestens eins größer als die Länge sein
sprintf(buf, "%5d", val);

Das füllt bis zu 5 Stellen mit Leerzeichen auf und schreibt den string in buf. Die Zahlen sind dann rechtsbündig.

Oder das hier für linksbündig:

sprintf(buf, "%-5d", val);

Also Minus vor den “width” Modifikator.

Ich habe mir da ein Array Namens stringBuffer angelegt, dass ich überall für Funktionen wie strcpy(), sprintf() und dtostrf() verwende. Dann muss ich nicht immer lokal Puffer anlegen.

Für Bagraphen könntest du mit fillRectangle() mit der Hintergrund-Farbe den Teil Löschen, der zu viel ist. Wenn sich das schnell ändert, wird das halt flackern, da das auf einem 16 MHz Prozessor doch recht langsam ist.

Vielen Dank Serenifly !!! Das mit der Anzeige der Zahlen klappt mit den Leerzeichen ganz gut. Das mit dem Bargraphen muss ich noch testen. Gute Nacht wünsche ich. Und nochmals danke :)