mit dem Seeeduino XIAO ESP32 fiel es mir das este Mal auf, dass die GET Abfrage von openwaether.org nur die erste kurze Zeit funktioniert und danach nur noch der Fehlercode -1 zurückliefert, was einfach heisst dass die Seite nicht gefunden wurde. Ich zieh mir da einen JSON String runter.
url = openwaether.api./data/....
HTTPClient http;
int result = http.get(url)
ergibt result = -1
Häh? Normalerweise funktioniert etwas nicht einmal und dann nie wieder zudem es auf einem normalen ESP32 WROOM einwandfrei spielt. Ich verwende aber String in der Funktion als Container für die Payload der Seite. Openweather erlaubt 1000 Aufrufe pro Monat und 60/Minute. Danach ersheint ein leerer Datensatz.
Testweise habe ich mal google.de aufgerufen, was Fehler 301 zurückliefert, weil google kein http unterstützt.
Ich benutze wificlient.h und HTTPClient als Libs für die Arduino IDE.
Auch das aussenherum ist wichtig:
Z.B. erzeugst du jedesmal einen neuen HTTP-Client, mit Keep-Alive oder ohne, räumst du nach dem Request auch wieder auf? Wie stellst du das Timing mit "60 Requests pro Minute" sicher? Wie schnell ändert sich das Wetter bei dir, dass du eine so hohe Polling-Frequenz brauchst?
Z.B. erzeugst du jedesmal einen neuen HTTP-Client, mit Keep-Alive oder
ohne, räumst du nach dem Request auch wieder auf? Wie stellst du das
Timing mit "60 Requests pro Minute" sicher? Wie schnell ändert sich das
Wetter bei dir, dass du eine so hohe Polling-Frequenz brauchst?
Dass ich die richtige url benutzte sollte klar sein. Code heute abend, bin auf Arbeit in der Pause. Nur was ich im Kopf hatte. Und es geht nur um den Fehlercode, die URL ist wumpe dabei.
der ist "Connection Refused". z.B. Wlan offline, Firewall sperrt den Zugriff, aber auch: Keine freien TCP-Sockets am ESP mehr verfügbar, weil alle in irgendwelchen verlorenen Keep-Alive HTTP-Clients hängen.
Bei zuvielen Zugriffen auf den Service würde der eher mit HTTP Error "509 Bandwidth exceeded" oder so antworten.
Hier ist mal ein Teil des Codes. Lief den ganzen Tag 1x die Stunde, nach 3-4 Aufrufen Fehlercode -1 . Aktuell läuft er an einer http Testseite, die für ssolche Zwecke besteht wo nur Text drauf ist einwandfrei durch... komisch. -1 heisst dass die url nicht erreicht wurde aber im Browser kriege ich einwandfrei den json container angezeigt, egal wie oft ich F5 drücke.
f (jsonError) {
eine Ausgabe von "payload" mit ein, damit du schauen kannst ob das
gültiges Json ist.
Auf der Testseite steht nur Testzeugs, da parsed json natürlich nicht. Hauptsache die Seite lädt. Lese aber grad auf openwaethermap, dass sie die api 2.5 diesen Monat abschalten und ein neues Bezahlmodell einführen. Kann sein, dass die die Anfragen einfach begrenzen. Jetzt gibt es Wetter nur noch gegen Geld.
Wenn man immer wieder 'http.begin' aufruft, ohne vorher mit 'http.end()' aufzuräumen, dann sind vermutlich irgendwann irgendwelche Ressourcen erschöpft.
Wenn man immer wieder 'http.begin' aufruft, ohne vorher mit 'http.end()'
aufzuräumen, dann sind vermutlich irgendwann irgendwelche Ressourcen
erschöpft.
Das ist schon alles ok so. Es tritt nach endlosem Testen nur aufd wenn ich langsamer als 1 Mal die Minute abtaste. So verrückt das klingt. Alle 5 Minuten und dann ist die zweite Abtastung nach Reset schon ein Fehler. Auch die NTP Zeit Abfrage schlägt dann fehl um die interne Uhr zu synchronisieren weil Ticker.h Timer nicht sonderlich genau sind. Reichen würde 1x die Stunde. Und ich vermute fast dass dieser Seeeduino Xiao ne Macke hat in seinen Eingeweidden, denn das ist noch nie passiert vorher. Ich teste das mal mit nem normalen Esp32 Board am WE. Gibt aber auch noch andere Libraries und Möglichkeiten als die verwendete.
Zeige mal detailliert, wie du die Stromversorgung gemacht hast. Schaltplan, Fotos samt Netzteil und Leitungen. Ich will auch die Platzierung der Pufferkondensatoren sehen.
Weil: Dort liegt fast immer die Problemursache bei "seltsamen" Instabilitäten nach längerer zeit.
Auch die NTP Zeit Abfrage schlägt dann fehl um die interne Uhr zu
synchronisieren weil Ticker.h Timer nicht sonderlich genau sind.
Solche Details wären halt am Anfang hilfreich.
d.H. es liegt nicht am HTTPClient, es liegt nicht am Json-Parser. Vermutlich ist der ESP aus dem WLan geflogen...
Verwendest du Sleep-Modi? Lange Schleifen ohne delay() und yield()?
Ansonsten: Zielgerichtet den Fehler suchen. z.B. Ausgabe von "WiFi.isConnected()", "WiFi.localIP()" usw. im Fehlerfall.
Vom PC einen Ping auf den ESP durchlaufenlassen. Bricht der ab, wenn die Fehler auftreten?
Das scheint es nicht zu geben. Wo sind die technischen Unterlagen zu dem Modul, insbesondere der Schaltplan? Es gab schon öfter mangelhafte gestaltete Module.
Dann hat es zu wenig Pufferkapazität. Hänge an 3,3V und GND einen 100µF
Elko. Das hat schon vielen geholfen.
Das werde ich am WE machen in meiner Werkstatt. Übrigens läuft alles auch, wenn man den Code komplett zusammen streicht und nur die Client Routine stehen lässt. Alle Timer raus usw. Da scheint irgendwas strubblig zu werden. Also ertst puffern, dann Code Stück für Stück wieder dazu geben und schauen ob es nach jedem Schritt noch läuft. Mancher Code ist ja auch fehlerhaft aus den Libraries.
Tja, die Wunder der Technik... immer wieder ein Vergnügen :-)
Mache das Display mal dunkler, wenn es länger als 1 Jahr halten soll. Oder ergänze den Aufbau mit einem PIR Sensor, womit das Display nur bei Bedarf eingeschaltet wird.
Mache das Display mal dunkler, wenn es länger als 1 Jahr halten soll.
Oder ergänze den Aufbau mit einem PIR Sensor, womit das Display nur bei
Bedarf eingeschaltet wird.
Das geht nicht, 0 oder 1. Es brennt schnell ein, daher ständig wechselt und nachts geht es aus. Zeit kommt vom NTP Server. 4 Pins ablöten, neues Display rein und fertig. 4 Euro das Stück bei Aliexpress. Das EEPROM oben wird schon so rolierend beschrieben, dass die Datensätze der Grafiken immer neue Plätze buchen.
1
/* Datensicherung im EEPROM rolierend */
2
voidSafeToEE(tables_t*data){
3
4
constintlen=sizeof(*data);
5
6
/* Erzeuge eine zufällige Blockadresse */
7
constintmax_blocks=EESIZE/len;
8
intnewBlock=random(0,max_blocks);
9
10
EE_WritePtr=newBlock*len;// Zieladresse im EEPROM
11
data->valid=DVALID;// Block gültig markieren
12
data->blknr++;// Laufende Nummer
13
14
sprintf(buf,"EE Block Nr.%u Data Set = %d Adr = %04X",newBlock,data->blknr,EE_WritePtr);
15
debugln(buf);
16
17
/* Funktion erwartet den Typ als Parameter ohne Angabe der Länge */
Aber selbstverständlich kann man den Kontrast per Software einstellen!
Auszug aus meinem Treiber:
1
i2c.beginTransmission(display_address);
2
i2c.write(0x00);
3
i2c.write(0x81);
4
i2c.write(contrast);
5
i2c.endTransmission();
Mir reicht in Innenräumen ein kleiner "contrast" Wert um 50.
Es brennt schnell ein,
Eben deswegen der Vorschlag mit dem PIR Sensor. Du kannst es im Ruhezustand auf einen ganz niedrigen Kontrast (z.B. 8) stellen und wenn der Sensor auslöst für eine Minute auf 128 erhöhen.
Aber selbstverständlich kann man den Kontrast per Software einstellen!
Ich baue es mal eben ein.... ist aber nur fürs Büro mit dem Handy als Hotspot für Wifi da Firmen Wlan leider an MAC Adresse gekoppelt ist aus Sicherheitsgründen. Könnte ich zwar ändern im XIAO auf die meines Laptops aber lieber nicht.
Das passt schon mit 60 jetzt, der Kontrast ist sogar noch besser geworden. Vielleicht spendiere ich noch einen LDR für den A0 Pin für die Licht Sensierung mit einer Look Up Table für die Helligkeit. Gibt es ja diese Logarithmus Tabellen für LEDs.
Ups... Sturmwarnung für heute abend. Windstärke 5-6 ... woher das?
Ich popp den Threasd nochmal hoch. Nachdem ich mich intensiv mit dem Xiao, Firebeetle und Wrover befasst habe und deren Connektivität zum Wlan fallen natürlich auch viele Berichte im Netz auf. Kurz und knapp: Seit dem Zurücksetzen des Core von 3.03 auf 2.11 sind die Probleme weg! Der Core nervt schon desswegen weil vieles nicht mehr funktioniert bzw anders .Der Watchdog verhält sich nicht mehr wie beschrieben, braucht jetzt einen Struct und egal was man da einträgt, die Zeiten stimmen nicht. LED Pwm anders, Timer anders usw usw. Zudem scheinen etliche Wrapper Funktionen von Libraries nicht angepasst zu sein, da die ja die Espressiv API nur kapseln. Zurück auf 2.11 und alles wurde gut, auch keine Vebindungsabrüche mehr. Habe auch den Eindruck, dass der Esp32 gerne mal den wifi Core abschmieren lässt ohne dass das bemerkbar wird. Er bleibt weiter angemeldet im Netz also sichtbar aber reagiert auf nichts mehr. Abhilfe ist zyklisches Resetten des ESP32, stört mich nicht in der Anwendung und die Daten sind im spiffs ja speicherbar.