INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
2,2" TFT-Display Frage
03.07.2018, 17:49
Beitrag #1
Sad 2,2" TFT-Display Frage
Hallo zusammen,

das angefügte Programm liest über einen NodeMCU mit 2,2" TFT-Display aktuelle Wetterdaten (Luftdruck, Luftfeuchtigkeit, Temperatur) von einem BME_280 Sensor aus. Jetzt sehe ich folgendes Problem: "Wenn der Luftdruck z.B. von sagen wir 1002 hPa auf 998 hPa sinkt dann steht im Display "9982":(Sad Denn es handelt sich ja um ein Grafikdisplay - die ersten drei Zahlen werden überschrieben und die letzte bleibt einfach stehen! Bei der Anzeige der Temperatur ergibt sich natürlich das gleiche Problem. Vielleicht hat ja jemand eine Idee wie sich das elegant lösen läßt?

MFG


Code:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#define Serial Serial
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9340.h"
#include "SPI.h"

ESP8266WiFiMulti WiFiMulti;

//Pinout of display

#define TFT_CS D0   // GPIO 16
#define TFT_RST 10  // D12 GPIO10
#define TFT_DC D1   // GPIO 5
#define TFT_MOSI D7 // GPIO 13
#define TFT_CLK D5  // GPIO 14
#define TFT_MISO D6 // GPIO 12

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


#define ROTATION_NO 0
#define ROTATION_90 1
#define ROTATION_180 2
#define ROTATION_270 3


String weatherdata;
int humidity, pressure;
float temperature;
int firstComma, secondComma;


void setup() {

  Serial.begin(115200);
  // Serial.setDebugOutput(true);

   WiFi.mode(WIFI_STA);

  WiFiMulti.addAP("STARFLEX", "{$&ATxfhc..29482]{U7P-MPKG@#%?]}");


  tft.begin();

  tft.setRotation( ROTATION_270);
  tft_printframe();
  tft_printcaption();


}
//Void setup() end

void tft_printcaption(void)
{
  tft.setTextColor(ILI9340_WHITE);
  tft.setTextSize(4);
  tft.setCursor( 50, 5);
  tft.print("   hPa");
  tft.setTextSize(4);
  tft.setCursor( 5, 205);
  tft.print("   %");

}

void tft_printframe( )
{
  tft.fillScreen(ILI9340_BLACK);
  tft.drawRoundRect(1, 0, tft.width() - 1, 40, 10, ILI9340_BLUE);
  tft.drawRoundRect(1, 50, tft.width() - 1, 135, 10, ILI9340_GREEN);
  tft.drawRoundRect(0, 200, tft.width() - 1, 40, 10, ILI9340_RED);
}

void tft_show_weatherdata() //(air pressure, temperature, humidity)
{

pressure = weatherdata.toInt();  // will read up to first comma

  firstComma = weatherdata.indexOf(",");
  temperature = weatherdata.substring(firstComma+1).toFloat();  //will read up to second comma

  secondComma = weatherdata.indexOf(",",firstComma+1);
  humidity = weatherdata.substring(secondComma+1).toInt();   //will read to end of string


tft.setTextColor(ILI9340_YELLOW, ILI9340_BLACK );
  tft.setTextSize(4);
   tft.setCursor(5, 5);
tft.print(pressure); //air pressure
tft.setTextSize(11);
tft.setCursor(5, 80);
tft.print(temperature,1);// temperature
tft.setTextSize(4);
tft.setCursor(5, 205);
tft.print(humidity); //humidity

}

void loop(void) {

  // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    HTTPClient http;

    Serial.print("[HTTP] begin...\n");

    // configure traged server and url
    http.begin("http://192.168.1.15/?mode=text");

    Serial.print("[HTTP] GET...\n");
    // start connection and send HTTP header
    int httpCode = http.GET();

    // httpCode will be negative on error
    if (httpCode > 0) {
      // HTTP header has been send and Server response header has been handled
      Serial.printf("[HTTP] GET... code: %d\n", httpCode);
      Serial.println();
      // file found at server
      if (httpCode == HTTP_CODE_OK) {
        weatherdata = http.getString();
        Serial.println(weatherdata);
        tft_show_weatherdata();
      }
    }

    else {
      Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }


    http.end();
  }

}
Diese Nachricht in einer Antwort zitieren
03.07.2018, 18:11 (Dieser Beitrag wurde zuletzt bearbeitet: 03.07.2018 18:25 von Tommy56.)
Beitrag #2
RE: 2,2" TFT-Display Frage
Du musst die Zahlen in eine Zeichenkette mit fester Länge formatieren, also entweder bei linksbündig Leerzeichen/0 anhängen oder bei rechtsbündig diese vorn anhängen.

Eine andere Variante beim Grafikdisplay: Du übermalst die alte Zahl vorher mit einem Rechteck in der Hintergrundfarbe.

Gruß Tommy

Edit: Was meinst Du, warum wir ein extra Unterforum für ESP8266 haben?

@Mod: Bitte verschieben.

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.07.2018, 20:48 (Dieser Beitrag wurde zuletzt bearbeitet: 03.07.2018 20:50 von georg01.)
Beitrag #3
RE: 2,2" TFT-Display Frage
Hallo,
wie der Tommy schon vorgeschlagen hat, Du muss die Anzeige (re)Aktualisieren.
Stichwort -> Repaint.
Es gibt schon paar Möglichkeiten … die mit einem Rechteck in der Hintergrundfarbe ist schon sehr gut. Damit Du verstehst um was geht probiere vollendendes:
In der tft_show_weatherdata();
Code:
...
  tft.setTextSize(4);
   tft.setCursor(5, 5);
tft.print("          "); // <--- Leerzeichen Anzahl  anpassen!
tft.print(pressure); //air pressure
tft.setTextSize(11);
...

Gruß
Georg

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.07.2018, 20:56
Beitrag #4
RE: 2,2" TFT-Display Frage
Das mit den Leerzeichen ist auch eine gute Lösung.
Der TO sollte mal für sein konkretes Display+genutzte Lib mit micros() herausfinden, welche Variante schneller ist.
Das wäre interssant.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.07.2018, 11:04
Beitrag #5
RE: 2,2" TFT-Display Frage
Hallo zusammen und Danke für die Antworten - das muß ich jetzt erstmal "verdauen" Big GrinBig Grin

Hallo,
ich habe das jetzt mal umgesetzt wobei sich herausgestellt hat daß die Lösung von Georg die beste und einfachste ist!!!!! Ein Problem habe ich jetzt noch - ich muß ja auch etwas unternehmen wenn die Temperatur von sagen wir -10.1 auf -9.9 ansteigt! Aber irgenwie komme ich da im Moment nicht weiter!! Die "Lösung" die ich auskommentiert habe funktioniert jedenfalls nicht.BlushBlushBlush

MFG


Code:
if (temperature < 10) {
  tft.setCursor(5, 80);
  tft.print("     ");
  tft.setCursor(5, 80);
  }
// else if (temperature > -10){
// tft.setCursor(5, 80);
// tft.print("     ");
// tft.setCursor(5, 80);
// }
  tft.print(temperature, 1); // temperature
Diese Nachricht in einer Antwort zitieren
04.07.2018, 20:42
Beitrag #6
RE: 2,2" TFT-Display Frage
Eventuelle Lösung wäre:
Code:
if (temperature < 10) {
  tft.setCursor(5, 80);
  tft.print("     ");
  tft.setCursor(5, 80);
  tft.print(temperature, 1); // temperature
  }
// else if (temperature > -10){
// tft.setCursor(5, 80);
// tft.print("     ");
// tft.setCursor(5, 80);
// tft.print(temperature, 1); // temperature
// }

Ich möchte jedoch nicht Deine Rumpflogik (Programmablauf) verfolgen.

Zitat:die Lösung von Georg die beste und einfachste ist!!!!!
Die Lösung ist zwar die einfachste, soll lediglich den Repaint- Aspekt / Problem verdeutlichen, aber gewiss ist es NICHT! die beste Lösung!

Gruß Georg

Ps.
Zitat:Der TO sollte mal für sein konkretes Display+genutzte Lib mit micros() herausfinden, welche Variante schneller ist.
Das wäre interssant.
Jedoch vermute ich - ohne Resonanz

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.07.2018, 21:35
Beitrag #7
RE: 2,2" TFT-Display Frage
(04.07.2018 20:42)georg01 schrieb:  
Zitat:Der TO sollte mal für sein konkretes Display+genutzte Lib mit micros() herausfinden, welche Variante schneller ist.
Das wäre interssant.
Jedoch vermute ich - ohne Resonanz
Wahrscheinlich leider ja.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.07.2018, 07:39
Beitrag #8
RE: 2,2" TFT-Display Frage
Hallo,

er benutzt ein ILI9340 im SPI-Mode. Das kann max. 15MHz SPI-Clock, beim Lesen nur 6MHz, aber lesen ist ja eher unüblich.
Er benutzt die Adafruit-Lib, wie schnell die SPI macht habe ich nicht nachgeschaut.
Der ESP8266 könnte max. 40MHz SPI-Clock z.B. mit der TFT_eSPI-Lib, die hat aber den ILI9340 wohl nicht dabei.
Man könnte den Unterschied der Formatierung der Prorogrammvarianten natürlich ausmessen, in diesem Fall aber wozu?
Selbst wenn man Uhrzeit, Temperatur o.ä. 5x pro Sekunde aktualisiert (ist für mich Quatsch, kann man alle Sekunde machen), dauert die Übertragung ans Display hier sicher erkennbar länger als die Textformatierung, so langsam sind 80MHz CPU-Takt ja nun auch nicht.
Man kann einen ESP8266 durchaus so beschäftigen, daß das eine Rolle spielt, z.B. MP3-Stream aus dem Web mit Softwarededcoder. Da hat man dann aber auch andere Timingprobleme.
In seinem Fall würde es mich schlicht überhaupt nicht interessieren.

PS: auf dem ESP nehme ich für sowas durchaus auch die Stringklasse...

Gruß aus dem warmen Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Question Frage zum Banggood-Board Volker3.0 4 499 14.05.2018 08:27
Letzter Beitrag: Volker3.0
Question MQTT ausgabe mit Node MCU auf ili9225 display? merz 2 839 31.10.2017 21:48
Letzter Beitrag: merz
  nodeMCU ESP 12E V3 - Frage zum Beispielsketch "Hello Server" Stargazer 2 1.231 13.08.2017 21:09
Letzter Beitrag: Stargazer
  ESP8266 ESP12-E Webserver-Frage Claus_M 8 2.662 14.11.2016 22:02
Letzter Beitrag: Claus_M

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste