WLAN fähigen Sensor bauen mit ESP8266

Worum gehts?

Ich möchte Messerwerte – hier Temperatur und Luftfeuchtigkeit – mit einem batteriebetriebenen Sensor per Funk auf einen Raspberry Pi übertragen, dort auswerten, darstellen und darauf basierend eine Aktion auslösen, z.B. einen Lüftungsventilator anschalten.

Es war einmal…

Vor einiger Zeit gab es einmal einen Hersteller von günstigen und relativ einfach in die Pi Landschaft zu integrierenden 433/886MHz Funk-Sensoren – Ciseco WirelessThings. Leider gibt es diese Firma nicht mehr – von Heuschrecken gekauft und ausgesaugt. Auch die WirelessThings Sensoren sind nicht mehr erhältlich.

Auf der Suche nach Alternativen bin ich dann auf ESP8266 basierende Module gestoßen; Wifi bzw. WLAN tauglich und zudem Arduino kompatibel.

Exkurs: Arduino vs. Raspberry Pi

Arduino ist eine ganze Familie von Microcontrollern meist auf Basis von Atmel Prozessoren. Im Gegensatz zum Raspberry Pi, der ja ein richtiger Allround Computer ist, sind Microcontroller etwas einfacher gestrickt, dabei aber sehr vielseitig und für alle möglichen Einsatzzwecke programmierbar. Allerdings sind sie dann auch nur für diesen einen Zweck  verwendbar, da der Microcontroller immer nur ein Programm ausführt. Der Prozessor ist um einiges langsamer, der Speicher sehr beschränkt, da z.B. ein Arduino aber nicht den Ballast eines universellen Betriebssystems mit sich rumschleppen muss, ist er trotzdem recht schnell.

Programmieren

Hierzu gibt es genügend Anleitungen im Intenet – deshalb nur das die wesentlichen Unterschiede zum Programmieren auf dem Rasperry Pi:

Arduinos können mit einer abgespeckten Variante der Sprache C programmiert werden. Dazu wird am besten das Arduio IDE (Integrated Development Environment) verwendet. Alternativ haben die ESP8266 auch den Dialekt „Lua“ drauf.   Eine schöne Anleitung zur Installation für beide Varianten gibt es bei Adafruit.  Ich verwende hier das Arduino IDE.

Die Installation nach der Adafruit Anleitung oder einer anderen Anleitung unbedingt durchführen – das gilt auch für andere Boards. Wichtig ist vor allem die Installation des Board-Treibers sowie der ESP8266 Libraries.

In der Adafruit Anleitung sind auch zwei Beispiele zum Kennenlernen. Ferner gibt es in den Library Bibliotheksverzeichnissen, die auf dem PC angelegt werden, jede Menge guter Code Beispiele und Vorlagen.

Es gibt auch eine für Raspberry Pi Fans sehr naheliegende Programmiersprache namens Micropython, die auch für den ESP8266 geeignet ist. Sobald ich mich damit näher beschäftigt habe, schreibe ich etwas darüber.

Der Arduino Programmcode – genannt Sketch – wird auf dem PC mit dem IDE erstellt, dort kompiliert und über USB beim PC und die serielle Schnittstelle des Microcontrollers übertragen. Je nach Variante passiert das über die RX/TX Pins des Controllers oder über den darauf befindlichen Micro USB Anschluss, was wesentlich komfortabler ist.

Ist der Code erst einmal auf dem Controller – und funktioniert – arbeitet der Controller autark. Liegt 3,3 V Spannungsversorgung an, startet er und führt das überspielte Programm aus.

Der Programmcode besteht aus mindestens zwei Teilen: einem einmal zum Start durchlaufenen Teil „Setup“ und einer anschließend unendlich oft durchlaufenen Schleife namens „Loop“

Jede Codezeile zwischen den geschweiften Klammern endet in der Regel mit einem Semicolon ;

Der Befehl „void“ hat mich vom Namen her anfänglich irritiert. „Void“ als Adjektiv heißt „ungültig“. Ungültiger Code?? „Void“ bedeutet aber als Substantiv „Hohlraum“ und das könnte passen, denn in den Hohlraum zwischen den geschweiften Klammern wollen wir ja unseren Code einfüllen. Beide Teile müssen zwingend vorhanden sein, sonst gibt es einen Compilerfehler. Wenn man – wie in meinem Bespiel – den „loop“ Teil nicht braucht, einfach leer lassen.

Die Syntax ist gefühlt eine Mischung aus Python und PHP und nicht all zu schwierig. Variablendeklarationen sind penibel zu beachten, die Verkettung von Strings etwas sperrig, aber sonst gehts.

Welche Produkte gibt es?

Das Angebot ist vielfältig

  • Bare Bones Modul (3€ -7,5€ bei Watterott.com  oder Reichelt) vielleicht etwas fummelig zu verwenden aber Platz sparend.
  • NodeMCU ESP8266  (ca. 7,50€ – 9€) erhältlich bei Reichelt oder AZ-Delivery – mit Micro USB Anschluss als Programmierschnittstelle zum PC, mehreren GPIO Pins, Analog Pin, I2C und SPI Schnittstellen.
    AZ-Delivery sitzt in Niederbayern und vertickt China Ware, hat ein großes Angebot an Microcontrollern nebst Zubehör, ganz gut gemachte Anleitungen als eBooks, spamt leider sehr stark mit nervigen „Newslettern“ die man zum Glück auch abbestellen kann.
  • oder die High End Version Adafruit Feather Huzzah ESP8266 ab 19€ bei The Pi Hut. Diese Version hat zusätzlich einen Anschluss für einen LiPo Akku, der automatisch geladen wird, wenn USB verbunden ist und eine On Board LED auf GPIO #0.  Außerdem geht das Teil automatisch in den Programmiermodus sobald das Arduino IDE Daten schickt – sehr praktisch. Außerdem ist es CE und FCC zertifiziert – bei vielen anderen ist das nicht so, vor allem wenn sie aus dem Reich der Mitte kommen.
    The Pi Hut mit Sitz in England hat ein sehr großes Angebot an Raspberry Pi Komponenten, vorbei schauen lohnt sich. Solange die Briten noch in der EU sind lohnt auch eine Bestellung, die Frachtkosten sind, wenn man mehrere Teile bestellt, erträglich.

All das gibt es auch bei Amazon, teils deutlich teurer, teils direkt aus China mit langer Lieferzeit.

Für diese Anleitung hier habe ich das Adafruit Feather Huzzah ESP8266 verwendet. Das NodeMCU geht natürlich genau so gut, allerdings ist die Pin Belegung des Boards etwas anders.

Was machen wir hier?

Das Prinzip

Im Netz findet man meistens Anleitungen, bei denen der Arduino (oder ein anderer Controller) die Temperatur etc. misst und diese dann selbst als Webserver darstellt. Diese Werte kann man dann per PHP auslesen und woanders weiter verarbeiten. Bei Batteriebetrieb ist das aber nicht sinnvoll, da der Controller die ganze Zeit wach ist und entsprechend die Batterie schnell leer ist.

Anders herum geht das wesentlich besser:

  • Huzzah (oder eben das Board, das ihr verwendet) soll starten,
  • eine WiFi Verbindung zum Router oder Access Point aufbauen,
  • mittels eines DHT22 Sensors  Temperatur und Luftfeuchtigkeit messen,
  • die Daten auf einem im LAN hängenden Webserver (Raspberry Pi) ablegen wo sie dann weiter verarbeitet werden.
  • Anschließend soll sich Huzzah für 30 Minuten schlafen legen und nach dem Aufwachen wieder von vorne loslegen.

Im Batteriebetrieb müsste ein so aufgebauter Sensor mehrere Monate durchhalten. Vielleicht sogar mit einer Knopfzelle.

Hardware

Der Sensor

Dieses Beispiel bauen wir auf einem Breadboard auf. Dafür brauchen wir:

  • einen ESP8266 Microcontroller (hier Adafruit Feather Huzzah)
  • einen DHT22 Feuchtigkeits- und Temperatursensor. DHT11 ginge auch, ist aber deutlich ungenauer,  zeigt nur ganze Grad Celsius an und außerdem keine Temperaturen unter dem Gefrierpunkt. Andere Sensoren z.B. auf I2C Basis gehen natürlich auch (BMP280 und dergleichen).
  • einen 10k Ohm Widerstand
  • 6 Steckbrett Kabel

Der Aufbau ist wie folgt – bei anderen Boards als dem Huzzah ist die Position der Pins möglicherweise anders:

Der DHT Sensor ist von links nach rechts wie folgt belegt:

  1. VCC – in unserem Fall 3,3V, er verträgt aber auch 5V – rotes Kabel am Steckbrett mit + verbunden
  2. Data Out – im Fritzing Diagramm blaues Kabel – mit GPIO #2 des Huzzah Bords verbunden
  3. nicht belegt
  4. Masse – schwarzes Kabel zur Masseleiste des Steckbretts.

Zwischen 1 und 2 des DHT kommt ein 4,7 kOhm bis 10kOhm Widerstand

Das Huzzah Board wird wie folgt verkabelt.

  • 3V mit der + Leiste
  • GND mit Masse
  • GPIO #2 mit Data Out des DHT Sensors
  • zwischen RST und GPIO #16 kommt eine Brücke (orange). Diese Brücke erst später stecken, wenn alles funktioniert. Sie dient dazu, den Controller zu resetten, wenn er nach dem Tiefschlaf wieder aufwacht.
    Bei Programmieren dürfen die beiden Pins nicht verbunden sein
    , sonst kommt es ggf. zu merkwürdigen Ergebnissen.

Das wars auch schon. Der Micro USB Anschluss wird mit einem USB Kabel mit dem PC verbunden.

Wenn alles funktioniert können wir das später auf eine Leiterplatte übertragen und in ein Gehäuse einbauen. Platz für Batterien oder LiPo Akku nicht vergessen. Sobald ich dazu komme das zu machen, schreibe ich etwas darüber.

Der Server

Da dies hier ja in erster Linie ein Raspberry Pi Blog ist, nehme ich an, du hast einen Pi, den du als Server hernehmen kannst. Dieser braucht einen Webserver (z.B. Lighttpd) sowie PHP.  Anleitungen, wie man das installiert, gibts im Web zuhauf.

Ich verwende  als Webserver den Lighttpd. Ferner muss noch PHP installiert sein. Raspbian Stretch braucht außerdem mindestens PHP 7.0. Bei Verwendung von Lighttpd ist die Installation unter Raspbian Stretch leider etwas kompliziert:
sudo apt-get install php7.0-fpm php-cgi .
Damit wird verhindert, dass die ganzen Apache Utilities mit installiert werden und so nutzlos die Speicherkarte vollschreiben.
Leider ist das noch nicht genug. Es müssen noch ein paar Einstellungen vorgenommen werden. Diese sind in folgender Website sehr gut beschrieben (ab Schritt 8). Außerdem ist dort noch beschrieben, wie man Lighttpd installiert.

Code

Huzzah Sensor

Ich habe mich auf das Nötigste beschränkt. Fehlerbehandlung und Komfortfunktionen wie „Akku leer“ Warnung habe ich weggelassen. Der einzige Luxus ist eine kleine Blink Routine, die anzeigt, dass sich das Board mit dem WLAN verbinden will. Das ist hifreich, um zu testen, ob die WLAN Signalqualität ausreicht.

Zum Testen die hervorgehobene Zeile ESP.deepSleep auskommentieren, sonst schläft der Controller bei jedem Durchlauf für die eingestellte Zeit – beim Debuggen eher hinderlich. Wenn alles sauber funktioniert und in Produktion gehen soll, den Wert z.B. auf 1800e6 setzen. Dann legt sich der Sensor für eine halbe Stunde schlafen.

Während des Deep Sleep braucht der Controller nur ca. 50 Mikroampere Strom. Das Einzige, was noch läuft ist der Timer. Ist die Zeit abgelaufen, wacht das Teil auf und resettet sich; das heißt, alles beginnt von vorne. Da die Routine nur jeweils einmal durchlaufen wird, reicht es, sie in den Abschnitt void setup()  einzutragen.

Will man den Controller manuell aus dem Tiefschlaf wecken, muss man die Brücke zwischen RST und GPIO #16 öffnen und die Reset Taste am Board drücken.

Server

Auch hier habe ich ganz bewusst eine Primitiv Routine geschrieben, welche die vom Sensor übergebenen Werte in eine Datei hineinschreibt. Für meine Zwecke reicht das. Wer die Daten z.B. als Diagramm darstellen will kann natürlich auch eine MySQL Datenbank aufsetzen. Eine schöne englischsprachige Anleitung dafür gibt’s hier.

Die Empfangsroutine liegt im Verzeichnis /sensor des Webservers auf dem Rasperry Pi und heißt sensor.php. Diese URL /sensor/sensor.php muss mit den Angaben in Zeile 66 des obigen Codes client.print(„GET /sensor/sensor.php?st=“); übereinstimmen.

Außerdem müssen die beiden Übergabe Variablennamen st  und sh  sowohl im Sketch als auch im PHP Code übereinstimmen.

Das PHP Programm speichert die Daten im /tmp Verzeichnis ab, wo sie dann von meinem Luftfeuchtigkeits Watchdog verarbeitet werden – vielleicht veröffentliche ich das später einmal. Das /tmp Verzeichnis habe ich in den Arbeistspeicher gelegt, um die SD Karte des Pi nicht zu sehr zu stressen. Siehe auch diesen Beitrag.

Hinweise

Die WLAN Funktionalität des Huzzah Boards ist ziemlich gut, kann aber auch keine Wunder bewirken. Bei schlechten Empfangsverhältnissen müsst ihr draufsatteln mit einem WLAN Repeater oder einem Extra Access Point. Oder halt doch auf eine andere Funktechnologie umsteigen. Das schöne am ESP8266 ist, dass der Empfänger nicht in der Nähe des Senders stehen muss, um die Daten zu bekommen. Nachteil ist natürlich, dass dort, wo der Sensor steht, eine halbwegs stabile WLAN Abdeckung erforderlich ist.

Andere Sensoren

Natürlich könnt ihr auch andere Sensoren an den ESP8266 anschließen. Z.B. I2C Sensoren wie den BMP280 oder andere – wichtig ist nur, dass die entsprechende Arduino Library für den Sensor gibt. Eine schöne Anleitung findet ihr hier.

 

 

 

 

 

 

 

 

 

Schreibe einen Kommentar

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

Wordpress Anti-Spam durch WP-SpamShield