Temp-Anzeige wird überschrieben

Hallo,

seit kurzem beschäftige ich mich mit dem Arduino, habe mir verschiedene zugelegt und entsprechend werde ich diese in einem Hausautomationsprojekt einsetzen.

Mein erstes Projekt ist eine Temperaturerfassung mit einem LM35 über ein Arduino Nano, Ausgabe an einem 1,8" TFT.

Ich habe vorab mich in verschiedenen Forums bereits informiert und auch das Display soweit zum laufen gebracht, jedoch habe ich das Proplem das die Temperatur nicht aktualisiert wird, sondern einfach überschrieben, so dass irgendwann in dem Bereich wo Zahlen stehen sollen, nur noch Pixel sind.

Ich muss dazu sagen, dass ich vom programmieren nicht wirklich Ahnung habe und mir das durch Bücher und Forums entsprechend ausarbeite und teste.

Hier die programmierung:

// TFT Anzeige mit Arduino NANO
//Uhrzeit, Datum, Innen und Aussentemperatur
//Uhrzeit, Datum und Aussentemp wird von Arduino MEGA über I2C Bus übertragen

#include <Adafruit_GFX.h>    
#include <Adafruit_ST7735.h> 
#include <SPI.h>


#define TFT_CS     10
#define TFT_RST    9  
#define TFT_DC     8
#define TFT_SCLK 13   
#define TFT_MOSI 11   

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

int val = 0;

void setup(void) {
   Serial.begin(9600);
 tft.initR(INITR_BLACKTAB);  // You will need to do this in every sketch
 tft.fillScreen(ST7735_BLACK); // Hintergrundfarbe
 // Init serial for serial monitor, so we can see debug text in the Serial Monitor Window
 //tft print function!
 tft.setRotation(1); // place this before the pic or data you want to rotate.
 tft.setTextColor(ST7735_RED);
   tft.setTextSize(2);   //Textgröße
 tft.setCursor(40,6);   //Platzierung
 tft.println("Uhrzeit"); 
   tft.setTextSize(2);   //Textgröße
 tft.setCursor(30,25);   //Platzierung
 tft.println("10:30 Uhr"); 
   tft.setCursor(20,45);   //Platzierung
 tft.println("17.11.2016");  
 tft.setTextSize(1);     //Textgröße
 tft.setCursor(30,80);   //Platzierung
 tft.println("Aussen");  
   tft.setTextSize(1);   //Textgröße
 tft.setCursor(30,100); //Platzierung
 tft.println("-10,3C");  
 tft.setTextSize(1);     //Textgröße
 tft.setCursor(100,80);  //Platzierung
 tft.println("Innen"); 
   tft.setTextSize(1);   //Textgröße
// tft.setCursor(100,100);  //Platzierung
 // tft.println("20,4C");   
 delay(1000);
 
}


//void loop() {
 //for(int x = 34; x <= 94; x++) {
// int reading = analogRead(val);
// float millivolts = (reading / 1024.0) * 5000;
// float temp = millivolts / 10;
// tft.setCursor(100,100);
// tft.setTextSize(1);
// tft.setTextColor(ST7735_WHITE);
// tft.setCursor(100, 30);


 void loop(){

 tft.setCursor(10,30);
 tft.setTextSize(3);
 tft.setTextColor(ST7735_BLACK);

  delay(5000);


 int tempPin = 0; //Port A0;
   //Analogport einlesen
   float tempC = analogRead(tempPin);
   // Wert konvertieren
   //tempC = (1.0*tempC* 100.0)/1024.0;
     tft.setTextColor(ST7735_RED);
   tft.setTextSize(2);   //Textgröße
   tft.setCursor(80,100);  //Platzierung
   //tft.print(blank);
   tft.print(tempC);

//    tft.drawPixel(x, plot, ST7735_WHITE);
 
//  tft.fillRect(35, 70, 60, 80, ST7735_BLACK);

}

Ich wäre euch dankbar wenn ihr mir helfen könntet.

Vielen Dank

DucDich

TFT_ansteuern.ino (2.32 KB)

Bitte setze den Sketch in Code-Tags, damit wir den auch auf mobilen Geräten richtig lesen können.
Verwende dazu die Schaltfläche </> im Editor-Fenster, das kannst auch nachträglich noch machen.

Bietet die Library die Möglichkeit, eine nicht-transparente Hintergrundfarbe zusätzlich zur Textfarbe vorzugeben?

Wenn du nur alle 5 sec schreibst, sollte das Flackern erträglich sein.

Sonst könntest du prüfen, ob der Wert sich geändert hat, und nur dann das Hintergrund-Rechteck löschen oder den alten Text in Hintergrundfarbe schreiben.

michael_x:
Bietet die Library die Möglichkeit, eine nicht-transparente Hintergrundfarbe zusätzlich zur Textfarbe vorzugeben?

Nach meinem Verständnis macht das Adafruit_GFX, die auch bei Adafruit_ST7735 eingebunden werden kann. Also:

setTextColor(uint16_t c, uint16_t bg)  // c=Vordergrund  bg=Hintergrund

Zumindest mit dem Standard-Font geht das, bei proportionalen natürlich nicht. Dann kann man, will man beim Prinzip Löschen durch Überschreiben bleiben, die alte Zahl mit Vordergrundfarbe=Hintergrundfarbe erneut schreiben. Ob Löschen durch Überschreiben oder Löschen durch Rechteck besser aussieht, muß man probieren.

Vielen Dank für die rasche Antworten.
wo müsste ich diese Zeile in mein Programm einfügen?
Sorry wenn ich so blöd frage, Programmieren war bisher nicht mein Aufgabengebiet

Beispielsweise:

tft.setTextColor(ST7735_RED);  // Hintergrund durchsichtig
tft.setTextColor(ST7735_RED, ST7735_BLACK);  // Hintergrund schwarz

So ich habe das getestet, das funktioniert so, jedoch springt die Anzeige von 0.000 auf einen Wert. das alle 5 sekunden wie die Zeit eben eingestellt ist.

Woher die 0.000 kommt, ausser evtl. von einem Wackelkontakt, kann ich nicht sehen.
Räume deinen aktuellen Sketch mal ein bisschen auf, vereinfache ihn wenn’s geht, und poste ihn hier wieder.
In loop() ist ja nach meinem Stand nicht viel drin ausser

delay(5000);
float tempC = analogRead(0);  // na ja ;)
/* Farbe setzen, Position */ 
tft.print(tempC); // das sollte irgendwas zwischen 0.00 und 1023.00 anzeigen.

Was passiert, wenn die Ausgabe eine Stelle weniger wird? Vermutlich bleibt der Rest dahinter sichtbar.
Aber das ist ja immer “.00”
Die Anzeige wechselt also von
1000.00 nach

999.000

Die dritte Null nach dem Dezimalpunkt ist alter Müll der nicht weiter stört, wie praktisch.