Code Erklärung

Arduino

  • Aufsetzen der WiFi-Verbindung
  • Steuerung der Sensoren
  • Steuerung der Pumpe und der Lüfter
  • Steuerung der Lampe
  • Automatisches Warnsystem des Wassertanks

Aufsetzen der WiFi-Verbindung

Um eine dauerhafte WiFi-Verbindung zu gewährleisten, wird innerhalb einer Schleife regelmäßig die Verbindung überprüft. Gibt der boolean “WL_CONNECTED” den Wert “false” an, wird ein neuer Verbindungsversuch initialisiert, wofür wir das WiFiMulti-Paket benutzen. Dieses Paket ermöglicht es dem Programm auf dem Microcontroller, sich mit einer verfügbaren WiFi-Verbindung zu verknüpfen, indem man den Namen der Verbindung und das entsprechende Passwort in der Methode “WiFiMulti.addAP(“WiFiName”,”WiFiPasswort”);” einträgt. Es ist durchaus möglich dies mehrmals hintereinander aufzurufen, um die Verfügbarkeit verschiedener Netzwerke zu überprüfen.

Programmausschnitt 1: Aufsetzten der WiFi-Verbindung

Ansteuerung der Sensoren

Mithilfe des “#define DHTPIN”-Befehls, sind wir in der Lage, die einzelnen Pins unseres Microcontrollers anzusteuern, wodurch wir über die Kontrolle der Stromzufuhr sowie der übermittelten Daten verfügen. In einer Schleife fordern wir nun mithilfe eines lokalen Warte-Befehls alle fünf Sekunden die Messdaten unserer Sensoren an (z.B.: “readTemperature();”) und speichern diese in float-Variablen ab. Diese Variablen werden automatisch alle 24 Stunden über eine MQTT-Verbindung an unseren Discord-Server übertragen.

Programmausschnitt 2: Ansteuerung des Temperatursensors

Steuerung der Pumpe und der Lüfter

Die Steuerung der Pumpe und der Lüfter unterscheidet sich nicht großartig. In beiden Fällen werden in einer Schleife die Messwerte der entsprechenden Sensoren ausgelesen, also Bodenfeuchtigkeit für die Pumpe und Lufttemperatur für die Lüfter. Befinden sich die ausgelesenen Werte in dem von uns geprüftem kritischen Bereich, steuern wir die Pins an, an denen Pumpe bzw. Lüfter angeschlossen sind, wodurch diese in Betrieb genommen werden. Die Pumpe wird automatisch nach einigen Sekunden wieder ausgestellt und betritt für kurze Zeit einen Ruhemodus, um eine Überwässerung zu vermeiden. Die Lüfter hingegen laufen solange weiter, bis sich der Wert für die Lufttemperatur wieder stabilisiert hat. An besonders heißen Sommertagen führt dies dazu, dass die Lüfter durchaus 24 Stunden lang aktiv sein können.

Programmausschnitt 3: Steuerung der Pumpe

Steuerung der Lampe

Es ist uns bisher nicht gelungen ist die Lampen sicher über ein ESP32 zu steuern, da die Lampe bei einer Leistung von 60W läuft, die unseren MOSFET bzw. andere Teile unseres Systems überlasten würde. Wann die LED leuchtet, ist von einer Zeitschaltung abhängig, welche bereits implementiert ist. Diese läuft nach einem festen Stundensatz, da Sonnenlicht alleine nur in seltenen Fällen ideal ist. Das Steuern der LED gehört definitiv zu einem der wichtigsten Ziele, die wir uns für die Zukunft unseres Projektes gesetzt haben.

Automatisches Warnsystem des Wassertanks

Das Warnsystem für den Wassertank wurde implementiert, indem wir wieder in einer Schleife die Messwerte unserer Wassersensoren auslesen und bei der Rückgabe eines negativen Werts eine Warnmeldung an unseren MQTT-Server schicken.

Programmausschnitt 4: Initialisierung der Wassersensoren
Programmausschnitt 5: Auslesen der Wassersensoren

Der vollständige Programmcode unseres Projekts ist hier verfügbar:
Smart-Home-Automatic-Blumentopf/SHAB_-_15_-_Finaler_Code.ino at main · TimDenker0/Smart-Home-Automatic-Blumentopf (github.com)

NodeRed

Unser Plan für unser NodeRed-Teilprojekt war es, eine MQTT-Verbindung zu unserem Microcontroller herzustellen, um unsere Messdaten abzurufen. Diese sollten dann über einen Discord-Bot alle 24 Stunden auf unseren Discord-Server gepostet werden, sowie auf Kommando abrufbar sein. Den Bot zu erstellen ging vergleichsweise leicht und ohne große Hürden, auf NodeRed konnten wir die entsprechenden Knoten mithilfe der Bot- und Kanal-ID verknüpfen, sodass wir bereits nach einer Stunde in der Lage waren, per Knopfdruck Nachrichten über unseren Bot zu verschicken.

Empfang und Verarbeitung der Daten des ESP32

Auf dem Bild ist zu erkennen, wie die einzelnen Sensoren jeweils als MQTT-in-Nodes realisiert wurden. Sobald Werte empfangen werden, werden diese durch Funktions-Nodes mit der jeweiligen Präfix benannt und bei der Luftfeuchtigkeit und Temperatur noch ein Prozentzeichen (%) bzw. ein Grad Celcius (°C) hinzugefügt. Anschließend werden diese durch ein Join-Node zu einem String zusammengefasst und anschließend in einer Variable gespeichert und zusätzlich in dem Debug-Fenster ausgegeben.

Discord Command-Erkennung und Ausgane der Daten

Um diese Variable mit unseren Sensordaten dann an Discord zu schicken, verwenden wir den Befehl “!status”, indem wir erstmal mit dem discordMessage-Node die gesendete Nachricht empfangen und dann mit einem change-Node prüfen, ob der gesendete payload “!help” (Ein Befehl, der alle Befehle auflistet) oder “!status” enthält. Ist dies nicht der Fall, gibt der Bot die Nachricht und eine Fehlermeldung zurück. Findet er in der Nachricht allerdings “!status”, so wird der payload so abgeändert, dass der ESP32 weiß, dass er jetzt Daten schicken muss und diese werden per MQTT-out-Node an den Microcontroller gesendet. Dieser sammelt dann die Daten; diese werden durch die oben gennante Auswertung in Variablen gespeichert. Da dies oft unterschiedlich lange gebraucht hat, haben wir noch eine 20 Sekunden Verzögerung eingebaut, da es sonst dazu gekommen ist, dass die Variablen noch nicht upgedatet waren und die alten Werte erneut ausgegeben wurden. Nach der Verzögerung wird der Bericht aus der Variable an den discordMessageManager-Node geschickt und darüber vom Bot in den Discord-Channel gepostet. Um neue Nutzer aufgrund der Verzögerung nicht zu verwirren, schickt der Bot zudem eine Nachricht, in der auf die Verzögerung bis zur vollständigen Übermittlung hingewiesen wird.

Empfang des Wasserstand-Alarms

Außerdem gibt der Bot automatisch eine Alarm-Meldung aus, wenn der Wasserstand unter 1/3 bzw. unter 1/6 des maximalen Tankvolumens ist. Dies wurde ähnlich wie die Sensordaten realisiert, nur das wir hier kein Join-Node benötigen, da immer nur eine Warnmeldung ausgegeben werden soll. Entweder ist der Tank unter 1/3 oder 1/6 seiner Kapazität. Diese Warnung wird genau so wie die Statusabfrage über den discordMessageManager-Node in den Discord-Channel geschickt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*