{"id":950,"date":"2018-03-03T19:26:09","date_gmt":"2018-03-03T18:26:09","guid":{"rendered":"https:\/\/www.rustimation.eu\/?p=950"},"modified":"2023-04-20T10:02:47","modified_gmt":"2023-04-20T08:02:47","slug":"wifi-faehigen-sensor-mit-esp8266","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/wifi-faehigen-sensor-mit-esp8266\/","title":{"rendered":"WLAN f\u00e4higen Sensor bauen mit ESP8266 &#038; PHP"},"content":{"rendered":"<h2 style=\"text-align: left;\">Worum gehts?<\/h2>\n<p>Ich m\u00f6chte Messwerte &#8211; hier Temperatur und Luftfeuchtigkeit &#8211; mit einem batteriebetriebenen Sensor per Funk auf einen Raspberry Pi \u00fcbertragen, dort auswerten, darstellen und darauf basierend eine Aktion ausl\u00f6sen, z.B. einen L\u00fcftungsventilator anschalten.<\/p>\n<h4>Es war einmal&#8230;<\/h4>\n<p>Vor einiger Zeit gab es einmal einen Hersteller von g\u00fcnstigen und relativ einfach in die Pi Landschaft zu integrierenden 433\/886MHz Funk-Sensoren &#8211; Ciseco WirelessThings. Leider gibt es diese Firma nicht mehr &#8211; von Heuschrecken gekauft und ausgesaugt. Auch die WirelessThings Sensoren sind nicht mehr erh\u00e4ltlich.<\/p>\n<p>Auf der Suche nach Alternativen bin ich dann auf<strong> ESP8266<\/strong> basierende Module gesto\u00dfen; Wifi bzw. WLAN tauglich und zudem Arduino kompatibel.<\/p>\n<p><!--more--><\/p>\n<h2>Exkurs: Arduino vs. Raspberry Pi<\/h2>\n<p>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\u00fcr alle m\u00f6glichen Einsatzzwecke programmierbar. Allerdings sind sie dann auch nur f\u00fcr diesen einen Zweck\u00a0 verwendbar, da der Microcontroller immer nur ein Programm ausf\u00fchrt. Der Prozessor ist um einiges langsamer, der Speicher sehr beschr\u00e4nkt, da z.B. ein Arduino aber nicht den Ballast eines universellen Betriebssystems mit sich rumschleppen muss, ist er trotzdem recht schnell.<\/p>\n<h3>Programmieren<\/h3>\n<p>Hierzu gibt es gen\u00fcgend Anleitungen im Intenet &#8211; deshalb hier nur die wesentlichen Unterschiede zum Programmieren auf dem Rasperry Pi:<\/p>\n<p>Arduinos k\u00f6nnen 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.\u00a0\u00a0 Eine sch\u00f6ne Anleitung zur Installation f\u00fcr beide Varianten gibt es bei <a href=\"https:\/\/learn.adafruit.com\/adafruit-feather-huzzah-esp8266?view=all\" target=\"_blank\" rel=\"noopener noreferrer\">Adafruit<\/a>.\u00a0 Ich verwende hier das Arduino IDE.<\/p>\n<p><strong>Die Installation nach der Adafruit Anleitung oder einer anderen Anleitung unbedingt durchf\u00fchren<\/strong> &#8211; das gilt auch f\u00fcr andere Boards. Wichtig ist vor allem die Installation des Board-Treibers sowie der ESP8266 Libraries.<\/p>\n<p>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.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #808080;\">Es gibt auch eine f\u00fcr Raspberry Pi Fans sehr naheliegende Programmiersprache namens Micropython, die auch f\u00fcr den<a href=\"https:\/\/docs.micropython.org\/en\/latest\/esp8266\/esp8266\/tutorial\/intro.html\" target=\"_blank\" rel=\"noopener noreferrer\"> ESP8266 geeignet<\/a> ist. Sobald ich mich damit n\u00e4her besch\u00e4ftigt habe, schreibe ich etwas dar\u00fcber.<\/span><\/p>\n<p>Der Arduino Programmcode &#8211; genannt Sketch &#8211; wird auf dem PC mit dem IDE erstellt, dort kompiliert und \u00fcber USB beim PC und die serielle Schnittstelle des Microcontrollers \u00fcbertragen. Je nach Variante passiert das \u00fcber die RX\/TX Pins des Controllers oder \u00fcber den darauf befindlichen Micro USB Anschluss, was wesentlich komfortabler ist.<\/p>\n<p>Ist der Code erst einmal auf dem Controller &#8211; und funktioniert &#8211; arbeitet der Controller autark. Liegt 3,3 V Spannungsversorgung an, startet er und f\u00fchrt das \u00fcberspielte Programm aus.<\/p>\n<p>Der Programmcode besteht aus mindestens zwei Teilen: einem einmal zum Start durchlaufenen Teil \"Setup\" und einer anschlie\u00dfend unendlich oft durchlaufenen Schleife namens \"Loop\"<\/p>\n<pre class=\"lang:c decode:true\" title=\"Arduino Codebl\u00f6cke\">void setup() {\r\n  \/\/ put your setup code here, to run once:\r\n\r\n}\r\n\r\nvoid loop() {\r\n  \/\/ put your main code here, to run repeatedly:\r\n\r\n}<\/pre>\n<p>Jede Codezeile zwischen den geschweiften Klammern endet in der Regel mit einem Semicolon ;<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #808080;\">Der Befehl \"void\" hat mich vom Namen her anf\u00e4nglich irritiert. \"Void\" als Adjektiv hei\u00dft \"ung\u00fcltig\". Ung\u00fcltiger Code?? \"Void\" bedeutet aber als Substantiv \"Hohlraum\" und das k\u00f6nnte passen, denn in den Hohlraum zwischen den geschweiften Klammern wollen wir ja unseren Code einf\u00fcllen. Beide Teile m\u00fcssen zwingend vorhanden sein, sonst gibt es einen Compilerfehler. Wenn man &#8211; wie in meinem Bespiel &#8211; den \"loop\" Teil nicht braucht, einfach leer lassen.<\/span><\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #3366ff;\">Nachtrag: obige Erkl\u00e4rung von \"void\" ist zwar naheliegend aber nicht ganz korrekt, wie ich aus einem Kommentar von User magmac\u00a0 erfahren musste &#8211; siehe Kommentare. Danke daf\u00fcr.<\/span><\/p>\n<p>Die Syntax ist gef\u00fchlt 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.<\/p>\n<h2>Welche Produkte gibt es?<\/h2>\n<p>Das Angebot ist vielf\u00e4ltig<\/p>\n<ul>\n<li>Bare Bones Modul (3\u20ac -7,5\u20ac bei <a href=\"http:\/\/www.watterott.com\/de\/WiFi-Serial-Transceiver-Module-Breakout-Board-w\/-ESP8266\" target=\"_blank\" rel=\"noopener noreferrer\">Watterott.com<\/a>\u00a0 oder <a href=\"https:\/\/www.reichelt.de\/Entwicklerboard-Zubehoer\/DEBO-ESP8266\/3\/index.html?ACTION=3&amp;LA=446&amp;ARTICLE=192142&amp;GROUPID=8244&amp;artnr=DEBO+ESP8266&amp;SEARCH=esp8266&amp;trstct=pos_0\" target=\"_blank\" rel=\"noopener noreferrer\">Reichelt<\/a>) vielleicht etwas fummelig zu verwenden aber Platz sparend.<\/li>\n<li>NodeMCU ESP8266\u00a0 (ca. 7,50\u20ac &#8211; 9\u20ac) erh\u00e4ltlich bei <a href=\"https:\/\/www.reichelt.de\/Entwicklerboard-Zubehoer\/DEBO-JT-ESP8266\/3\/index.html?ACTION=3&amp;LA=446&amp;ARTICLE=219900&amp;GROUPID=8244&amp;artnr=DEBO+JT+ESP8266&amp;SEARCH=esp8266&amp;trstct=pos_4\" target=\"_blank\" rel=\"noopener noreferrer\">Reichelt<\/a> oder <a href=\"https:\/\/www.az-delivery.de\/collections\/esp8266\" target=\"_blank\" rel=\"noopener noreferrer\">AZ-Delivery<\/a> &#8211; mit Micro USB Anschluss als Programmierschnittstelle zum PC, mehreren GPIO Pins, Analog Pin, I2C und SPI Schnittstellen.<\/li>\n<li>Alternativ bzw. eigentlich fast alternativlos ist der Wemos D1 Mini Controller das Ger\u00e4t der wahl. Klein, g\u00fcnstig, wenig Stromverbrauch, akkutauglich.<br \/>\n<span style=\"color: #808080;\">AZ-Delivery sitzt in Niederbayern und vertickt China Ware, hat ein gro\u00dfes Angebot an Microcontrollern nebst Zubeh\u00f6r, ganz gut gemachte Anleitungen als eBooks, spamt leider sehr stark mit nervigen \"Newslettern\" die man zum Gl\u00fcck auch abbestellen kann.<\/span><\/li>\n<li>oder die High End Version <a href=\"https:\/\/www.adafruit.com\/product\/2821\" target=\"_blank\" rel=\"noopener noreferrer\">Adafruit Feather Huzzah ESP8266<\/a> ab 19\u20ac bei <a href=\"https:\/\/thepihut.com\/products\/adafruit-feather-huzzah-with-esp8266-wifi\" target=\"_blank\" rel=\"noopener noreferrer\">The Pi Hut<\/a>. Diese Version hat zus\u00e4tzlich einen Anschluss f\u00fcr einen LiPo Akku, der automatisch geladen wird, wenn USB verbunden ist und eine On Board LED auf GPIO #0.\u00a0 Au\u00dferdem geht das Teil automatisch in den Programmiermodus sobald das Arduino IDE Daten schickt &#8211; sehr praktisch. Au\u00dferdem ist es CE und FCC zertifiziert &#8211; bei vielen anderen ist das nicht so, vor allem wenn sie aus dem Reich der Mitte kommen.<br \/>\n<span style=\"color: #808080;\">The Pi Hut mit Sitz in England hat ein sehr gro\u00dfes 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\u00e4glich.<\/span><\/li>\n<\/ul>\n<p>All das gibt es auch bei Amazon, teils deutlich teurer, teils direkt aus China mit langer Lieferzeit.<\/p>\n<p>F\u00fcr diese Anleitung hier habe ich das Adafruit Feather Huzzah ESP8266 verwendet. Das NodeMCU geht nat\u00fcrlich genau so gut, allerdings ist die Pin Belegung des Boards etwas anders.<\/p>\n<h2>Was machen wir hier?<\/h2>\n<h3>Das Prinzip<\/h3>\n<p>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.<\/p>\n<p>Anders herum geht das wesentlich besser:<\/p>\n<ul>\n<li>Huzzah (oder eben das Board, das ihr verwendet) soll starten,<\/li>\n<li>eine WiFi Verbindung zum Router oder Access Point aufbauen,<\/li>\n<li>mittels eines DHT22 Sensors\u00a0 Temperatur und Luftfeuchtigkeit messen,<\/li>\n<li>die Daten (in diesem Fall oft auch als Telegramm bezeichnet) auf einem im LAN h\u00e4ngenden Webserver (Raspberry Pi) ablegen wo sie dann weiter verarbeitet werden.<\/li>\n<li>Anschlie\u00dfend soll sich Huzzah f\u00fcr 30 Minuten schlafen legen und nach dem Aufwachen wieder von vorne loslegen.<\/li>\n<\/ul>\n<p>Im Batteriebetrieb m\u00fcsste ein so aufgebauter Sensor mehrere Monate durchhalten. Vielleicht sogar mit einer Knopfzelle.<\/p>\n<h3>Hardware<\/h3>\n<h4>Der Sensor<\/h4>\n<p>Dieses Beispiel bauen wir auf einem Breadboard auf. Daf\u00fcr brauchen wir:<\/p>\n<ul>\n<li>einen ESP8266 Microcontroller (hier Adafruit Feather Huzzah)<\/li>\n<li>einen DHT22 Feuchtigkeits- und Temperatursensor. DHT11 ginge auch, ist aber deutlich ungenauer,\u00a0 zeigt nur ganze Grad Celsius an und au\u00dferdem keine Temperaturen unter dem Gefrierpunkt. Andere Sensoren z.B. auf I2C Basis gehen nat\u00fcrlich auch (BMP280 und dergleichen).<\/li>\n<li>einen 10k Ohm Widerstand<\/li>\n<li>6 Steckbrett Kabel<\/li>\n<\/ul>\n<p>Der Aufbau ist wie folgt &#8211; bei anderen Boards als dem Huzzah ist die Position der Pins m\u00f6glicherweise anders:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-991\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2018\/03\/2018-03-25-12_53_14-Huzzah_DHT.fzz-Fritzing-Steckplatinenansicht.png\" alt=\"\" width=\"961\" height=\"507\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2018\/03\/2018-03-25-12_53_14-Huzzah_DHT.fzz-Fritzing-Steckplatinenansicht.png 961w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2018\/03\/2018-03-25-12_53_14-Huzzah_DHT.fzz-Fritzing-Steckplatinenansicht-300x158.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2018\/03\/2018-03-25-12_53_14-Huzzah_DHT.fzz-Fritzing-Steckplatinenansicht-768x405.png 768w\" sizes=\"auto, (max-width: 961px) 100vw, 961px\" \/><\/p>\n<p>Der <strong>DHT Sensor<\/strong> ist von links nach rechts wie folgt belegt:<\/p>\n<ol>\n<li>VCC &#8211; in unserem Fall 3,3V, er vertr\u00e4gt aber auch 5V &#8211; rotes Kabel am Steckbrett mit + verbunden<\/li>\n<li>Data Out &#8211; im Fritzing Diagramm blaues Kabel &#8211; mit GPIO #2 des Huzzah Bords verbunden<\/li>\n<li>nicht belegt<\/li>\n<li>Masse &#8211; schwarzes Kabel zur Masseleiste des Steckbretts.<\/li>\n<\/ol>\n<p>Zwischen 1 und 2 des DHT kommt ein 4,7 kOhm bis 10kOhm Widerstand<\/p>\n<p>Das <strong>Huzzah Board<\/strong> wird wie folgt verkabelt.<\/p>\n<ul>\n<li>3V mit der + Leiste<\/li>\n<li>GND mit Masse<\/li>\n<li>GPIO #2 mit Data Out des DHT Sensors<\/li>\n<li>zwischen RST und GPIO #16 kommt eine Br\u00fccke (orange). Diese Br\u00fccke erst sp\u00e4ter stecken, wenn alles funktioniert. Sie dient dazu, den Controller zu resetten, wenn er nach dem Tiefschlaf wieder aufwacht.<strong><br \/>\nBeim Programmieren d\u00fcrfen die beiden Pins nicht verbunden sein<\/strong>, sonst kommt es ggf. zu merkw\u00fcrdigen Ergebnissen.<\/li>\n<\/ul>\n<p>Das wars auch schon. Der Micro USB Anschluss wird mit einem USB Kabel mit dem PC verbunden.<\/p>\n<p>Wenn alles funktioniert k\u00f6nnen wir das sp\u00e4ter auf eine Leiterplatte \u00fcbertragen und in ein Geh\u00e4use einbauen. Platz f\u00fcr Batterien oder LiPo Akku nicht vergessen. Sobald ich dazu komme das zu machen, schreibe ich etwas dar\u00fcber.<\/p>\n<h4>Der Server<\/h4>\n<p>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.\u00a0 Anleitungen, wie man das installiert, gibts im Web zuhauf.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #808080;\">Ich verwende\u00a0 als Webserver den <strong>Lighttpd<\/strong>. Ferner muss noch PHP installiert sein. Raspbian Stretch braucht au\u00dferdem mindestens PHP 7.0. Bei Verwendung von Lighttpd ist die Installation unter Raspbian <strong>Stretch<\/strong> leider etwas kompliziert:<\/span><\/p>\n<pre class=\"lang:default decode:1 inline:1 \">sudo apt-get install php7.0-fpm php-cgi<\/pre>\n<p>.<br \/>\nDamit wird verhindert, dass die ganzen Apache Utilities mit installiert werden und so nutzlos die Speicherkarte vollschreiben.<br \/>\nLeider ist das noch nicht genug. Es m\u00fcssen noch ein paar Einstellungen vorgenommen werden. Diese sind in <a href=\"https:\/\/pimylifeup.com\/raspberry-pi-lighttpd\/\" target=\"_blank\" rel=\"noopener noreferrer\">folgender Website<\/a> sehr gut beschrieben (ab Schritt 8). Au\u00dferdem ist dort noch beschrieben, wie man Lighttpd installiert.<\/p>\n<p>F\u00fcr Raspbian <strong>Buster<\/strong> muss mindestens PHP 7.3 installiert werden.<\/p>\n<pre class=\"lang:default decode:1 inline:1 \">sudo apt-get install php7.3-fpm php-cgi<\/pre>\n<p>&nbsp;<\/p>\n<h3>Code<\/h3>\n<h4>Huzzah Sensor<\/h4>\n<p>Ich habe mich auf das N\u00f6tigste beschr\u00e4nkt. 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\u00e4t ausreicht.<\/p>\n<pre class=\"height-set:true lang:c mark:83,84 decode:true\" title=\"Huzzah Sketch\">\/\/ F\u00fcr ESP8266 - Einfach gehaltener techn. Durchstich. \r\n\/\/ Scheibt Temperatur und Feuchte in Datei auf Server\r\n\/\/ Fehlerhandling noch zu erg\u00e4nzen\r\n\/\/ Batteriespannung optional messen und bei zu wenig Spannung Alarm geben.\r\n\/\/ die Serial.println() Statements dienen lediglich dem Debuggen \u00fcber die Konsole\r\n\r\n#include &lt;DHT_U.h&gt;\r\n#include &lt;ESP8266WiFi.h&gt;\r\n\r\nWiFiClient client;\r\n\r\n#define DHTPIN 2 \/\/ SENSOR PIN\r\n#define DHTTYPE DHT22 \/\/ SENSOR TYPE - THE ADAFRUIT LIBRARY OFFERS SUPPORT FOR MORE MODELS\r\nDHT dht(DHTPIN, DHTTYPE);\r\n\r\nconst char* ssid     = \"DeineNetzwerkSSID\";\r\nconst char* password = \"DeinWLANPasswort\";\r\n\r\nvoid setup() {\r\n\r\n  Serial.begin(115200);\r\n  delay(100);\r\n\r\n  \/\/ Blinker\r\n  pinMode(0, OUTPUT);\r\n\r\n  \/\/ Los gehts mit der Verbindung zum WiFi Netzwerk\r\n\r\n  Serial.println();\r\n  Serial.println();\r\n  Serial.print(\"Connecting to \");\r\n  Serial.println(ssid);\r\n  \r\n  WiFi.begin(ssid, password);\r\n  \r\n  while (WiFi.status() != WL_CONNECTED) {\r\n    delay(100);\r\n    Serial.print(\".\");\r\n    blink (100, 20, 10);\r\n  }\r\n\r\n  Serial.println(\"\");\r\n  Serial.println(\"WiFi connected\");  \r\n  Serial.println(\"IP address: \");\r\n  Serial.println(WiFi.localIP());\r\n\r\n  \/\/ DHT Messung\r\n  dht.begin(); \r\n  Serial.println(\"sensor inizialized\");\r\n  delay(2000); \/\/ GIVE THE SENSOR SOME TIME TO START\r\n\r\n  float sensorTemp = dht.readTemperature(); \r\n  Serial.println(\"temp sensor read\");\r\n  float sensorHum = dht.readHumidity(); \r\n  Serial.println(\"hum sensor read\");\r\n\r\n  Serial.println(sensorTemp);\r\n  Serial.println(sensorHum);\r\n\r\n\/\/die IP des Servers auf dem du die Daten ablegen willst\r\nIPAddress server(192, 168,178, 38); \r\nSerial.println(server);\r\n\r\nif (client.connect(server, 80)) {\r\n  Serial.println(\"connected!!\");\r\n  client.print(\"GET \/sensor\/sensor.php?st=\");\r\n  client.print(sensorTemp);\r\n  client.print(\"&amp;sh=\");\r\n  client.print(sensorHum);\r\n  client.println(\" HTTP\/1.1\");\r\n  client.println(\"Host: 192.168.178.38\");\r\n  client.println(\"Connection: close\");\r\n  client.println();\r\n  delay(100);\r\n  client.stop();\r\n} \r\n  if (client.connected()) { \r\n    client.stop();  \/\/ DISCONNECT FROM THE SERVER\r\n  }\r\n\r\nSerial.println(\"Fertig!!!\");\r\n\r\nSerial.println(\"Going into deep sleep for xx seconds\");\r\nESP.deepSleep(20e6); \/\/ e.g. 20e6 is 20 seconds\r\n\r\n}\r\n\r\nvoid loop() {\r\n\/\/ nothing here\r\n}\r\n\r\nvoid blink(int t1, int t0, int n) {\r\n\/\/ Schaltet LED ein und aus. \u00dcbergabeparameter: Millisekunden Ein, \r\n\/\/ Millisekunden aus, Anzahl Blinks\r\n\/\/ Optional - ggf. weglassen, um Strom zu sparen\r\n  int i = 0;\r\n  while (i &lt;= n) {\r\n    digitalWrite(0, HIGH);\r\n    delay(t1);\r\n    digitalWrite(0, LOW);\r\n    delay(t0);\r\n    i++;}\r\n}\r\n<\/pre>\n<p>Zum Testen die hervorgehobene Zeile ESP.deepSleep auskommentieren, sonst schl\u00e4ft der Controller bei jedem Durchlauf f\u00fcr die eingestellte Zeit &#8211; beim Debuggen eher hinderlich. Wenn alles sauber funktioniert und in Produktion gehen soll, den Wert z.B. auf <strong>1800e6<\/strong> setzen. Dann legt sich der Sensor f\u00fcr eine halbe Stunde schlafen.<\/p>\n<p>W\u00e4hrend des Deep Sleep braucht der Controller nur ca. 50 Mikroampere Strom. Das Einzige, was noch l\u00e4uft ist der Timer. Ist die Zeit abgelaufen, wacht das Teil auf und resettet sich; das hei\u00dft, alles beginnt von vorne. Da die Routine nur jeweils einmal durchlaufen wird, reicht es, sie in den Abschnitt<\/p>\n<pre class=\"lang:c decode:1 inline:1 \"> void setup()<\/pre>\n<p>einzutragen.<\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #808080;\">Will man den Controller manuell aus dem Tiefschlaf wecken, muss man die Br\u00fccke zwischen RST und GPIO #16 \u00f6ffnen und die Reset Taste am Board dr\u00fccken. <\/span><\/p>\n<h4>Server<\/h4>\n<p>Auch hier habe ich ganz bewusst eine Primitiv Routine geschrieben, welche die vom Sensor \u00fcbergebenen Werte in eine Datei hineinschreibt. F\u00fcr meine Zwecke reicht das. Wer die Daten z.B. als Diagramm darstellen will kann nat\u00fcrlich auch eine MySQL Datenbank aufsetzen. Eine sch\u00f6ne englischsprachige Anleitung daf\u00fcr gibt's <a href=\"https:\/\/www.instructables.com\/id\/PART-1-Send-Arduino-data-to-the-Web-PHP-MySQL-D3js\/\" target=\"_blank\" rel=\"noopener noreferrer\">hier<\/a>.<\/p>\n<p>Die Empfangsroutine liegt im Verzeichnis \/sensor des Webservers auf dem Rasperry Pi und hei\u00dft sensor.php. Diese URL<\/p>\n<pre class=\"lang:default decode:1 inline:1 \">\/sensor\/sensor.php<\/pre>\n<p>muss mit den Angaben in Zeile 66 des obigen Codes <span class=\"crayon-sy\"><span class=\"lang:default decode:true crayon-inline \">client.print(\"GET \/sensor\/sensor.php?st=\");<\/span> \u00fcbereinstimmen. <\/span><\/p>\n<p><span class=\"crayon-sy\">Au\u00dferdem m\u00fcssen die beiden \u00dcbergabe Variablennamen <span class=\"lang:default decode:true crayon-inline \">st<\/span>\u00a0 und <\/span><\/p>\n<pre class=\"lang:default decode:1 inline:1 \">sh<\/pre>\n<p>sowohl im Sketch als auch im PHP Code \u00fcbereinstimmen.<\/p>\n<pre class=\"lang:php decode:true\" title=\"sensor.php\">&lt;?php\r\n    \/\/This program is the interface to the HUZZAH data collector\r\n    \/\/it receives the temperature and humidity values and\r\n    \/\/stores them in a file in the \/tmp directory where they\r\n    \/\/are picked up by display.py and hum_wdog.py\r\n\r\n    $temp = $_GET[\"st\"];\r\n    $hum = $_GET[\"sh\"];\r\n\r\n    $lineitem = $temp.\"\\n\".$hum.\"\\n\";\r\n    $datei = fopen(\"\/tmp\/ext_values.dat\",\"w\");\r\n    fwrite($datei, $lineitem);\r\n    fclose($datei);\r\n    echo \"fine\";\r\n?&gt;\r\n<\/pre>\n<p>Das PHP Programm speichert die Daten im \/tmp Verzeichnis ab, wo sie dann von meinem Luftfeuchtigkeits Watchdog verarbeitet werden &#8211; vielleicht ver\u00f6ffentliche ich das sp\u00e4ter einmal. Das \/tmp Verzeichnis habe ich in den Arbeistspeicher gelegt, um die SD Karte des Pi nicht zu sehr zu stressen. Siehe auch <a href=\"https:\/\/www.rustimation.eu\/index.php\/sd-karten-verschleiss-vermeiden\/\" target=\"_blank\" rel=\"noopener noreferrer\">diesen Beitrag<\/a>.<\/p>\n<h2>Weiterentwicklung<\/h2>\n<p>Die oben vorgestellte L\u00f6sung ist quasi 100% homegrown. Weniger Aufwand muss getrieben werden, wenn man sich auf ein IoT Protokoll wie MQTT st\u00fctzt und f\u00fcr die Serverseite zum Beispiel Node-Red verwendet. Dazu habe ich folgende Beitr\u00e4ge geschrieben:\u00a0 <a href=\"https:\/\/www.rustimation.eu\/index.php\/esp8266-d1-mini-sensor-mit-mqtt\/\">ESP8266 (Wemos D1 MINI) Sensor mit MQTT <\/a>oder <a href=\"https:\/\/www.rustimation.eu\/index.php\/esp8266-wifi-parameter-speichern\/\">ESP8266: WiFi Passwort etc. ohne Programmieren speichern<\/a>. Professionelle Platinen zum Bau des hier beschriebenen Sensors auf Basis D1 Mini mit DHT22 findet ihr in diesem Beitrag: <a href=\"https:\/\/www.rustimation.eu\/index.php\/sensorplatine-fuer-d1-mini-und-dht11-22-fuer-6-euro\/\">Verkaufe Sensorplatine f\u00fcr D1 Mini und DHT11\/22 f\u00fcr 5 Euro<\/a>.<\/p>\n<h2>Hinweise<\/h2>\n<p>Die WLAN Funktionalit\u00e4t des Huzzah Boards ist ziemlich gut, kann aber auch keine Wunder bewirken. Bei schlechten Empfangsverh\u00e4ltnissen m\u00fcsst ihr draufsatteln mit einem WLAN Repeater oder einem Extra Access Point. Oder halt doch auf eine andere Funktechnologie umsteigen. Das Sch\u00f6ne am ESP8266 ist, dass der Empf\u00e4nger\/Server nicht in der N\u00e4he des Senders stehen muss, um die Daten zu bekommen. Nachteil ist nat\u00fcrlich, dass dort, wo der Sensor steht, eine halbwegs stabile WLAN Abdeckung erforderlich ist.<\/p>\n<h3>Andere Sensoren<\/h3>\n<p>Nat\u00fcrlich k\u00f6nnt ihr auch andere Sensoren an den ESP8266 anschlie\u00dfen. Z.B. I2C Sensoren wie den BMP280 oder andere &#8211; wichtig ist nur, dass die entsprechende Arduino Library f\u00fcr den Sensor gibt. Eine sch\u00f6ne Anleitung <a href=\"https:\/\/www.instructables.com\/id\/IoT-Weather-Station-With-ESP8266\/\" target=\"_blank\" rel=\"noopener noreferrer\">findet ihr hier<\/a>.<\/p>\n<h3>Troubleshooting<\/h3>\n<p>Das Arbeiten mit Arduino ist manchmal nervig. Mal vergisst man ein Semikolon am Ende, Char Arrays sind \"a pain in the ass\" und auch sonst ist das alles nicht ganz so einfach wie Python auf dem Pi. Dann muss man immer noch warten bis alles kompiliert und \u00fcbertragen ist. F\u00fcr den Fall dass ihr das hier oben Erkl\u00e4rte nicht zum Laufen bekommt, hier noch ein paar Tipps:<\/p>\n<h4>Serverseite:<\/h4>\n<p>Auf dem Pi habt ihr einen Webserver und php installiert. Checkt ab, ob php \u00fcberhaupt l\u00e4uft.<\/p>\n<p>Dazu im Webserver(!) Rootverzeichnis eine Datei _info.php anlegen, die folgenden Inhalt hat \u2013 nur eine Zeile:<br \/>\n<code>&lt;?php phpinfo() ?&gt;<\/code><br \/>\nDiese Datei dann mit dem Browser auf dem PC aufrufen \u2013 <code>http:\/\/IPdeinesPi\/_info.php<\/code> Wenn du jetzt eine lange Tabelle zu deiner PHP Installation bekommst, dann funktioniert PHP.<\/p>\n<p>Ich gehe davon aus, dass die Webserver Root bei<\/p>\n<pre class=\"lang:ps decode:1 inline:1 \">\/var\/www\/html<\/pre>\n<p>liegt. Das php Skript namens <em>sensor.php<\/em> aus dem Kapitel Server liegt eine Ebene drunter &#8211; aus Sicht des Webservers in<\/p>\n<pre class=\"lang:php decode:1 inline:1 \">\/sensor<\/pre>\n<p>, aus Linux Sicht in<\/p>\n<pre class=\"lang:ps decode:1 inline:1 \">\/var\/www\/html\/sensor<\/pre>\n<p>. Dieses Verzeichnis dem Webserveruser <em>www-data<\/em> zuordnen<\/p>\n<pre class=\"lang:ps decode:1 inline:1 \">sudo chown www-data:www-data \/var\/www\/html\/sensor<\/pre>\n<p>.<\/p>\n<p>Es schadet nichts, das php Skript auch www-data zuzuordnen.<\/p>\n<pre class=\"lang:ps decode:1 inline:1 \">sudo chown www-data:www-data \/var\/www\/html\/sensor\/sensor.php<\/pre>\n<p>Testet, ob ihr darauf mit einem Browser im Heimnetz zugreifen und Parameter \u00fcbergeben k\u00f6nnt:<\/p>\n<pre class=\"lang:php highlight:0 decode:true\">http:\/\/ip.des.raspberry.pi\/sensor\/sensor.php?st=123&amp;sh=346<\/pre>\n<p><code><\/code>Das Skript gibt im Erolgsfalle ein lapidare <em>fine<\/em> aus. Bekommt ihr nur eine wei\u00dfe Seite, habt ihr einen Fehler im Skript eingebaut &#8211; meist fehlendes Semikolon am Zeilenende.<\/p>\n<p>Wenn ihr <em>sensor.php<\/em> 1 zu 1 \u00fcbernommen habt, dann in der Shell eures Servers mit<\/p>\n<pre class=\"lang:ps decode:1 inline:1 \">cat \/tmp\/ext_values.dat<\/pre>\n<p>nachsehen, ob dort 123 346 drinsteht. Ansonsten halt da, wo ihr die Daten hinschreiben wolltet, nachsehen.<\/p>\n<p>Wenn ja, funktioniert euer Server. Wichtig ist, dass das Ablageverzeichnis durch den Webserveruser www-data beschreibbar ist. Beim Verzeichnis\u00a0 <em>\/tmp<\/em> ist das automatisch der Fall.<\/p>\n<h4>Sensorseite:<\/h4>\n<p>Den Arduino Sketch \u00fcberpr\u00fcfen &#8211; ich gehe davon aus, dass er fehlerfrei kompiliert und auf den ESP8266 \u00fcbertragen wird.<\/p>\n<p>Klappt die Verbindung zum WLAN? Stimmt die Server IP Adresse? Achtung, wird mit Kommata geschrieben &#8211; Zeile 61.<\/p>\n<p>Klappt die Messung? An der Konsole nachverfolgen.<\/p>\n<p>Zeile 66: <span class=\"crayon-sy\"><span class=\"lang:c decode:true crayon-inline\">client.print(\"GET \/sensor\/sensor.php?st=\");<\/span>\u00a0 &#8211; Richtiges Verzeichnis eingegeben (Webserversicht)?<\/span><\/p>\n<p>Zeile 66 bzw. 68: die Variablen <em>st<\/em> bzw. <em>sh<\/em> m\u00fcssen sich identisch im php Skript Zeile 7 und 8 wiederfinden.<\/p>\n<p>Zum debuggen nach belieben Serial.println() Statements einf\u00fcgengeben um zu sehen wie weit der Sketch kommt und welche Werte verarbeitet werden. Ansehen mit Konsole &#8211; Button rechts oben &#8211; Lupe.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><code><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Worum gehts? Ich m\u00f6chte Messwerte &#8211; hier Temperatur und Luftfeuchtigkeit &#8211; mit einem batteriebetriebenen Sensor per Funk auf einen Raspberry Pi \u00fcbertragen, dort auswerten, darstellen und darauf basierend eine Aktion ausl\u00f6sen, z.B. einen L\u00fcftungsventilator anschalten. Es war einmal&#8230; Vor einiger Zeit gab es einmal einen Hersteller von g\u00fcnstigen und relativ einfach in die Pi Landschaft &hellip; <a href=\"https:\/\/www.rustimation.eu\/index.php\/wifi-faehigen-sensor-mit-esp8266\/\" class=\"more-link\"><span class=\"screen-reader-text\">WLAN f\u00e4higen Sensor bauen mit ESP8266 &#038; PHP<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53,8,10],"tags":[58,107,101,108,67,60],"class_list":["post-950","post","type-post","status-publish","format-standard","hentry","category-iot","category-php","category-raspberry-pi","tag-adafruit","tag-arduino","tag-dht22","tag-huzzah","tag-php","tag-sensor"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/950","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/comments?post=950"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/950\/revisions"}],"predecessor-version":[{"id":2386,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/950\/revisions\/2386"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=950"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=950"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=950"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}