NodeMCU ESP8266 V3 Einsteiger-Tutorial: Vom ersten Sketch zum WLAN-Sensor mit DHT22

Das NodeMCU ESP8266 V3 ist für viele der erste Kontakt mit dem Internet der Dinge – und das aus gutem Grund: Es kostet wenig, hat WLAN schon an Bord, wird per USB programmiert und lässt sich komplett aus der Arduino IDE bedienen. In diesem Tutorial startest du bei null: Arduino IDE einrichten, das Pinout mit seinen Eigenheiten verstehen, die erste LED blinken lassen, ins WLAN einwählen, einen DHT22-Sensor auslesen und am Ende einen kleinen Webserver bauen, der Temperatur und Luftfeuchte direkt im Browser anzeigt. Fertiger Code und alle typischen Stolperfallen inklusive.

Warum das NodeMCU ESP8266 V3?

Der ESP8266 ist der Chip, der das Bastel-Hobby vor Jahren im Sturm erobert hat: ein vollwertiger WLAN-Mikrocontroller für einen Bruchteil dessen, was WLAN-Shields damals kosteten. Das NodeMCU ESP8266 V3 ist die komfortabelste Bauform davon: Der nackte Chip sitzt auf einer Platine mit USB-Buchse, Spannungsregler, USB-Seriell-Wandler (CH340) und praktischen Stiftleisten fürs Breadboard.

Das bedeutet: Du steckst das Board per USB-Kabel an den Rechner, lädst deinen Sketch hoch – fertig. Kein FTDI-Adapter, keine fummelige Verkabelung zum Flashen, kein externes Netzteil. Genau das macht das V3 zum idealen Einstiegsboard, wenn du bisher mit dem Arduino UNO R3 gearbeitet hast und jetzt WLAN dazuhaben willst.

ℹ️ NodeMCU vs. Wemos D1 Mini vs. nackter ESP-12F: Alle drei tragen denselben ESP8266-Chip. Das NodeMCU V3 ist am breitesten (passt über die Mittelrille eines Standard-Breadboards, lässt aber je nach Board wenig Platz für Kabel), der Wemos D1 Mini ist kompakter, und das ESP-12F ist das nackte Modul für eigene Platinen. Für den Einstieg ist das NodeMCU mit seinen vielen herausgeführten Pins am dankbarsten.

Das brauchst du

NodeMCU ESP8266 V3 (CH340) – das WLAN-Board, Herzstück des Projekts
DHT22 (AM2302) Sensor – misst Temperatur und Luftfeuchtigkeit
Breadboard & Jumper-Kabel – zum steckbaren Aufbau
3 mm LED und ein Widerstand (~330 Ω) – für den ersten Blink-Test

💡 Micro-USB-Kabel nicht vergessen: Das NodeMCU V3 nutzt eine Micro-USB-Buchse. Wichtig: Verwende ein Datenkabel, kein reines Ladekabel. Reine Ladekabel haben keine Datenadern – der Rechner erkennt das Board dann gar nicht. Ein häufiger Fehler, der viele Minuten Fehlersuche kostet.

1Arduino IDE für den ESP8266 einrichten

Damit die Arduino IDE das NodeMCU kennt, musst du einmalig die ESP8266-Boardunterstützung nachinstallieren. Öffne Datei → Voreinstellungen und trage bei "Zusätzliche Boardverwalter-URLs" diese Adresse ein:

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

Danach gehst du auf Werkzeuge → Board → Boardverwalter, suchst nach esp8266 und installierst das Paket "ESP8266 by ESP8266 Community". Anschließend wählst du unter Werkzeuge → Board den Eintrag NodeMCU 1.0 (ESP-12E Module). Diese Einstellungen passen fürs V3:

Einstellung Wert
Board NodeMCU 1.0 (ESP-12E Module)
CPU Frequency 80 MHz
Flash Size 4MB (FS:2MB OTA:~1019KB)
Upload Speed 115200
Port COMx bzw. /dev/ttyUSBx

⚠️ CH340-Treiber nötig: Das V3 nutzt den CH340-USB-Chip. Erscheint unter "Port" kein Eintrag, fehlt der Treiber. Installiere den CH340-Treiber deines Betriebssystems, stecke das Board neu ein – danach taucht der Port auf. Unter Linux ist der Treiber meist schon im Kernel; dort hilft es, den eigenen Benutzer der Gruppe dialout hinzuzufügen.

2Pinout verstehen: Dx-Nummern und ihre Fallstricke

Der wichtigste Aha-Moment beim ESP8266: Die aufgedruckten Pin-Namen (D0 bis D8) sind nicht die GPIO-Nummern, die du im Code benutzt. Zum Glück kennt der Arduino-Core die Dx-Namen als Konstanten – du kannst also einfach D5 schreiben. Wichtig ist trotzdem zu wissen, welche Pins Besonderheiten haben:

Label GPIO Besonderheit
D1 GPIO5 I2C SCL – frei nutzbar
D2 GPIO4 I2C SDA – frei nutzbar
D3 GPIO0 Boot-Pin: beim Start nicht auf LOW ziehen
D4 GPIO2 Onboard-LED (invertiert), Boot-Pin
D5 GPIO14 SPI SCK – frei nutzbar
D6 GPIO12 frei nutzbar
D7 GPIO13 frei nutzbar
D8 GPIO15 Boot-Pin: muss beim Start LOW sein
A0 ADC0 einziger Analogeingang, max. 1,0 V

ℹ️ Drei Regeln, die dir Ärger ersparen: Erstens – für Sensoren und LEDs nimmst du am besten D1, D2, D5, D6 oder D7, die sind unkompliziert. Zweitens – D3, D4, D8 sind Boot-Pins; hängt dort beim Einschalten etwas dran, das sie auf den falschen Pegel zieht, startet das Board nicht. Drittens – der Analogeingang A0 verträgt nur bis 1,0 V (auf dem Board oft schon auf 3,3 V vorgeteilt, aber trotzdem vorsichtig sein).

3Der erste Sketch: Blink

Bevor wir ins WLAN gehen, prüfen wir mit dem Klassiker, ob Upload und Board funktionieren. Das NodeMCU hat eine eingebaute LED an LED_BUILTIN (GPIO2). Achtung: Sie ist invertiert verdrahtet – LOW schaltet sie an, HIGH aus.

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

void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // LED an (invertiert!)
  delay(500);
  digitalWrite(LED_BUILTIN, HIGH);  // LED aus
  delay(500);
}

Willst du stattdessen eine eigene LED blinken lassen, steckst du sie über einen 330-Ω-Vorwiderstand an Pin D5 und GND, setzt pinMode(D5, OUTPUT) und schaltest mit digitalWrite(D5, HIGH/LOW). Warum der Vorwiderstand nötig ist und wie du seinen Wert berechnest, erklärt der Artikel LED-Vorwiderstand berechnen.

4Ins WLAN einwählen

Jetzt das, wofür der ESP8266 gemacht ist: die WLAN-Verbindung. Der folgende Sketch verbindet sich mit deinem Netz und gibt die zugewiesene IP-Adresse im seriellen Monitor aus. Trag deine SSID und dein Passwort ein.

#include <ESP8266WiFi.h>

const char* ssid     = "DEIN_WLAN_NAME";
const char* password = "DEIN_PASSWORT";

void setup() {
  Serial.begin(115200);
  delay(100);

  WiFi.mode(WIFI_STA);           // als Client (nicht als Access Point)
  WiFi.begin(ssid, password);

  Serial.print("Verbinde mit WLAN");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Verbunden! IP-Adresse: ");
  Serial.println(WiFi.localIP());
}

void loop() {
}

⚠️ Nur 2,4-GHz-Netze: Der ESP8266 kann ausschließlich 2,4-GHz-WLAN, kein 5 GHz. Verbindet er sich nicht, prüfe, ob dein Router ein 2,4-GHz-Netz anbietet und ob SSID und Passwort exakt stimmen (Groß-/Kleinschreibung!). Bei manchen Routern hilft es, für IoT-Geräte ein separates 2,4-GHz-Gastnetz einzurichten.

5Den DHT22 auslesen

Der DHT22 misst Temperatur (-40 bis +80 °C) und Luftfeuchte (0–100 %) und liefert beides digital über eine einzige Datenleitung. So verkabelst du ihn mit dem NodeMCU:

DHT22 NodeMCU
+ (VCC) 3V3
OUT (Data) D5 (GPIO14)
- (GND) GND

Installiere über den Bibliotheksverwalter die "DHT sensor library" von Adafruit (samt der abhängigen "Adafruit Unified Sensor"). Dann liest dieser Sketch alle zwei Sekunden die Werte aus:

#include "DHT.h"

#define DHTPIN  D5      // Datenpin
#define DHTTYPE DHT22   // Sensortyp

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
}

void loop() {
  delay(2000);   // DHT22 max. alle 2 Sekunden abfragen

  float t = dht.readTemperature();
  float h = dht.readHumidity();

  if (isnan(t) || isnan(h)) {
    Serial.println("Fehler beim Lesen des DHT22!");
    return;
  }

  Serial.printf("Temperatur: %.1f C  |  Luftfeuchte: %.1f %%\n", t, h);
}

ℹ️ Warum die 2-Sekunden-Pause? Der DHT22 ist ein langsamer Sensor – er braucht rund zwei Sekunden zwischen zwei Messungen. Fragst du ihn schneller ab, bekommst du nan ("not a number") zurück. Genau dafür ist die isnan()-Prüfung da: Sie fängt fehlerhafte Messungen ab, statt Unsinn anzuzeigen.

6Alles zusammen: Messwerte im Browser anzeigen

Jetzt das Highlight: Wir kombinieren WLAN und Sensor zu einem kleinen Webserver. Rufst du die IP-Adresse des NodeMCU im Browser auf, zeigt es dir Temperatur und Luftfeuchte auf einer selbst gebauten Seite an, die sich alle fünf Sekunden aktualisiert.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "DHT.h"

const char* ssid     = "DEIN_WLAN_NAME";
const char* password = "DEIN_PASSWORT";

#define DHTPIN  D5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

ESP8266WebServer server(80);

void handleRoot() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();

  String html = "<!DOCTYPE html><html><head>";
  html += "<meta charset='utf-8'>";
  html += "<meta http-equiv='refresh' content='5'>";   // alle 5 s neu laden
  html += "<title>NodeMCU Klima</title></head><body>";
  html += "<h1>Raumklima</h1>";
  html += "<p>Temperatur: " + String(t, 1) + " °C</p>";
  html += "<p>Luftfeuchte: " + String(h, 1) + " %</p>";
  html += "</body></html>";

  server.send(200, "text/html", html);
}

void setup() {
  Serial.begin(115200);
  dht.begin();

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
  Serial.println();
  Serial.print("Webserver laeuft auf: http://");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.begin();
}

void loop() {
  server.handleClient();
}

Lade den Sketch hoch, öffne den seriellen Monitor, kopiere die angezeigte IP-Adresse (z. B. 192.168.178.42) in deinen Browser – und schon siehst du deine Messwerte live. Jedes Gerät in deinem Heimnetz kann diese Seite aufrufen. Wie du daraus ein vollwertiges, per Browser schaltbares Steuerpanel machst, zeigt der Artikel ESP32 Webserver einrichten (das Prinzip ist beim ESP8266 identisch).

💡 Von hier aus weiter: Der nächste logische Schritt ist, die Werte nicht nur anzuzeigen, sondern ins Smart Home zu schicken. Mit dem MQTT-Protokoll landen deine Messwerte direkt in Home Assistant – nachzulesen im Artikel MQTT mit ESP32 & Home Assistant, der sich mit minimalen Anpassungen auch auf dem ESP8266 nutzen lässt.

7Bonus: Deep Sleep für Batteriebetrieb

Soll das NodeMCU als batteriebetriebener Funksensor laufen, ist Dauerbetrieb Verschwendung – WLAN frisst Strom. Die Lösung ist der Deep Sleep: Das Board misst, sendet und legt sich dann für eine feste Zeit fast komplett schlafen. Dafür musst du einmalig D0 (GPIO16) mit RST verbinden, damit der interne Timer das Board wieder aufwecken kann.

// Board misst, und schlaeft dann 15 Minuten
// WICHTIG: D0 (GPIO16) mit RST verbinden!

void setup() {
  Serial.begin(115200);
  // ... hier WLAN verbinden, DHT22 lesen, Wert senden ...

  Serial.println("Gehe schlafen fuer 15 Minuten");
  ESP.deepSleep(15 * 60 * 1000000ULL);   // Mikrosekunden
}

void loop() {
  // wird nie erreicht - nach dem Aufwachen startet setup() neu
}

⚠️ D0–RST-Brücke zum Flashen kurz trennen: Solange D0 und RST verbunden sind, kann der Upload manchmal scheitern. Trenne die Brücke zum Hochladen des Sketches und setze sie erst danach wieder. Für echten Langzeitbetrieb kombinierst du das Board mit einem Akku und Lademodul – siehe akkubetriebene Projekte mit 18650-Zellen.

Troubleshooting

⚠️ Board taucht nicht als Port auf: Fast immer der CH340-Treiber oder ein reines Ladekabel. Treiber installieren, Datenkabel verwenden, Board neu einstecken.

⚠️ "espcomm_sync failed" beim Upload: Der ESP8266 kommt nicht in den Flash-Modus. Reduziere die Upload-Geschwindigkeit auf 115200, ziehe während des Uploads angeschlossene Sensoren von den Boot-Pins (D3, D4, D8) ab und versuche es erneut.

⚠️ Ständige Neustarts / Watchdog-Reset: Vermeide lange delay() oder Endlosschleifen ohne yield(). Der ESP8266 muss regelmäßig seinen WLAN-Stack bedienen – blockierst du ihn zu lange, startet der Watchdog das Board neu.

⚠️ DHT22 liefert nur nan: Datenpin richtig? Mindestens 2 Sekunden Pause zwischen Messungen? Manche DHT22-Module brauchen einen 10-kΩ-Pull-up zwischen Data und 3V3 – bei fertigen Modulen ist der meist schon verbaut.

🚀 Alles für dein erstes WLAN-Projekt

Diese Teile brauchst du für dieses Tutorial:

Fazit

Das NodeMCU ESP8266 V3 ist genau deshalb so beliebt, weil es den Sprung ins Internet der Dinge so einfach macht: auspacken, per USB anstecken, Sketch hochladen – und schon hängt dein Mikrocontroller im WLAN. Du hast in diesem Tutorial die komplette Kette durchlaufen: IDE eingerichtet, das Pinout mit seinen Boot-Pin-Fallstricken verstanden, geblinkt, dich verbunden, einen DHT22 ausgelesen und die Werte über einen eigenen Webserver im Browser sichtbar gemacht.

Die wichtigsten Merksätze: Nutze für Sensoren die unkomplizierten Pins D1, D2, D5, D6 und D7. Der ESP8266 spricht nur 2,4-GHz-WLAN. Und der DHT22 will maximal alle zwei Sekunden abgefragt werden. Von hier aus ist alles offen – ein Funk-Thermometer für jedes Zimmer, ein Datenlogger, eine Anbindung an Home Assistant per MQTT oder ein per Browser schaltbares Relais. Viel Spaß beim Bauen!

Zurück zum Blog