Wemos D1 Mini Einsteiger-Tutorial: Vom ersten Sketch zum ESP8266 WLAN-Webserver
Kaum größer als eine Briefmarke, WLAN an Bord und für kleines Geld zu haben: Der Wemos D1 Mini mit ESP8266-Chip ist seit Jahren das Lieblingsboard für Smart-Home-Bastler – und der vielleicht einfachste Einstieg in vernetzte Mikrocontroller-Projekte überhaupt. In diesem Tutorial richtest du die Arduino IDE für den D1 Mini ein, verstehst die etwas eigenwillige Pin-Belegung, liest einen DHT22-Sensor aus und baust am Ende einen eigenen WLAN-Webserver, über den du Temperatur abliest und ein Relais vom Handy aus schaltest.
Warum der D1 Mini der perfekte Einstieg ins IoT ist
Ein klassischer Arduino UNO ist toll zum Lernen – aber sobald dein Projekt ins Netzwerk soll, brauchst du Zusatzhardware. Der ESP8266 auf dem D1 Mini bringt WLAN direkt mit: Er verbindet sich mit deinem Heimnetz, kann Webseiten ausliefern, Daten an Server schicken oder per MQTT mit deinem Smart Home sprechen. Dazu kommt: Der Chip läuft mit 80 MHz (statt 16 MHz beim UNO), hat 4 MB Flash und wird bequem per USB-C programmiert – in derselben Arduino IDE, die du schon kennst.
Der D1 Mini ist dabei bewusst minimalistisch: 11 nutzbare GPIO-Pins, ein Analogeingang, kompaktes Format für den Dauereinsatz in kleinen Gehäusen. Für Sensorknoten, WLAN-Schalter, Wetterstationen und ESPHome-Projekte ist genau das ideal.
ℹ️ 3,3V-Logik beachten: Anders als der UNO arbeitet der ESP8266 intern mit 3,3V. Die 5V vom USB-Anschluss stehen am 5V-Pin zur Verfügung (z. B. für Sensoren), aber die GPIO-Pins vertragen offiziell nur 3,3V. Viele Module wie der DHT22 funktionieren problemlos direkt mit 3,3V.
Was du brauchst
Arduino IDE für den ESP8266 einrichten
-
1Öffne in der Arduino IDE Datei → Einstellungen und trage bei „Zusätzliche Boardverwalter-URLs“ ein:
http://arduino.esp8266.com/stable/package_esp8266com_index.json -
2Öffne den Boardverwalter, suche nach „esp8266“ und installiere das Paket
esp8266 by ESP8266 Community. -
3Wähle unter Werkzeuge → Board den Eintrag
LOLIN(WEMOS) D1 R2 & mini. - 4Schließe das Board per USB-C an und wähle den neuen COM-Port aus. Wird kein Port angezeigt, installiere den CH340-USB-Treiber (siehe Troubleshooting).
Die Pin-Belegung verstehen: D-Nummern vs. GPIO
Die größte Stolperfalle beim D1 Mini: Die aufgedruckten Pin-Namen (D0 bis D8) entsprechen nicht den GPIO-Nummern des ESP8266. Im Code kannst du zum Glück einfach die D-Konstanten verwenden – digitalWrite(D4, HIGH) funktioniert direkt. Ein paar Pins haben außerdem Sonderfunktionen beim Booten:
| Aufdruck | GPIO | Besonderheit |
|---|---|---|
| D0 | GPIO16 | Kein Interrupt/PWM, nötig für Deep-Sleep-Wakeup (Brücke zu RST) |
| D1 / D2 | GPIO5 / GPIO4 | Beste Allrounder-Pins, Standard für I2C (SCL/SDA) |
| D3 | GPIO0 | Boot-Pin: muss beim Start HIGH sein |
| D4 | GPIO2 | Boot-Pin, interne LED (invertiert: LOW = an) |
| D5–D7 | GPIO14/12/13 | SPI-Pins, sonst frei verwendbar |
| D8 | GPIO15 | Boot-Pin: muss beim Start LOW sein |
| A0 | ADC0 | Einziger Analogeingang, max. 3,2V am D1 Mini |
Merkregel: Sensoren und Aktoren zuerst an D1, D2, D5, D6, D7 anschließen – diese Pins haben keine Boot-Fallen.
Code 1: Blink mit der internen LED
Der Klassiker zum Testen der Toolchain. Beachte: Die interne LED des D1 Mini ist invertiert – LOW schaltet sie ein.
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // interne LED an D4 (GPIO2)
}
void loop() {
digitalWrite(LED_BUILTIN, LOW); // LED AN (invertiert!)
delay(500);
digitalWrite(LED_BUILTIN, HIGH); // LED AUS
delay(500);
}
Code 2: Mit dem WLAN verbinden und DHT22 auslesen
Verkabelung: DHT22 VCC an 3V3, GND an G, Datenpin an D2. Installiere im Bibliotheksverwalter die DHT sensor library von Adafruit (inkl. Adafruit Unified Sensor).
#include <ESP8266WiFi.h>
#include <DHT.h>
#define DHT_PIN D2
#define DHT_TYP DHT22
const char* WLAN_NAME = "DEIN_WLAN_NAME";
const char* WLAN_PASSWORT = "DEIN_WLAN_PASSWORT";
DHT dht(DHT_PIN, DHT_TYP);
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.mode(WIFI_STA);
WiFi.begin(WLAN_NAME, WLAN_PASSWORT);
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() {
float temperatur = dht.readTemperature();
float feuchte = dht.readHumidity();
if (isnan(temperatur) || isnan(feuchte)) {
Serial.println("Fehler beim Lesen des DHT22!");
} else {
Serial.print("Temperatur: ");
Serial.print(temperatur);
Serial.print(" °C | Luftfeuchte: ");
Serial.print(feuchte);
Serial.println(" %");
}
delay(3000);
}
Im seriellen Monitor (115200 Baud) siehst du nach dem Verbindungsaufbau die IP-Adresse deines Boards – die brauchst du gleich für den Webserver.
Code 3: WLAN-Webserver mit Sensoranzeige und Relais-Steuerung
Jetzt kombinieren wir alles: Der D1 Mini liefert eine kleine Webseite aus, die Temperatur und Luftfeuchte anzeigt und zwei Buttons zum Schalten des Relais bietet. Relais-Verkabelung: VCC an 5V, GND an G, IN an D1.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#define DHT_PIN D2
#define DHT_TYP DHT22
#define RELAIS_PIN D1
const char* WLAN_NAME = "DEIN_WLAN_NAME";
const char* WLAN_PASSWORT = "DEIN_WLAN_PASSWORT";
DHT dht(DHT_PIN, DHT_TYP);
ESP8266WebServer server(80);
bool relaisAn = false;
String baueSeite() {
float t = dht.readTemperature();
float h = dht.readHumidity();
String html = "<!DOCTYPE html><html><head>";
html += "<meta charset='utf-8'>";
html += "<meta name='viewport' content='width=device-width, initial-scale=1'>";
html += "<meta http-equiv='refresh' content='10'>";
html += "<title>D1 Mini Dashboard</title></head><body>";
html += "<h1>D1 Mini Dashboard</h1>";
html += "<p>Temperatur: " + String(t, 1) + " °C</p>";
html += "<p>Luftfeuchte: " + String(h, 1) + " %</p>";
html += "<p>Relais ist: " + String(relaisAn ? "AN" : "AUS") + "</p>";
html += "<p><a href='/an'>Relais AN</a> | <a href='/aus'>Relais AUS</a></p>";
html += "</body></html>";
return html;
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(RELAIS_PIN, OUTPUT);
digitalWrite(RELAIS_PIN, LOW);
WiFi.mode(WIFI_STA);
WiFi.begin(WLAN_NAME, WLAN_PASSWORT);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Webserver erreichbar unter: http://");
Serial.println(WiFi.localIP());
server.on("/", []() { server.send(200, "text/html", baueSeite()); });
server.on("/an", []() {
relaisAn = true;
digitalWrite(RELAIS_PIN, HIGH);
server.sendHeader("Location", "/");
server.send(303);
});
server.on("/aus", []() {
relaisAn = false;
digitalWrite(RELAIS_PIN, LOW);
server.sendHeader("Location", "/");
server.send(303);
});
server.begin();
}
void loop() {
server.handleClient();
}
Rufe die IP-Adresse aus dem seriellen Monitor im Browser auf deinem Handy oder PC auf (gleiches WLAN vorausgesetzt) – und du steuerst dein erstes IoT-Gerät. Die Seite aktualisiert die Messwerte alle 10 Sekunden automatisch.
⚠️ Sicherheitshinweis Relais: Schalte mit dem KY-019 zum Lernen nur Kleinspannung (z. B. eine 12V-LED-Leiste). Netzspannung (230V) gehört ausschließlich in die Hände von Fachkräften – Lebensgefahr!
Code 4: Strom sparen mit Deep Sleep
Für Batterie-Sensorknoten ist der Deep-Sleep-Modus Gold wert: Der ESP8266 wacht in festen Intervallen auf, misst, sendet und schläft weiter. Wichtig: Verbinde dafür D0 mit RST – ohne diese Brücke kann sich der Chip nicht selbst aufwecken. Zum Flashen die Brücke wieder trennen.
#include <ESP8266WiFi.h>
void setup() {
Serial.begin(115200);
delay(100);
Serial.println();
Serial.println("Aufgewacht! Hier wuerde jetzt gemessen und gesendet.");
// Hier: Sensor lesen, WLAN verbinden, Daten uebertragen ...
Serial.println("Schlafe fuer 60 Sekunden...");
ESP.deepSleep(60e6); // Mikrosekunden: 60e6 = 60 s
}
void loop() {
// wird nie erreicht
}
Praxistipps
📡 WLAN-Empfang prüfen: Mit WiFi.RSSI() liest du die Signalstärke in dBm aus. Werte besser als -70 dBm sind solide; darunter helfen ein anderer Standort oder eine kürzere Distanz zum Router.
🏠 Perfekt für ESPHome & Home Assistant: Der D1 Mini ist eines der beliebtesten ESPHome-Boards – statt selbst Code zu schreiben, beschreibst du Sensoren und Schalter in einer YAML-Datei und bindest sie direkt in Home Assistant ein.
🔌 Saubere Stromversorgung: WLAN-Sendespitzen ziehen kurzzeitig bis zu 300 mA. Bei mysteriösen Resets im Akku- oder Netzteilbetrieb hilft ein Elko (z. B. 470 µF) zwischen 5V und GND direkt am Board.
Troubleshooting
⚠️ Kein COM-Port sichtbar: Der D1 Mini nutzt den CH340-USB-Chip – unter Windows und älteren macOS-Versionen muss der CH340/CH341-Treiber einmalig installiert werden. Auch ein reines Ladekabel ohne Datenleitungen ist ein häufiger Übeltäter.
⚠️ Board bootet nicht oder Upload schlägt fehl: Prüfe, ob etwas an den Boot-Pins D3, D4 oder D8 hängt, das den Pegel beim Start verzieht. Zum Flashen im Zweifel alle externen Module abziehen.
⚠️ Ständige Watchdog-Resets (wdt reset): Der ESP8266 muss regelmäßig seine WLAN-Routinen bedienen. Vermeide lange blockierende Schleifen ohne delay() oder yield() – schon ein delay(1) pro Schleifendurchlauf beruhigt den Watchdog.
⚠️ DHT22 liefert nan: Zwischen zwei Messungen müssen mindestens 2 Sekunden liegen. Prüfe außerdem, ob der Datenpin wirklich an D2 hängt und der Sensor mit 3,3V versorgt wird.
📡 Starte dein erstes WLAN-Projekt
Alle Bauteile für dieses Tutorial findest du bei MAKEROO.
Fazit
Mit dem Wemos D1 Mini bist du in unter einer Stunde vom ersten Blink-Sketch beim eigenen WLAN-Webserver – inklusive echter Sensordaten und Relais-Steuerung vom Handy. Wenn du die Eigenheiten des Boards kennst (D-Nummern statt GPIOs, Boot-Pins, 3,3V-Logik), ist der ESP8266 ein extrem zuverlässiger Arbeiter für Smart-Home-Knoten aller Art. Der nächste logische Schritt: mehrere D1 Minis als Sensornetz, die ihre Daten per MQTT an eine Zentrale melden.