Es gibt zwei Versionen des Wemos D1 mit identischer Pinbelegung:
- D1 Mini Typ C mit Mini-USB-Anschluss
- D1 Mini V4.0 wird mit USB-C-Anschluss
D1 Mini Typ C | D1 Mini V 4.0 |
Board installieren
Trage unter Datei -> Einstellungen eine zusätzliche Boardverwalter-URL ein:
https://arduino.esp8266.com/stable/package_esp8266com_index.json
Board auswählen
Pinbelegung
I²C-Pins
I²C-Pins (in Klammern ESP-Pin-Nummern)
D1 (5)-> SCL
D2 (4) -> SDA
SPI-Pins
SPI-Pins (in Klammern ESP-Pin-Nummern)
D7 (13)-> COPI/SDO
D6 (12) -> CIPO/SDI
D5 (14) -> CLK/SCK
D8 (15) -> CS
Beispiel: Anschluss eines Adafruit 1,8 Zoll TFT
Digitale Pins
Digitale Pins
links | Bemerkung | rechts | Bemerkung |
---|---|---|---|
D0 (16) | Zustand HIGH beim Hochladen eine angeschlossene LED leuchtet beim Hochladen | D1 (5) | |
D5 (14) | D2 (4) | ||
D6 (12) | D3 (0) | aktiviert Firmware-Upload wenn der Zustand LOW ist | |
D7 (13) | D4 (2) | darf beim Hochladen nicht LOW sein. Kann nach dem Hochladen als normaler Eingabe-/Ausgabepin verwendet werden. Interne LED | |
D8 (15) | darf beim Hochladen nicht HIGH sein |
Der Zustand des Pins D2 ist LOW | Der Zustand des Pins D2 ist HIGH |
Mit diesem Programm kannst du den Zustand des Tasters an Pin D2 testen:
int Taster = D2;
int Status = 0;
void setup()
{
// die Taster werden als INPUT (Eingang) deklariert
pinMode(Taster, INPUT);
Serial.begin(9600);
}
void loop()
{
// Taster für die gelbe LED abfragen
Status = digitalRead(Taster);
if (Status) Serial.println("Zustand des Tasters: HIGH" );
else Serial.println("Zustand des Tasters: LOW" );
delay(500);
}
Analoger Pin
Das Wemos D1 Mini hat nur einen analogen Pin mit der Bezeichnung A0. Die Auflösung beträgt 10 Bit, der maximale Wert ist 1024.
Zeit mit der Bibliothek time.h anzeigen
ESP8266-Mikrocontroller können mit der Standardbibliothek Datum und Zeit anzeigen.
Beispiel: ⇒Anzeige von Datum und Zeit auf einem OLED-Display
#include "ESP8266WiFi.h"
#include "time.h"
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";
// NTP-Server aus dem Pool
#define Zeitserver "de.pool.ntp.org"
/*
Liste der Zeitzonen
https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
CEST = Central European Summer Time von
M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
#define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"
// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit;
/*
Struktur tm
tm_hour -> Stunde: 0 bis 23
tm_min -> Minuten: 0 bis 59
tm_sec -> Sekunden 0 bis 59
tm_mday -> Tag 1 bis 31
tm_wday -> Wochentag (0 = Sonntag, 6 = Samstag)
tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
tm_year -> Jahre seit 1900
tm_yday -> vergangene Tage seit 1. Januar des Jahres
tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
tm Zeit;
WiFiServer Server(80);
WiFiClient Client;
void setup()
{
// Zeitzone: Parameter für die zu ermittelnde Zeit
configTzTime(Zeitzone, Zeitserver);
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(1000);
// WiFi starten
WiFi.begin(Router, Passwort);
Serial.println("------------------------");
while (WiFi.status() != WL_CONNECTED)
{
delay(200);
Serial.print(".");
}
Serial.println();
Serial.print("Verbunden mit ");
Serial.println(Router);
Serial.print("IP über DHCP: ");
Serial.println(WiFi.localIP());
}
void loop()
{
// aktuelle Zeit holen
time(&aktuelleZeit);
// localtime_r -> Zeit in die lokale Zeitzone setzen
localtime_r(&aktuelleZeit, &Zeit);
Serial.println("------------------------");
// es kann bis zu 30 Sekunden dauern
// bis die Zeit ermittelt wird
// Name des Wochentages 0-6
switch (Zeit.tm_wday)
{
case 0:
Serial.print("Sonntag");
break;
case 1:
Serial.print("Montag");
break;
case 2:
Serial.print("Dienstag");
break;
case 3:
Serial.print("Mittwoch");
break;
case 4:
Serial.print("Donnerstag");
break;
case 5:
Serial.print("Freitag");
break;
case 6:
Serial.print("Samstag");
break;
}
Serial.print(", ");
if (Zeit.tm_mday < 10) Serial.print("0");
Serial.print(Zeit.tm_mday);
Serial.print(".");
// Monat: führende 0 ergänzen
// Zählung beginnt mit 0 -> +1
if ((Zeit.tm_mon + 1) < 10) Serial.print("0");
Serial.print(Zeit.tm_mon + 1);
Serial.print(".");
// Anzahl Jahre seit 1900
Serial.print(Zeit.tm_year + 1900);
Serial.print(" ");
// Stunde: wenn Stunde < 10 -> 0 davor setzen
if (Zeit.tm_hour < 10) Serial.print("0");
Serial.print(Zeit.tm_hour);
Serial.print(":");
// Minuten
if (Zeit.tm_min < 10) Serial.print("0");
Serial.print(Zeit.tm_min);
Serial.print(":");
// Sekunden
if (Zeit.tm_sec < 10) Serial.print("0");
Serial.print(Zeit.tm_sec);
Serial.println();
Serial.println("Tage seit dem 1.1. " + String(Zeit.tm_yday));
// Normalzeit/Sommerzeit
if(Zeit.tm_isdst > 0) Serial.println("MESZ = Mitteleuropäische Sommerzeit");
else Serial.println("MEZ = Mitteleuropäische Zeit");
delay(5000);
}
Webserver
Beispiel
Im Browser werden 6 Zufallszahlen angezeigt.
Im Seriellen Monitor wird die mit DHCP ermittelte IP des Wemos D1 Mini angezeigt.
Diese Adresse musst du in einem Browser deiner Wahl eingeben
client-Methode
#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"
// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";
ESP8266WebServer Server(80);
// Minimum und Maximum der Zufallszahlen
int Minimum = 1;
int Maximum = 49;
// 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()
{
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());
// Zufallsgenerator mit dem Signal an A0 starten
randomSeed(analogRead(A0));
Server.begin();
Server.on("/", SeiteBauen);
}
void loop()
{
Server.handleClient();
}
void SeiteBauen()
{
// Seite zusammenbauen
// Kopf der HTML-Seite: aktualisierung alle 60 Sekunden
// kann angepasst werden
String Nachricht = "<head><meta http-equiv=\"refresh\" content=\"60\"></head>";
Nachricht += "<h1>Zufallszahlen</h1>";
Nachricht += "<hr>";
// Zufallszahlen anzeigen
for (int i = 0; i < 7; i++)
{
int Zahl = random(Minimum, Maximum);
Nachricht += String(Zahl) + " ";
}
Nachricht += "<hr>";
// Nachricht senden -> Seite anzeigen
Server.send(200, "text/html", Nachricht);
}
Letzte Aktualisierung: