ESP32 WROOM – Pinbelegung, WLAN und Bluetooth

FunduinoZuletzt aktualisiert am

Pinbelegung, WiFi, Bluetooth und Einrichtung in der Arduino IDE

Was kann das ESP32-Wroom

Der ESP32-Wroom verfügt über:

  • digitale Ein- und Ausgänge
  • analoge Eingänge
  • berührungsempfindliche Touch-Pins
  • Bussysteme: I2C und SPI
  • WiFi und Bluetooth BLE
Entwicklungsboard ESP32-Wroom von oben
Das ESP32-Wroom im Überblick

I2C-Pins

Der I²C-Bus (Inter Integrated Circuit) wurde ursprünglich von Philips entwickelt. Ein Controller (hier das ESP32-Wroom) sollte mit verschiedenen Peripheriegeräten kommunizieren können. Die Anschlüsse tragen die Bezeichnungen SDA und SCL.

Einige Bauteile werden mit I2C gesteuert:

Beispiel: Zufallszahlen auf einem 20x4 LCD anzeigen.

I2C-Pins: 22 = SCL, 21 = SDA

Die Bibliothek LCDIC2 findest du unter Sketch → Bibliothek einbinden → Bibliotheken verwalten.

Pinbelegung ESP32-Wroom, I2C-Pins hervorgehoben
Die I2C-Pins des ESP32-Wroom
LCD-Display zeigt sechs Zufallszahlen
Sechs Zufallszahlen auf dem 20x4-LCD
Schaltplan LCD-Display am ESP32-Wroom
Schaltplan: 20x4-LCD am ESP32-Wroom
Bibliotheksverwalter der Arduino IDE mit LCDIC2
Die Bibliothek LCDIC2 im Bibliotheksverwalter
1 / 4
Zufallszahlen auf dem 20x4-LCD
# include "LCDIC2.h"

// 4-zeiliges LCD
LCDIC2 lcd(0x27, 20, 4);

// 2-zeiliges LCD
// LCDIC2 lcd(0x3f, 16, 2);

void setup()
{
  // Zufallsgenerator starten
  randomSeed(analogRead(0));

  // LCD starten
  lcd.begin();

  // Cursor verbergen
  lcd.setCursor(false);

  // Ausgabe auf dem LCD
  // Cursor auf Position 0 in Zeile 0 setzen
  lcd.setCursor(0, 0);
  lcd.print("Zufallszahlen:");

  // Cursor auf Position 0 in Zeile 0 setzen
  lcd.setCursor(0, 1);

  // // 6 Zufallszahlen anzeigen
  for (int i = 1; i <= 6; i++)
  {
    int Zahl =  random(1, 7);
    lcd.print(String(Zahl));
    lcd.print(" ");
  }
}

void loop()
{
  // bleibt leer, Programm läuft nur einmal
}

SPI-Pins

Auch der SPI-Bus (Serial Peripheral Interface) dient der Kommunikation zwischen dem Controller und Peripheriegeräten. Der SPI-Bus benötigt zwei Datenleitungen und zwei Steuerleitungen:

  • COPI (Controller Out Peripherie In) vom Controller ausgehende Kommunikation mit einem Peripheriegerät
  • CIPO (Controller In Peripherie Out) vom Peripherie-Gerät ausgehende Kommunikation mit dem Controller
  • CS (Chip Select) der Controller aktiviert und startet die Kommunikation mit dem Peripheriegerät
  • SCK (Serial Clock) vom Controller erzeugte Taktfrequenz für den SPI-Bus

Anmerkung: Es gibt mehrere Initiativen die alten, aber immer noch weit verbreiteten Bezeichnungen MOSI (Master Out Slave In → COPI) und MISO (Master In Slave Out → CIPO) zu ersetzen:

sparkfun.com/spi_signal_names

oshwa.org – A Resolution to Redefine SPI Signal Names

docs.arduino.cc – SPI

SPI-Pins: 23 = COPI/SDO, 19 = CIPO/SDI, 18 = CLK, 5 = CS

Pinbelegung ESP32-Wroom, SPI-Pins hervorgehoben
Die SPI-Pins des ESP32-Wroom

Touch-Pins

Der menschliche Körper und elektrisch leitfähige Gegenstände können elektrische Ladung speichern. Wird einer der Touch-Pins berührt, verändert sich der Messwert.

Beispiel: Schließe ein Kabel an Touch-Pin 32 an.

Touch-Pins: 32, 33, 27, 14, 12, 13, 4, 2, 15

Pinbelegung ESP32-Wroom, Touch-Pins hervorgehoben
Die Touch-Pins des ESP32-Wroom
Kabel an Touch-Pin 32 des ESP32-Wroom
Beispiel: ein Kabel am Touch-Pin 32
Serieller Monitor mit Messwerten des Touch-Pins
Ausgabe im Seriellen Monitor beim Berühren
1 / 3
Touch-Pin 32 auslesen
void setup()
{
  // Serielle Kommunikation starten
  Serial.begin(9600);
  delay(1000);
}

void loop()
{
  Serial.print("Wert: ");

  // gemessenen Wert am Touch-Pin 32 anzeigen
  Serial.print(touchRead(32));

  // wenn der Wert < 20 -> Pin wurde berührt
  if (touchRead(32) < 20) Serial.println(" -> Pin berührt");

  // bei größeren Werten wurde der Pin nicht berührt
  else Serial.println(" -> Pin nicht berührt");
  delay(1000);
}

Digitale Pins

Digitale Pins (INPUT und OUTPUT). Das Beispielprogramm lässt eine LED an Pin 33 blinken.

Digitale Pins links: 33, 25, 26, 27, 14, 12, 13

Digitale Pins rechts: 23, 22, 21, 19, 18, 5, 17, 16, 4, 2, 15

Pinbelegung ESP32-Wroom, digitale Pins hervorgehoben
Die digitalen Pins des ESP32-Wroom
LED an Pin 33 des ESP32-Wroom angeschlossen
Das LED-Blinkprogramm an Pin 33
1 / 2
LED an Pin 33 blinken lassen
int LED = 33;

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

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

Analoge Pins

Es stehen zwei ADC-Wandler (Analog Digital Converter) mit einer Auflösung von 12 Bit zur Verfügung. Wenn WiFi verwendet wird, können nur die Pins 32 bis 39 als analoge Eingänge angesprochen werden. Das Signal hat den Wertebereich von 0 bis 4095.

Beispiel: Potentiometer an Pin 35.

Analoge Pins: 36, 39, 34, 35, 32, 33

Pinbelegung ESP32-Wroom, analoge Pins hervorgehoben
Die analogen Pins des ESP32-Wroom
Potentiometer am analogen Pin 35 des ESP32-Wroom
Potentiometer an Pin 35
Serieller Plotter mit Kurve der Potentiometerwerte
Ausgabe im Seriellen Plotter beim Drehen des Potentiometers
1 / 3
Potentiometer an Pin 35 auslesen
// Potentiometer an Pin 35
int Potentiometer = 35;

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

DAC-Pins

Für das ESP32-Wroom existiert kein analogWrite(). Stattdessen können die Pins 25 und 26 mit dacWrite angesprochen werden. Das Programm erhöht die Helligkeit der LED in 5er-Schritten, anschließend wird die LED gedimmt.

DAC-Pins: 25, 26

Pinbelegung ESP32-Wroom, DAC-Pins hervorgehoben
Die DAC-Pins des ESP32-Wroom
LED an Pin 25 dimmen (DAC)
void setup()
{
  // kein setup notwendig
}

void loop()
{
  // Helligkeit in 5er-Schritten erhöhen
  for (int i = 50; i < 255; i+=5)
  {
    dacWrite(25, i);
    delay(20);
  }

  // Helligkeit in 5er-Schritten verringern
  for (int i = 255; i > 50; i-=5)
  {
    dacWrite(25, i);
    delay(20);
  }
}

WiFi

Beispiel: Das Programm zeigt im Browser 6 Zufallszahlen an. Im Seriellen Monitor wird die mit DHCP ermittelte IP des ESP32-Wroom angezeigt.

Diese Adresse musst du in einem Browser deiner Wahl eingeben.

Browserfenster mit sechs Zufallszahlen vom ESP32-Wroom
Sechs Zufallszahlen im Browser
Serieller Monitor zeigt die IP-Adresse des ESP32-Wroom
Die per DHCP vergebene IP-Adresse im Seriellen Monitor
1 / 2
Zufallszahlen im Browser anzeigen (WiFi)
#include "WiFi.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 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 < 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();
        }
      }
    }
  }
}

Bluetooth BLE

Installiere zunächst die Bibliothek ArduinoBLE über Sketch → Bibliothek einbinden → Bibliotheken verwalten und suche dort nach ArduinoBLE.

Das Programm schaltet eine LED an Pin 18: 1 einschalten, 0 ausschalten.

Die für iOS und Android verfügbare App LightBlue sorgt für die Schaltung der LED (Bildschirmschnappschüsse mit iOS).

Bibliotheksverwalter der Arduino IDE mit ArduinoBLE
Die Bibliothek ArduinoBLE im Bibliotheksverwalter
LED per Bluetooth BLE schalten
# include "ArduinoBLE.h"

/*
  eindeutige  UUID bestimmen:
  https://www.guidgenerator.com/online-guid-generator.aspx
  https://www.uuidgenerator.net/
  BLERead | BLEWrite | BLENotify
  -> schreiben, lesen, Info
*/

// Name BLE-Service
BLEService LEDSchalten("19b10000-e8f2-537e-4f6c-d104768a1214");

BLEUnsignedCharCharacteristic Auswahl("19b10000-e8f2-537e-4f6c-d104768a1214", BLERead | BLEWrite | BLENotify);

// LED an Pin 18
int LED = 18;

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

  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  // pinMode festlegen
  pinMode(LED, OUTPUT);

  // BLE starten
  if (!BLE.begin()) Serial.println("Bluetooth-Modul konnte nicht gestartet werden!");
  else Serial.println("Bluetooth-Modul erfolgreich gestartet!");

  // Name festlegen (wird in der App angezeigt) und den Service (LEDSchalten) zuweisen
  BLE.setLocalName("LED schalten");
  BLE.setAdvertisedService(LEDSchalten);

  // Auswahl als Platzhalter für den in der App gewählten Wert
  LEDSchalten.addCharacteristic(Auswahl);

  // Service LEDSchalten hinzufügen
  BLE.addService(LEDSchalten);

  // Startwert für die Kommunikation schreiben
  Auswahl.writeValue(0);

  // Zuweisung starten
  BLE.advertise();
}

void loop()
{
  // auf die Verbindung zu Geräten warten
  BLEDevice Verbindung = BLE.central();

  // wenn der ESP32 mit einem Gerät verbunden ist ...
  if (Verbindung)
  {
    Serial.println("Verbunden ... ");

    // solange der Controller mit einem Gerät verbunden ist ...
    while (Verbindung.connected())
    {

      if (Auswahl.written())
      {
        // LED einschalten
        if (Auswahl.value() == '1')
        {
          Serial.print(char(Auswahl.value()));
          Serial.println(" -> LED ein");
          digitalWrite(LED, HIGH);
        }

        // LED ausschalten
        if (Auswahl.value() == '0')
        {
          Serial.print(char(Auswahl.value()));
          Serial.println(F(" -> LED aus"));
          digitalWrite(LED, LOW);
        }
      }
    }
  }
}

Board installieren

Trage unter Datei → Einstellungen eine zusätzliche Boardverwalter-URL ein: https://dl.espressif.com/dl/package_esp32_index.json

  • Icon für den Boardverwalter anklicken oder Werkzeuge → Board → Boardverwalter
  • nach ESP32 suchen
  • Board installieren
Einstellungen der Arduino IDE mit zusätzlicher Boardverwalter-URL
Zusätzliche Boardverwalter-URL eintragen
Boardverwalter der Arduino IDE mit ESP32-Paket
ESP32 im Boardverwalter installieren
1 / 2

Board auswählen

Wenn das ESP32-WROOM nicht automatisch erkannt wurde, klicke auf „Wähle ein anderes Board und einen anderen Port“ und suche nach esp32-wroom. Je nach Betriebssystem wird der USB-Port eine andere Bezeichnung haben.

Dialog der Arduino IDE zur Board- und Portauswahl
Ein anderes Board und einen anderen Port wählen
Auswahlliste der Arduino IDE mit ESP32-WROOM
Das ESP32-WROOM auswählen
1 / 2
Anleitung bewerten

Kommentare

Frage stellen oder Erfahrung teilen

Schreib uns, wenn etwas nicht funktioniert. Nenne dabei dein Board und die Fehlermeldung.

Wir prüfen jeden Kommentar vor der Veröffentlichung. Deine E-Mail-Adresse bleibt bei uns.