Wemos D1 Mini Boards

Über den Beitrag

In diesem Beitrag möchte ich das Wemos D1 Mini Board vorstellen. Genau genommen handelt es sich dabei um eine Board-Familie, deren Vertreter aber gar nicht so unterschiedlich sind. Wenn ich also vom Wemos D1 Mini spreche, meine ich grundsätzlich immer die ganze Familie.

Zunächst einmal gehe ich darauf ein, was das Wemos D1 Mini Board überhaupt ist, welche Eigenschaften es besitzt und wie sich die verschiedenen Varianten unterscheiden. Dann zeige ich, wie ihr das Board in die Arduino IDE integriert und welche Unterschiede es zum Arduino (UNO) Board gibt. Zum Schluss gibt es einen kleinen Geschwindigkeitstest.

Was ist das Wemos D1 Mini Board?

Wemos D1 Mini Board (hier von AZ-Delivery)
Wemos D1 Mini Board (hier von AZ-Delivery)

Das Herz eines Wemos D1 Mini Boards ist je nach Version ein ESP8266EX, ein ESP8266 12-F oder ein ESP8285 Chip. Dabei handelt es sich um leistungsstarke 32 Bit Microcontroller mit integrierter W-LAN Schnittstelle.

Das, was der ATmega328P für das Arduino UNO Board ist, ist also der ESP8266/ESP8285 für das Wemos Board. Und so wie der ATmega328P „stand-alone“ programmierbar ist (das habe ich hier behandelt), könnt ihr auch den ESP8266/ESP8285 als solches programmieren. Nur braucht ihr zu diesem Zweck einige zusätzliche Komponenten wie z.B. einen USB-zu-Seriell Adapter. Außerdem ist es nicht jedermanns Sache, ein SMD Bauteil wie den ESP8266EX zu verlöten. Da ist es einfacher, ein Entwicklungsboard wie den Wemos D1 Mini zu verwenden.

Namenswirrwarr

Wenn ihr nach dem Begriff „D1 Mini“ sucht, werdet ihr eine ganze Reihe von Boards mit unterschiedlichen Namen finden. Beispielsweise ist das der Lolin D1 Mini, der oben abgebildete AZ-Delivery D1 Mini (NodeMCU), aber natürlich auch der Wemos D1 Mini. Der „Vorname“ ist dabei nur ein Marken- oder Herstellername und spielt nach meiner Erfahrung keine Rolle. Im weiteren Verlauf des Beitrages verwende ich bevorzugt die Bezeichnung Wemos D1 Mini, denn das ist das Original. 

Daneben haben diese Boards noch unterschiedliche „Nachnamen“, z. B. D1 Mini Pro, D1 Mini V3 oder D1 Mini Lite. Hier gibt es dann tatsächlich auch Unterschiede.  

Wesentliche technische Eigenschaften der Wemos D1 Mini Boards

Die folgenden technischen Eigenschaften haben alle Wemos D1 Mini Boards gemein:

  • Bei der Spannungsversorgung der Boards habt ihr verschiedene Optionen. Entweder ihr speist sie mit 2,5 bis 3,6 Volt am 3,3 Volt Pin, mit 3 bis 7 Volt am 5 Volt Pin oder über den USB-Mikro Anschluss. Die zugrundeliegenden Microcontroller laufen mit 2,5 – 3,6 Volt.
  • Der Strombedarf der Wemos D1 Mini Boards ist mit ca. 70 Milliampere vergleichsweise hoch. Beim Senden steigt der Bedarf sogar auf mehrere hundert Milliampere.
  • Die Wemos D1 Mini Boards haben die Schnittstellen I2C, SPI und UART.
  • Das WIFI erfüllt die Spezifikationen 802.11 b/g/n (2,4 GHz) mit WPA/WPA2 PSK.
  • Die Taktrate beträgt 80 oder 160 MHz.
  • Es gibt 11 I/O Pins, alle bis auf D0 sind PWM-, I2C- und One-Wire fähig, Imax ist 12 mA.
  • Die Ausgangsspannung an den I/O Pins beträgt maximal 3.3 Volt.
  • 1 analoger Eingang mit 10 Bit Auflösung, max. 3.2 Volt (!)
  • Flashspeicher: 1 – 16 MB.

Die verschiedenen Wemos D1 Mini Boards

Tabelle 1: Vertreter der Wemos D1 Mini Board Familie
Tabelle 1: Vertreter der Wemos D1 Mini Board Familie

Die Boards unterscheiden sich im Wesentlichen durch den verwendeten Microcontroller, den Flash-Speicher und die Antenne. Daneben gibt es noch Unterschiede beim USB-zu-Seriell Adapter. Einige Boards verwenden den CH340G, andere den CP2104. Dieser Unterschied ist insofern relevant, als unterschiedliche Treiber benötigt werden. Aus der Bezeichnung des Boards lässt sich nicht sicher schließen, welcher USB-zu-Seriell Adapter verwendet wird. 

 

Wemos D1 Mini Lite Board
Der kleinste Vertreter (hinsichtlich Flash-Speicher): das Wemos D1 Mini Lite Board
Das Wemos D1 Mini V3 Board
Wemos Mini V3 Board
Wemos D1 Mini Pro Board
Mit externem Antennenanschluss: Wemos D1 Mini Pro Board

Vorbereitungen

Pinleiste

Üblicherweise bekommt ihr mit eurem Board Pinleisten geliefert. Bei AZ-Delivery erhaltet ihr löblicherweise verschiedene Leisten mitgeliefert (nein, ich werde nicht von denen bezahlt!):

Pinleisten für das Wemos D1 Mini Board
Pinleisten für das Wemos D1 Mini Board

Ich persönlich finde die Buchsenleisten mit den langen Pins für das Experimentieren praktisch, weil sich das Board damit gut auf dem Breadboard fixieren lässt und man zusätzlich die Buchsen nutzen kann:

Wemos D1 Mini Board auf dem Breadboard

Das Wemos D1 Mini Board in die Arduino IDE einbinden

Der Arduino IDE müsst ihr zunächst noch beibringen, mit dem Wemos D1 Mini Board umzugehen. Als Erstes geht ihr dazu auf Datei -> Voreinstellungen und klickt auf das Symbol neben „Zusätzliche Boardverwalter-URLs“. In dem aufgehenden Fenster tragt ihr Folgendes in einer separaten Zeile ein:

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

Konfigurierung der Voreinstellungen
Konfigurierung der Voreinstellungen

Dann geht ihr zu Werkzeuge -> Board -> Bordverwalter, sucht nach „esp8266“ und installiert das Paket:

Einrichtung im Boardverwalter
Einrichtung im Boardverwalter

Dann startet ihr die Arduino IDE neu.

Wenn euer Board im Gerätemanager erkannt wird, sollte das so oder ähnlich aussehen:

Wemos D1 Miniboard im Gerätemanager
Wemos D1 Miniboard im Gerätemanager

Wenn euer Board nicht erkannt wird, dann fehlt euch wahrscheinlich der Treiber für den USB-zu-Seriell Adapter. Den Treiber für den CH340G erhaltet ihr z.B. hier oder hier (auf das Downloadsymbol klicken). Stört euch nicht an der Bezeichnung „CH341SER“. Den Treiber für den CP2104 bekommt ihr z.B. hier.

Ein kleiner Test

Öffnet den Blink Beispielsketch: Datei -> Beispiele -> Basics -> Blink. Dann wählt unter Werkzeuge -> Boards das richtige Board aus:

Boardauswahl in der Arduino IDE
Boardauswahl in der Arduino IDE

Schließlich müsst ihr noch den richtigen Port auswählen und könnt den Sketch dann hochladen. Wenn alles klappt, sollte die Board LED jetzt blinken:

LED des Wemos D1 Mini Boards
LED des Wemos D1 Mini Boards

Das Wemos D1 Board nutzen

Ich werde nun auf die wichtigsten Basisfunktionen eingehen und dabei besonderes Augenmerk auf die Unterschiede zum Arduino (Uno) legen.

Auch beim Wemos D1 Mini Board haben die Pins zum Teil mehrere Funktionen:

Tabelle 2: Pinbezeichnungen und -funktionen der Wemos D1 Mini Boards
Tabelle 2: Pinbezeichnungen und -funktionen der Wemos D1 Mini Boards

Einschränkungen für einige Pins

Einige Pins haben besondere Funktionen, weshalb es gewisse Einschränkungen für sie gibt:

  • D0 (GPIO 16): Der Pin wird zum Wecken aus dem DeepSleep benötigt. Außerdem gibt er beim Booten ein kurzes High Signal.
  • D3 (GPIO 0): Wird dieser Pin beim Booten auf LOW gezogen, dann geht der ESP8266 in den Firmware Programmiermodus.
  • D4 (GPIO 2): Der Pin darf beim Booten nicht auf LOW gezogen werden.
  • D8 (GPIO 15): Darf beim Booten nicht auf HIGH gezogen werden.

digitalWrite() / analogWrite()

Bei der digitalWrite() Funktion ist zunächst zu beachten, dass das HIGH Signal am entsprechenden Ausgang bei 3,3 Volt liegt. Der Strom darf 12 mA nicht überschreiten.

Ihr könnt die Pins D0 – D8 und RX / TX als Ein- bzw. Ausgangspins nutzen. Damit stehen euch also insgesamt 11 Pins zur Verfügung. Um sie anzusprechen, könnt ihr ihre Bezeichnung oder die GPIO Nummer verwenden. Die folgenden Anweisungen haben denselben Effekt:

digitalWrite(D2, HIGH); / digitalWrite(4, HIGH);

Bei Pin D4 ist zu beachten, dass er mit der Board LED verbunden ist. Allerdings in der Art, dass die Board LED leuchtet, wenn D4 LOW ist.

Der pinMode wird wie gewohnt eingestellt. Eine Besonderheit gibt es aber. Wenn ihr den Pull-Down Widerstand an D0 (GPIO 16) aktivieren wollt, dann müsst ihr das mit pinMode(D0, INPUT_PULLDOWN_16) tun.

analogWrite() steht für alle I/O Pins zur Verfügung. Das gilt auch für den Pin D0, der ansonsten eingeschränkte PWM-Fähigkeiten hat. Im Gegensatz zum Arduino UNO beträgt die Auflösung 10 Bit. Das heißt, dass  analogWrite(pin, 1023) die volle Spannung liefert.

Update: seit der ESP8266 Arduino Core Version 3.0 ist die voreingestellte Auflösung für analogWrite() wegen Kompatibilitätsproblemen 8 Bit. Um das vorherige Verhalten wieder herzustellen, müsst ihr ins setup die Anweisung analogWriteRange(1023); einfügen (siehe auch hier).

digitalRead() / analogRead()

digitalRead() funktioniert wie beim Arduino mit allen Pins D0 – D8. Die Pins RX und TX haben ihre Eigenheiten. Deshalb würde ich sie für diesen Zweck nicht verwenden.

Der Pin A0 ist der einzige analoge Eingang. Eigentlich verträgt der analoge Eingang des ESP8266 nur maximal 1 Volt. Allerdings ist auf den Wemos D1 Mini Boards ein Spannungsteiler (100 kOhm / 220 kOhm) davor gesetzt, sodass die maximale Spannung 3,2 Volt beträgt. Die Auflösung beträgt 10 Bit. Damit ergibt sich für die Spannung U:

U\;[\text{V}]=3.2 \cdot \frac{analogRead(\text{A0})}{1024}

Interessant ist, dass man bei „Vollausschlag“ tatsächlich 1024 erhält und nicht 1023 wie beim Arduino UNO. Bei diesem reite ich immer gerne darauf herum, dass man bei der Spannungsberechnung durch 1023 teilen muss. Das ist hier also anders.

Die analogRead() Funktion der Wemos D1 Mini Boards gefällt mir erheblich besser als die des Arduino UNO. Mit dem Arduino UNO schwanken die analogRead Werte um +/- zwei Einheiten, selbst bei Anschluss einer stabilen Spannungsquelle. Die mit dem Wemos D1 Mini ermittelten Werten hingegen schwankten bei mir gar nicht.

Interrupts

Abgesehen von den weiter oben genannten generellen Einschränkungen könnt ihr jeden Pin des Wemos D1 Mini Boards für Interrupts nutzen. Ein Interrupt wird wie gewohnt über

attachInterrupt(digitalPinToInterrupt(Pin), ISR, Mode);

eingerichtet und mit

detachInterrupt(digitalPinToInterrupt(Pin));

wieder deaktiviert. Für Mode habt ihr die Optionen:

  • RISING
  • FALLING
  • CHANGE
  • LOW
  • HIGH

Die ersten drei Optionen lösen den Interrupt mit der Signalflanke aus, LOW und HIGH lösen immer wieder aus, solange das Level des Pins der Einstellung entspricht.

Darüberhinaus gibt es noch zwei Dinge bei der Interrupt Service Routine (ISR) zu beachten:

  1. Die ISR muss vor dem Setup positioniert werden.
  2. Ihr müsst das Attribut IRAM_ATTR vor den Funktionsnamen der ISR setzen, also z. B.: void IRAM_ATTR ISRname() {.....}.

Vielleicht seht ihr auch manchmal das Attribut ICACHE_RAM_ATTR. Das funktioniert (noch), ist aber veraltet.

I2C mit dem Wemos D1 Mini Board

Wenn ihr I2C mit Wire.begin() aktiviert, dann geht das Wemos D1 Mini Board davon aus, dass D1 als SCL und D2 als SDA dient. Es ist aber kein Problem, auch andere Pins nach dem Schema Wire.begin(SDA-PIN,SCL-PIN) auszuwählen.

Die Wemos D1 Mini Boards beherrschen den Fast Mode (400 kHz), darüber wird es eng.

Aufpassen müsst ihr bei den Spannungsleveln der I2C Verbindung. Verwendet ihr ein I2C Bauteil das auf 5 Volt läuft, müsst ihr einen Spannungsteiler in die Leitung setzen oder ihr nehmt einen Logik-Level Konverter wie diesen:

Logik-Level Konverter
Logik-Level Konverter

SPI mit dem Wemos D1 Mini Board

Zum Thema SPI gibt es nicht so viel zu sagen. Die Anschlüsse findet ihr in Tabelle 2.

Serielle Schnittstelle

Die Pins TX und RX für die serielle Kommunikation benutzt ihr wie beim Arduino UNO. Ihr könnt aber auch stattdessen die Pins D7 und D8 (= GPIO 13 / RXD2 bzw. GPIO 15 / TXD2) benutzen. Dazu müsst ihr lediglich im Setup die Anweisung Serial.swap() nach Serial.begin() einfügen. 

Achtung – bissiger Wachhund

Nehmt mal den folgenden, an sich ziemlich sinnlosen Sketch und ladet ihn unverändert auf euer Wemos D1 Mini Board.

Im Setup blinkt die Board LED zehnmal in schneller Frequenz. Das soll einfach nur den Startpunkt des Sketches visualisieren. In der Hauptschleife wartet euer Wemos D1 Mini Board auf ein HIGH Signal an D1, z.B. durch einen Taster oder Sensor. Und falls keines kommt, sollte euer Board die while() Schleife ewig ausführen.

void setup() {
  pinMode(D1, INPUT); // Eigentlich redundant, da das der Standardzustand ist
  pinMode(LED_BUILTIN, OUTPUT);
  for(int i=0; i<10; i++){
    digitalWrite(LED_BUILTIN, LOW);   
    delay(50);                       
    digitalWrite(LED_BUILTIN, HIGH);    
    delay(50);           
  }
  //ESP.wdtDisable();
}

void loop() {
  while(!digitalRead(D1)){
    //delay(0);  
  }
}

 

Wenn ihr den Sketch laufen lasst, dann werdet ihr aber an der blinkenden LED sehen, dass er ca. alle drei Sekunden neu startet. Hier schlägt ein Sicherheitsmechanismus zu und der heißt Watchdog Timer. Über Watchdog Timer hatte ich schon mal einen ganzen Beitrag geschrieben (hier). An dieser Stelle nur so viel dazu: ein Watchdog Timer ist ein Zähler, der, wenn er nicht zurückgesetzt wird, überläuft und dann einen Reset auslöst. Er wacht also über den Microcontroller und sorgt so dafür, dass z.B. ein hängengebliebenes Programm neu startet. 

Das Wemos D1 Mini Board, oder genauer gesagt der ESP8266, besitzt einen Software Watchdog und einen Hardware Watchdog Timer. Der Software Watchdog ist standardmäßig aktiviert und läuft ca. alle 3 Sekunden über. Bestimmte Funktionen setzen ihn zurück, z.B. wenn ihr die Hauptschleife (loop) neu startet oder ein delay() oder – ganz explizit – ein ESP.wdtFeed() ausführt (der Watchdog wird gefüttert). Entkommentiert mal die Zeile 15 und ihr werdet sehen, dass euer Board nicht mehr ständig neu startet.

Den Watchdog hinhalten

Ihr könnt die Zeit bis zum Reset verlängern, indem ihr den Software Watchdog abschaltet. Dazu entkommentiert die Zeile 10. Allerdings schlägt jetzt der Hardware Watchdog ca. alle 8 Sekunden zu. Der Hardware Watchdog lässt sich nicht abschalten und die Watchdog Zeiten lassen sich auch nicht variieren.

Was soll das?

Der ESP8266 führt regelmäßig Routinen aus, die sich um die Funktion des W-LANs kümmern. Das macht er beispielsweise, wenn die Hauptschleife neu startet oder bei einem delay(). Gibt man ihm dazu keine Gelegenheit, dann startet er lieber neu, um die korrekte W-LAN Funktion zu gewährleisten. Das wiederum kann aber zu Problemen führen wie bei dem Sketch oben.

W-LAN – Funktionen

Einer der Hauptgründe für die Wahl eines Wemos D1 Mini Boards ist natürlich seine W-LAN-Funktionalität. Aufgrund der Komplexität des Themas habe ich darüber einen separaten Beitrag verfasst. Als „Appetizer“ möchte ich hier ein einfaches Beispiel zeigen. Mit dem folgenden Sketch könnt ihr eine LED an D1 per Browser an- und ausschalten.

#include "ESP8266WebServer.h"
#define LEDPIN D1

const char* ssid = "Deine SSID";
const char* pass = "Dein Passwort";
IPAddress ip(192,168,178,xxx); // xxx = wählt eine frei IP in eurem Heimnetz
IPAddress gateway(192,168,178,1);
IPAddress subnet(255,255,255,0);

ESP8266WebServer server(80);
 
String led1= "<a href=\"/led_an\">LED An</a>";
String led0= "<a href=\"/led_aus\">LED Aus</a>";

void handleRoot() {
  String message="<h1>Testprogramm - Minimalprogramm ESP8266</h1>";
  message += "Hallo ......, das ist ein Gru&szlig vom ESP8266 Server</BR></BR>";
  message += led1;
  server.send(200, "text/html", message);
}

void ledan(){
  digitalWrite(LEDPIN, HIGH);
  server.send(200, "text/html", led0);
}

void ledaus(){
  digitalWrite(LEDPIN, LOW);
  server.send(200, "text/html", led1);
}

void setup(){
  pinMode(LEDPIN, OUTPUT);
  digitalWrite(LEDPIN, LOW);
//  Serial.begin(9600); 
//  Serial.println("Testprogramm - Minimalprogramm ESP8266");
//  Serial.print("Verbinde mich mit Netz: ");
//  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  WiFi.config(ip, gateway, subnet); 
  
//  while(WiFi.status() != WL_CONNECTED){
//  delay(500); Serial.print(".");
//  }
//  Serial.println("");
//  Serial.println("WiFi Verbindung aufgebaut");
//  Serial.print("Eigene IP des ESP-Modul: ");
//  Serial.println(WiFi.localIP());

  server.on("/",handleRoot);
  server.on("/led_an", ledan);
  server.on("/led_aus", ledaus);
  server.begin();
//  Serial.println("HTTP Server wurde gestartet!");
} 
  
void loop(){
  server.handleClient(); 
}

 

Erklärungen zu diesem Sketch und weitere Beispiele findet ihr in meinem Beitrag über den ESP8266 ESP-01. Oder ihr wollt euch auf eurem Smartphone informieren lassen, wenn bestimmte Sensordaten ein Limit überschreiten? Kein Problem mit IFTTT (if this then that) – das habe ich hier beschrieben.

Geschwindigkeitstest

Zum Schluss möchte ich mich noch der Frage widmen, wie schnell die Wemos D1 Mini Boards tatsächlich sind. 80 oder 160 MHz klingen ja recht verheißungsvoll gegenüber den 16 MHz des Arduino UNO.

digitalRead();

Als Erstes habe ich die Geschwindigkeit der digitalRead() Funktion ermittelt. Dazu habe ich das Board diese Funktion eine Million mal ausführen lassen. Die dafür benötigte Zeit habe ich über die millis() Funktion gemessen.

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

void loop() {
  long startTime = millis();
  for(long i=0; i<1000000; i++){
    digitalRead(10);
  }
  long duration = millis() - startTime;
  Serial.println(duration);
}

 

Hier die Ergebnisse für 1 Mio. Ausführungen auf dem Arduino UNO und dem D1 Mini bei 80 bzw. 160 MHz:

  • Arduino UNO : 3710 ms
  • D1 Mini  bei 80 MHz: 588 ms
  • D1 Mini bei 160 MHz: 325 ms

In grober erster Näherung entspricht das tatsächlich dem Verhältnis der Taktraten.

Mathematische Operationen

Für die Geschwindigkeitsmessung mathematischer Operationen habe ich mit pow(i,0.5) eine Funktion ausgesucht, die relativ rechenintensiv ist:

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

void loop() {
  long startTime = millis();
  float f = 0.0;
  for(long i=0; i<50000; i++){
    f = pow(i,0.5);
  }
  long duration = millis() - startTime;
  Serial.println(duration);
  Serial.println(f);
}

Die Zeile Serial.println(f) ist übrigens wichtig, da der Compiler die Berechnung von f „wegoptimiert“, wenn f nicht verwendet wird. Ich hatte mich sehr gewundert, als ich immer „0“ als Ergebnis für „duration“ erhielt, bis ich darauf kam, dass f verwendet werden muss. 

Hier nun die Ergebnisse:

  • Arduino UNO : 17119 ms
  • D1 Mini  bei 80 MHz: 926 ms
  • D1 Mini bei 160 MHz: 463 ms

Bei dieser Rechenoperation ist der ESP8266 Chip gegenüber dem ATmega328P noch schneller, als es durch die Taktrate erklärlich ist. Hier kommt zur Taktrate noch ein Architekturvorteil zum Tragen. Auf jeden Fall ist der Unterschied wirklich groß. Ob ihr den allerdings wirklich braucht, steht natürlich auf einem anderen Blatt Papier.

76 thoughts on “Wemos D1 Mini Boards

  1. Hallo Wolle,
    hier ein interessanter Hinweis, der für andere nützlich sein kann.
    Auf einige meiner D1Minis konnte ich keine Software mehr uploaden und erhielt die Fehlermeldung
    „PermissionError(13, ‚Ein an das System angeschlossenes Gerät funktioniert nicht.‘, None, 31)“
    obwohl ich diese Module nach der Lieferung erfolgreich getestet hatte.

    Letztlich lag der Fehler daran, dass ich zwischenzeitlich den Treiber CH341 auf die Version 3.8 upgedatet hatte.
    Durch Installation des Treibers Version 3.5 konnte ich die Module wieder ansprechen.
    viele Grüße
    Jörg

    1. Hi Jörg,
      ja, das ist ein sehr ärgerliches Problem, das wg. der großen Verbreitung dieses Chips leider nicht nur die Wemos D1 Mini Boards betrifft. Danke für den Hinweis!
      VG, Wolfgang (Wolle)

  2. Ich möchte den d1 Mini also WLAN Adapter mit dem CNC shield v3 verbinden das das shield v3 auf dem arduino Uno gesteckt ist
    Es ist kein Platz mehr auf dem uno.
    Kann mir jemand helfen

  3. Hallo Wolfgang,
    das erklärt, warum ich WDT Fehler bekomme, wenn ich WiFi ausschalte. Werde mal sehen, ob mein Code durchläuft, wenn ich den Köter füttere.
    Kannst Du mir evtl sagen, über welchen Pin das Teil Strom bekommt, wenn ich es über ein Battery Shied betreibe? Irgendwo muss es doch möglich sein, einen Schalter einzubauen, mit dem ich das System komplett ausschalten kann. Die Dokumentation schweigt sich da leider aus und ich bin leider komplette Anfängerin auf dem Gebiet.

    Viele Grüße
    Melanie

    1. Hallo Melanie, das Battery Shield wird über den weißen Anschluss mit den zwei Pins mit einem Li-Akku betrieben. Es gibt Li-Akkus mit geeignetem Anschluss. Die Akkus können über den USB-Anschluss aufgeladen werden. Grundsätzlich würde ich Lithiumakkus aber nicht unbeaufsichtigt laden lassen.

      VG, Wolfgang

      1. Hallo Wolfgang,
        erst mal lieben Dank für die superschnelle Antwort. Allerdings hab ich vermutlich meine Frage etwas doof formuliert.
        Das Shield mit dem Akku zu verbinden ist nicht das Problem, hab das Ganze schon mal getestet und auch geladen. Testweise auch mal das Ladestandprogramm aufgespielt u.s.w. Mein Problem ist nur: Wenn ich das Shield einfach auf das Mini stecke, ist zwar alles schick, aber wie zur Hölle bekomme ich das ganze ausgeschaltet?
        DeepSleep ist ja ganz nett, aber wenn das Board schläft, ist 1. noch Strom auf 3v3 und 5v und 2. verbraucht das Board ja trotzdem noch Strom.
        Daher dachte ich mir, ich steck die beiden Teile nicht direkt zusammen, sondern löte die Pins aneinander – und da, wo das Mini den Strom vom Shield bekommt, hau ich einen Schalter dazwischen, damit ich die Verbindung trennen kann. Soweit der Plan, aber beim Pinout für das Shield steht nur: „Pinbelegung wie D1 Mini“ und auch über Google hab ich nichts gefunden. Da mich Deine Videos und Dein Blog echt begeistern und ich hier eine Möglichkeit für mein WDT Problem gefunden habe, dacht ich, ich frag mal den Profi. 🙂
        Also was meinst, hab ich eine Chance oder sollte ich das Projekt adakta legen und wieder auf die klobigen Batteriekästchen umsteigen?
        Nochmal herzlichen Dank und viele Grüße
        Melanie

        1. Hallo Melanie,

          das Shield hat einen Step-Up Konverter, der die Akkuspannung auf 5V hebt. Mit diesen 5V wird dann der D1 Mini versorgt. Also wenn du einen Schalter zwischen Shield und Board setzen willst, dann am 5V Pin. Das mit den 5V ist gut gemeint, aber nicht besonders effektiv. Erst wird die Spannung auf 5V angehoben und dann auf dem D1 Mini Board mit einem Spannungsregler wieder auf 3.3V gesenkt. Wenn ich einen Schalter einbauen würde, dann in die Batteriezuleitung. Dann wäre alles wirklich aus. Aber ich würde eher ein 7.4 V Li- Akku nehmen und einen 3.3 oder 5V Spannungsregler und damit direkt den 3.3 bzw. 5V Pin versorgen.

          Hier noch ein guter Artikel zum Shield:

          https://arduinodiy.wordpress.com/2017/01/02/reviewing-the-wemos-battery-shield/

          VG, Wolfgang

          1. Hallo Wolfgang,

            mega, vielen Dank! Der Link hilft. Ich dachte immer, der 5V Pin ist lediglich ein Ausgang, dass das BatteryShield den Pin auch gleich als Eingang für den Mini nutzt, war mir unklar. Also aber alles in allem doch ne Schnapsidee…
            Schade, hätt so schön sein können, meine Modellbeleuchtung einfach irgendwo im Diorama ausschalten zu können.
            Ich wünsch Dir einen super Tag und viel Erfolg bei all Deinen Projekten!

            Liebe Grüße
            Melanie

  4. Hallo!
    Im Beitrag oben wird erwähnt, dass der D1 Mini schon relativ strom-hungrig ist. Welche Alternativen sind dem empfehlenswert, die weniger Energie verbrauchen und trotzdem eine Funkanbindung ermöglichen? Bluetooth wäre eventuell auch noch eine Alternative, aber Wifi schon favorit.

    Hintergrund meiner Frage:

    Ich habe einige Anwendungsfälle für Sensoren, die flexibel eingesetzt werden sollen. Dafür ist mir ein Batteriebetrieb wichtig und eine regelmäßige Aufzeichnung von Messwerten. Die Messwerte sollten dann zeitnah an einen Server (zunächst NAS im gleichen Netztwerk, später übers Internet) verschickt werden.

    Zu Anfang geht es mir erstmal um Temperatur & Luftfeuchtigkeitsmessung als Einstieg. diese soll im besten Fall 1x pro Minute erfasst und gespeichert weden. Das Versenden der Daten würde mir dann auch 1-3 mal pro Tag ausreichen.

    1. Hallo, da gibt es verschiedene Möglichkeiten. Du kannst zum Beispiel bei Wifi bleiben und das Wemos Board bzw. den ESP8266 zwischendurch in den Schlaf schicken, siehe hier zum Beispiel:

      https://randomnerdtutorials.com/esp8266-deep-sleep-with-arduino-ide/

      Oder du nimmst einen ESP32. Der ist auch stromhungrig, aber lässt sich genauso in den Schlaf schicken. Oder du nimmst einen von den relativ stromsparenden Arduino Boards auf SAMD Basis, wir z.B. den Nano 33 IOT.

      Am stromsparendsten ist aus meiner Sicht 433 MHz Funk, z.B. mit dem HC12 Modul:

      https://wolles-elektronikkiste.de/hc-12-funkmodul

      und das in Kombination mit einem Mikrocontroller, den du zwischenzeitlich in den Schlaf schickst.

      VG, Wolfgang

      1. Super, vielen Dank für die Tipps!
        Werde es erstmal mit dem D1 mini und Deep sleep versuchen und später mit den anderen Optionen vergleichen.

    2. Ich ergänze mal die Antwort von Wolfgang, und teile meine Erfahrungen zu batterie-betriebenen Systemen:

      Wie Wolfgang richtig ausführt ist es eigentlich egal ob ESP8266 oder ESP32. Energie-hungrig ist im Wesentlichen Wifi. Auch Bluetooth ist da nicht viel besser. (ca .100 – 150 mA)
      Sensorgehäuse sollen möglichst klein und kompakt sein, viel Platz für Batterien hat man nicht. Das Beste was mir das bisher mit Wifi/BLE gelungen ist:

      – 2 x 2000 mAh Lipo Flachakku
      – Stromversorgung der Sensoren via 2N7000 Schalttransistor steuern
      – Daten alle 30 Minuten, dazwischen Deep Sleep
      –> 14 Tage Laufdauer

      Den D1 Mini habe ich ausgewählt, da er über keinen Batterie Charger verfügt. On Board Battery Charger sind zwar bequem, verbrauchen aber nach meinem Wissen Strom im Normalbetrieb, wenn auch nur ein paar mA.

      Komplett anders mit RFM69 Modulen anstatt Wifi (ich verwende Adafruit RFM69HCW) auf Basis 433 MHz.
      – 2x 3000 mAh 18650 Lipos
      – Stromversorgung der Sensoren via 2N7000 Schalttransistor steuern
      – Daten alle 30 Minuten, dazwischen Deep Sleep
      –> aktuell seit 1,5 Jahren ohne Unterbrechung in Betrieb !!! Liegt draussen im Garten, bei Wind und Wetter.
      Ein weiteres Grund für die 433 MHz Variante ist die Coverage. In dem Frequenzbereich ist die Durchdringung von Wänden etc. und damit die Reichweite deutlich besser als mit Wifi oder Bluetooth. Selbst durch 3 Wände und eine Stahlbeton-Decke, erreiche ich noch eine RSSI von 65.
      Einziger „Nachteil“: man kann nur 60 Byte große Pakete versenden. Für einen Handvoll Messwerte aber ausreichend.
      Einen Versuch mit 433 MHz boards kann ich also nur empfehlen.

  5. Ich verwende den D1 mini von AZ Delivery. Die GPIO Pins vertragen angeblich max. 3,6V.

    Ich habe die Pins nachgemessen und da liegen am *unbeschalteten* pin aber +5V an (D7, INPUT_PULLUP).

    Sind mittlerweile die GPIO Pins „offiziell“ 5V tauglich? Wo steht das? Ich konnte noch in keiner Spezifikation (auch nicht in jener von AZ-Delivery) darauf einen Hinweis sehen – im Gegenteil, da wird immer streng zu <3V6 ermahnt.

    1. Das ist ja merkwürdig. Ich habe es gerade ausprobiert und messe bei pinMode(D7, INPUT_PULLUP) knappe 3.3 Volt:

      D1 Mini, Spannung an D7

      Der ESP8266 kann ja nicht mehr Spannung am Pin abgeben, als er selbst bekommt. Ich würde mal die Eingangsspannung (VCC/GND) am ESP8266 direkt messen:

      Pinout ESP8266Mod

      Wenn dort tatsächlich 5 Volt anliegen, dann ist irgendetwas auf dem Modul falsch verschaltet. Du könntest noch schauen, ob der 5 Volt Pin des Moduls mit VCC des ESP8266 verbunden ist. Eigentlich sollte er mit dem 3.3 Volt Pin verbunden sein.

      1. der fehler sitzt wohl *vor* der elektronik… *unbeschaltet* war der nachbar-pin. auch mein board kommt auf die 3V3 wenn wirklich nichts drauf hängt.

        allerdings machen sich die clamp dioden am GPIO nicht bemerkbar. d.h. wenn man da +5V über einen serienwiderstand (47k) anlegt, dann wird der GPIO pin nicht wie erwartet auf 3V6 „geclampt“, sondern fährt auf +5V hoch.

        schaltet man den GPIO auf OUTPUT, dann setzt er seine 3V3 durch.

  6. Wie immer eine sehr schöne Erläuterung ( die vielen verschiedene Bezeichnungen der Boards haben mir auch schon Kopfschmerzen bereitet)

    Eine vielleicht dumme Frage:

    ich verwende unregulierte LiPo Akkus. Diese Akkus sind zwar mit 3,7 V angegeben, voll geladen liegen diese Akkus bei 4,2 Volt. Ich würde gerne auf Voltage Regulatoren verzichten. Verträgt der D1 Mini zur Stromversorgung die 3,7/4,2 V Lipos?

    Vielen Dank im Voraus

    1. Hallo, hier darf man alle Fragen stellen! Du meinst Versorgung über den 3.3 Volt-Pin? Der ist direkt mit dem Eingangsspannungspin des ESP8266 verbunden. Die Spezifikation gibt eine Spanne von 2.5 – 3.6 Volt vor. Mit 3.7 – 4.2 wärst du permanent außerhalb. Das würde ich lassen, auch wenn er wahrscheinlich nicht gleich kaputt geht. Und hinter dem 5 Volt Anschluss liegt ein Spannungsregler, der auf 3.3 Volt herunterregelt. Für den wiederum braucht man eine Spannung, die um einen gewissen Wert oberhalb der 3.3 Volt liegt (Drop out Spannung). Wie groß die Drop out Spannung ist, das variiert, aber bei 3.6 Volt geht wahrscheinlich nicht mehr viel.
      Aber vielleicht wäre der Wemos D1 Mini Battery Shield etwas für dich, den bgibt es zum Beispiel hier:
      https://smile.amazon.de/sspa/click?ie=UTF8&spc=MTozMTIzMjc1OTU1OTQ0NzQ1OjE2NjM4NzI1MTY6c3BfYXRmOjIwMDQ3NDExOTI1Mzk4OjowOjo&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&url=%2FAZDelivery-Batterie-Lithium-Batterien-inklusive%2Fdp%2FB07X93M17P%2Fref%3Dsr_1_1_sspa%3F__mk_de_DE%3D%25C3%2585M%25C3%2585%25C5%25BD%25C3%2595%25C3%2591%26crid%3D13XUMLULILAFZ%26keywords%3Dwemos%2Bd1%2Bmini%2Bbattery%2Bshield%26qid%3D1663872516%26sprefix%3Dwemos%2Bd1%2Bmini%2Bbattery%2Bshield%252Caps%252C83%26sr%3D8-1-spons%26psc%3D1%26smid%3DA1X7QLRQH87QA3
      Eigentlich genau das, was du suchst.
      VG, WOlfgang

      1. Schöne Erläuterung,

        ich bin jetzt der Empfehlung gefolgt und habe mir ein Batterie Shield besorgt. Die Kapazität der Batterie möchte ich in Prozentwerten ausgeben. (Mir ist klar, dass das bei der Entladekurve eines Lipo-Akkus vielleicht nicht sinnvoll ist) Um sicherzustellen, dass ich den A0 Port nicht „abfackele“ habe ich einen 100kOhm zwischen Batterie und A0 gesetzt. Das wäre nach der Beschreibung oben eigentlich garnicht notwendig, da es schon einen Voltage Divider gibt?
        Ich meine gelesen zu haben, dass der D1Mini mindestens 2,59 V braucht. Wenn der Voltage Divider die Spannung schon auf 3,2 Volt runter regelt, wären der messbare Bereich also 2,59 bis 3,2 V ?

        Viele nDank für Deine Mühe

        1. Der A/D-Wandler des ESP8266 verträgt maximal ein Volt. Deswegen ist zwischen dem Board-Pin A0 und dem A/D-Wandler ein Spannungsteiler von 220 kOhm und 100kOhm verbaut. Bei 3.2 Volt Spannung an A0 misst du damit eine Spannung von 1 Volt am A/D-Wandlereingang (3.2 * 100 /(100+220)). Wenn deine Li-Batterie frisch geladen ist, dann hat sie bis zu 4.2 Volt. Ohne weitere Maßnahmen würdest du dann 4.2 * 100/(100+220) = 1.3125 Volt am A/D-Wandler anliegen haben. Der Spannungsteiler regelt also nicht auf 3.2 Volt herunter, sondern auf ein 3.2tel des Spannungswertes an A0. Ich weiß nicht, ob der A/D-Wandler oberhalb von 1 Volt zerstört würde, aber günstigstenfalls würdest du immer nur 1 Volt messen und nicht verfolgen können, wie sich deine Batterie langsam entlädt. Erst unterhalb 3.2 Volt würdest du sehen, dass sich etwas tut. Wenn man sich Entladekurven von Li Akkus anschaut, dann sind diese bei 3.2 Volt schon ziemlich weit entladen und du hast nicht mehr viel Zeit zu reagieren. Von 3.2 Volt bis zu den ~2.6 Volt Mindestspannung geht es recht schnell.
          Deswegen würde ich dazu raten, den 100 kOhm Widerstand einzusetzen. Damit ist dein Teiler dann 100 / (100 + 100 + 220) = 1/4.2 und du kannst bis zum Maximum messen.

          1. Hallo Wolfgang,

            ich „stolpere“ immer wieder, habe wohl das Grundprinzip der Formeln nicht verstanden.
            Habe jetzt Volt = (analogRead(A0)/1024.0)*4.2; gesetzt, da mein ergänzter Spannungsteiler bei 4,2 V eine Wert von „1“ ergibt. Damit sollte bei max. geladener Batterie 4,2 rauskommen.
            Die minimale Spannung ist 2,6V , die Differenz zu 4,2V wäre 1,6V. 1,6 V entsprechen also 100%. Ich habe mir einen „Merker“ bei 20% gesetzt, danach sollte es gemäß der Lipo-Entladekurven „schnell bergab“ gehen.

            Danke für Deine Erklärung

            1. Macht alles Sinn was du schreibst! Man muss nur im Hinterkopf behalten, dass die Prozentwerte wirklich nur Schätzungen sind, da die Entladekurven nich linear sind und zudem noch eine gewisse Abhängigkeit vom Strom zeigen. Viel Spaß und Erfolg mit deinem Projekt!

              1. Das Thema korrekter Kapazitätswerte einer Batterie hatte ich schon mal mit dem MAX17043 versucht zu lösen, leider gescheitert.

                Danke und Dir vielen Dank für Deine Site, hat mir schon oft geholfen!!

  7. Hallo Wolle

    zunächst vielen Dank für deine hervorragenden Artikel.

    jetzt D1Mini und zwar zum Analog-Eingang des D1 Mini
    Bei einer Temperaturmessung mit einem TMP36 habe ich festgestellt, dass die angelegte Spannung (mit Multimeter gemessen) nicht der vom D1Mini ausgegebenen entspricht. Beim TMP36 entspricht 1°C einer Spannung von 50mV am Mess-Ausgang. Die vom D1 Mini ausgegebenen Temperaturen lagen um ca. 5°C zu hoch!
    Durch ein kleines Experiment (ich habe VDD über ein Potentiometer an den Eingang gelegt und die Spannung mit einem Multimeter gemessen) habe ich herausgefunden, dass
    1. die angezeigte Spannung linear zur angelegten ansteigt
    2. der angezeigte Wert systematisch um 57 mV zu hoch liegt.

    Das ist meiner Meinung nach wichtig zu wissen, weil nicht in jedem Fall der Fehler so offensichtlich ist, dass man ihn bemerkt.

    viele Grüße Jörg

    1. Hallo Jörg,
      vielen Dank für den Hinweis, der sicherlich dem einen oder anderen viel Zeit sparen kann!
      VG, Wolle

  8. Hallo Wolle,
    ich such mir gerade einen Wolf, welche Spannung beim NodeMCU anliegen DARF und welche Spannung anliegen MUSS, damit ein Wechsel von Low to High stattfindet. Kannst Du helfen?
    Hintergrund: ich will einen Geräuschsensor (KY-037) anschließen. Setze ich den Digitalpin direkt auf 0 oder 3,3V, funktioniert alles. Schließe ich den Digitalausgang vom KY-037 an, passiert nichts, obwohl die LED am KY-037 den Zustand wechselt. Gemessen kommen dort bei HIGH nur 2,9 V raus, was offenbar für den NodeMCU nicht reicht. Danke schonmal.

    1. Hi Hajo,
      wie Wolle ja schon geschrieben hat, wird bei Vcc=3.3V alles spätestens ab 2.5V ganz sicher als High erkannt.
      Vermutlich liegt der Fehler eher in der Art der Verwendung des KY-037 Moduls. Das ist ein einfacher LM393 Komparator, der bei Vcc=3.3V schon ziemlich am unteren Ende seines zulässigen Bereichs (2.0V) gefahren wird. Und da der Digitalausgang mit der Eingangsmodulation immer nur ganz kurz (LOW!) aber dafür oft aktiv wird, müsste man schon einen Interrupt nutzen, um ein bzw. das erste kurze Signal zu erwischen.
      Das sind schnelle kurze Pulse. Außerdem mal den aktiven Low-Pegel messen, ob der LM393 noch unter ca 0.8V kommt. Hierzu das Poti so einstellen, daß am Analog-Ausgang fast Vcc anliegt. Dann ist der Digital-Ausgang dauerhaft aktiv auf Low. Umgekehrt ist bei der niedrigsten A0 Spannung der D0 Ausgang immer passiv High.
      Viel Erfolg.

  9. Hey Wolle,
    sehr schöne Übersicht, perfekt präsentiert!
    Da kann sich manch ein Buchautor noch eins, zwei Scheiben von abschneiden.
    Ich beschäftige mich auch schon seit ein paar Jahren mit den ESP8266 und ESP32 Boards aus Fernost und mag die Wemos D1 Umgebung sehr gern, da schön kompakt und erweiterbar. Es gibt viele Sensoren, Aktoren, Power-Supply (Lipo-Lader, ext. Supply, etc) und auch LCD Boards, die man auf die 2er und 3er Backplanes stapeln kann.
    Für eigene Entwicklungen dann die preiswerten Lochraster Boards.

    Allerdings verwende ich nicht mehr die Arduino IDE, die ich vom 328er kenne, sondern programmiere hauptsächlich in Micropython unter der Thonny IDE, mit dem sich die Boards einfach flashen lassen und das die Entwicklung von (Python)Code sehr einfach macht. Ganz besonders das eben mal schnell ein paar Zeilen interaktiv ausprobieren, ohne flashen oder compilieren zu müssen ist toll. Besonders die komfortablen WLAN, I2C, PWM und viele weitere (eingebaute) Libs machen das Leben damit sehr leicht. Kann ich nur empfehlen, auch wenn die Geschwindigkeit mit C meist nicht mithalten kann, so sind die in C geschriebenen Libs sehr schnell. Auch das RAM beim kleinen ESP8266 läßt unter Python keine sehr großen Projekte zu, reicht aber für Hobby-Anwendungen allemal und ist mit 100KB schon 3 mal so groß, wie beim 328er.
    Ganz besonders toll ist die eingebaute Flash Disk Verwaltung des vom System nicht benötigten ROM. Da sind je nach ESP-Variante zwischen 2 und 15MB Flash als FAT Disk für Programm-Code und Text-, Bild-, Sensor-Daten einfach nutzbar und unter Thonny direkt im Flash editierbar.
    Wer mehr MEHR will nimmt den ESP32 als D1 mini mit 4MB Flash und 520KB RAM und als Dual Core mit 2 x 240Mhz für wenige € mehr. Dann gibts auch mehr IOs, GPIOs als Touch Sensoren, Bluetooth LE, DAC, Temperatur Sensor, I2S usw.
    Wirf auch mal einen Blick auf den neuen Wemos Lolin S2 mini, immerhin ein ESP32-C3 WIFI & Bluetooth LE RISC-V Single-Core CPU mit 160/240Mhz, 4MB Flash und 2MB RAM mit direktem USB Support.

  10. Dickes Lob von mir für diese gute Referenz. Hergekommen bin ich über die Suche nach Unterschieden der verschiedenen D1-Generationen und fündig geworden.

  11. Tolle Seite.
    Beschäftige mich seit paar Jahren auch etwas mit Arduino.
    Habe schon paar kleine Projekte mit dem WEMOS D1 Mini realisiert. Kann dir sehr empfehlen einen 3D Drucker anzuschaffen. Damit lassen sich passgenaue Gehäuse für solche Projekte realisieren. Man kann ja nicht alles auf dem Breadboard lassen, wenns dauerhaft laufen soll und man es sichtbar platzieren will.
    Brauchbare Geräte gibt es schon für 250€. Kostenlose Software gibt es auch.

  12. Hallo Wolfgang,
    vielen Dank für diese sehr hilfreiche Seite zum Wemos D1 mini, die mir zusammen mit Deinen anderen Beiträgen den Einstieg in die Welt des ESP8266 sehr erleichtert hat. Für die anderen Nutzer ist es vielleicht hilfreich zu wissen, dass es auf dem Markt zwei unterschiedliche Versionen dieses Boards gibt. Das von Dir vorgestellte Modell von AZ-Delivery, das man auch bei anderen Anbietern findet, hat die Schottkydiode eingebaut, die eine Rückspeisung vom 5V pin in den PC verhindert. Das ist die schwarze Diode mit Aufdruck S4 links von der USB Buchse. Bei dem abweichenden Layout fehlt diese Diode. (Die dort rechts neben der USB Buchse zu findende Schottkydiode hat eine andere Aufgabe. Sie verhindert, dass die Leitung D- des USB ports eine negative Spannung an Pin6 des UART liefert.) Das Fehlen des Rückspeiseschutzes hat zur Folge, dass eine an dem pin „5V“ angeschlossene Spannungsquelle die Schnittstelle im PC beschädigen kann, insbesondere, wenn hier mehr als 5V angelegt werden. Es ist also bei diesen Boards darauf zu achten, jeweils nur eine Versorgungsspannung (USB oder extern) anzuschließen. Grüße aus dem hohen Norden, Alex.

  13. Hallo Wolfgang,
    ich, Anfänger was Mikrocontroller und IoT betrifft, bin in den letzten Wochen schon mehrmals über Artikel deiner Website „gestolpert“; auch bei diesem Artikel (D1 mini) kann ich nur sagen „echt toll“. Möchte hiermit einfach nur einmal DANKE – für deine tolle Arbeit – sagen.
    Grüße aus der Pfalz
    Andreas

  14. Hallo Wolfgang,

    Danke für Deine übersichtliche Seite. Ich finde Sie wirklich gut zusammengefasst.

    Ich möchte zwei Geräte mit UART an meinem D1 mini Pro anschließen.
    Nun habe ich für die Lösung mit Serial1 (RxD1 und TXD1) das Problem, dass ich den Pin für RXD1 nicht finde.
    Wenn ich Serial2 (TxD2 und RxD2) nutzen möchte, kennt meine IDE den Serial2 nicht.
    Aus der Software Seite heraus:
    Serial2.read() geht nicht aber Serial1.read() geht
    Aus der Hardware Seite heraus
    Ich finde den Pin RXD1 nicht.

    Wie würdest Du vorgehen?

    Lieben Gruß
    Dominique

    1. Hallo Dominique,

      da musste ich selbst erstmal schauen. Anscheinend hat der ESP8266, also der zugrundeliegende Mikrocontroller, 1.5 UARTs. UART0 (TX = GPIO1, RX = GPIO3) kann ganz normal benutzt werden. Dann gibt es alternative Pins (TX = GPIO15, RX = GPIO13) auf die man mit Serial.swap() umschalten kann. Es ist aber beides UART0. Aber wenn du immer nur ein USB Gerät zur selben Zeit benutzt, dann wäre das eine Lösung. Die Schnittstelle wird mit Serial angesprochen.

      UART1 hat nur einen TX Pin, nämlich GPIO2. Der Pin wird mit Serial1 angesprochen. Einen zweiten RX steht schlicht nicht zur Verfügung.

      Die Alternative wäre 2xSoftwareSerial oder 1xHardware und einmal SoftwareSerial.

      VG, Wolfgang

      1. Hallo Wolfgang,

        vielen Dank für Deine schnelle Antwort.
        Sehr Schade dass der RX1 fehlt, da TX1 anscheinend funktioniert.
        Ich werde es dann mit der SoftwareSerial probieren.

        Gruß
        Dominique

  15. Hallo Herr Ewald,
    Super Zusammenstellung!
    Auch die verschiedenen Verwendungsmöglichkeiten gut beleuchtet 🙂

    Kurze Frage:
    Kann ich…
    D1-D4 als DigitalRead (mit internem PullUP),
    D5/D6 für I2C und
    D7/D8 für WS2812b

    störungsfrei benutzen?
    Ich hatte da zumindest mit D8 Probleme (z.B. Relaismodul)

    So wie ich das sehe, könnte ich sogar RX/TX als Digital-IN/OUT benutzen,
    solange ich kein Serial. benutze oder?

    Viele Grüße und Danke für die Mühe!
    Bernd

    1. Hallo,

      prinzipiell kann man alle Pins D0 bis D8 und RX/TX als GPIO verwenden. In einigen Fällen kann es Einschränkungen geben wg. der speziellen Aufgaben bestimmter Pins. Auch beim Hochfahren kann es Probleme geben. Hier gibt es eine ganz gute Übersicht:

      „ESP8266 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials“ https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/

      VG, Wolfgang

      1. Hallo zurück,
        Ja, die Seite kannte ich schon.
        Mir ist unverständlich, warum solche tollen Boards mit solchen Einschränkungen entwickelt werden…
        M.E. würde da ein globales ChipSelect helfen. Hardware oder Code. Das würde die meisten aller Probleme beseitigen…

        Mfg
        Bernd

  16. Hallo Wolle
    auf einem ESP8266 D1mini bekomme ich unregelmässig folgende Fehlermeldung:
    „md5 of file does not match data in flash“
    Die Websuche gibt seltsame Antworten, die mir nicht weiterhelfen.
    Dazwischen funktioniert er wieder ganz normal. Manchmal flasht er richtig und steigt nach ein paar Minuten plötzlich aus.
    Kennst du dieses Phänomen?
    Andreas

    1. Hallo,
      die Fehlermeldung ist mir noch nicht begegnet. Ich habe mal kurz ein bisschen gegoogelt, aber habe auch nichts wirklich Eindeutiges finden können. Das Problem ist nicht unbekannt, aber nirgendwo stand eindeutig: das ist die Ursache und das die Lösung. Kann ich leider nicht weiterhelfen.
      Vielleicht liest das hier noch jemand, der das Problem schon mal hatte und lesen konnte.
      VG, Wolfgang

  17. Hallo Wolfgang,
    das ist ja mal eine hilfreiche Seite hier. Danke.
    Ich bin bei der Suche nach der Lösung eines Problems auf Deine Seite gestoßen. Vielleicht hast Du einen Tipp für mich.
    Ich habe eine kleines Modul mit einem D1 Mini gebaut, welches über MQTT Nachrichten mit einem IOBroker austauscht. Ich möchte, solange das Board über USB am PC hängt über den seriellen Monitor Informationen in der Entwicklungsumgebung erhalten. Wenn das Board nicht am USB hängt, soll es keine Ausgaben schreiben. Dazu muss ich beim setup() feststellen, ob das USB Kabel an dem D1 Mini angeschlossen ist. Wie würdest Du das feststellen?
    Viele Grüße
    Arndt

    1. Hallo Arndt, auf die Frage bin ich auch schon mal gestoßen. Leider interessiert es die Serial Verbindung nicht, ob auf der anderen Seite jemand zuhört oder nicht. Es wäre schön, wenn Serial.begin() oder Serial.println() einen Rückgabewert hätten, abhängig vom Erfolg der Übertragung. Auch if(Serial) funktioniert nicht – es gibt immer true zurück, wenn das Serial Objekt erfolgreich erzeugt wurde. Mir fällt nur ein nicht besonders eleganter Weg ein: für die ersten, sagen wir 10 Sekunden nach Programmstart fragst du mit if(Serial.available()) ab, ob Daten vom seriellen Monitor übermittelt werden. D.h. auf der Seite des seriellen Monitors musst du in den ersten 10 Sekunden ein Zeichen senden, um zu zeigen, dass du per seriellem Monitor verbunden bist. Also so:
      void setup(){
      bool serial_connected = false;
      pinMode(D6,OUTPUT);
      Serial.begin(115200);
      delay(1000);
      unsigned long startTime = millis();
      Serial.println();
      Serial.println("Send something: ");
      while((millis() - startTime)<10000){
      if(Serial.available()){
      serial_connected = true;
      break;
      }
      }
      if(serial_connected){
      Serial.println("OK");
      digitalWrite(D6, HIGH);
      delay(5000);
      digitalWrite(D6, LOW);
      }
      else{
      Serial.println("Not OK");
      for(int i=0; i<5; i++){
      digitalWrite(D6, HIGH);
      delay(100);
      digitalWrite(D6, LOW);
      delay(100);
      }
      }
      }

      Die Aktionen (LED leuchten, print OK / Not OK) dienen nur der Prüfung, ob es funktioniert.

      1. Hallo Wolfgang,

        ich habe das Programm auf einem frischen D1 Mini angepasst und ausprobiert. Trotz verschiedener Baud-Raten und auch mal extrem langer Texte die einige Zeit zum Übertragen benötigen, bin ich nicht zum Ziel gekommen.
        Ich denke, ich werde jetzt das Problem lösen, indem ich den noch freien D3-Pin auf Ground ziehe, wenn ich die Schaltung nicht über den USB angeschlossen habe. Der D3 ist mit einem internen Pull-Up versehen und im USB Betrieb auf HIGH, und dann anderenfalls auf LOW. Damit habe ich meine Fallunterscheidung.

        Ich danke Dir für Deine schnelle Hilfestellung
        Arndt

        1. Hallo Arndt, auch wenn’s schon ein paar Tage her ist hätte ich noch eine Idee zur USB-Erkennung:
          wenn D3 frei ist kannst du einen Spannungsteiler vom 5V-Pin dorthin verbinden:

          o—–[R1]—-o—-[R2]—-o
          | | |
          G D3 5V

          R1 = R2 = 1-10k

          Bei USB-Betrieb liegen die 5V an -> an D3 sind dann 2,5V (über R1/R2) = HIGH
          Ohne USB sind die 5V nicht da -> an D3 sind dann 0V (über R1) = LOW
          Dann brauchst du nichts umstecken/löten

          1. Hallo Ralf,
            ich stöbere gerade zufällig hier herum und sehe Deine Antwort, mehr als ein Jahr später. Die Benachrichtigung ist mir wohl durch die Lappen gegangen.
            Danke für diesen konstruktiven, tollen Vorschlag. Mein Projekt vom letzten Jahr ist seit September im Dauerbetrieb und den seriellen Monitor habe ich seitdem nicht mehr benötigt.
            Aber ich fange demnächst ein neues Projekt an und dann bin ich froh, für das Problem eine Lösung zu haben.
            Frohe Weihnachten 2022
            Arndt

    1. Hallo Frank,

      erst mal danke für das Feedback. Zu deinem Development Board: das ist genau das, um den ESP-8266-01 etwas komfortabler zu gestalten! Dieses Herumstecken von Kabel zum Flashen/Resetten und die Anordnung der Pins für Probeschaltungen auf dem Breadboard machen ja wenig Spaß. Da schafft das Board Abhilfe. Gute Erfindung!

      VG, Wolfgang

  18. Hallo Wolfgang,
    erstmal ein Lob für die tolle Seite und gleich eine Frage:
    Kann man den D1 mini mit der dcf77_xtal Library von Udo Klein betreiben? Ist da ein richtiger Quarz drauf?
    Gruß Martin

    1. Hallo Martin,

      laut Datenblatt hat das D1 Mini Board einen Kristall. Ob das bedeutet, dass die Bibliothek funktioniert, kann ich dir nicht beantworten. Ich würde Udo Klein über seine Website oder über GitHub ansprechen.

      VG, Wolfgang

      1. Hallo Wolfgang,
        danke für die Rückmeldung. Ein Quarz ist eine gute Nachricht. Ich habe gesehen, dass Udo Klein seit einigen Jahren scheinbar nicht mehr aktiv ist, werde es aber trotzdem mal probieren ihn zu kontaktieren. Vorher muss ich mir aber erstmal ein DCF77 Modul besorgen, ich bin momentan noch in der Projektplanung und suche mir passende Sensoren und das dazu passende CPU-Board aus.
        Gruß
        Martin

  19. Relais: Ich habe das Problem, dass beim Neustart des Wemos immer alle pins ganz kurz high gesetzt werden (Standart scheint high zu sein). In der Software setze ich sie dann low, jedoch schaltet das Ralais an einem der pins damit beim start durch den Neustart ganz kurz immer – da high beim Start. Gibt es einen Pin der Standard low hat?

  20. Wenn man den D1 Mini mit 3,3V betreibt, wird ja der auf dem Board befindliche Spannungswandler (5V -> 3,3V) sozusagen „von hinten“ versorgt. Kann das Probleme geben?

    1. Auf der 5 Volt Seite ist ja „nichts“. Ich wüsste nicht, was da passieren sollte. Hier ist erklärt, wie ein Spannungsregler funktioniert:
      https://qastack.com.de/electronics/922/how-does-an-lm7805-voltage-regulator-work#:~:text=Spannungsregler%20haben%20einen%20Transistor%2C%20der,wie%20bei%20einem%20variablen%20Widerstand.&text=Bei%20der%20Zenerdiode%20handelt%20es,V%20ben%C3%B6tigt%2C%20damit%20Q1%20leitet.
      Die 5 Volt Seite sollte nicht zugänglich sein.

  21. Hallo Wolfgang,

    ich versuche einen LB6612 Motortreiber mit dem D1 Mini von AZ-Delivery zu betreiben. Die I/O pins schalten ordnungsgemäß zwischen HIGH und LOW um, aber die Geschwindigkeit, welche über PWM geregelt wird funktioniert genausowenig wie der Servo. Ich nutze die Pins D1 bis D8, es sollte also klappen. Allerdings habe ich die analogWrite() Funktion bislang ohne den zweiten Parameter verwendet. Der MC und der Treiber laufen auf 3,3 V und dem Servo habe ich noch einen Spannungsteiler vorgeschaltet, da die 7,2 V vom Akku etwas zu hoch für diesen sind. Mache ich irgendwas falsch?

    Gruß Martin

    1. Hallo, ich habe nur einen TB6612 Motortreiber gefunden. Ich gehe mal davon aus, dass der so wie deiner funktioniert. Hier habe ich eine Beschreibung gefunden:

      https://www.mikrocontroller-elektronik.de/preiswerter-dual-motortreiber-tb6612fng/

      Du sprichst von einem Servo. Meinst du wirklich einen Servo? für den brauchst du keine Motorsteuerung, der Servo wird direkt mit dem PWM Signal gesteuert (ggf. mit externer Stromquelle).

      Falls es doch kein Servo ist, sondern ein normaler Motor:
      Hast du AIN1 und AIN2 richtig angeschlossen (den einen HIGH, den anderen LOW)? Und Standby auf HIGH? Und was heißt analogWrite() mit nur einem Parameter? Die Funktion kann man doch eigentlich nur mit Pin und Wert aufrufen. Du könntest mal probieren, an den PWMA Pin einfach ein HIGH anzulegen, dann sollte der Motor auf voller Last laufen.

      Und zum Thema Spannungsregelung: Wenn ich das richtig verstanden habe versuchst du die Versorgungsspannung des Servos über einen Spannungsteiler einzustellen. Eine Steuerspannung kann man über einen Spannungsteiler einstellen, aber keine Versorgungsspannung (aus verschiedenen Gründen, das würde hier aber etwas lang werden). Dafür nimmt man Spannungsregler:

      https://wolles-elektronikkiste.de/spannungsversorgung-linear-und-schaltregler

      Hoffe, das hilft weiter.

      1. Hallo Wolfgang,

        danke für die scnelle Antwort. Sorry, ich habe mich etwas unklar ausgedrückt. Ich betreibe den LB6612 an den Pins D1-D7 und den Servo an D8. AIN1 und 2 und Standby funktionieren problemlos. Das mit dem Spannungsteiler ist ein guter Tipp, ich hatte momentan nur einen 3,3 V Regler zur Verfügung, deshalb diese Bastellösung. Ich werde jetzt aber einen 5 V Regler einsetzen, dann kann ich den Servo damit auch versorgen. Ich hatte schon mal versucht einem NodeMCU 8266 mit Motortreiber L298N zu betreiben und auch dort hat die Geschwindigkeitsregelung nicht funktioniert. Deshalb frage ich mich langsam ob es nicht eine Programmierproblematik ist, denn mit dem Arduino Uno funktioniert alles bestens. Deshalb bin ich ‚hellhörig‘ geworden, als ich bei dir las, dass man den PWM Pin mit diesem zweiten pwm_range Wert ansprechen muss, wasa ich ja bislang nicht getan habe.

        Gruß Martin

  22. Hallo, ich finde Ihre Seite und Ihre Beiträge super! Auch wie die Beiträge geschrieben wurden.
    Also von mir ein dickes Lob!

  23. Hallo Wolfgang,
    ich bin aus Zufall hier aus deine Seite gestoßen und ich muss sagen ich bin begeistert.
    Selten habe ich eine so gute und verständlich beschriebene Seite über den D1 Mini gesehen.
    Ich bin selbst ein großer Fun vom D1 Mini und habe auch schon einige Projekte damit gebaut.
    In den meisten Fällen reicht er für den „Normalanwender“ vollkommen aus.
    Mit Sicherheit werde ich öfter mal hier vorbei schauen.

    Grüße aus dem Saarland,
    Manfred

  24. Hallo Wolfgang,
    ich hab mal ne frage zu wemos d1 mini v 3.0.0
    wie könnte man ein wemos mit einem Akku betreiben ?
    Der wemos hat ja einen 5V Anschluss oder einen 3V Anschluss.
    Akkus haben 3,6 oder 6 V. Kann man den wemos mit 3,6 oder mit 6 V versorgen ?
    Oder müssen es genau 3 V oder 5 V sein ?
    Was passiert wenn die Spannung einbricht ( Akku leer).
    Beschädigt man dann den wemos ?

    1. Hallo,

      schau mal unter „Wesentliche technische Eigenschaften…“ im Beitrag 🙂 :

      „Bei der Spannungsversorgung der Boards habt ihr verschiedene Optionen. Entweder ihr speist sie mit 2,5 bis 3,6 Volt am 3,3 Volt Pin, mit 3 bis 7 Volt am 5 Volt Pin oder über den USB-Mikro Anschluss. Die zugrundeliegenden Microcontroller laufen mit 2,5 – 3,6 Volt.“

      Die Boards haben einen Spannungsregler – also alles gut!

      Bei zu niedriger Spannung beschädigst du nichts. Vielleicht verhält sich das Teil nur unvorhersehbar. Also sei höchstens vorsichtig, was du damit steuerst.

  25. Hallo Wolle
    Wie immer eine unglaubliche Informationsdichte und sehr praxisbezogen. Danke!
    Da ich zufällig auch auf dem „D1mini-Trip“ bin noch ein paar Hinweise:
    – die langen Lötpins sind auch praktisch zur Stapelung mit den vielen Entwicklungsboards und
    Stromversorgungsboards. Sowie OLED 0.66″.
    Man kann alles zu einem Turm zusammenstecken und experimentieren.
    Leere Boards eignen sich gut für kleine Eigenentwicklungen.
    – es gibt auch noch D1 mini auf der Basis von ESP32. Hier kann man die gleichen Zusatz-Boards auch
    Verwenden, allerdings nur für die innere Pinreihe.
    Melde dich, wenn du in Zürich bist – ich bin nur eine Stunde entfernt.
    Grüsse aus der Region Basel.
    Andreas

    1. Halo Andreas, vielen Dank für die Hinweise. Und vielleicht verschlägt es mich ja tatsächlich mal nach Zürich – dann melde ich mich! VG, Wolle

  26. Wow Wolle

    Da hast Du aber ein dickes Dünnbrett gebohrt! Fantastischer Artikel, ausführlich, eine echte Erholung von diesen „Du musst eigentlich schon alles wissen damit Du meinen einen Supernerdy Satz verstehen kannst“ – GitHub-ReadMe Mist…Stell doch Deine Artikel unter Beerware Lizenz und komm mal nach Zürich!

    Grüsse ins Studio

    1. Hallo Roman, vielen Dank. Das mit der Beerware Lizenz ist gute Idee. Wir sehen uns dann in Zürich! Viele Grüße, Wolle

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert