ich fange erst an mit Arduino - also bitte etwas Verständnis
Ich habe einen Arduino Webserver an dem ein BME280 Sensor angeschlossen ist - so kann ich über mein Tablet , Handy, PC etc. auf aktuelle Wetterdaten zugreifen. Kürzlich habe ich mir einen Nodemcu 1.0 und ein TFT-Display gekauft um so eine permanente Anzeige von Temperatur, Luftdruck und Luftfeuchtigkeit über WLAN zu erhalten. Ich habe zwei Beispielcodes aus dem Internet hergenommen und zusammengefügt (sorry!!!). Aktuell geht es um die Variable "wetterdaten" in "void loop()". Am seriellen Monitor werden die Werte richtig angezeigt - es funktioniert also. Aber wie bekomme ich die Werte am TFT-Display angezeigt?? Ich komme von einer anderen Programmiersprache und muß mich erst an Arduino gewöhnen - bin aber gern bereit dazuzulernen!! Für etwas Hilfe bei meinem Problem wäre ich wirklich sehr dankbar!!!
cu
phb
/**
*
*
*
*
*/
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#define USE_SERIAL Serial
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9340.h" // https://github.com/glennirwin/Adafruit_ILI9340
#include "SPI.h"
ESP8266WiFiMulti WiFiMulti;
//Pinbelegung für Display
#define TFT_CS D0 // GPIO 16 interne LED kein Port nötig, da TFT CS an GND
#define TFT_RST 10 // D12 GPIO10 //kein Port nötig, da Reset an Reset angeschlossen
#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);
//Falls die Anzeige gedreht wird
#define ROTATION_NO 0
#define ROTATION_90 1
#define ROTATION_180 2
#define ROTATION_270 3
void setup() {
USE_SERIAL.begin(115200);
// USE_SERIAL.setDebugOutput(true);
USE_SERIAL.println();
USE_SERIAL.println();
USE_SERIAL.println();
for(uint8_t t = 4; t > 0; t--) {
USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
USE_SERIAL.flush();
delay(1000);
}
WiFi.mode(WIFI_STA);
WiFiMulti.addAP("STARFLEX", "{§_DISCOURSE_HOISTED_CODE_0_§ATxfhc..29482]{U7P-MPKG@#%?]}");
tft.begin();
tft.setRotation( ROTATION_270);
tft_zeichneRahmen();
tft_zeichneBeschriftung();
tft_zeigeTemperatur();
}
void tft_zeichneBeschriftung(void)
{
tft.setTextColor(ILI9340_WHITE);
tft.setCursor( 10,55);
tft.setTextSize(2);
tft.print("Bodentemperatur in ");
tft.setTextSize(1);
tft.print("O");
tft.setTextSize(3);
tft.print("C");
tft.setTextSize(2);
tft.setCursor( 50,15);
tft.print("HPascal");
tft.setTextSize(2);
tft.setCursor( 10,210);
tft.print("%");
}
void tft_zeichneRahmen( )
{
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_zeigeTemperatur( )
{
String wetterdaten;
tft.setTextSize(10);
tft.setTextColor(ILI9340_YELLOW, ILI9340_BLACK );
tft.setCursor(20,90);
tft.print(wetterdaten);
}
void loop() {
// wait for WiFi connection
if((WiFiMulti.run() == WL_CONNECTED)) {
HTTPClient http;
USE_SERIAL.print("[HTTP] begin...\n");
// configure traged server and url
http.begin("http://192.168.1.15"); //HTTP
USE_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
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
// file found at server
if(httpCode == HTTP_CODE_OK) {
String wetterdaten = http.getString();
USE_SERIAL.println(wetterdaten);// Dieser Wert soll auf dem TFT-Display ausgegeben werden
}
} else {
USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
}
Jetzt wäre Es nett, wenn Du oben auch noch Code-Tags um den Code drum herum packst - für die Mobilisten /Edit
Wenn die Werte bereits korrekt ausgegeben werden - sorry - dann nimm diese Werte und packe Die auf's Display - in der IDE gibt's bestimmt ein Beispiel, wo diverser Text auf's Display gezaubert wird - Das 'einfach' abkupfern.
So, nun schaue ich mir Mal Deinen Sketch an - kann was dauern ...
Ich versuche die Werte auf das Display zu bekommen und weiß nicht wie! Wie bekomme ich die Werte von "wetterdaten" in void Loop() in "void tft_zeigeTemperatur( )"? Da sollten sie auf das Display ausgegeben werden!!
Kann Deine LCD-Lib Strings an das Display schicken?
Wenn nicht, müsstest Du den String zeichenweise auslesen und genau so ans Display schicken.
Also ein Zeichen lesen, prüfen, ob's nicht das Ende ist, ans Display schicken, goto 10
Hast Du akut schon irgend eine Ausgabe auf das Display?
Kompiliert der Sketch?
Gib doch alles zur Kontrolle erst mal an den seriellen Monitor aus, da siehst Du, was ankommt.
Vor Deiner eigentlichen Information kommt erst mal eine Menge an Headerzeilen, dann kommt eine Leerzeile. Die ist die Erkennung, dass jetzt Inhalt kommt.
Das mit den Codetags solltest Du noch korrigieren.
im Originalprogramm war die Ausgabe auf das Display im Typ "char". Ich habe aber mal einen Test gemacht und einfach mal oben reingeschrieben "String wetterdaten ="test"" und dann wurde "test" auch am Display angezeigt!.
Ich habe eben keine Ausgabe auf das Display - das ist ja gerade mein Problem. Ich weiß nicht wie ich den Inhalt der Variablen "wetterdaten" an das Display übergeben soll. Eigentlich ist "void tft_zeigeTemperatur( )" dafür vorgesehen.
Mit dem Befehl "tft.print(wetterdaten);" wollte ich die Daten auf dem Display ausgeben aber wahrscheinlich ist die Variable "wetterdaten" nur in "void loop()" sichtbar und nicht ausserhalb. Das dürfte der Grund sein warum es nicht funktioniert! Wie bekomme ich es hin das "wetterdaten" auch in "void tft_zeigeTemperatur( )" erkennbar ist???
im seriellen Monitor kommen außer den Headerzeilen auch Temperatur, Luftdruck und Luftfeuchtigkeit an - was der BME280 halt so hergibt. Mit einem Webbrowser sieht man natürlich keinen HTML-Code sondern nur die jeweiligen Werte und Ihre Bennennungen (Grad Celsius, Hectopascal, Prozent)! Da ist also alles in Ordnung - normalerweise schaue ich mir die Werte auf einem Pc oder meinem Handy mit einem Webbrowser an!
Das mit den Codetags verstehe ich nicht - ich habe doch die "How to use this forum" gelesen!! Ich dachte es ginge darum den Teil der besonders wichtig ist hervorzuheben was ich ja auch getan habe!!!
phb:
Das mit den Codetags verstehe ich nicht - ich habe doch die "How to use this forum" gelesen!! Ich dachte es ginge darum den Teil der besonders wichtig ist hervorzuheben was ich ja auch getan habe!!!
Den ganzen Code in Codetags setzen. Damit wird er erstens scrollbar und zweitens werden manche Klammersymbole nicht als Smilies interpretiert.
Gruß Tommy
Edit: Eigentlich könntest Du doch der Abfrage vom Arduino einen Parameter mit geben, dass die Antwort nicht in HTML, sindern in text/plain erfolgt. Das macht das Separieren der Werte einfacher.
Also sowas:
Jetzt hab´ichs begriffen und den Code entsprechend formatiert!!
Das mit der plain/text Abfrage ist eine sehr gute Idee - genau da muß ich mich mal schlau machen. Ich will in der Tat nicht den ganzen HTML-Kram mitkriegen sondern nur die drei Werte in plain text - so wie auf dem Webbrowser halt auch! Nur eben auf einem TFT-Grafik Display im Dauerbetrieb damit ich nicht jedesmal erst einen Computer oder ein Handy einschalten muß!!!
Der Browser braucht schon den ganzen HTML-Kram - daraus 'baut' Der ja die Web-Seite.
Wenn Du die PHP selber 'in der Hand' hast, also bestimmen kannst, was zurück gegeben wird, ist Tommy's Vorschlag sehr gut.
Einfach ein ?arduino=on (oder was auch immer) übergeben, in der PHP diese Eingabe prüfen und dann eben ausschließlich die Werte als Ausgabe generieren - dafür ist PHP ja da, dynamisch eine Seite aufbauen.
stimmt schon alles - aber ich gebe die Werte ja nur auf einem TFT-Display aus - und da wird ja dann auch das angezeigt was ich gar nicht sehen will - nämlich HTML-Code!
Aber soweit bin ich ja gar nicht - ich habe leider immer noch nicht herausbekommen wie ich die Werte die vom Webserver kommen auf das Display ausgeben kann. Vielleicht irgend eine Idee????
der einfachere Weg: Du schreibst Dein Script auf dem Webserver so um, dass es bei Abfrage vom Arduino text/plain schickt. Dann brauchst Du nur die Headerzeilen auszublenden.
Du läßt das als HTML, dann musst Du nach den Headern das HTML parsen und Deine Werte raussuchen.
Zuerst musst Du eine Entscheidung über den Weg treffen.
ich werde den zweiten Weg gehen - vielleicht kann ich ja mit "replace" die Headerzeilen durch z.B. Spaces ersetzen - aber momentan habe ich noch keine Ausgabe auf dem Display :-((
Dein Display ist auch erst der n+x-te Schritt.
Gib Dir immer alles auf dem seiellen Monitor aus. Dann siehst Du, wie Dein Teilergebnis aktuell aussieht und kannst Dein weiteres Vorgehen danach ausrichten.
HTML parsen ist mit wenig Vorkenntnissen in der Regel ein stark iterativer Prozess. Man tastet sich ran, schaut, was raus kommt und schränkt es weiter ein.
Das ist auch ein Weg, den Du ziemlich selbständig gehen musst, denn wir wissen nicht, was Dein Server genau sendet.
Der Text-Weg ist da (nach meiner Ansicht) einfacher zu lösen aber es ist Deine Entscheidung.