Raspberry Pi + ESP8266 NodeMCU: Per WLAN Daten senden

Im Internet of Things / Internet der Dinge ist das Datensammeln eines der Hauptbestandteile zur Analyse. Ein Problem, dass der Raspberry Pi hat ist, dass er selbst in seiner günstigsten Wifi-fähigen Form (Raspberry Pi Zero) durch seinen Preis nicht für das massenhafte Auslesen an Daten geeignet ist. Der ESP8266 NodeMCU hingegen sehr wohl! Dieser kostet nur wenige Euro und kann selbst mit einem kleinen Akku über Monate hinweg mit Strom versorgt werden.

In diesem Tutorial wollen wir zwischen Raspberry Pi und dem ESP8266 NodeMCU Daten senden – und zwar in beide Richtungen. Damit wollen wir den günstigen ESP8266 als „Außenstation“ für unsere Projekte verwenden, wobei der Raspberry Pi als Herzstück agiert und alle Daten sammelt bzw. speichert.

 

Zubehör

Um dieses Tutorial nachbauen zu können, benötigst du folgendes:

Der ESP Mikrocontroller wird per Lua programmiert, welches im Grunde eine sehr einfache Sprache ist.
Darüber hinaus nutzen wir folgendes, um die Verbindung „sichtbar“ zu machen:

Bei Interesse gehe ich in weiteren Tutorials auf die Nutzung anderer Sensoren (DHT11 / DHT22 bspw.) mit dem ESP8266 ein. In diesem Tutorial steht die Verbindung im Vordergrund und daher ist der Aufbau bzw. die Nutzung eines Buttons relativ simpel.

Hast du vorher noch nicht mit einem ESP8266 gearbeitet, solltest du dir dieses Tutorial zunächst ansehen: Einführung & Programmierung des ESP8266 NodeMCU Boards

 

Vorbereitung: Node.JS Server

Raspberry Pi Node.JS Logo

Node.JS Logo

Damit der Raspberry Pi Daten per WLAN empfangen kann, brauchen wir einen Webserver. Hierfür kann z.B. Apache2 dienen, allerdings nutzen wir in diesem Tutorial Node.JS, da dies eine Reihe einfach zu nutzender Erweiterungen hat, welche u.a. auch die GPIOs steuern können.

Wichtig: Falls du noch keinen Node.js Server auf deinem Raspberry Pi installiert hast, so starte mit dem ersten Abschnitt von diesem Tutorial (Link).

Sofern du die übertragenen Daten z.B. per MySQL speichern möchtest, so kannst du das NPM Package „node-mysql“ nutzen. Dafür ist eine bereits bestehende Installation von MySQL auf dem Raspberry Pi nötig. Wie dies am einfachsten funktioniert, ist hier gezeigt.

In weiteren Tutorials wird die Thematik noch genauer besprochen.

 

Aufbau am ESP8266 NodeMCU

Bevor wir die Software aufspielen, nehmen wir das Breadboard zur Hand und erstellen den Testaufbau. Dabei wollen wir sowohl auf Eingaben reagieren (Taster) als auch auf übermittelte Werte vom Raspberry Pi (LED leuchten lassen).

Raspberry Pi ESP8266 NodeMCU Button SteckplatineDer Taster wird an GND sowie die andere Seite an GPIO5 / D2 angeschlossen.

Statt einen Button könntest du auch ein Magnetrelais o.ä. nutzen, wie wir es hier bereits für den Raspberry Pi besprochen haben. Die Funktionsweise ist die gleiche.

 

Vom Raspberry Pi Daten an den ESP8266 senden

Um Befehle an den ESP8266 zu senden, nutzen wir diesen als Server, an den wir HTTP Anfragen senden. Dabei wird die interne IP Adresse des Heimnetzwerks genutzt (192.18.x.x). Diese HTTP Anfragen können entweder direkt per Terminal (curl), per Python (urllib) oder noch einfacher durch Aufruf per Browser gesendet werden.

Im ersten Schritt richten wir also den ESP8266 Server ein, welcher die LED schaltet. Öffne dazu das Programm, mit dem du den Lua Code überträgst (ich nutze den ESPlorer, wie hier erklärt). Folgender Code muss übertragen werden:

Den Namen deines WLANs und das Passwort musst du natürlich anpassen. Falls du möchtest, dass der Code auch direkt nach Neustart ausgeführt wird, erstelle eine Datei mit dem Namen „init.lua“ mit folgendem Inhalt und übertrage diese Datei ebenfalls auf den ESP8266:

Nun kannst du eine der oberen Möglichkeiten ausprobieren. Solange der ESP noch seriell verbunden ist, wirst du die IP Adresse ablesen können (bspw. bei mir: „Config done, IP is 192.168.1.53„). Öffne nun deinen Browser und hänge an die IP Adresse den Zusatz /?led=on an.

Ebenso kannst du mit off die LED wieder ausschalten. Möglich wäre hier noch eine Passwortabfrage über einen Parameter, damit nicht jeder die Aktion auslösen kann.

Um vom Raspberry Pi diese Abfrage abzusenden, kannst du curl benutzen. Gib dazu folgendes im Terminal ein:

curl 192.168.1.53/?led=off

 

Übrigens: Falls du per Node.JS auch HTTP-Requests senden möchtest, geht dies mit der http-Bibliothek.

 

Vom ESP8266 NodeMCU Daten an den Raspberry Pi senden

Starten wir mit dem Raspberry Pi. Zunächst finden wir die interne / lokale IP Adresse heraus:

ifconfig -a

Das zeigt u.a. so etwas an:

...
wlan0 Link encap:Ethernet HWaddr b8:27:eb:6f:37:fd
 inet addr:192.168.1.80 Bcast:192.168.1.255 Mask:255.255.255.0
 inet6 addr: fe80::5c5d:4000:b4d5:bb75/64 Scope:Link
...

In meinem Fall ist die IP Adresse des Raspberry Pi’s 192.168.1.80, welche gleich für das ESP8266 Lua Skript benötigt wird.

In dem kommenden Skript nutze ich Express und einen JSON Body Parser. Falls diese Pakete noch nicht installiert sind, geht dies einfach mit:

npm install express body-parser

Nun erstellen wir das Node.js Skript:

sudo nano rpi_esp826_server.js

Dieses bekommt folgenden Inhalt:

Speichere (STRG+O) und kehre zurück zum Terminal (STRG+X). Hier startest du nun den Server per Node:

node rpi_esp826_server.js

 

ESP8266 Skript

Um nun vom ESP8266 auch HTTP Request an den Raspberry Pi senden zu können, brauchen wir dessen http-Library. Diese ist nicht auf der Standard-Firmware enthalten und muss durch eine Custom-Firmware aufgespielt werden. Gehe dazu auf diese Seite und wähle die entsprechenden Module, die enthalten sein sollen.

Nach Angabe deiner Email bekommst du innerhalb von wenigen Minuten den Downloadlink (Spam Ordner prüfen). Das Aufspielen der Firmware haben wir bereits im vorherigen Tutorial besprochen.

Nun spielen wir folgendes Skript wieder per ESPFlasher auf den NodeMCU:

Im oberen Teil des Skripts musst du wieder die Daten deines WLANs anpassen sowie die URL des Raspberry Pi’s. In meinem Fall ist dies also http://192.168.1.80:8000/esp8266_trigger (Port und Route wurden im Raspberry Pi Node.JS Skript definiert).

Nachdem du es übertragen hast, kannst du den Taster drücken und auf den Log in der Raspberry Pi Konsole achten. Hier siehst du, sobald Daten eingingen.

 

Wie du siehst ist es nicht sehr schwer Daten auszutauschen. Wir können somit eine bidirektionale Verbindung aufbauen und z.B. bestimmte Sensoren oder Module auslesen und diese Daten übertragen.

Als nächstes ist geplant, dass wir mehrere ESP8266 mit Sensoren (DHT11 o.ä.) ausstatten und die Werte immer wieder an den Raspberry Pi senden, welcher diese in einer lokalen SQL Datenbank sammelt.

15 Kommentare

  1. Sehr geil!

    Habe schon mit meinem Pi Dank Deiner Anleitungen die komplette Steuerung meines Terrariums realisiert siehe https://goo.gl/iKyFQG . Licht an/aus, UV-Lampe an/aus, Heizung an/aus, Befeuchter an/aus alles per Funksteckdose und abhängig von Werten die mit dem DHT22 gemessen werden. Sehr geil wäre wenn ich den Pi nicht direkt in die Nähe des Terra stellen müsste und das ganze per WLan machen könnte. Freue mich schon auf das Tutorial mit Sensoren. Darf ich mir gleich danach ein Tut für die Funkdosen wünschen?

    Viele Grüße

    Ben

    Antworten
    • Hi Ben,

      ich bin z.Z. an einer sehr ähnlichen Steuerung, allerdings für ein Gewächshaus. Dein Interface beinhaltet aber bereits Komponenten die ich 1:1 wiederverwenden könnte.
      Wärst du bereit mir den aktuellen Code deines Projekts zur Verfügung zu stellen?

      LG
      Dave

      Antworten
  2. Hallo Felix,

    super Anleitung! Ich habe bei mir das Problem, das die Taster mehrere Events auslösen beim Drücken. Entprellen via Hardware habe ich jetzt schon versucht, allerdings ohne Erfolg. Bei Magnetschaltern (Tür) wird das wahrscheinlich noch mehr sein. Hast Du dafür evtl. eine Lösung?

    PS: Der Taster wird an GND sowie die andere Seite an GPIO5 / D2 angeschlossen. <- GPIO5 ist bei mir D1 😛

    Antworten
    • Du könntest einen „Cooldown“ (sleep) setzen, sobald eine Event ausgelöst wurde (bspw. 500ms warten, bevor das nächste erkannt wird). Oder bspw. nur auf Flanken (Pull up/down) reagieren.

      Antworten
  3. Hallo Felix,

    vielen Dank für deine tollen Tutorials.
    Habe mir sofort den ESP8266 samt Board bestellt.
    Die Idee ist unser Gewächshaus zu überwachen und bei Frostgefahr zu heizen.
    Erhard

    Antworten
  4. Éin „Guten Morgen“ in die Runde,

    bin ganz neu hier und habe bisher nur wenig Erfahrung mit dem Raspi. Für ein aktuelles Projekt möchte ca. 1.900 verschiedene Relais-Ausgänge ansteuern können – nach Möglichkeit mit nur einem Pi. Ich finde aber aber biosher nicht den passenden GPIO-Expander. Ich bräuchte z.B. einen 16bit-Expander, aber dann für 255 Teilnehmer an einem Bus. Das was ich bisher gefunden hatte, ist immer nur mit 3 Bits addressierbar – also 8 Teilnehmer am Bus – hat jemand von Euch eine gute Idee, wie ich das lösen könnte? Eventuell wäre ja die Idee aus dem heutigen Tutorial adaptierbar?

    LG
    Alexander Koch

    Antworten
  5. Hallo Felix,
    auch von mir herzlichen Dank für Deine Projekte.
    Zu dem aktuellen habe ich folgende Frage:
    Was bedeutet der Zusatz „esp8266_trigger“ in der Zeile:
    local RASPBERRY_PI_URL = „http://192.168.1.80:8000/esp8266_trigger“

    MfG

    Juergen B.

    Antworten
  6. Da ich bei einem Jugend forscht Wettbewerb auch den Raspberry Pi mittels Wifi steuern habe ich eine Frage:
    Ich möchte den Besuchern auf diesem Wettbewerb die Möglichkeit geben mittels dem Raspberry Pi selber Dinge zu steuern. Deswegen frage ich mich nun ob es mit dem Raspberry Pi möglich ist, dass sich schnell hintereinander verschiedene vorher nicht näher bekannte Endgeräte verbinden?

    Ich würde mich sehr über eine Antwort freuen:D

    Antworten
  7. Guten Tag,

    Zitat: „Als nächstes ist geplant, dass wir mehrere ESP8266 mit Sensoren (DHT11 o.ä.) ausstatten und die Werte immer wieder an den Raspberry Pi senden, welcher diese in einer lokalen SQL Datenbank sammelt.“
    Wurde das bereits realisiert oder kommt es noch?
    Vielen Dank!
    WG

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Raspberry Pi Tutorials, um kein Tutorial mehr zu verpassen!