Der Arduino-Code benötigt viele Speichervariablen, insbesondere für die Speicherung des Wasserkonsums. Dazu kommen viele Thresholds und Konstanten, die über den Compiler-Befehl #define erstellt werden. Diese werden hauptsächlich für das Takten der Methoden und die Auslesung der Wassermenge verwendet und deshalb später noch erwähnt.
Zusätzlich wird das SPIFFS-System für den Zugriff auf den Flash-Speicher benutzt, damit die Konsumdaten über Sessions hinweg gespeichert werden können.
Zudem wird eine Menge Management für Discord und die Webseite benötigt, beispielsweise der TimeClient zum Auslesen der Uhrzeit aus dem Internet.

Es gibt außerdem diverse Hilfsmethoden beispielsweise zum Anpassen der Datenstruktur an den neuen Tag, Senden von Discord-Nachrichten und Konvertieren von Daten in eine vom Webserver lesbare Form.

In der init() – Methode werden nun die oben genannten Konzepte initialisiert. Zudem werden die gespeicherten Daten vom Flash-Speicher den Variablen zugewiesen. Bei Variablenänderungen während der Laufzeit wird dann sowohl in den Flash-Speicher und die Variablen gespeichert, um die Zugriffszeit des Flash-Speichers zu umgehen. Zudem wird der Server gestartet; dieser läuft danach unabhängig von der loop() – Methode auf Anfrage. Genauere Informationen hierzu sind in der Dokumentation des Webservers zu finden.

Innerhalb der loop() – Methode befindet sich an erster Stelle die Logik für das Versenden der Discord-Nachrichten. Diese benutzen, wie auch die später folgende Gewichtsleselogik, eine Speichervariable mit Systemzeit des letzten Zugriffs, damit die Methode nur nach festen Intervallen fortgeführt wird. Sind die notwendigen Bedingungen erfüllt, die von der Tageszeit und der Wassermenge abhängen, wird über Discord eine Nachricht gesendet, die den Nutzer zum Wasserkonsum auffordert.

Discord-Bot informiert über den restlichen Wasserbedarf.

Danach wird das Gewicht in drei Modi ausgelesen. Im Normalmodus wird die Gewichtsdifferenz in das Speichersystem übertragen und auf den Tagesstand addiert. Steigt das Gewicht, so wechselt das Programm in Modus 1. Nach einer Wartezeit, während der das restliche Programm weiterlaufen kann, wird wieder das Gewicht gemessen: Ist das Gewicht immer noch höher als bevor das Programm in Modus 1 gesprungen ist, wird in Modus 2 weitergemacht, ansonsten in Modus 0. Hiermit können kurzzeitige Spikes, die beispielsweise beim Absetzen verursacht werden, aussortiert werden.
In Modus 2 wird dann darauf gewartet, dass das Gewicht nicht weiter steigt. Danach gilt der Auffüllvorgang als abgeschlossen und es wird in Modus 0 weitergemacht.

Modellierung der Ausleselogik durch einen Automaten

Als nächstes werden die LEDs angesteuert. Der Modus ist fest gesetzt, da keine Einstellungsmöglichkeit implementiert wurde. In diesem wird der Füllstand der Flasche durch das Verhältnis der angeschalteten Lampen visualisiert. Es wurden jedoch auch Modi für ein simples RGB-Muster sowie ein Regenbogenmuster implementiert.

Categories:

Tags:

Comments are closed