ESP8266 NodeM­CU

Lese­zeit: 6 Minu­ten

Das NodeM­CU

Das NodeM­CU arbei­tet mit einem ESP8266-Pro­zes­sor und ver­fügt über WiFi.

Board instal­lie­ren

Tra­ge unter Datei -> Ein­stel­lun­gen eine zusätz­li­che Board­ver­wal­ter-URL ein:

http://​ardui​no​.esp8266​.com/​s​t​a​b​l​e​/​p​a​c​k​a​g​e​_​e​s​p​8​2​6​6​c​o​m​_​i​n​d​e​x​.​j​son

Board aus­wäh­len

Wenn das NodeM­CU nicht auto­ma­tisch erkannt wur­de, kli­cke auf "Wäh­le ein ande­res Board und einen ande­ren Port" und suche nach NodeM­CU. Je nach Betriebs­sys­tem wird der USB-Port eine ande­re Bezeich­nung haben.

Pin­be­le­gung

I²C

Info zu I²C

D1 (GPIO5) -> SCL
D2 (GPIO4) -> SDA

SPI

Info zu SPI

D5 (GPIO14) -> SCK/SLCK
D6 (GPIO12) -> CIPO/SDI
D7 (GPIO13) -> COPI/SDO
D8 (GPIO15) -> CS

Digi­ta­le Pins

D0 (GPIO16)
D1 (GPIO5)
D2 (GPIO4)
D3 (GPIO0)
D4 (GPIO3)
D5 (GPIO14)
D6 (GPIO12)
D7 (GPIO13)
D8 (GPIO15)
RX (GPIO3)

Die Pins kön­nen mit ihrer Bezeich­nung D0 bis D8 und mit ihrer Num­mer ange­spro­chen werden:

int LED = 5;

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

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

oder:

int LED = D1;

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

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

Ana­lo­ger Pin

Das NodeM­CU ver­fügt nur über einen ana­lo­gen Pin.
Der Anolog-Digi­tal-Wand­ler ermit­telt Wer­te zwi­schen 0 und 1024.

WiFi

Bei­spiel:
Im Brow­ser wer­den 6 Zufalls­zah­len ange­zeigt.
Im Seri­el­len Moni­tor wird die mit DHCP ermit­tel­te IP des NodeM­CU angezeigt.

cli­ent-Metho­de

#include "ESP8266WiFi.h"

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";
WiFiServer Server(80);
WiFiClient Client;

// Minimum und Maximum der Zufallszahlen
int Minimum = 1;
int Maximum = 49;

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial);
  delay(500);

  // WiFi starten
  WiFi.begin(Router, Passwort);

  // Verbindung herstellen
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(200);
    Serial.print(".");
  }
  Server.begin();

  // SSID des Routers anzeigen
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(WiFi.SSID());

  // IP anzeigen
  Serial.println(WiFi.localIP());

  // Zufallsgenerator mit dem Signal an A0 starten
  randomSeed(analogRead(A0));
}

void loop()
{
  Client = Server.available();
  if (Client)
  {
    // Seite aufbauen wenn SeiteAufbauen true ist
    boolean SeiteAufbauen = true;

    // solange der Client verbunden ist ...
    while (Client.connected())
    {
      if (Client.available())
      {
        // Anforderung vom Clienten lesen ...
        char Zeichen = Client.read();

        // return (\n) gesendet
        if (Zeichen == '\n')
        {
          // wenn SeiteAufbauen den Wert true hat
          if (SeiteAufbauen)
          {
            /*
              HTML-Seite aufbauen
              die folgenden Anweisungen müssen
              mit print oder println gesendet werden
              println "verschönert" den Quelltext
              (erzeugt einen Zeilenumbruch im Quelltext)
            */

            // HTML-Seite aufbauen
            Client.println("HTTP/1.1 200 OK");
            Client.println("Content-type:text/html");

            // Leerzeile zwingend erforderlich
            Client.println();
            Client.println("<!doctype html>");
            Client.println("<html>");
            Client.println("<body>");

            // alle 60 Sekunden aktualisieren mit meta-Tag
            Client.println("<meta http-equiv=\"refresh\" content=\"60\">");

            // <h2> Überschrift H2
            Client.println("<h2>Zufallszahlen</h2>");

            // <hr> horizontale Linie
            Client.println("<hr>");

            // Zufallszahlen anzeigen
            for (int i = 0; i < 6; i++ )
            {
              int Zahl = random(Minimum, Maximum);
              Client.println(Zahl);
              Client.println(" ");
            }
            Client.print("<hr>");

            // IPs anzeigen
            Client.print("Eigene IP (Server): ");
            Client.print(Client.remoteIP());

            // <br> break = neue Zeile
            Client.print("<br>IP Adresse Klient DHCP ");
            Client.print(WiFi.localIP());

            // Seite schließen
            Client.println("</body>");
            Client.println("</html>");

            // HTTP-Antwort endet mit neuer Zeile
            Client.println();

            // Seite vollständig geladen -> loop verlassen
            break;
          }

          // wenn new line (\n) gesendet wurde -> Seite aufbauen
          if (Zeichen == '\n') SeiteAufbauen = true;
          else if (Zeichen != '\r') SeiteAufbauen = false;
          delay(1);
          Client.stop();
        }
      }
    }
  }
}

Server.on-Methode

#include "ESP8266WebServer.h"

// Router-SSID/Passwort anpassen
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxx";

ESP8266WebServer Server(80);

// LED beim Start ausgeschaltet
bool LEDStatus = false;

// statischeIP = false -> IP-Adresse über DHCP vergeben
// statischeIP = true -> statische IP festlegen
bool statischeIP = false;

// ip und gateway müssen an das lokale Netz angepasst werden
IPAddress ip(192, 168, 1, 100);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

void setup() 
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  // WiFi starten
  WiFi.begin(Router, Passwort);

  // statische IP vergeben
  if (statischeIP) 
  {
    WiFi.config(ip, gateway, subnet);
    Serial.print("Verbunden mit ");
    Serial.println(Router);

    // IP anzeigen
    Serial.print("Statische IP: ");
  }

  // IP über DHCP ermitteln
  else 
  {
    while (WiFi.status() != WL_CONNECTED) 
    {
      delay(200);
      Serial.print(".");
    }
    Serial.println();
    Serial.print("Verbunden mit ");
    Serial.println(Router);
    Serial.print("IP über DHCP: ");
  }

  // IP anzeigen
  Serial.println(WiFi.localIP());

  // Webserver starten
  // / -> Aufruf der URL, SeiteBauen -> Aufruf der Funktion
  Server.begin();
  Server.on("/", SeiteBauen);

  // beim Aufruf der URL /LEDSchalten
  // Funktion für die Schaltung der LED aufrufen
  Server.on("/LEDSchalten", LEDSchalten);
}

void loop() 
{
  // auf Anfragen warten
  Server.handleClient();
}

void SeiteBauen() 
{
  // Seite "zusammenbauen"
  String Seite = "";
  Seite += "<h1 align=\"left\">LED schalten</h1>";

  // Link beim Anklicken des Buttons
  // Aufruf der Funktion LEDSchalten
  Seite += "<a href=\"/LEDSchalten\">";

  // LED aus -> LEDStatus false -> gelber Hintergrund
  if (LEDStatus) Seite += "<input style=\"background-color: blue;";

  // LED an -> LEDStatus true -> weißer Hintergrund
  else Seite += "<input style=\"background-color: white;";
  Seite += " width:150px;height:150px; cursor:pointer;";
  Seite += " border-radius:50%;border: 2px solid black;\"";
  Seite += " type=\"button\">";

  // Seite anzeigen
  Server.send(200, "text/html", Seite);
}

void LEDSchalten() 
{
  // LEDStatus = false -> LED einschalten
  // LOW -> einschalten
  if (!LEDStatus) digitalWrite(LED_BUILTIN, LOW); 
  
  // LEDStatus = true -> LED ausschalten
  // HIGH -> ausschalten
  else  digitalWrite(LED_BUILTIN, HIGH); 
  LEDStatus = !LEDStatus;

  // Seite neu aufbauen
  SeiteBauen();
}

Letzte Aktualisierung: 20. Okt 2024 @ 9:52