Bodenfeuchtesensor mit langer Akkulaufzeit

WiFi-Bodenfeuchtesensor und langer Laufzeit

WiFi-Bodenfeuchtesensor  und langer Laufzeit

Wir benötigen folgende Teile:

- einen ESP8266-basierenden Mikrocontroller (NodeMCU oder WEMOS D1 mini)

- einen Low-Drop-Spannungsregler (MCP1700)

- Firmware für den Mikrocontroller

- einen 18650-Li-Ion-Akku

- einen Akku-Halter

-einen kapazitiven Bodenfeuchte-Sensor

 

Wenn man alles einfach so zusammenstecken würde, wäre der Akku nach 2-3 Tagen leer. Das ist in der Tatsache begründet, dass der ESP8266 durch das integrierte WLAN bis zu 70mA, beim Senden sogar kurzzeitig bis zu 700mA Strom aufnehmen kann.

Also müssen wir einen Weg finden, die Stromaufnahme auf ein Minimum zu reduzieren. Das ist aber mit ein paar Handgriffen erledigt.

Eine NodeMCU besitzt meistens einen AMS1117-Spannungsregler. Dieser wandelt die 5V Versorgungsspannung des USB-Port auf 3,3V für den Mikrocontroller. Da dieser Spannungswandler aber einen typischen Spannungsfall von 1,2 - 1,4V vorweist, ist er für unsere Zwecke ungeeignet. Der Akku liefert nämlich eine Spannung von 3,7V und der ESP8266 benötigt mindestens 3,0V Betriebsspannung. Bei vollem Akku würden daher nur etwa 2,3-2,5V zur Verfügung stehen und daher würde der Chip nicht starten. 

Wir entfernen den Spannungswandler daher und ersetzen ihn durch einen Low-Drop-Regler. Wir haben uns für den MCP1700 entschieden. Dieser besitzt eine Dropout-Spannung von typisch nur 0,15V. Das heißt, dass die Akkuspannung bis auf 3,15V fallen kann und der ESP8266 immer noch im normalen Bereich arbeiten kann.

Dieser Schritt ist bei einem WEMOS D1 Mini nicht notwendig, da dieser bereits einen Low-Drop-Spannungsregler besitzt!

Dazu löten wir den MCP1700 wie folgt auf: Pin 1 des MCP1700 auf Pin 1 des AMS1117, Pin 2 des MCP1700 auf Pin 3 des AMS1117 und Pin 3 des MCP auf das große Pad des AMS1117. Mit ein wenig Biegen der Pins sieht das Ergebnis etwa so aus:

AMS1117_MCP1700

 

Spätestens jetzt sollte die Firmware auf den Controller geflasht werden. Wir nutzen dazu eine modifizierte Tasmota-Variante, welche auf Github heruntergeladen werden und kompiliert werden muss. Es muss darauf geachtet werden, nach dem Kompilieren mit "Atom" die Tasmota-Sensors-Variante zu benutzen, da in dieser der Analogport freigeschaltet ist!

Update: Tasmota unterstützt den Deepsleep jetzt nativ. es kann auch die normale Version mit Analog-Unterstützung genutzt werden.

Nun ist es Zeit, weitere unnütze Verbraucher von der NodeMCU zu verbannen. Dies ist in erster Linie der USB-Seriell-Konverter-IC, den wir nach dem Flashen nicht benötigen. Dazu kann er entweder komplett entfernt werden oder man durchtrennt mit einem scharfen Cuttermesser die Stromversorgung des Chips. In unserem Fall ist ein CH340G verbaut und die Spannungsversorgung liegt auf Pin 19 des Chips. Also trenne wir diesen mit einem vorsichtigen Schnitt. Natürlich kann der Pin auch abgelötet und etwas hochgebogen werden. Sollte man eine neue Firmware aufspielen wollen,kann man den Pin wieder mit dem Pad verbinden oder alternativ direkt über die Pins TX und RX flashen.

Nun können Akkuhalter und Bodenfeuchtesensor angeschlossen werden. Dazu verbinden wir den roten Draht des Akkuhalters mit dem Pin 3V der NodeMCU und den schwarzen Draht mit G. Da die NodeMCU mehrere solche Anschlüsse besitzt, ist das Verbinden des Sensors kein Problem: der schwarze Draht wird an "G" angeschlossen und der gelbe Draht an "A0". Normalerweise würde man den roten Draht an einen freien "3V"-Anschluss anschliessen, dies tun wir aber nicht. Wir verbinden ihn mit "D1" und das aus folgendem Grund:

Der Sensor verbraucht laut Datenblatt bis zu 5mA. Das würde allerdings unsern Akku unnötig belasten. Der Sensor soll nur seine Betriebsspannung bekommen, wenn er mißt, im Tieflschlaf jedoch nicht. Daher wird er mit "D1 verbunden, da der ESP8266 im Tiefschlaf, welchen wir nutzen, diesen Pin definiert abschaltet. Das ist übrigens nicht bei allen Pins der Fall. Manche besitzen einen undefinierten Zustand wenn der Chip schläft.  

Tip zur Verdrahtung: Der Sensor kam bei uns mit einem 3-poligen Stecker. Dieser ist aber ungeeignet, um den Sensor an die NodeMCU anzuschliessen, da sich die notwendigen Pins nicht nebeneinander befinden. Daher haben wir die Pins mit Hilfer einer Nadel aus dem Steckergehäuse entfernt und in die Gehäuse von Jumperkabeln, wie man sie von Steckbrettern kennt, wieder eingesteckt. So ist man in der Verdrahtung frei und kann den Sensor direkt ohne zu Löten anstecken.

Nun verbinden wir mit einer Drahtbrücke "RST" mit "D0", da damit der ESP8266 später per Software aus dem Tiefschlaf geweckt wird.

Die modifizierte Tasmota-Version beinhaltet eine Funktion, mit welcher man den Tiefschlafmodus abschalten kann. Da wir nur alle paar Stunden einen Wert erhalten wollen und der Chip etwa 15 Sekunden für die Übertragung online ist, finden wir das sehr praktisch. Dazu kann z.B. über einen Schalter und einen in Reihe geschalteten 10kOhm-Widerstand ein GPIO-Pin auf GND gelegt werden. Ist dies der Fall, schläft der ESP nach der Übertragung wieder ein, ist der Pin nicht auf GND gelegt, z.B. wenn der Schalter geöffnet ist, dann bleibt der Chip online und kann umkonfiguriert werden.

Das Ergebnis sieht dann wie auf dem folgenden Bild aus:

NodeMCU_verdrahtet  Schema_Feuchtesensor

Der Widerstand im unteren Bereich ist für das Zu- und Abschalten des Tiefschlafmodus gedacht und wurde später um den o.g. Schalter erweitert.

Jetzt kann der Akku eingesetzt und die Tasmota-Firmware konfiguriert werden:

Zuerst verbinden wir uns mit dem Accesspoint, den die Firmware der NodeMCU öffnet und geben SSID und Passwort unseres WLAN-Netzwerkes ein. Das geht ganz einfach mit einem Mobiltelefon. Das Netzwerk besitzt immer den namen "sonoff-xxxx" bzw "tasmota-xxxx", wobei "xxxx" die vier letzten Stellen der MAC-Adresse des Chips sind. Der Controller ist wie immer bei Tasmota unter der Adresse 192.168.4.1 erreichbar.

Nach dem Speichern der Einstellungen verbindet sich der Controller mit dem heimischen Netzwerk und bezieht automatisch eine IP-Adresse. Diese kann in den Netzwerkeinstellungen des Routers in Erfahrung gebracht werden.

Nun können wir uns mit Hilfe der zugewiesenen IP-Adresse mit einem Browser direkt zur NodeMCU verbinden. Als Erstes muss hier zu "Configuration" > "Configure Module" navigiert werden. Dort stellen wir als Modul oben "Generic" ein. Nach dem Speichern der Einstellung mit einem Klick auf "Save" startet der Controller neu und übernimmt die Einstellungen. Anschliessend stellen wir im gelichen Menü wie eben den Pin "D4" auf "Deepsleep Switch" ein, um das Zu- und Abschalten des Tiefschlafmodus zu ermöglichen und "D1" als "Relais1" um die Spannungsversorgung des Sensors schalten zu können:

Configuration_1

Anschliessend speichern wir die Einstellungen wieder mit einem Klick auf "Save".

Sollte alles korrekt angeschlossen sein, kann man schon den Wert des analogen Ports sprich des Sensors sehen, welcher sich je nach Feuchte zwischen 0 und 1024 bewegt. Testen kann man das Ganze, indem man den Sensor an der aktiven Fläche berührt und im Browser die Änderung des Analogwertes beobachtet. Ausserdem sollte jetzt bei Betätigen des "Toggle"-Buttons im abgeschalteten Zustand ("OFF") der Analogwert "0" anzeigen.

 

Nun kann auch die MQTT-Verbindung konfiguriert werden, damit der Controller seine Daten auch an ioBroker schickt.

Jetzt wechseln wir zurück ins Hauptmenü ("Main") und kümmern uns um das Feintuning. Wenn der Mikrocontroller aus dem Tiefschlaf erwacht, wird ein Reset ausgeführt. Das bedeutet, dass sämtliche vorherigen Zustände gelöscht sind. Der Zustand des Relaisausganges wird zwar im Flash-Speicher gesichert, aber wir wollen dass der Ausgang "D1" beim Erwachen Spannung führt und den Sensor versorgt. Um dies zu erreichen, schalten wir den Ausgang D1 über den "Toggle"-Button ein und wechseln zur "Console". Dort definieren wir jetzt die Zeitspanne, wie lang der Controller schlafen soll. Mit dem Befehl "DeepSleepTime xxx" wird die Zeit in Sekunden angegeben. Eine Eingabe von "DeepSleepTime 86400" würde also den Controller genau einmal am Tag aufwachen und messen lassen. Anschliessend geben wir in der Eingabezeile "SaveData 0" ein. Das bewirkt, dass keine Änderung des Schaltzustandes mehr im Flash gespeichert wird und beim Aufwachen der Pin "D1" sofort eingeschaltet wird und die Versorgungsspannung an den Sensor weitergibt. Ausserdem wird so verhindert, dass der Sensor keine Spannung erhält, sollte man versehentlich beim Konfigurieren den Toggle-Button betätigt haben.

UPDATE: Anstatt den Toggle-Button auf ON und SaveData 0 zu setzen genügt es jetzt auch, den Befehl "PowerOnState 4" in der Tasmota-Konsole abzusetzen. Dieser bewirkt, dass der Ausgang für die Spannnungsversorgung des Sensors (D1) beim Start / Aufwachen des Controllers immer auf EIN gesetzt wird.

 

Nun kann die Hardware in ein entsprechendes Gehäuse eingebaut werden. Wir haben eine kleine Feuchtraum-Abzweigdose mit den Maßen 40x80mm genutzt,diese am Boden eingeschlitzt,den Sensor durchgesteckt und danach mit handelsüblichem Silikon abgedichtet,damit durch den Schlitz keine Feuchtigkeit zur Elektronik gelangen kann.

Bodenfeuchtesensor_offen     Bodenfeichtesensor_geschlossen

 

Im Tiefschlaf haben wir nach dem Umbau eine Stromaufnahme von ca. 0,24mA gemessen. Wenn man die Aufwachzeit von 15 Sekunden berücksichtigt, sollte ein 2000mAh-Akku etwas mehr als 6 Monate halten, abhängig von der Häufigkeit der Messung.

Jetzt kann mit dem Sonoff-Adapter in ioBroker der Wert als Datenpunkt ausgelesen und weiterverarbeitet werden.

Analog_ioBroker

 

Viel Spass beim Nachbauen!