Nr. 26 – NodeMCU mit integriertem ESP8266-Modul Anleitung

Aufgabe 26.1 : Das NodeMCU mit integriertem ESP8266-Modul in Betrieb nehmen

Material : Arduino, NodeMCU , Kabel (Materialbeschaffung www.funduinoshop.com)

Das NodeMCU Entwicklerboard ist ein kleiner, leistungsstarker Mikrocontroller. Es verfügt ähnlich wie ein Arduino-Board über GPIOs (general purpose input/output), also Digitale Ein- und Ausgänge und zusätzlich ist ein ESP8266-Modul integriert. Über dieses Modul kann eine Verbindung in WLAN-Netze hergestellt werden.

Beim ersten Blick auf das NodeMCU fällt auf, dass die Pinbelegung kaum von der eines Funduino UNO/MEGA R3 abweicht. Wir finden die Digitalen Anschlüsse D0 bis D10, GND, Pins für die Versorgungsspannung, separate RX/TX Pins und sogar Pins zum Ansteuern des I²C Busses.

Da die Bezeichnung der digitalen Pins (D0 bis D10) jedoch nicht mit denen der internen ESP8266 GPIOs übereinstimmt (D1 entspricht nicht GPIO1, D2 nicht GPIO2, …), müssen unbedingt wir die nachfolgende Pinbelegung berücksichtigen.

 Digitale Pins des NodeMCU GPIO Belegung
 D0 / LED_BUILTIN GPIO16
D1     GPIO5
D2 GPIO4
D3 GPIO0
D4 GPIO2
D5 GPIO14
D6 GPIO12
D7 GPIO13
D8 GPIO15
D9 GPIO3
D10 GPIO1

 

 

Doch wie kann ich das Entwicklerboard programmieren?

Wir beginnen zuerst mit der Implementierung der ESP8266 Bibliothek.

Die Installation der Bibliothek und die Auswahl des NodeMCU erfolgt in fünf einfachen Schritten.

Schritt 1 – Den Reiter „Datei“ anklicken und den Unterpunkt „Voreinstellungen“ auswählen.

Es öffnet sich ein neuer Dialog.

 

Schritt 2 – Die nachfolgende URL in das weiße Eingabefeld eintragen und den Dialog mit „OK“ schließen.

 http://arduino.esp8266.com/stable/package_esp8266com_index.json

 

Schritt 3 – Den Reiter „Werkzeuge“ anklicken, den Unterpunkt „Board: Platzhalter“ auswählen und anschließend die Boardverwaltung öffnen

 

Schritt 4 – Geben Sie nun „ESP8266“ in die Suchleiste ein. Nun können Sie die Bibliothek installieren.

 

 

Schritt 5 – Den Reiter „Werkzeuge“ anklicken und im Unterpunkt „Board: Platzhalter“ das „NodeMCU 0.9 (ESP-12 Module)“ auswählen.

 

 

Nachdem wir die Bibliothek implementiert und unser NodeMCU konfiguriert haben, können wir es endlich über die Arduino IDE programmieren.

Nun kommen wir zum eigentlichen Sketch und der Bearbeitung der Aufgabe 26.1 .
Dieser unterscheidet sich im Wesentlichen nicht von unserer Anleitung Nr. 1,  der blinkenden LED.

Der Sketch : 

int LED = D0;          

void setup() {
 pinMode(LED, OUTPUT); 
 }

void loop() {
 digitalWrite(LED, LOW); 
 delay(1000); 
 digitalWrite(LED, HIGH); 
 delay(1000);
}

Dem fortgeschrittenen Bastler ist eventuell direkt ein kleiner Unterschied aufgefallen.

 int LED = D0

Anstatt der herkömmlichen Definition der Variablen (z.B. „int LED = 6;“ für „LED liegt an Pin6 an“) haben wir hier die Pinbezeichnung des NodeMCU verwendet. Da der bin D0 aber auch dem GPIO16 (siehe Tabelle) entspricht, hätten wir auch die Variable „int LED = 16;“ verwenden können.

 

 

Aufgabe 26.2 : Einen Temperaturwert mit dem NodeMCU (WLAN) ins Heimnetz übertragen

Material : Arduino, NodeMCU , TMP36 Sensor, Kabel, Breadboard (Materialbeschaffung www.funduinoshop.com)

Nachdem wir bereits in Aufgabe 26.1 die integrierte LED des NodeMCU blinken lassen haben, widmen wir uns jetzt einer etwas komplizierteren Aufgabe. Wir möchten einen Temperaturwert mit dem TMP36 erfassen, mit dem NodeMCU verarbeiten und anschließend in unserem Webbrowser anzeigen lassen.
Für die Datenübertragung an unseren Router verwenden wir das integrierte ESP8266-Modul.

Zuerst wird der TMP36 wie in der nachfolgenden Zeichnung angeschlossen.

 

Da die Erfassung und Umwandlung des Temperaturwerts durch den TMP36 aus der Anleitung Nummer 10 entnommen werden kann, schauen wir uns direkt die Datenübertragung per WLAN an.

Wir verwenden in dieser Aufgabe die „<ESP8266WiFi.h>“ Bibliothek, welche mit dem Standardbefehl „#include <ESP8266WiFi.h>“ implementiert werden kann.

 

Im ersten Teil des Sketches, welcher die Variablen und  das Setup enthält, wird unser Webserver eingerichtet.

#include <ESP8266WiFi.h>             // Implementierung der ESP8266 WiFi Bibliothek


const char* ssid  = "IhreSSID";       // Festlegung unserer SSID (Name des WLAN-Netzwerks)
const char* password = "IhrPasswort";  // Festlegung unseres WLAN-Passworts


int sensorwert;                      // Diese Variablen haben wir der Anleitung 10 entnommen.
int TMP36 = A0;                      // Sie dienen im späteren Verlauf der Ermittlung der Temperatur
int temperatur = 0;
int temperatur1;
int t=500;

WiFiServer server(80);               // WLAN Verbindung wird über den Port80 hergestellt


void setup()                         // Im Setup werden unsere Einstellungen konfiguriert. Zudem bauen wir Kontrollelemente ein, die uns zur Überwachung des NodeMCU dienen.
                                     
{
     Serial.begin(115200);           // Das NodeMCU verwendet die Baudrate "115200" 
                                     // Diese Baudrate muss später im Seriellen Monitor eingestellt werden, damit wir die Aktionen des NodeMCU überwachen können
    
                                      
     Serial.println();
     Serial.print("Verbinde zu ");
     Serial.println(ssid);           // Kontrollelement im seriellen Monitor
     

     WiFi.begin(ssid,password);      // Die WLAN Verbindung wird mit der oben definierten SSID und dem zugehörigen Passwort hergestellt

   
     while (WiFi.status() != WL_CONNECTED)  // Solange noch keine WLAN-Verbindung besteht....
     {
      delay(500);
      Serial.print(".");                    // ... sollen Punkte ausgegeben werden. Die Punkte dienen als Kontrollelement.
     }

     Serial.println(" ");
     Serial.println("WiFi verbunden");   // Kontrollelement im seriellen Monitor

     server.begin();                     // Das NodeMCU dient nun als Mini-Webserver, auf welchem wir Daten temporär speichern und ausgeben können
     
     Serial.println ("Webserver laeuft, warte auf ESP8266..."); // Kontrollelement im seriellen Monitor

     delay(10000);                       // An dieser Stelle geben wir dem ESP-Modul 10 Sekunden Zeit für die Initialisierung
     Serial.println();
     Serial.println("Die IP-Adresse des Webservers lautet ");
     Serial.println(WiFi.localIP());     // Nun wird die sogenannte localIP ausgegeben. Diese können wir später im Webbrowser aufrufen und die Temperaturwerte ablesen.
}

Im zweiten Teil werden die Informationen vom Webserver angefordert und ausgegeben.

void loop()

{

// In den Folgenden Zeilen soll festgestellt werden, ob sich ein Client mit dem Server verbindet.

WiFiClient client = server.available();    // Abfrage an den Webserver, die der Erkennung eines Client dient. 

if (client)                              // Insofern ein Client vorhanden ist...
{

Serial.println("Neuer Client");        // Kontrollelement im seriellen Monitor

while (client.connected())             // ... und sich dieser mit dem Server verbinden möchte...
{
if (client.available())            // ... und auch als solcher erkannt wird, ...

{

sensorwert=analogRead(TMP36);                   // ... startet die Ermittlung der Umgebungstemperatur.
temperatur= map(sensorwert, 0, 410, -50, 150);
delay(t);
temperatur1 = (temperatur*0.333);

client.println("<!DOCTYPE HTML>");                   // Jetzt wird das HTML-Kontrukt für den Webserver erstellt.
client.println("<html>");                            // Websiten werden in der Regel in der Programmiersprache "HTML" kontruiert. 
client.println("Der Funduino Temperaturmesser");     // Damit wir auf unserer Website später auch etwas ablesen können, müssen wir diese Füllen.
client.println("<br>");                              // Dies erreichen wir mit dem Befehl "client.println" , ähnlich wie "Serial.println"
client.println("<br>");                              // "<br>" erschafft eine Leerzeile (bzw. definiert das Ende einer Zeile)
client.println("Die Raumtemperatur betraegt ca. ");
client.println(temperatur1);                         // An dieser Stelle soll die Variable ausgegeben werden.
client.println(" Grad Celsius.");

break;                     // Der "break;" beendet die Schleife

}

}
}

delay(1000);                           // Wir warten eine Sekunde lang ab....

client.stop();                         // ... und beenden die Verbindung zum Webserver.

}

 

 

Der gesamte Sketch im Überblick :

#include <ESP8266WiFi.h>             // Implementierung der ESP8266 WiFi Bibliothek


const char* ssid  = "IhreSSID";       // Festlegung unserer SSID (Name des WLAN-Netzwerks)
const char* password = "IhrPasswort";  // Festlegung unseres WLAN-Passworts


int sensorwert;                      // Diese Variablen haben wir der Anleitung 10 entnommen.
int TMP36 = A0;                      // Sie dienen im späteren Verlauf der Ermittlung der Temperatur
int temperatur = 0;
int temperatur1;
int t=500;

WiFiServer server(80);               // WLAN Verbindung wird über den Port80 hergestellt


void setup()                         // Im Setup werden unsere Einstellungen konfiguriert. Zudem bauen wir Kontrollelemente ein, die uns zur Überwachung des NodeMCU dienen.
                                     
{
     Serial.begin(115200);           // Das NodeMCU verwendet die Baudrate "115200" 
                                     // Diese Baudrate muss später im Seriellen Monitor eingestellt werden, damit wir die Aktionen des NodeMCU überwachen können
    
                                      
     Serial.println();
     Serial.print("Verbinde zu ");
     Serial.println(ssid);           // Kontrollelement im seriellen Monitor
     

     WiFi.begin(ssid,password);      // Die WLAN Verbindung wird, mit der oben definierten SSID und dem zugehörigen Passwort hergestellt

   
     while (WiFi.status() != WL_CONNECTED)  // Solange noch keine WLAN-Verbindung besteht....
     {
      delay(500);
      Serial.print(".");                    // ... sollen Punkte ausgegeben werden. Die Punkte dienen als Kontrollelement.
     }

     Serial.println(" ");
     Serial.println("WiFi verbunden");   // Kontrollelement im seriellen Monitor

     server.begin();                     // Das NodeMCU dient nun als Mini-Webserver, auf welchem wir Daten temporär speichern können
     
     Serial.println ("Webserver laeuft, warte auf ESP8266..."); // Kontrollelement im seriellen Monitor

     delay(10000);                       // An dieser Stelle geben wir dem ESP-Modul 10 Sekunden Zeit für die Initialisierung
     Serial.println();
     Serial.println("Die IP-Adresse des Webservers lautet ");
     Serial.println(WiFi.localIP());     // Nun wird die sogenannte localIP ausgegeben. Diese können wir später im Webbrowser aufrufen und die Temperaturwerte ablesen.
}

void loop()            

{

                  // In den Folgenden Zeilen soll festgestellt werden, ob sich ein Client mit dem Server verbindet/verbunden hat.
                  
WiFiClient client = server.available();    // Abfrage an den Webserver, die der Erkennung eines Client dient. 
                                           

  if (client)                              // Insofern ein Client vorhanden ist...
  {
    
    Serial.println("Neuer Client");        // Kontrollelement im seriellen Monitor

 

    while (client.connected())             // ... und sich dieser mit dem Server verbinden möchte...
    {
        if (client.available())            // ... und auch als solcher erkannt wird, ...
        
        {
         

                  sensorwert=analogRead(TMP36);                   // ... startet die Ermittlung der Umgebungstemperatur.
                  temperatur= map(sensorwert, 0, 410, -50, 150); 
                  delay(t); 
                  temperatur1 = (temperatur*0.333);              
                                                                 

              client.println("<!DOCTYPE HTML>");                   // Jetzt wird das HTML-Kontrukt für den Webserver erstellt.
              client.println("<html>");                            // Websiten werden in der Regel in der Programmiersprache "HTML" kontruiert. 
              client.println("Der Funduino Temperaturmesser");     // Damit wir auf unserer Website später auch etwas ablesen können, müssen wir diese Füllen.
              client.println("<br>");                              // Dies erreichen wir mit dem Befehl "client.println" , ähnlich wie "Serial.println"
              client.println("<br>");                              // "<br>" erschafft eine Leerzeile (bzw. definiert das Ende einer Zeile)
              client.println("Die Raumtemperatur betraegt ca. ");
              client.println(temperatur1);                         // An dieser Stelle soll die Variable ausgegeben werden.
              client.println(" Grad Celsius.");
             

              break;                     // Der "break;" beendet die Schleife
              
        }
        
    }
  }

  delay(1000);                           // Wir warten eine Sekunde lang ab....
 
  client.stop();                         // ... und beenden die Verbindung zum Webserver.

  
}