Arduino OTA – Sketch Upload per WLAN ohne Kabel

Stell dir vor, du könntest deinen Mikrocontroller ganz einfach über WLAN programmieren, ohne jedes Mal ein Kabel anschließen zu müssen. Mit Over-the-Air (OTA) Updates ist genau das möglich.

In diesem Beitrag zeige ich dir, wie du Arduino-Sketches bequem per WLAN auf deinen Mikrocontroller hochladen kannst. So sparst du nicht nur Zeit, sondern auch den Aufwand, dein Gerät physisch zu verbinden. Besonders praktisch für schwer erreichbare Geräte oder solche in abgeschlossenen Gehäusen. Die Schritte sind einfach und erfordern nur wenige Anpassungen an deinem Sketch.

Die Installation über die OTA-Schnittstelle in der Arduino-IDE setzt WiFi-fähige Boards, ausreichend Flash-Speicher und die Integration der benötigten OTA-Bibliothek voraus.
Alles was benötigt wird, steckt in der „Arduino-OTA“ Bibliothek (over the air) das einen bequemen WLAN-Upload über Funk ermöglichen.



Vorbereitung:

Bibliothek installieren:
Gehen dazu in der Arduino-IDE 2.x zu Menüpunkt
„Sketch“ / „Bibliotheken einbinden“ / „Bibliotheken verwalten…“
In dem sich öffnenden Fenster kann nun nach den benötigten Bibliothek „ArduinoOTA“ gesucht werden.
Diese nun installieren.

Richte danach unter Entwicklungsboard das zu verwendende Board deiner Wahl ein. In diesem Beispiel wurde ein ESP32 verwendet.
Schließe es per USB Kabel an deinem PC mit der Arduino-IDE an und wähle den korrekten Com-Port.

Flash Speichergröße:
Für Arduino-Boards mit OTA-Funktionalität ist ausreichend Flash-Speicher entscheidend, um Platz für das OTA-Update und den bestehenden Sketch zu bieten.

  1. Mindestens 1 MB Flash: Für einfache Projekte und kleinere Sketche reicht oft 1 MB Flash aus. Das ist ausreichend für grundlegende OTA-Updates, bei denen der neue Sketch vollständig in den Speicher passt.
  2. 2 MB Flash oder mehr: Empfohlen für komplexere Projekte oder wenn der Sketch umfangreicher wird (beispielsweise bei Projekten mit mehreren Bibliotheken oder komplexen Funktionen). 2 MB oder mehr bieten genügend Platz, um OTA-Updates reibungslos zu ermöglichen und auch größere Sketche problemlos unterzubringen.

Die ESP32-Boards beispielsweise bieten oft 4 MB Flash, was eine gute Flexibilität für OTA-Updates bietet.

Partition Scheme (Partitionierungsschema):
Das Standard-Partitionierungsschema ist in der Regel „Default“, das einen kleinen Bereich für den Bootloader, den Hauptanwendungsspeicher und einen separaten Bereich für OTA-Updates reserviert.
Es ist oft ausreichend für einfache Anwendungen und OTA-Updates.


OTA-kompatible Entwicklungsboards (Auswahl)

BoardFlash-GrößeBesonderheiten
ESP32 (DevKit, WROOM, S2, C3)4 MB – 16 MBIdeal für OTA, viele Varianten mit WiFi & viel Speicher (DevKit im Test verwendet)
ESP8266 (NodeMCU, WeMos D1 Mini)1 MB – 4 MBOTA möglich, aber begrenzter Speicher – nur einfacher Sketch
Arduino Nano ESP3216 MBIdeal für umfangreiche OTA-Projekte und Dateisysteme
Arduino MKR WiFi 10102 MBUnterstützt OTA via Arduino Cloud – eigene Methode nötig
ESP32-CAM4 MBOTA möglich, aber wegen Kamera manchmal instabil – spezielle Speicherbelegung beachten
u-blox NINA-W10≥ 2 MBKompatibel mit Arduino-OTA, z. B. auf Arduino Nano 33 IoT
Adafruit HUZZAH ESP32 Feather≥ 2 MBOTA unterstützt, auch bei batteriebetriebenen Projekten
SparkFun Thing Plus – ESP32-S3≥ 4 MBGute Dokumentation & OTA möglich

Nicht geeignet für OTA:

BoardTypFlash-GrößeEinschränkungen
Arduino UNO R3ATmega328P32 KBKein WiFi, viel zu wenig Speicher
Arduino Nano (classic)ATmega328P32 KBKeine OTA-Möglichkeit, kein WiFi
Arduino Pro MiniATmega328P32 KBKein WiFi, kein OTA möglich
ESP-01 (ESP8266)ESP8266512 KBOTA nur mit modifiziertem Sketch & Tricks
Digispark ATtiny85ATtiny858 KB – 32 KBKein WLAN, kein OTA möglich
Seeeduino LotusATmega328P32 KBKein WLAN-Modul onboard
LilyPad ArduinoATmega328P32 KBFür Wearables – OTA nicht vorgesehen

Sketch:

Wähle nun unter Beispiele/ArduinoOTA, das dort zu findende BasicOTA Beispiel-Sketch aus.

Funktion von OTA:
Nach der Installation findet man wie immer Beispiele für die installierte Bibliothek.
Bei näherer Betrachtung kann man jeden bereits erstellten Sketch wie folgt mit OTA erweitern.
Es erfordert lediglich, wenn nicht schon geschehen, das includen dieser 4 Bibliotheken, ArduinoOTA.begin in der Setup und ArduinoOTA.handle in der Loop.
Ob ihr jetzt den Hostnamen betitelt, die Portadresse anpasst oder ein Passwort verwendet ist erstmal optional:

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

const char* ssid = "Ihr_WLAN_SSID";
const char* password = "Ihr_WLAN_Passwort";

void setup() {
  // Verbindung zum WLAN herstellen
  WiFi.begin(ssid, password);
  
  // Initialisiere OTA

  // Setze den Hostnamen für OTA bei mehreren OTA-Geräten - Beispiel: myesp32
     ArduinoOTA.setHostname(OTAHostname);

  // Setzen Sie das Passwort für OTA-Updates (optional)
     ArduinoOTA.setPassword("geheimesPasswort");

  // Ggf. Portadresse für Firewall aktivieren und anpassen
  // ArduinoOTA.setPort(3232);

     ArduinoOTA.begin();

  // Dein bestehender Setup-Code...
}

void loop() {
  // Dein bestehender Setup-Code...

  // Fügen Sie diese Zeile hinzu, um OTA-Updates zu ermöglichen
  ArduinoOTA.handle();
}

Sketch Beispiel, der Upgedatet werden soll:
Um es übersichtlich zu machen verwende ich hier als Beispiel nur den Blink – Sketch
(ESP32 mit LED an Pin 19):

#define LED_PIN 19

void setup() {
  pinMode(LED_PIN, OUTPUT); // Setzt den LED-Pin als Ausgang
}

void loop() {
  digitalWrite(LED_PIN, HIGH); // Schaltet die LED ein
  delay(1000); // Wartet für eine Sekunde
  digitalWrite(LED_PIN, LOW); // Schaltet die LED aus
  delay(1000); // Wartet für eine Sekunde
}

Kombiniert man nun diese beiden Sketche sieht das Ergebnis so aus:

Somit sind die Vorbereitungen abgeschlossen. Gerät kann nun getestet werden.


Test: Ein späteres Update nun per WLAN:

Voraussetzung:
– Das Gerät mit der Arduino-IDE muss sich im gleichen WLAN befinden, wie das ESP32 Board
– Lokale Firewalls prüfen ob ggf. diese die Verbindung blockieren. Standardport wäre 3232

Wird nun etwas am Sketch verändert, kann es wie folgt kabellos per Funk übertragen werden:
Der Port des Entwicklungsboard ist nun keine Com-Schnittstelle mehr, sondern ein im Netzwerk zu findender Anschluss.
Das Board nun unter dem Namen, wie im Sketch unter ArduinoOTA.setHostname(„myesp32“) gesetzt suchen und ausgewählen.

Sollte ein Passwort gesetzt worden sein, dann wird vorab geprüft:

Finaler Test:

Im abschließenden Test habe ich die Blinkfrequenz im Delay verändert um zu sehen ob das update funktioniert.
Bei mir hat es ohne Probleme die neue Sketch Version übertragen und automatisch mit dieser gestartet. Inzwischen gibt es immer mehr Entwicklungsboards mit Wifi. Ich könnte mir vorstellen das es auch bei den ein oder anderen funktionieren könnte. Probiert das doch mal aus.

Fazit:
In IoT-Anwendungen bieten OTA-Updates klare Vorteile. Sie ermöglichen die Fernaktualisierung von Firmware, bieten Fehlerbehebung und Funktionserweiterungen, sparen Zeit, minimieren Ausfallzeiten und verbessern die Skalierbarkeit und die Langlebigkeit von IoT-Geräten.


Sicherheitsaspekte bei OTA-Updates
OTA (Over-the-Air) klingt bequem – und das ist es auch! Bedenkt aber auch sobald Firmware drahtlos übertragen wird, öffnet sich eine potenzielle Angriffsfläche. Hier sind die wichtigsten Punkte, die du kennen solltest, um dein Mikrocontroller-Projekt abzusichern:


1. Passwortschutz aktivieren

  • Die Basis-Sicherheit bei ArduinoOTA ist das Setzen eines Passworts via ArduinoOTA.setPassword()
  • Noch besser: Verwende die MD5-Hash-Variante mit ArduinoOTA.setPasswordHash(), damit das Passwort nicht im Klartext im Code steht
  • Beispiel: ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3"); // MD5 für Passwort "admin"

Erstellung MD5-Hash-Variante unter Linux oder macOS:

echo -n „admin“ | md5sum

Erstellung MD5-Hash-Variante unter Windows 11 CMD:

Erstelle Textdatei mit Inhalt admin und speichere z.B. unter C:\1\ mit Name md5.txt ab.

Eingabe CMD: certutil -hashfile C:\1\md5.txt MD5

Ausgabe CMD:
C:\Users\prilchen>certutil -hashfile C:\1\md5.txt MD5
MD5-Hash von C:\1\md5.txt:
21232f297a57a5a743894a0e4a801fc3
CertUtil: -hashfile-Befehl wurde erfolgreich ausgeführt.

Erstellung MD5-Hash-Variante unter Windows 11 Powershell:

Erstelle Textdatei mit Inhalt admin und speichere z.B. unter C:\1\ mit Name md5.txt ab.

Eingabe Powershell: Get-FileHash -Path „C:\1\md5.txt“ -Algorithm MD5

Ausgabe Powershell:
Algorithm Hash Path
——— —- —-
MD5 21232f297a57a5a743894a0e4a801fc3 C:\1\md5.txt

Klartext-Passwörter sind leicht auslesbar, insbesondere bei lokalem Zugriff auf den Sketch. Deshalb ist Hashing die sicherere Variante.


2. OTA nur in vertrauenswürdigen Netzwerken

  • OTA funktioniert über das lokale WLAN. Falls du dein Mikrocontroller-Gerät in einem offenen oder öffentlichen Netzwerk betreibst, besteht das Risiko, dass Fremde OTA-Zugriff erhalten.
  • Besser: Nutze ein abgesichertes Heimnetz mit WPA2 oder greife auf ein separates IoT-VLAN zurück.

3. Firewall & Netzwerk-Scanning

  • Firewall auf deinem PC kann die Verbindung blockieren – erlaube den Port 3232
  • Prüfe regelmäßig, ob unbekannte Geräte OTA-Ports im Netz scannen
  • Tools wie Wireshark oder Fing helfen beim Monitoring

4. OTA deaktivieren bei Produktivbetrieb

  • Wenn das Gerät produktiv läuft (z. B. Smart Home, Industrieanlage), empfiehlt es sich, OTA im Sketch ganz zu deaktivieren oder nur bei Bedarf zu aktivieren
  • Beispiel: if (debugMode) { ArduinoOTA.begin(); }

5. Erweiterte Sicherheit (fortgeschritten)

  • HTTPS oder VPN: ArduinoOTA unterstützt dies nicht nativ, aber du kannst OTA-Funktion durch eigene Implementierung über HTTPS oder einen VPN-Tunnel übertragen – z. B. per MQTT, WebUpdater oder verschlüsseltem Webserver
  • Firmware-Signaturen: Fortgeschrittene Nutzer können ihre Firmware vor OTA signieren, um Integrität und Herkunft zu prüfen

Zusätzlicher Tipp
Wenn du mehrere ESP32-Geräte mit OTA verwendest, vergib eindeutige Hostnamen (ArduinoOTA.setHostname()), sonst kann es zu Überschneidungen im Netzwerk kommen – und das ist ein Albtraum beim Debuggen.


Der Vollständigkeit halber hier auch die erweiterte Sketch Version mit weiteren Optionen und für Analyseausgabe im Seriellen Monitor:

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

const char* ssid = "Accesspoint  Name";
const char* password = "geheim123";

#define LED_PIN 19

void setup() {
  pinMode(LED_PIN, OUTPUT); // Setzt den LED-Pin als Ausgang
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // Port defaults to 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
 ArduinoOTA.setHostname("myesp32");

  // No authentication by default
 ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH)
        type = "sketch";
      else // U_SPIFFS
        type = "filesystem";

      // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
      else if (error == OTA_END_ERROR) Serial.println("End Failed");
    });

  ArduinoOTA.begin();

  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
  digitalWrite(LED_PIN, HIGH); // Schaltet die LED ein
  delay(1000); // Wartet für eine Sekunde
  digitalWrite(LED_PIN, LOW); // Schaltet die LED aus
  delay(1000); // Wartet für eine Sekunde
}

Hinweis: Das Beitragsbild wurde mit Microsoft Copilot erstellt.

, , , , ,
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzerkomfort bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst und hilft uns zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.