WLAN fähigen Sensor bauen mit ESP8266 & PHP

Worum gehts?

Ich möchte Messwerte – 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 hier nur 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.

Nachtrag: obige Erklärung von "void" ist zwar naheliegend aber nicht ganz korrekt, wie ich aus einem Kommentar von User magmac  erfahren musste – siehe Kommentare. Danke dafür.

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.
  • Alternativ bzw. eigentlich fast alternativlos ist der Wemos D1 Mini Controller das Gerät der wahl. Klein, günstig, wenig Stromverbrauch, akkutauglich.
    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 (in diesem Fall oft auch als Telegramm bezeichnet) 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.
    Beim 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.

Für Raspbian Buster muss mindestens PHP 7.3 installiert werden.
sudo apt-get install php7.3-fpm php-cgi
 

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.

Weiterentwicklung

Die oben vorgestellte Lösung ist quasi 100% homegrown. Weniger Aufwand muss getrieben werden, wenn man sich auf ein IoT Protokoll wie MQTT stützt und für die Serverseite zum Beispiel Node-Red verwendet. Dazu habe ich folgende Beiträge geschrieben:  ESP8266 (Wemos D1 MINI) Sensor mit MQTT oder ESP8266: WiFi Passwort etc. ohne Programmieren speichern. Professionelle Platinen zum Bau des hier beschriebenen Sensors auf Basis D1 Mini mit DHT22 findet ihr in diesem Beitrag: Verkaufe Sensorplatine für D1 Mini und DHT11/22 für 5 Euro.

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/Server 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.

Troubleshooting

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 übertragen ist. Für den Fall dass ihr das hier oben Erklärte nicht zum Laufen bekommt, hier noch ein paar Tipps:

Serverseite:

Auf dem Pi habt ihr einen Webserver und php installiert. Checkt ab, ob php überhaupt läuft.

Dazu im Webserver(!) Rootverzeichnis eine Datei _info.php anlegen, die folgenden Inhalt hat – nur eine Zeile:
<?php phpinfo() ?>
Diese Datei dann mit dem Browser auf dem PC aufrufen – http://IPdeinesPi/_info.php Wenn du jetzt eine lange Tabelle zu deiner PHP Installation bekommst, dann funktioniert PHP.

Ich gehe davon aus, dass die Webserver Root bei
/var/www/html
liegt. Das php Skript namens sensor.php aus dem Kapitel Server liegt eine Ebene drunter – aus Sicht des Webservers in
/sensor
, aus Linux Sicht in
/var/www/html/sensor
. Dieses Verzeichnis dem Webserveruser www-data zuordnen
sudo chown www-data:www-data /var/www/html/sensor
.

Es schadet nichts, das php Skript auch www-data zuzuordnen.
sudo chown www-data:www-data /var/www/html/sensor/sensor.php
Testet, ob ihr darauf mit einem Browser im Heimnetz zugreifen und Parameter übergeben könnt:

Das Skript gibt im Erolgsfalle ein lapidare fine aus. Bekommt ihr nur eine weiße Seite, habt ihr einen Fehler im Skript eingebaut – meist fehlendes Semikolon am Zeilenende.

Wenn ihr sensor.php 1 zu 1 übernommen habt, dann in der Shell eures Servers mit
cat /tmp/ext_values.dat
nachsehen, ob dort 123 346 drinsteht. Ansonsten halt da, wo ihr die Daten hinschreiben wolltet, nachsehen.

Wenn ja, funktioniert euer Server. Wichtig ist, dass das Ablageverzeichnis durch den Webserveruser www-data beschreibbar ist. Beim Verzeichnis  /tmp ist das automatisch der Fall.

Sensorseite:

Den Arduino Sketch überprüfen – ich gehe davon aus, dass er fehlerfrei kompiliert und auf den ESP8266 übertragen wird.

Klappt die Verbindung zum WLAN? Stimmt die Server IP Adresse? Achtung, wird mit Kommata geschrieben – Zeile 61.

Klappt die Messung? An der Konsole nachverfolgen.

Zeile 66: client.print("GET /sensor/sensor.php?st=");  – Richtiges Verzeichnis eingegeben (Webserversicht)?

Zeile 66 bzw. 68: die Variablen st bzw. sh müssen sich identisch im php Skript Zeile 7 und 8 wiederfinden.

Zum debuggen nach belieben Serial.println() Statements einfügengeben um zu sehen wie weit der Sketch kommt und welche Werte verarbeitet werden. Ansehen mit Konsole – Button rechts oben – Lupe.

 

 

28 Gedanken zu „WLAN fähigen Sensor bauen mit ESP8266 & PHP

  1. Guten Tag Christoph,
    nach ihrer Anleitung habe ich alles für meinen RPI3B installiert. Das OS ist raspios-bullseye-armhf. Als Sensor verwende ich D1 mini und D1 mini pro. Läuft alles gut.
    Es gab ein paar Probleme weil ich ihre Anleitung in ein libreoffice Textdatei eingefügt hatte. Da wollte der Sketch auf dem D1 nicht und auch nicht der Code im Server. Als ich die Sketche aus ihrer Seite direkt kopierte und gespeichert hatte lief alles perfekt. Auch mit meinem Orangepi PC Plus mit einem alten Ubuntu xenial hat es gut funktioniert. Eine Frage hätte ich noch.
    Was müsste ich machen um noch Datum und Zeit in die Datei ext_values.dat zu T & Hy zu speichern?
    Mit freundlichen Grüßen
    Hans-Jürgen

    1. Hallo,
      freut mich, dass du das erfolgreich umsetzen konntest.
      Wie so oft gibt es für die Erfassung der Zeit mehrere Möglichkeiten.
      1. du bringst den ESP8266 dazu, die Uhrzeit zu übermitteln. Dazu musst du die Zeit von einem Zeitserver abfragen. Dazu benötigst du die ntp Library für Arduino. Programmbeispiele findest du durch Suche nach "ntp arduino esp8266" in Google oder besser DuckDuckgo (die Suchmaschine, die dich nicht ausspioniert). Vorgehensweise ist dann analog zur Temperatur/Luftfeuchtigkeit. Einfach als weiteren Wert die Zeit übermitteln. Ob das eine menschenlesbare Uhrzeit ist oder ein UNIX Zeitstempel (Epoch) bleibt dir überlassen.
      2. Alternativ kannst du die Uhrzeit bei jedem Lesevorgang auf dem Server per php Funktion time() hinzufügen.
      Viel Spaß damit
      Viele Grüße
      Christoph

    1. Hallo Max,
      dein Statement ist leider etwas zu unterkomplex, um dir helfen zu können. Wie weit kommst du? Was zeigt die ESP8266 Console an – aso die serial.println() Befehle? Hast du die Serveradresse (=dein Pi) auch richtig geschrieben? mit Kommas? Gibts Fehlermeldungen auf der Konsole oder beim Kompilieren? Schreib ein bisschen mehr und ich versuche, dir zu helfen.
      Chris

      1. Hallo,
        den Sketch kann ich ohne Fehler hochladen und ich hab auch alles korrekt eingegeben. Im Sketch habe ich nochmal eine Zeile zur Prüfung der Verbindung zum Pi angefügt und sie gibt aus dass keine Verbindung mit dem Pi möglich ist. Das PHP Programm habe ich im Ordner /var/www/html/ platziert.
        Lg Max

        1. Hallo,
          ich nehme mal an, dass der Controller ins WLAN kommt – Einstellung in Zeile 16 und 17 des Sketchs.
          Kontrolliere, ob in Zeile 61 die IP Adresse vom Pi drinsteht – mit KOMMA separiert.
          in Zeile 66 den richtigen Pfad eingetragen? Du musst hierbei vom Stammverzeichnis deines Webservers ausgehen. Wenn es bei /var/www/html liegt, dann lautet der Pfad client.print("GET /sensor.php?st="); und keinesfalls client.print("GET /var/www/html/sensor.php?st=");
          Netzkabel steckt? Webserver mit php auf dem Pi installiert?
          Erlaubt dein Router, dass sich Geräte innerhalb deines Netzwerks miteinander unterhalten dürfen – wenn du headless auf den Pi gehst, erübrigt sich diese Frage.
          Zu guter Letzt noch ein Hinweis auf meinen Kommentar vom 11. März 2019:

          Das Script sensor.php auf dem Raspberry Pi wird vom Arduino aufgerufen der dabei die Parameter übergibt. Einen direkten Aufruf im Browser machst du nur zum Testen, nur deshalb gibts den Output “fine”.
          Du kannst das Script testen, indem du die Seite im Browser aufrufst und dabei zwei Werte übergibst: IPdeinesPi/sensor/sensor.php?st=123&sh=345
          Ferner noch probieren mit echo $temp.$hum; die empfangenen Werte direkt auszugeben. Es sieht ein bisschen so aus, als ob hier leere Werte übergeben werden.

          Mehr fällt mir im Augenblick auch nicht ein.
          VG Chris

          1. Da bin ich auch wieder. Ich habe alles nochmal gründlich überprüft und eigentlich sollte es funktioneren. Jeddoch wenn ich die Seite im Browser öffne ist das nur weiß und dort ist kein Output. Außerdem wird in die Datei wo die Sensordaten gespeichert werden sollen leer.
            Ich verzweifle hier langsam ;p
            Lg Max

            1. Sorry, ich hatte von meinem WordPress keine Info bekommen, dass du etwas gepostet hattest und enstprechend spät reagiert.
              Der Fehler scheint also eher auf der Pi (Empfangs-) Seite zu liegen.
              Hast du dort das Script
              aus dem Kapitel "Server" im korrekten Verzeichnis auf dem Pi abgelegt?? Um zu sehen, ob du da überhaupt Zugriff drauf hast, noch ein
              <h1>Das ist ein Test</h1> ganz vorne oder hintendran schreiben (ausserhalb der php Klammern) und evtl. noch als Überschrift auszeichnen. Wenn du die Datei mit dem Browser aufrufst, müsstest du zumindest den Text sehen. Es könnte auch sein, dass du dich beim php Code verschrieben hast. Dann erscheint meist nur eine weiße Seite. Testweise mal viele echo Statements in den Code einbauen. Die Strichpunkte am Ende werden gerne mal vergessen und führen zu einer weißen Seite.
              Das Verzeichnis muss(!) vom User www-data les- und beschreibbar sein, ebenso das Verzeichnis, wo die von dem Skript erzeugte Datei abgelegt wird muss von www-data beschreibbar sein.
              Dann noch prüfen, ob php bei dir richtig installiert ist. Dazu im Webserver(!) Rootverzeichnis eine Datei _info.php anlegen, die folgenden Inhalt hat – nur eine Zeile:
              <?php phpinfo() ?>
              Diese Datei dann mit dem Browser auf dem PC aufrufen – http://IPdeinesPi/_info.php Wenn du jetzt eine lange Tabelle zu deiner PHP Installation bekommst, dann funktioniert PHP.

              Probier das mal aus – ohne genau zu sehen, was du da gemacht hast, ist es für mich schwierig, dir weiter zu helfen. Da aber inzwischen sicher einige hundert Besucher meiner Seite das erfolgreich ausprobiert haben, müsste es wirklich funktionieren.
              LG
              Chris

              1. Hallo,
                ich hab alles aus dem Beitrag hier rauskopiert und ach richtig abgelegt. Beim php Script habe ich am Ende noch Test drangeschrieben und ich konnte es sehen
                Lg

                  1. Hi,
                    ich habe jetzt alles zum Testen nochmal genau nach meiner Anleitung aufgebaut.
                    Überprüfe deinen Serveranteil auf dem Pi:
                    Wo hast du ext_values.dat abgelegt? Wenn du einen anderen Ordner als /tmp genommen hast, muss das Verzeichnis mit sudo chown www-data:www-data NameDesVerzeichnisses für www-data beschreibbar gemacht werden. Alternativ mit chmod 666 NameDesVerzeichnissesdas Verzeichnis für jedermann schreib-/lesbar machen.
                    Test durch Aufruf mit dem Browser auf einem Client im Heimnetz: http://IPadresseVomPi/sensor/sensor.php?st=123&sh=346. Browser meldet "fine". Datei ext_values.dat muss erzeugt worden sein, hat das Datum von gerade eben und enthält 123 346
                    Wenn das klappt, hast du diese Hürde schon mal überwunden und kannst beim ESP8266 weitermachen.
                    Überprüfe nochmal genau was die Konsole ausgibt. Im Erfolgsfall sieht das so aus:
                    11:22:44.092 ->
                    11:22:44.092 -> Connecting to WLAN
                    11:22:44.192 -> .
                    11:22:45.597 -> WiFi connected
                    11:22:45.597 -> IP address:
                    11:22:45.597 -> 192.168.178.71
                    11:22:45.597 -> sensor inizialized
                    11:22:47.606 -> temp sensor read
                    11:22:47.606 -> hum sensor read
                    11:22:47.606 -> 22.40
                    11:22:47.606 -> 41.50
                    11:22:47.606 -> 192.168.178.42
                    11:22:47.606 -> connected!!
                    11:22:47.706 -> Fertig!!!
                    11:22:47.706 -> Going into deep sleep for xx seconds

                    ggf. beliebig viele Serial.println("deinDebugText"); Statements einbauen, um zu sehen wo es hakt.
                    Natürlich auch den Pfad überprüfen, der vom ESP8266 auf dem Pi angesprochen wird. In meinem Beispiel ist das /sensor ausgehend vom Webserver Rootverzeichnis. Auf dem Pi wäre das physikalisch /var/www/html/sensor
                    Meine Anleitung gilt für den Adafruit Feather Huzzah Controller, wenn du einen anderen verwendest, musst du gggf. die Pinbelegung anpassen.

                    So, mehr weiß ich auch nicht. das MUSS funktionieren. Für den Fall dass nicht, bitte stelle deine Fragen möglichst konkret. Schicke ggf. Screenshots o.ä. per Mail an mich.

    1. hmmm, könntest du das bitte konkretisieren? Meinst du die Adresse des Servers auf dem der ESP8266 seine Daten ablegen soll? Das sollte eigentlich funktionieren.
      Zeile 60 vom Script
      //die IP des Servers auf dem du die Daten ablegen willst
      IPAddress server(deineDomain.xy/deinVerzeichnis);

      Wenn du ein Gerät mit Namen innerhalb deines LAN ansprechen willst dann geht das bei Fritz!Boxen ganz einfach:
      IPAddress server(DeinServerImLAN.fritz.box/deinVerzeichnis);
      Evtl noch ein http:// vor die Domain schreiben.

      HALT: Das scheint tatsächlich nicht zu funktionieren – IPAdress kann, wie der Name schon sagt, nur IP Adressen definieren.
      Leider habe ich momentan auch kaum mehr Zeit, rumzubasteln.
      Probiers mal mit dem Arduino http Client: https://www.arduino.cc/en/Tutorial/HttpClient
      Der könnte auch mit ESP8266 funktionieren.
      Viel Spaß beim Experimentieren
      Chris

  2. Sehr schöner Beitrag ! Damit wird der Akkubetrieb des esp8266 endlich sinnvoll realisiert. Alle anderen Beiträge mit dem esp8266 als Server sind nur mit einer stabilen
    Stromversorgung sinnvoll.
    Meine Anmerkungen:
    Bei läuft der Raspberry pi mit Apache2, weil ein Webserver schon eingerichtet war.
    Es waren keine weiteren Einstellungen erforderlich. Ich habe aber trotzdem die
    Installs "sudo apt-get install php-fpm php-cgi" unter Raspian Buster gestartet.
    Zum esp8266: Statisch fließen 0.5mA im DeepSleep Modus und 75mA im aktiven Modus. Als Sensor habe ich einen mbe280 mit i2C angeschlossen. Kommt der esp nach dem Ende des DeepSleep Modus ins Reset kommen auch mal 250mA Peaks zustande. Man sollte als die Sleep-Time nicht zu kurz wählen, um den Akku zu schonen. Ansonsten habe ich das esp-Programm noch um eine Timeout Funktion erweitert, damit der esp bei fehlerhafter Wifi Verbindung nicht im aktiven Modus (75mA) verbleibt.

    1. Hi Dreas,
      ich hatte in der Konfiguration mit dem BME280 zuerst auch 0,5mA Strom im Deepsleep Modus. Das macht bei AA Zellen mit 2000mAh gerade mal 166 Tage Laufzeit!
      Du kannst den Strom im Deepsleep Modus auf (bei mir) ca. 80µA reduzieren, wenn Du nach dem bme280.begin(0x76); folgende Zeile einfügst:
      bme280.setSampling(bme280.MODE_FORCED);
      Dann geht der BME280 nach jeder Abfrage in den Ruhezustand.
      Ausserdem kannst du die Verbindungszeit zum Router deutlich reduzieren wenn du anstatt nur WiFi.begin(ssid, pass); folgendes einfügst:
      //WIFI connect
      if (WiFi.SSID() != ssid) { // nur beim 1sten connect
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, pass);
      }
      Viel Spass, Walter

    1. Vielen Dank für das tolle Beispiel.
      Habe ich das richtig verstanden, dass der Code Huzzah Sensor auch mit dem Raspberry geschrieben werden kann? Oder braucht man da den arduino?

      Danke für die Antwort.

      1. Hallo,
        Wenn ich dich richtig verstanden habe, willst du wissen, mit welchem Gerät man den Huzzah programmiert.
        Das geht üblicherweise mit einem Windows PC. Für Mac und Linux gibts aber sicher auch Lösungen – einfach mal googeln. Der Huzzah ist selbst ja ein kleiner Arduino. Ich glaube nicht, dass man einen Arduino mit einem Arduino programmieren kannst. Dafür brauchst du immer eine „richtige“ Maschine.
        Gruß
        Chris

  3. vielen Dank für die tolle Anleitung die genau das ist, was ich zur Ablösung meiner älteren Sensoren gesucht habe. Allerdings schaffe ich es aktuell noch nicht, Daten an den Raspberry zu übergeben. Das php Skript meldet "fine", aber in der Datei im tmp- Verzeichnis sind nur zwei Leerzeilen. Wie könnte ich prüfen, was hier schief läuft? Danke für die Hilfe

    1. Hallo,
      freut mich, wenn dir mein Betrag gefallen hat.
      Das Script sensor.php auf dem Raspberry Pi wird vom Arduino aufgerufen der dabei die Parameter übergibt. Einen direkten Aufruf im Browser machst du nur zum Testen, nur deshalb gibts den Output "fine".
      Du kannst das Script testen, indem du die Seite im Browser aufrufst und dabei zwei Werte übergibst: IPdeinesPi/sensor/sensor.php?st=123&sh=345

      Ferner noch probieren mit echo $temp.$hum; die empfangenen Werte direkt auszugeben. Es sieht ein bisschen so aus, als ob hier leere Werte übergeben werden.

      Gruß
      Chris

      1. Hallo Chris,
        ich habe meinen Fehler gefunden: ich habe das php-Skript um die komplette Pfadangabe erweitert – keine gute Idee.
        Danke nochmals
        Jetzt geht's an die restlichen Aufgaben um meine altersschwachen FS20-Sensoren durch neue zu ersetzen (die Daten von einem BME280 bekomme ich schon angezeigt. Jetzt möchte ich noch die Daten im RAM des ESP zwischenspeichern und nur 1x tgl zum Raspberry hochladen – wenig WiFi Zeit für den ESP, wenig Schreibzugriffe für den Pi)
        Olaf

      2. Hallo Chris,
        ich glaube ich bin für den Nachbau zu doof.
        Ich habe /sensor/sensor.php direkt im root verzeichnnis angelegt. Ich glaube da liegt auch mein fehler kannst Du mir eventuell auf die Sprünge helfen.

        1. Hallo,
          in diesem Fall bedeutet "Root" nicht das Linux Root-Verzeichnis "/" sondern das Rootverzeichnis des Webservers. Beim Lighttpd Webserver ist das aus Systemsicht standardmäßig "/var/www/html". Dort hin bzw. in ein beliebiges Verzeichnis darüber muss sensor.php kopiert werden. Bei deinem obigen Beispiel wäre das also /var/www/html/sensor/sensor.php (aus Systemsicht).
          Aus Sicht eines Webclients – hier der ESP8266 – ist das natürlich /sensor/sensor.php
          Du kannst das Script testen, indem du die Seite im Browser aufrufst und dabei zwei Werte übergibst: http://IPdeinesPi/sensor/sensor.php?st=123&sh=345
          In der Datei /var/www/tmp/ext_values.dat (aus Linux System Sicht) müsstest du dann die eingegebenen Werte finden. Das tmp Verzeichnis musst du natürlich vorher anlegen.
          ich hoffe, das hilft. Viel Spaß beim Basteln!
          Chris

  4. Ich bin zufällig über diese Seite gestolpert… danke für die ganzen Infos.

    An einer Stelle habe ich mich über den Text gewundert:
    void setup() {}
    void loop() {}

    in der Programmierung ist void nicht für "Hohlraum füllen" zu verstehen, sondern signalisiert void den sog. Rückgabewert.
    "void" heisst in dem Zusammenhang, daß die folgende Funktion keinen Rückgabewert liefern wird (leer, unbestimmt).
    Anders gesagt: die Funktion setup oder loop dürfen/werden keinen Programmcode in der Art:
    "return 1;" (um z.B. zu signalisieren – daß die Funktion erfolgreich war) enthalten.

    Wie es keinen Rückgabewert gibt, kann eine Funktion auch etwas zurückliefern – wenn sie z.B. der loop Funktion etwas zurückmelden möchte:

    void loop() {
    // tu was…
    Int abc = unterfunktion(123);
    }

    => die Variable abc (vom Typ Int) wird durch den Aufruf der "unterfunktion" mit dem übergebenen Parameter 123 aufgerufen und erwartet einen Int Wert zurück.

    also muss im Programmcode auch irgendwo folgendes Konstrukt existieren:

    Int unterfunktion(Int parameter) {
    // tue irgendwas mit dem übergebenen "parameter" (von loop wurde 123 geliefert)
    return 321;
    }

    => dem loop wird für den Parameter abc im Erfolgsfall der Unterfunktion also 321 zurückgeben – genauso kann die Unterfunktion auch rückmelden, daß irgendwas nicht "passte" und gibt dann vielleicht "999" zurück – und der Funktionsteil loop muss darauf reagieren.

    Neben void (= nichts) gibt es die Rückgabewerte Int (= Ganzzahl), Float (= "Komma"-Zahl), String (= Textlicher Inhalt) und je nach Sprache noch weitere.

    Bevor weitere Verwirrung aufkommt… nur zur Richtigstellung 🙂

    1. Mich hatte seinerzeit eher der sprachliche Aspekt "was bedeutet void eigentlich?" interessiert. Ich habe mich bisher noch nicht mit C und deren Derivaten beschäftigt und kannte nur das "void". Insofern vielen Dank für die Information. Wenn man drüber nachdenkt, macht "void" alleine – ohne dass es "int" etc. gibt – tatsächlich keinen Sinn, da es dann ja redundant wäre.

Schreibe einen Kommentar

Ich freue mich über Lob und Kritik.
Falls du Probleme mit der hier vorgestellten Anleitung hast und nicht weiter kommst:
Bitte das Problem oder die Fehlermeldung(en) möglichst genau beschreiben, auch an welcher Stelle (z.B. in welchem Node oder Befehl) und unter welchen Umständen der Fehler auftritt.
Gerne kannst du mir auch ein Mail schreiben. Die Adresse findest du im Impressum.
Ich gebe mir viel Mühe, meinen Lesern weiterzuhelfen. Je konkreter du bist, desto einfacher und schneller kann ich versuchen zu helfen.
Deine E-Mail-Adresse wird nicht veröffentlicht.
Erforderliche Felder sind mit * markiert