IoT-Sensorknoten

2017 — 2018
Eigentlich brauche ich keine Sensoren überall in der Wohnung — aber das kann doch ein nettes Projekt werden, um mal wieder etwas zu programmieren und etwas über die ESP8266- und ESP32-Chips und deren Low-Power-Optionen zu lernen. Somit entstand die Idee zu einem Sensorknoten für Temperatur und Luftfeuchtigkeit, der Batteriebetrieben mindestens 3 Monate durchhalten soll. Drei Monate ergeben sich dadurch, dass ich keine Lust habe öfter die Batterien oder Akkus zu wechseln.
Angefangen habe ich also mit einem ESP8266 (LoLin-Board) und einem Si7021-Sensor. Die DHT21/DHT22-Sensoren waren mir zu teuer und einen Si7021 hatte ich halt irgendwann mal bestellt. Also nun alles auf einem Breadboard zusammenstecken und Code schreiben. Nachdem alles funktioniert hat und es darum geht die Stromaufnahme maximal zu reduzieren, muss alles raus, was nicht unbedingt benötigt wird. Also habe ich den ESP8266 einzeln bestellt und die Spannungsversorgung selbst gebastelt. Mehr dazu später.

Der Plan war nun drei Sensorknoten zu bauen, ich hatte aber schon nach einer Lochrasterplatine keine Lust mehr auf den Verdrahtungsaufwand. Also sollte eine eigene Platine her, da diese sehr günstig in China bestellt werden können. Nun aber erst einmal mehr zur geplanten Funktionsweise:

Elektrische Grundidee

Die ESP-Chips haben eine sehr hohe Stromaufnahme, wenn das WLAN eingeschaltet ist. Aber auch mit abgeschaltetem WLAN wird noch zu viel Energie benötigt, um einen Batteriebetrieb zu ermöglichen. Dafür gibt es aber den Deep-Sleep-Modus, in dem der Chip eine bestimmte Zeit schläft und danach automatisch wieder aufwacht.
Die Energieversorgung sollte mit einem Li-Ion-Akku, wie sie auch in Notebookakkus zu finden sind (Baugröße 18650) verwendet werden. Diese bieten eine Spannung von nominell 3,7 V (min. 2,5 V bis max. 4,2 V). Die Wahl fiel auf einen Li-Ion-Akku, da zwei “normale” NiMH-Akkus nicht ausreichen und drei NiMH-Akkus eine Spannung 3,6 V (min 3 V bis max. 4,5 V) leifern. Da der ESP eine Spannung von nominell 3,3 V (min. 3,0 V bis max. 3,5 V) benötigt, müsste bei der Verwendung von NiMH-Akkus eine höhere Spannungsdifferenz in einem Spannungsregler vernichtet werden. Die Energie der Akkus würde also weniger gut genutzt. Außerdem brauchen drei AA-Akkus auch mehr Platz, als ein 18650-Akku.

In der ersten Iteration wurde eine Diode eingesetzt, um einen “konstanten” Spannungsabfall von 4,2 V − 3,5 V = 0,7 V zu erreichen. Bekanntlich hat eine Standard-Diode nämlich einen Forward-Volate-Drop von ca. 0,7 V. Dies wäre die Keep-It-Simple-Methode, die in der ersten Iteration auf der Lochrasterplatine auch gut funktioniert hat. Mit dem ESP32 auf dem selbst entworfenen PCB sah es aber schon anders aus. Da war ja nämlich noch etwas mit der Diodenkennlinie, die in der Realität dann doch nicht so ideal verläuft, wie man es gerne hätte.

Datenfluss

Der Sensor sammelt Daten und sendet diese in einem Intervall von 30 Minuten an eine Datenbank. Die Datenbank sollte auf Zeitserien (Time series) spezialisiert sein da es sich bei den Daten offensichtlich um Zeitserien handelt und dadurch die Datenabfrage vereinfach wird. Die Wahl fiel dabei auf InfluxDB, da diese im Gegensatz zu Graphite die Möglichkeit bietet Nutzern nur begrenzten Zugriff auf bestimmte Datenbanken zu geben.
Die Datenbank liegt dabei auf einem Raspberry Pi, der im lokalen Netz über HTTP erreichbar ist. Nach außen wird jedoch nur eine HTTPS-Schnittstelle durch die Firewall offengelegt. Als HTTPS-Proxy wird dabei ein Caddy-Webserver verwendet, da dieser sich automatisch die TLS-Zertifikate von Let's Encrypt besorgt.

Die Darstellung erfolgt “klassisch” mit Grafana. Dies ist ein Dashboard-Tool, welches viele verschiedene Datenquellen nutzen kann. Da mein Raspberry Pi zu Hause jedoch schon mit anderen Aufgaben gut belegt ist und ich das Dashboard auch von außerhalb nutzen möchte, liegt dieses auf einem gehosteten Server (VPS Cloud Server von Hetzner, Grafana Docker Container).

Da für den Betrieb auch der Akku-Ladezustand wichtig ist, werden nicht nur Luftfeuchtigkeit und Temperatur übermittelt, sondern auch die Batteriespannung in Prozent (zwischen Voll und Leer), sowie zu Debugging-Zwecken auch die rohe Integer-Zahl der ADC-Messung.

Probleme mit dem ersten PCB

Da ich die erste PCB-Version unter Zeitdruck erstellt habe und außerdem den Aufbau mit dem ESP32 nicht vorher getestet habe, sind natürlich ein paar Fehler nicht ausgeblieben.
Es beginnt damit, das die Löcher für den Batteriehalter zu klein waren und endet damit, dass es keine Schalter gab, um zwischen den zwei Boot-Modi des EPS32 umzuschalten. Je nach Zustand des GPIO0-Pins startet der ESP nämlich in den Code oder in den Modus zum Aufspielen eines neuen Programms.
Da ich mit mittlerweile nun doch ein Oszilloskop gekauft hatte, konnte ich auch den Spannungsverlauf sehen, welcher mich dann an das Problem mit der Diodenkennlinie erinnert hat. Ich hatte auch einfach nur auf git Glück eine 1N4001 verwendet, die ich noch auf Lager hatte.
Außerdem kann der ESP32 im Gegensatz zum ESP8266 nicht mehr seine eigene Versorgungsspannung mit seinem ADC messen. Daher ist ein externer Spannungsteiler nötig.

Der prinzipielle Aufbau hat jedoch funktioniert und das Modul konnte durch ein paar kleine Änderungen in Betrieb genommen werden. Dennoch habe ich eine neue Version erstellt um beispielsweise nun doch einen Spannungsregler verwenden zu können.

PCB v2.0

Die zweite PCB-Iteration bietet ein paar Variationsmöglichkeiten bei der Spannungsversorgung und beim Sensor.
Da der Sensor auf seiner eigenen Platine auch wieder einen Spannungsregler mitliefert, der aber eigentlich nicht benötigt wird, soll dieser auch noch verschwinden. Dafür bietet die Platine die Möglichkeit den Sensor direkt auf der Rückseite aufzulöten. Falls das nicht funktionieren sollte steht aber weiterhin ein Stecker für die fertig gekaufte Sensorplatine zur Verfügung.
Auch bei der Spannungsversorgung sind zwei Möglichkeiten vorgesehen. Da die Diodenkennlinie doch nicht so steil ist, wie erhofft, kann alternativ zur Diode ein Spannungsregler eingesetzt werden. Dafür wurde der TC1262-3.3V von Microchip ausgewählt, da dieser explizit für Batterie-betriebene Geräte ausgelegt ist und nur sehr wenig “Leckstrom” im Leerlauf aufweist. Der Akku sollte sich also im Ruhezustand hauptsächlich durch den ESP32 und nicht durch den Spannungsregler entladen.
Für die Spannungsstabilisierung sind zwei Plätze für große Elektrolyt-Kondensatoren eingeplant, die hoffentlich nicht benötigt werden. Bei der Diode waren diese aber nötig, wenn das Einschalten des WLAN-Radio zu einer Stromspitze geführt hat, die wiederum aufgrund der Diodenkennlinie zu einem Spannungseinbruch führte.

Repository und aktueller Stand

Der aktuelle Stand ist, wie immer wenn es bei mir um Code geht, in einem Git-Repositoy zu finden. Diese Mal jedoch nicht auf Github, sondern auf meinem eigenen (neuen) Git-Server. esp32-sensornode