Ein kurzer, wie mir scheint aber wichtiger Update zur Programmierung meines Controllers:
der Wachhund, oder: nie mehr einfrieren. In den letzten Wochen habe ich damit begonnen, etwas mit den Buttons rumzuspielen, die beim LCD-Shield dabei waren und einen sehr einfachen "Maintenance Mode" zu programmieren (einen Modus, den ich brauche, wenn ich am Aquarium arbeiten möchte).
Ich konnte der Sache noch nicht ganz auf den Grund gehen, aber anscheinend gibt es in der Library, die die Buttons liest einen Bug. Jedenfalls hängt sich mein Arduino nach längerer Laufzeit neuerdings "spontan" auf. Und das nicht wie bisher gewohnt mit einem fulminanten Reboot, sondern einfach, indem er still und leise stehen bleibt. Solche "Einfrierer" sind viel weniger angenehm als spontane Reboots. Ich habe ja schon früher meine Angst davor zum Ausdruck gebracht: Alles bleibt so stehen, wie es war, das Licht bleibt an (oder aus), die Düngerpumpe pumpt dauernd (oder nie wieder). Nicht gut fürs Aquarium.
Selbstverständlich ist es wichtig, solchen Einfrierer auf den Grund zu gehen und sie zu beheben. Wir können aber nie ganz sicher sein, dass unser Projekt nach einigen Tagen Laufzeit nicht plötzlich stehenbleibt. Z.B. stösst der millis() Zähler nach 49 Tagen an seine Grenzen, oder ein Sensor schickt plötzlich unerwartete Daten - was passiert dann?
Glücklicherweise hat der Mikrocontroller des Arduino einen eingebauten Mechanismus, um Einfrierer zu erkennen und den Arduino neu zu starten. Der kleine Aufpasser heisst passenderweise "Watchdog" (Wachhund) und leider ist er im Arduino-Projekt gar nicht so gut dokumentiert. Dennoch ist die Integration in einem ersten Schritt ganz einfach. Die nötigen Definitionen erhält man durch den Import folgender Library:
In setup() kann der Wachhund dann scharf gemacht werden:
Die Konstante (WDTO_8S) sagt, wie lange der Wachhund eine ausbleibende Antwort des Arduino tolerieren soll, bevor er einen Reset auslöst (in meinem Fall probehalber mal 8 Sekunden). Andere Werte finden sich online.
Nun muss der Arduino seinem Wachhund natürlich regelmässig sagen, dass er noch zuverlässig arbeitet. Am Besten mit dieser Programmzeile an erster Stelle im Loop:
So, nun sollte der Controller nicht mehr stehen bleiben, geschehe was wolle. Ich berichte dann
. Hier ein
gehaltvoller Beitrag zum Watchdog und zu den vielen Möglichkeiten, die er sonst noch bietet.
Beste Grüsse
Chris