Arduino Wetterstation mit Ethernet bleibt hängen

Hallo Leute,
ich habe ein komisches Problem mit meiner kleinen Wetterstation bestehend aus einer Arduino Uno, Ethernet Shield, Display und einer RTC. Wenn ich die Wetterstation an mache, bleibt sie etwa nach zwei Stunden stehen. Serial, sowohl Display geben nichts mehr aus. Ich habe auch schon alle Delays ersetzt (habe gelesen, dass das die Arduino belastet) und mir auch schon den freien RAM anzeigen lassen. Ich weiß wirklich nicht mehr weiter. Der Code ist wirklich noch sehr wirr, aber ich hoffe, ihr blickt da durch. Vielleicht findet jemand den Fehler.
Der Code ist im Anhang…

Danke im Voraus.

Arduino_Wetter_Anzeige_auf_Display_9_0_ram_anzeige.ino (12.9 KB)

Du scheinst noch nie etwas vom F()-Makro gehört zu haben.

ZB "Serial.println("Verbunden: “);” kopiert zuerst "Verbunden: " vom Flash ins RAM und dann wird es auf die serielle Schnittstelle ausgegeben.
wenn Du "Serial.println(F("Verbunden: “));” nimmst wird der Umweg RAm ausgelassen und somit RAM gespart.

Mach das bei allen print bzw println die Texte ausgeben.

Grüße Uwe

Arduiner-2014:
Der Code ist wirklich noch sehr wirr, aber ich hoffe, ihr blickt da durch. Vielleicht findet jemand den Fehler.
Der Code ist im Anhang…

Einerseits ist das Konzept leicht wirr:
Wozu brauchst Du für die Verwaltung der Zeit eine RTC, wenn Du doch über den Controller und millis() eine auf Dauer zwar leicht ungenaue Zeitbasis mit Millisekunden-Takt hast, andererseits aber über die Internetanbindung die Zeit in regelmäßigen Intervallen “atomuhrgenau” synchronisieren kannst?

Wozu wird dann als zweite auf Dauer leicht ungenaue Zeitbasis noch die RTC benötigt?
Die RTC ist überflüssig aus meiner Sicht.

Wenn Du die RTC wegläßt und die RTC-Library aus dem Programm rausschmeißt, stattdessen die Zeit vom Controller zählen läßt und gelegentlich per NTP nachsynchronisierst, hast Du die Komplexität des Programms und damit die Fehlermöglichkeiten schon mal reduziert.

Eine vernünftige Fehlersuche an Deinem Programm wird aber letztendlich nicht durch die zu komplexe Hardware verhindert, sondern nur durch den wirren und völlig unstrukturierten Code.

Wenn ich so ein Programm programmieren würde, würde die Loop-Funktion ungefähr so aussehen:

void loop() {
  syncNtpTime();  // in regelmäßigen Zeitabständen die Zeit über Internet synchronisieren
  updateTime();    // einmal pro Sekunde einen localTime-Sekundenzähler hochzählen
  updateWetter(); // regelmäßig neue Wetterdaten per HTTP holen
  showData(); // Daten anzeigen
}

Fertig ist die loop. Die einzelnen Funktionen können ggf. in weitere Unterfunktionen aufgeteilt werden. Debug-Ausgaben auf Serial sind überall im Programm möglich. Die Datendarstellung auf LCD erfolgt am Ende der loop.

Dein wirres und unstrukturiertes Programm hat trotz Verwendung von mehreren Drittanbieter-Libraries eine Länge von über 500 Zeilen. Ich bin mir ziemlich sicher, dass man ein strukturiertes Programm, das nur die mitgelieferten Arduino-Libraries verwendet und keine Dritt-Libraries zweifelhafter Qualität, mit eigenem Code mit weniger als 500 Zeilen auskommen kann.

Ich würde das Ding eher komplett Neuschreiben als in dem verwarzten Code mit zweifelhaftem Code aus Drittanbieter-Libraries den Fehler zu suchen. Damit würde ich wahrscheinlich schneller fertig sein.

Edit/Nachtrag: Hast Du mal den Seriellen Monitor mitlaufen lassen und konntest Du feststellen, an welcher Stelle das Programm hängenbleibt? Ist vielleicht “Serial.println(“Er versucht zu verbinden”);” die letzte Ausgabe im Seriellen Monitor? In dem Fall dürfte der Sketch beim client.connect hängenbleiben.