ESP32 Nützliche Infos

Last Updated on 4. April 2024 by sfambach

Der ESP32 ist der Nachfolger des erfolgreichen ESP8266 Controllers. Er besitzt eine 32Bit Tensilica Xtensa LX6 CPU in der Regel mit zwei Kernen (RISC Architektur). Hier sammle ich für mich interessante Informationen.

Anwendungsgebiete

  • Haushaltsanwendungen
  • Hausautomation
  • Smarte Steckdosen und Licht Steuerung
  • WLAN Steuerung
  • Babyphone
  • IP Kameras
  • Sensor Networks
  • Wearables
  • Bloototh Applikationen wie Kopfhörer/Lautsprecher …

Dokumentation

https://www.espressif.com/en/products/hardware/esp32/overview

https://github.com/espressif/arduino-esp32

Hardware

Verpackung

Den ESP32 gibt es als Chip oder Modul mit zusätzlichen externen Speicher, Antennen u.ä.

Welche Versionen es aktuell gibt ist der Espressif Bestellinformation zu entnehmen. Hier der Link zu ihr:

Espressif Bestellinformation

Bezeichnung

Jeder ESP kommt mit einer Beschriftung. Die Einzelenen Chips sind mit einem Code versehen. Hier ein Beispiel:

Espressif Datenblatt – Bestellinformationen
Quelle: https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

Bei den Modulen ist der Aufdruck eher nur ein Verweis aufs jeweilige Datenblatt oder die Bestellinformationen.

Auch gibt es die Chips und Module in unterschiedlichen Versionen, die sich zusätzlich voneinander unterscheiden können.

Innenleben

Das folgende Schaubild zeigt die Architektur des Controllers.
Neben diversen Schnittstellen besitzt er:

  • WLan
  • Bluetooth
  • Einen Temperatursensor
  • Crypto Routinen
Blockschaltbild ESP32

Speicher

Der ESP kommt mit unterschiedlichen Speicher Konfigurationen daher, hier ein kurzer Überblick welche Kombinationen aktuell möglich sind. Um welche Konfiguration es sich handelt kann dem jeweiligen Datenblatt oder der Bestellinformation entnommen werden.

RAM

Der Ur-Esp32 hat ein 520KB internen Speicher aber auch die Möglichkeit diesen extern zu erweitern. Aktuell wird als externe Erweiterung nur PSRAM unterstützt. Es ist möglich den Speicher auf bis zu 8MB zu erweitern wobei aktuell nur 4 MB gleichzeitig adressiert werden können.

Flash

Je nach Konfiguration kommt der ESP im Chipformat mit 0 ,2 oder 4 MB internen FLASH. Bei den Modulen kann der FLASH extern im Modul verbaut sein. Der Ur-ESP kann maximal 16 MB Flashspeicher adressieren. Jenachdem wie der Flash Speicher gemappt ist und welche Art verwendet wird, kann unterschiedlich viel davon verwaltet werden.

  • QSPI Flash
    • Beim Mapping als Instuctions Speicher, können bis zu 11MB + 248KB adressiert werden. Bei mehr als 3 MB + 248 KB wird der Zugriff inperformant.
    • Beim Mapping als exklusiv lesen Datenspeicher können maximal 4MB adressiert werden.
  • Externer SRam can als CPU Datenspeicher gemappt weden und es werden bis zu 8MB unterstützt. Es können aber nur auf 4MB gleichzeitig zugegriffen werden. (Beispiel OTA 2x 4MB Nutzbar)

ROM

Der UR-ESP hat 448 KB ROM. Sie beinhalten laut Espressif Forum spezielle interne Funktionen und zum Beispiel den Bluetooth Stack. Der extern nutzbare Funktionsumfang kann git entnommen werden:

https://github.com/espressif/esp-idf/tree/master/components/esp32/include/rom

UART 1,2,3

Der Esp32 besitzt 3 UART Schnittstellen, die von einander unabhängig konfiguriert werden können. Die Maximalgeschwindigkeit beträgt 5Mbps Dies ermöglicht eine asysnchrone Kommunikation mit RS232, RS485 und IrDa unterstützung. Als Anschluss kann jeder GPIO Pin dienen. (Quelle: Espressif ESP32Datenblatt Seite 28, 31)

Pinbelegung per default:

UARTRX IOTX IOCTSRTS
UART0GPIO3GPIO1N/AN/A
UART1GPIO9GPIO10GPIO6GPIO11
UART2GPIO16GPIO17GPIO8GPIO7
Quelle: https://circuits4you.com/2018/12/31/esp32-hardware-serial2-example/

In der Arduino Gui sind folgende Einstellungen:

  • Serial – Uart0 GPIO 1/3
  • Serial1 – Uart 1, GPIO 9/10 meist schon mit Flash Speicher belegt
  • Serial2 – Uart 2 GPIO 16/17

Die Ansteuerung ist in allen gängigen Frameworks wie Arduino IDE, Espressif, Micropython… enthalten.

I²C Wire Bus

Der ESP32 hat zwei Wire Busse. Für den Anschluss kann jeder GPIO Pin gewählt werden. Er kann mit einer Geschwindigkeit von 100Kbit’s (Standard Mode), 400Kbit’s (Fast Mode) bis hin zu 5 MHz arbeiten. Die beiden Busse beherrschen 7bit und 10 Bit Addressierung. (Quelle: Espressif ESP32 Datenblatt Seite 28,31)

Die Ansteuerung ist in allen gängigen Frameworks wie Arduino IDE, Espressif, Micropython… enthalten.

ADC’s

Der ESP32 besitzt zwei getrennt ADC 12Bit Register mit insgesamt 18 Kanälen. Durch die 12 Bit ergibt sich eine Messspanne von 0 bis 4095.

ADC1 hat 8 Kanäle, diese sind an den GPIOs 32-39 Verfügbar.

ADC2 besitzt 10 Kanäle und ist mit den GPIOs  0, 2, 4, 12 – 15 und 25 – 27 verbunden. Weiterhin ist der ADC2 nicht nutzbar wenn WIFI verwendet wird.

GPIOADCKanalAnmerkung
3610
3711
3812
3913
3214
3315
3416
3517
420
021Meist mit Bootoptionen belegt
222
1523
1324
1225
1426
2727
2528
2429
ADC Zuordnung nach GPIOs

Weitere Informationen sind dem unten gelinkten Artikel von Espressif zu entnehmen.

Programmierumgebung

Arduino Gui

Platformio

Espressif IDF

VS-Code für Espressif IDF

Spannung am ESP Abfragen

Der ESP 8266 hat noch die Möglichkeit die Spannung zu messen. Beim ESP32 beötigt man eine Hilfsschaltung, ein Spannungsteiler mit 100kOhm und 10kOhm am ADC.

Mehr infos gibts in dem gelinkten Beitrag:

https://www.arduinoforum.de/arduino-Thread-ESP32-Batteriestatus

Formel zur Berechnung der Spannung:

Uin =  (100 + 10) / 10 ((R1 + R2) /R2) 

https://www.arduinoforum.de/arduino-Thread-ESP32-Batteriestatus

Sofware Tipps

Hardware Daten auslesen

Die Datei esp.h/Klasse ESP bietet Zugriff auf einige Informationen der Hardware. Wie Id, Versionen, freier Speicher usw.. Der komplette Funktionsumfang kann in Githup eingesehen werden.

https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/Esp.h

Eingebunden werden muss die Esp.h meist nicht diese ist bei den Standardbibliotheken mit dabei. (Danke für den Hinweis an Andreas, siehe Kommentar) . Folgend ein paar Beispiele aus der Datei.

Neustart auslösen

Eine Funktion ist das Neustarten des ESPs. Dies kann nach einem remote Update der Firmware nötig sein oder bei schlampiger Programmierung wenn der Speicher voll ist ;).

ESP.restart();

Speicher Informationen abfragen

Gerade für das Debuggen sind Speicherinfomationen ganz nützlich. Zum Beispiel kann hieran erkannt werden, ob verwendeter Speicher auch wieder frei gegeben wird. Die folgenden können hierfür aufgerufen werden:

Heap/SPI Speicher Größe

uint32_t var = ESP.getHeapSize(); 
uint32_t var2 = ESP.getPsramSize();

Freier Heap/PS Speicher

uint32_t var1 = ESP.getFreeHeap(); 
uint32_t var2 = ESP.getFreePsram();

Minimalwert des Heap/SPI Speichers seit Controller start.

uint32_t var1 = ESP.getMinFreeHeap(); 
uint32_t var2 = ESP.getMinFreePsram();

Maximale Blockgröße des Heap/SPI Speichers

uint32_t var1 = ESP.getMaxAllocHeap(); 
uint32_t var2 = ESP.getMaxAllocPsram();

Basic OTA

OTA – Over The Air – Protokolle ermöglichen es Microcontroller über das Netzwerk zu flashen. Da der ESP32 über WLAN verfügt ist ein flashen über das Netz möglich. Die ausführliche Anleitung kann unter folgenden Link gefunden werden:

Anleitung für OTA

Im Grunde ist das Vorgehen wie folgt:

  • Python installieren
  • Beispiel Project Basic OTA auswählen
  • WLan Daten eingeben
  • OTA Firmware flashen
  • OTA teil in eigenen Code einbauen und immer über das Netzwerk flashen

Probleme

WiFi Verbindet sich nur jedes 2. Mal

Wie folgt die Verbindung starten:

  WiFi.disconnect();
  WiFi.mode(WIFI_STA); // kann auch ein anderer Mode sein
  while (WiFi.status() != WL_CONNECTED) {
    WiFi.begin(SSID, PASSWORD);
    delay(1000);
  }

Speicher Voll / zu Klein

Gerade bei Graphiken oder bei der Bluetooth Biliothek gerät man schnell mal an die Grenzen des verfügbaren Programmspeichers.

Ein gutes Einführungvideo gibts von Andreas Spiess:

Youtube Andreas Spiess – More Memory for the ESP32 …

Im Grunde geht es darum die Speicherzuordnung richtig einzustellen. Um mehr Speicher für die Applikationen zu bekommen, kann OTA ausgeschaltet oder der SPIFFS Speicher vermindert werden.

Arduino Gui

In der Arduino Gui sind die einstellungen im Menü Werkzeuge zu finden.

Arduino Gui – Einstellungen zum Speicher

Wer zusätzliche Optionen braucht, kann diese in der Konfiguration XML hinzufügen.

Espressif-IDF

In der Espressiv-IDF können die Einstellungen über die Menuconfig und über eine eigene Partitionstabelle vorgenommen werden.

Espressif IDF – Menuconfig, Hauptmenü
Espressif-IDF – Anpassen der Speichergröße und der Autodetectoption
Espressif-IDF – Anpassen der Partitionstabelle
Espressif-IDF – Partitionstabelle im Projektverzeichnis

Verwandte Beiträge

Quellen

https://en.wikipedia.org/wiki/ESP32

https://www.espressif.com/en/products/hardware/esp32/overview

https://github.com/espressif/arduino-esp32

ESP Wroom 32 IO Reference

Espressif Beitrag zum ADC

Anleitung für OTA

Youtube Andreas Spiess – More Memory for the ESP32 …

ThingPulse Beitrag zum PSRam

Espressif Bestellinformation

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

10 Gedanken zu „ESP32 Nützliche Infos

  1. Bitte um Überprüfung , das macht so keinen rechten Sinn.

    QSPI Flash
    Beim Mapping als Instuctions Speicher, können bis zu 11MB + 248KB adressiert werden. Bei mehr als 3 MB + 248 KB wird der Zugriff inperformant.

    MfG Mike

    1. Hi Mike

      ist aus dem Datenblatt des ESP32:

      https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

      Seite 26, wenn ich etwas falsch verstanden habe bitte korrgieren.

      3.1.3 External Flash and RAM ESP32 supports multiple external QSPI flash and external RAM (SRAM) chips.

      More details can be found in ESP32 Technical Reference Manual > Chapter SPI Controller. ESP32 also supports hardware
      encryption/decryption based on AES to protect developers’ programs and data in flash.

      ESP32 can access the external QSPI flash and SRAM through high-speed caches.
      • Up to 16 MB of external flash can be mapped into CPU instruction memory space and read-only memory
      space simultaneously.
      – When external flash is mapped into CPU instruction memory space, up to 11 MB + 248 KB can be
      mapped at a time. Note that if more than 3 MB + 248 KB are mapped, cache performance will be
      reduced due to speculative reads by the CPU.
      – When external flash is mapped into read-only data memory space, up to 4 MB can be mapped at a
      time. 8-bit, 16-bit and 32-bit reads are supported.
      • External RAM can be mapped into CPU data memory space. SRAM up to 8 MB is supported and up to 4
      MB can be mapped at a time. 8-bit, 16-bit and 32-bit reads and writes are supported.

      Schande über mein Haupt diese Quelle hatte gefehlt im Beitrag ich habe sie jetzt hinzugefügt.

      Gruß
      Stefan

  2. hallo stefan!
    danke für die so informativ gestaltete seite. vielleicht kannst du mir weiterhelfen?
    ich nutze die esp32 cam für eine türsprechanlage und habe das problem, dass sich die kamera nach ein paar tagen nicht mehr abrufen lässt (http://http://192.168.X.X/capture). über den resetbutton ist das problem behoben. was aber nicht die lösung ist. gibt es einen http-befehl mit der ein solcher reset ausgelöst werden kann? bei mir läuft alles über den iobroker, mit welchem solche befehle via script jederzeit absetzbar sind.
    sg tom

    1. Hi Tom,

      danke für deinen Beitrag. Einen Befehl per HTML der den ESP.restart() aufruft gibt es soweit ich weiss nicht. Allerdings sollte es möglich sein in der ESP cam den Befehl im bestehenden Format zu implementieren.

      in der Datei app_httpd.cpp des Cam Webservers ab ca Zeile 491 (If Kaskade) einen weitere If Bedingung eintragen:

      else if (!strcmp(variable, „reset“)) { ESP.restart();}

      und dann per http mit

      http:///control?var=reset&val=1

      aufrufen. So sollte es theoretisch gehen, ausprobiert habe ichs nicht 😉
      Mehr zur ESP Cam hier: https://www.fambach.net/esp32-cam-modul/

      1. hi joe!
        vielen dank für den tipp. wenn ich wiedermal die kamera abmontieren muss, werde ich den elko anlöten. zur zeit überwache ich die fixe ip von der kamera. wenn sie im netzwerk nicht mehr auftaucht, wird deren stromversorgung 10 sec. unterbrochen. das ist in dem fall die einfachste und schnellste lösung.

  3. Hallo Stefan
    danke für die interessanten Hinweise.
    Zuerst habe ich Esp.h in die library eingebunden und auf dem Sketch mit #include gestartet.
    Die diversen Hardware-Infos konnten angezeigt werden.
    Als ich dann den include auskommentierte, kam die Anzeige gleichwohl. Wie kann ich mir das erklären?
    2. Frage: du hast die Anweisung „ESP.restart()“ so prominent dargestell; es funktioniert aber ich kann mir keine sinnvolle Anwendung vorstellen. Wann braucht man das?
    Andreas

    1. Hallo Anreas,
      vielen Dank für deinen Kommentar. Die Esp.h ist per default bei den Boardtreibern mit dabei, diese muss nicht extra eingebunden werden. Ich habe sie nur aufgelistet weil man in Git so die Funktionalitäten finden kann die sie bietet.
      Zur zentralen Darstellung muss ich zu meinder Schande gestehen, dass ich die Seite eröffnet habe um hier mehrere nützliche Informationen zu sammeln, leider ist es dabei geblieben :(. Auch weil dauernd neue Boards raus kommen die alle mal testen möchte.
      Wichtig finde ich die Funktion zum Beispiel für:

    2. Schlampig programmiert, einmal am Tag den Esp gezielt neustarten 😉
    3. Für OTA (Over the Air (Aktualisierung der Firmware), firmware aktualisieren und neustarten, bzw. nach dem neustart installieren.

      Gruß Stefan

      P.S. Habe den Beitrag diesbezüglich erweitert.

  4. Hallo Stefan, danke für Deinen sorgfältig gestalteten und informativen Blog.
    Als erstes einen kurzen Hinweis auf einen Tippfehler ;-).
    Überschrift „Sofware Tips“ soll bestimmt „Software Tipps“ bedeuten.
    Dann war ich enttäuscht, dass Du dich noch nicht mit einer besseren, als der Arduino IDE befast hast. Für mich, als lang jähriger (> 40 Jahre) Elektronik und Software Entwickler, ist diese IDE nur ein Graus.
    Versuche die Arduino Umgebung in professionellere Tools einzubinden waren bisher mit einigen Hürden verbunden und nicht wirklich erfolgreich.
    Hast Du sich schon einmal mit der neuen Eclipse 2019 befasst? Hier hat der Umgang mit mehren Projekten so seine Tücken.
    M.f.G. Manfred

    1. Hallo Manfred,

      danke für deinen Kommentar und den Tipp ;)(habe es geändert).
      Es stimmt die Arduino IDE ist wirklich nur was für einfache Anwendungen. Da ich aber immer nur sporadisch dazu kommen reicht das aktuell aus. Der Vorteil von ihr ist, sie funktioniert auch nach Updates. Ich habe Sloeber für Eclipse ausprobiert, das Plugin ist eigentlich genial, hat bei mir aber immer wieder zu Fehlern bei der Auflösung der Bibliotheken geführt. Eine Weile habe ich auch mit PlatformIO gearbeitet, diese IDE ist auch recht ordentlich, bis durch Updates nichts mehr funktionierte. Eclipse 2019 habe ich noch nicht probiert das wäre wahrscheinlich mal was für den nächsten Urlaub 🙂

      Gruß
      Stefan

Schreibe einen Kommentar

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