GUIDE / ESPFLASH

Eine praktische Anleitung zur Einrichtung von Over-The-Air-Firmware-Updates auf dem ESP32 und zum Senden neuer Builds vom Android-Handy mit ESPFlash.

ESP32 OTA-Updates mit ESPFlash einrichten

Sobald ein ESP32-Projekt das Prototypenstadium auf dem Steckbrett verlässt und in einem fest montierten Gehäuse, an einer Decke oder in einer industriellen Schaltanlage verbaut wird, ist das Anschließen eines USB-Kabels für Firmware-Aktualisierungen unpraktisch oder schlicht unmöglich. Hier kommen Over-The-Air-Updates (OTA) ins Spiel: Sie ermöglichen es, neue Firmware-Binärdateien drahtlos über ein lokales Wi-Fi-Netzwerk auf den Mikrocontroller zu übertragen.

Bislang bedeutete OTA im Außeneinsatz meist, einen schweren Laptop mitzubringen oder komplizierte Build-Server aufzusetzen. Mit ESPFlash für Android wird die Firmware-Verwaltung mobil. Neben dem bewährten kabelgebundenen Flashen per USB OTG erweitert das Entwicklerteam von ESPFlash die App um ein kommendes natives OTA-Update-Feature, mit dem Sie neue Binärdateien direkt vom Smartphone über das lokale WLAN auf Ihre ESP32-Geräte übertragen können.

In dieser Anleitung erfahren Sie, wie Sie das Partitionslayout Ihres ESP32 für zuverlässige OTA-Updates konfigurieren, den entsprechenden Aktualisierungsdienst im Code einrichten und wie der mobile Workflow mit ESPFlash funktioniert.


Die ESP32 OTA-Architektur verstehen

Um ein Over-The-Air-Update durchführen zu können, muss der Flash-Speicher des ESP32 in mindestens zwei separate Applikationspartitionen aufgeteilt sein. Der ESP32 nutzt einen sogenannten A/B-Umschaltmechanismus:

  1. Bootloader & Partitions-Tabelle: Befinden sich ganz am Anfang des Flash-Speichers und verwalten die Adressen der restlichen Partitionen.
  2. OTA Data Partition (otadata): Ein kleiner Speicherbereich (üblicherweise 8 KB), der speichert, welche Partition (ota_0 oder ota_1) beim nächsten Boot-Vorgang gestartet werden soll.
  3. Partition ota_0 (Slot A): Beherbergt die aktuell ausgeführte Firmware-Version.
  4. Partition ota_1 (Slot B): Dient als Ziel für die neu empfangene Firmware-Datei.

Läuft die Firmware aktuell in ota_0, wird das neue Image während des OTA-Vorgangs blockweise in ota_1 geschrieben und anschließend verifiziert. Erst wenn die Prüfsumme stimmt, aktualisiert das System die otadata-Partition und startet neu. Schlägt das Update fehl oder bricht die Wi-Fi-Verbindung ab, bleibt die intakte Firmware in ota_0 unberührt. Das System kann nicht "bricken".


Schritt 1: Das Partitionslayout für OTA anpassen

Die standardmäßige ESP32-Partitionierung reserviert meist den gesamten Flash für eine einzige Applikation (No OTA). Für OTA benötigen Sie mindestens ein Modul mit 4 MB (oder mehr) Flash-Speicher.

Wenn Sie mit der Arduino IDE arbeiten:

  • Wählen Sie unter Tools > Partition Scheme die Option "Minimal SPIFFS (1.9MB OTA with spiffs)" oder "Default 4MB with ffat/ota".

Wenn Sie mit ESP-IDF oder PlatformIO arbeiten, erstellen Sie eine Datei namens partitions.csv im Projektverzeichnis:

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x4000,
otadata,  data, ota,     0xd000,  0x2000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000, 0x100000,
ota_0,    app,  ota_0,   0x110000,0x170000,
ota_1,    app,  ota_1,   0x280000,0x170000,

Dieses Schema stellt sicher, dass zwei vollwertige Firmware-Partitionen mit jeweils etwa 1,4 MB Platz zur Verfügung stehen.


Schritt 2: OTA-Unterstützung im Firmware-Code implementieren

Damit Ihr ESP32 Aktualisierungsdaten über das Netzwerk empfangen kann, muss er einen OTA-Server-Handler ausführen.

Minimalbeispiel mit ArduinoOTA (Arduino-Framework)

Fügen Sie Ihrer Firmware folgenden Code hinzu:

#include <WiFi.h>
#include <ArduinoOTA.h>

const char* ssid = "MeinWLAN";
const char* password = "SicheresPasswort";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWi-Fi verbunden. IP-Adresse: ");
  Serial.println(WiFi.localIP());

  // OTA-Hostnamen und optionales Passwort vergeben
  ArduinoOTA.setHostname("esp32-sensor-node");
  ArduinoOTA.setPassword("admin123");

  ArduinoOTA.onStart([]() {
    Serial.println("OTA-Update startet...");
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nOTA-Update abgeschlossen. Neustart...");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Fortschritt: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("OTA-Fehler [%u]\n", error);
  });

  ArduinoOTA.begin();
}

void loop() {
  ArduinoOTA.handle(); // Muss regelmäßig aufgerufen werden!
  // Eigene Anwendungslogik...
}

Schritt 3: Erstinstallation der Firmware mit ESPFlash via USB OTG

Bevor ein ESP32 drahtlose Updates verarbeiten kann, muss die Basis-Firmware (inklusive Partitions-Tabelle und Bootloader) initial geflasht werden. Hierfür ist kein PC erforderlich:

  1. Schließen Sie Ihr Android-Smartphone über ein USB-OTG-Kabel an den USB-Port des ESP32 an.
  2. Öffnen Sie ESPFlash. Die App erkennt das Board automatisch.
  3. Wählen Sie Ihre kompilierte Firmware-Binärdatei (.bin) aus dem lokalen Dateispeicher oder einem Cloud-Speicherordner (z. B. Google Drive) auf Ihrem Mobiltelefon.
  4. Setzen Sie die Startadresse (typischerweise 0x0 für eine zusammengefasste Binary oder 0x10000 für die reine Applikation) und starten Sie den Schreibvorgang.

Nach dem erfolgreichen Flashen startet der ESP32 neu und meldet sich im WLAN an. Mit SerialFlow Terminal können Sie den ersten Start überprüfen und sicherstellen, dass die zugewiesene IP-Adresse im Terminal-Protokoll korrekt ausgegeben wird.


Schritt 4: Drahtlose Updates mit dem kommenden ESPFlash OTA-Feature

Nachdem das Board im Feld platziert wurde, übernimmt das kommende OTA-Update-Feature in ESPFlash künftige Firmware-Aktualisierungen vollständig drahtlos:

  1. Firmware auf dem Smartphone bereitstellen: Kompilieren Sie Ihren neuen Code und exportieren Sie die erzeugte Binärdatei (z. B. firmware_v2.bin) auf Ihr Android-Gerät.
  2. Gerät im Netzwerk lokalisieren: Stellen Sie sicher, dass Ihr Android-Gerät mit demselben Wi-Fi-Netzwerk verbunden ist wie der ESP32. ESPFlash scannt das Subnetz via mDNS nach verfügbaren OTA-fähigen ESP32-Knoten (oder Sie geben die IP-Adresse manuell ein).
  3. Firmware übertragen: Wählen Sie die neue .bin-Datei in ESPFlash aus, geben Sie das konfigurierte Sicherheits-Passwort ein und starten Sie den Übertragungsvorgang.
  4. Verifizierung und Neustart: Die App zeigt den Übertragungsfortschritt in Echtzeit an. Nach Abschluss prüft der ESP32 die Hash-Werte und führt einen sauberen Warmstart in die neue Partition durch.

Typische Probleme bei OTA-Updates und deren Behebung

  • Fehler: "Not Enough Space" oder Partition zu klein: Die kompilierte Binärdatei darf die Größe der Ziel-Applikationspartition nicht überschreiten. Reduzieren Sie die Dateigröße, indem Sie ungenutzte Bibliotheken entfernen, oder passen Sie die partitions.csv an, um den App-Partitionen mehr Speicher zuzuweisen.
  • Verbindungsabbruch während des Flash-Vorgangs: WLAN-Schwankungen oder schwache Netzteile können zum Scheitern der Übertragung führen. ESP32-Chips ziehen beim gleichzeitigen Senden von Wi-Fi-Paketen und Schreiben in den Flash-Speicher Stromspitzen von bis zu 400–500 mA. Stellen Sie eine stabile 3,3V/5V-Spannungsversorgung sicher.
  • Boot-Loop nach dem Update: Enthält die neue Firmware einen fatalen Bug, der sofort nach dem Booten zum Absturz führt, löst der Watchdog einen Neustart aus. Wenn Sie die ESP-IDF-Rollback-Funktion (esp_ota_mark_app_valid_cancel_rollback()) nutzen, wechselt das System automatisch wieder zur vorherigen, funktionierenden Partition zurück.
  • Wiederherstellung bei Fehlschlägen: Sollte ein Update durch fehlerhafte Partitions-Tabellen doch einmal scheitern, können Sie das Board jederzeit mit einem USB-OTG-Kabel und ESPFlash retten und eine saubere Firmware per Kabel aufspielen.

Zusammenfassung

Over-The-Air-Updates befreien Sie von der Notwendigkeit physischer Kabelverbindungen bei installierten IoT-Knoten. In Kombination mit ESPFlash – das das kabelgebundene Erst-Flashen per USB OTG meistert und bald native WLAN-OTA-Updates direkt vom Smartphone bereitstellt – und SerialFlow Terminal zur Diagnose verfügen Sie über eine vollständige, mobile Entwicklungs- und Wartungsumgebung in der Hosentasche.