Wemos D1 Mini – Pinbelegung und Einrichtung

FunduinoLaatst bijgewerkt op

Pinbelegung, Bussysteme, WLAN und die Einrichtung in der Arduino IDE

Der Wemos D1 Mini ist ein winziges Board mit WLAN an Bord – und damit ein guter Einstieg in alles, was mit dem Netzwerk zu tun hat. Die Programmierung läuft wie beim Arduino über die Arduino IDE.

Diese Seite ist eine Referenz: Sie zeigt dir die Pinbelegung für I²C, SPI, die digitalen Pins und den analogen Eingang, gibt zu jedem Bereich ein kleines Beispiel und erklärt zum Schluss die Einrichtung in der Arduino IDE.

Wemos D1 Mini Typ C von oben
Der D1 Mini Typ C mit Mini-USB-Anschluss

Was der Wemos D1 Mini kann

Der Wemos D1 Mini bietet dir:

  • digitale Ein- und Ausgänge
  • einen analogen Eingang
  • die Bussysteme I²C und SPI
  • WLAN

Aktuell gibt es zwei Versionen. Die Pinbelegung ist bei beiden identisch, nur der USB-Anschluss unterscheidet sich: Der D1 Mini Typ C wird über Mini-USB verbunden, der D1 Mini V4.0 über USB-C.

Wemos D1 Mini Typ C von oben
Der D1 Mini Typ C mit Mini-USB-Anschluss
Wemos D1 Mini V4.0 von oben
Der D1 Mini V4.0 mit USB-C-Anschluss
1 / 2

Die I²C-Pins

Der I²C-Bus (Inter-Integrated Circuit) wurde ursprünglich von Philips entwickelt, damit ein Controller – hier der Wemos D1 Mini – mit verschiedenen Peripheriegeräten kommunizieren kann. Die beiden Anschlüsse heißen SDA und SCL:

  • D1 – SCL
  • D2 – SDA

Diese Bauteile werden zum Beispiel über I²C angesteuert:

Pinbelegung des Wemos D1 Mini mit hervorgehobenen I2C-Pins
Die I²C-Pins: D1 ist SCL, D2 ist SDA

Die SPI-Pins

Auch der SPI-Bus (Serial Peripheral Interface) dient der Kommunikation zwischen Controller und Peripheriegeräten. Er braucht zwei Datenleitungen und zwei Steuerleitungen:

  • COPI (Controller Out, Peripheral In) – Kommunikation vom Controller zum Peripheriegerät
  • CIPO (Controller In, Peripheral Out) – Kommunikation vom Peripheriegerät zum Controller
  • CS (Chip Select) – der Controller aktiviert das Peripheriegerät und startet die Kommunikation
  • SCK (Serial Clock) – die vom Controller erzeugte Taktfrequenz für den SPI-Bus

Am Wemos D1 Mini liegen sie auf diesen Pins:

  • D7 – COPI/SDO
  • D6 – CIPO/SDI
  • D5 – CLK
  • D8 – CS

Mehrere Initiativen arbeiten daran, die alten, aber immer noch weit verbreiteten Bezeichnungen MOSI (Master Out Slave In, jetzt COPI) und MISO (Master In Slave Out, jetzt CIPO) zu ersetzen. Mehr dazu bei SparkFun, bei der OSHWA und in der Arduino-Dokumentation.

Pinbelegung des Wemos D1 Mini mit hervorgehobenen SPI-Pins
Die SPI-Pins D5 bis D8

Die digitalen Pins

Die meisten digitalen Pins kannst du frei verwenden. Einige haben beim Hochladen eines Sketches jedoch eine Sonderrolle:

  • D0 – hat beim Hochladen den Zustand HIGH
  • D1, D2 – frei verwendbar (zugleich die I²C-Pins)
  • D3 – aktiviert den Firmware-Upload, wenn der Zustand LOW ist
  • D4 – darf beim Hochladen nicht LOW sein; danach als normaler Ein-/Ausgabepin verwendbar. An diesem Pin hängt die interne LED.
  • D5, D6, D7 – frei verwendbar (zugleich die SPI-Pins)
  • D8 – darf beim Hochladen nicht HIGH sein

Zum Ausprobieren ein Blinkprogramm mit einer LED an Pin D8. Verwendest du stattdessen D4, leuchtet die interne LED mit.

Pinbelegung des Wemos D1 Mini mit hervorgehobenen digitalen Pins
Die digitalen Pins des Wemos D1 Mini
Wemos D1 Mini mit einer LED an Pin D8
Aufbau für das Blinkprogramm: LED an D8
1 / 2
Blinkprogramm für eine LED an D8
int LED = D8;

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

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

Der analoge Pin

Der Wemos D1 Mini hat genau einen analogen Pin: A0. Die Auflösung beträgt 10 Bit, der höchste Wert ist also 1023.

Als Beispiel liest der Sketch ein Potentiometer an A0 aus. Besonders anschaulich wird es im seriellen Plotter: Dort siehst du die Drehbewegung als Kurve.

Wemos D1 Mini mit einem Potentiometer am Pin A0
Potentiometer am analogen Pin A0
Serieller Plotter mit dem Kurvenverlauf eines Potentiometers
Ausgabe im seriellen Plotter beim Drehen des Potentiometers
1 / 2
Potentiometer am Pin A0 auslesen
// Potentiometer an Pin A0
int Potentiometer = A0;

// Variable für den gelesenen Wert
int GelesenerWert = 0;

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

void loop()
{
  // analogen Wert lesen
  GelesenerWert = analogRead(Potentiometer);
  Serial.println(GelesenerWert);
  delay(500);
}

WLAN-Beispiel: Zufallszahlen im Browser

Das folgende Programm macht aus dem Wemos D1 Mini einen kleinen Webserver: Er erzeugt Zufallszahlen und zeigt sie in einem Browser an.

Trage oben im Sketch die SSID und das Passwort deines Routers ein. Nach dem Hochladen erscheint im seriellen Monitor die IP-Adresse, die der Router dem Board per DHCP zugewiesen hat. Diese Adresse gibst du in einem Browser deiner Wahl ein.

Das Board und der Computer, mit dem du die Seite aufrufst, müssen im selben Netzwerk sein. Die Seite ist nur im lokalen Netz erreichbar, nicht aus dem Internet.

Serieller Monitor mit der IP-Adresse des Wemos D1 Mini
Im seriellen Monitor erscheint die per DHCP vergebene IP-Adresse
Browserfenster mit den vom Wemos D1 Mini erzeugten Zufallszahlen
Die Zufallszahlen im Browser
1 / 2
WiFi-Beispiel: Zufallszahlen im Browser anzeigen
#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);

  // 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(0));
}

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 Client 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, weil es im Quelltext
              einen Zeilenumbruch erzeugt.
            */
            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 < 7; 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();
        }
      }
    }
  }
}

Board installieren und auswählen

Trage unter Datei › Einstellungen eine zusätzliche Board-Verwalter-URL ein:

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

  • Auf das Symbol für den Board-Verwalter klicken oder Werkzeuge › Board › Boardverwalter öffnen
  • nach esp8266 suchen
  • Board installieren

Wird der Wemos D1 Mini danach nicht automatisch erkannt, klicke auf „Wähle ein anderes Board und einen anderen Port“ und suche nach „Wemos D1“. Wie der USB-Port heißt, hängt von deinem Betriebssystem ab.

Dieselbe Einrichtung ausführlicher findest du in der Anleitung Wemos D1 und NodeMCU in der Arduino IDE installieren.

Einstellungsfenster der Arduino IDE mit eingetragener ESP8266-Board-Verwalter-URL
Die Board-Verwalter-URL unter Datei › Einstellungen
Board-Verwaltung der Arduino IDE mit dem Suchergebnis esp8266
In der Board-Verwaltung nach esp8266 suchen und installieren
Dialog der Arduino IDE zur Auswahl von Board und Port
„Wähle ein anderes Board und einen anderen Port“
Board-Auswahl der Arduino IDE mit dem Suchergebnis Wemos D1
Nach „Wemos D1“ suchen und das Board festlegen
1 / 4
Handleiding beoordelen

Opmerkingen

Stel een vraag of deel je ervaring

Neem contact met ons op als iets niet werkt. Vermeld daarbij je board en de foutmelding.

We controleren elke reactie voordat deze wordt gepubliceerd. Je e-mailadres blijft bij ons.