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.
- 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 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)
Board | Flash-Größe | Besonderheiten |
---|---|---|
ESP32 (DevKit, WROOM, S2, C3) | 4 MB – 16 MB | Ideal für OTA, viele Varianten mit WiFi & viel Speicher (DevKit im Test verwendet) |
ESP8266 (NodeMCU, WeMos D1 Mini) | 1 MB – 4 MB | OTA möglich, aber begrenzter Speicher – nur einfacher Sketch |
Arduino Nano ESP32 | 16 MB | Ideal für umfangreiche OTA-Projekte und Dateisysteme |
Arduino MKR WiFi 1010 | 2 MB | Unterstützt OTA via Arduino Cloud – eigene Methode nötig |
ESP32-CAM | 4 MB | OTA möglich, aber wegen Kamera manchmal instabil – spezielle Speicherbelegung beachten |
u-blox NINA-W10 | ≥ 2 MB | Kompatibel mit Arduino-OTA, z. B. auf Arduino Nano 33 IoT |
Adafruit HUZZAH ESP32 Feather | ≥ 2 MB | OTA unterstützt, auch bei batteriebetriebenen Projekten |
SparkFun Thing Plus – ESP32-S3 | ≥ 4 MB | Gute Dokumentation & OTA möglich |
Nicht geeignet für OTA:
Board | Typ | Flash-Größe | Einschränkungen |
---|---|---|---|
Arduino UNO R3 | ATmega328P | 32 KB | Kein WiFi, viel zu wenig Speicher |
Arduino Nano (classic) | ATmega328P | 32 KB | Keine OTA-Möglichkeit, kein WiFi |
Arduino Pro Mini | ATmega328P | 32 KB | Kein WiFi, kein OTA möglich |
ESP-01 (ESP8266) | ESP8266 | 512 KB | OTA nur mit modifiziertem Sketch & Tricks |
Digispark ATtiny85 | ATtiny85 | 8 KB – 32 KB | Kein WLAN, kein OTA möglich |
Seeeduino Lotus | ATmega328P | 32 KB | Kein WLAN-Modul onboard |
LilyPad Arduino | ATmega328P | 32 KB | Fü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.