🛠 Programmation OTA : téléverser le code par Wi-Fi
Objetivos
Actualizar el programa del ESP8266-ESP-12E sin volver a conectar ningún cable: el núcleo de Arduino incorpora el protocolo OTA (ArduinoOTA). Tras una primera carga obligatoria por cable serie, el módulo aparece en el puerto «red» de Arduino IDE y acepta actualizaciones por Wi-Fi. Comprender la distribución de la memoria flash de 4 MB es la clave del tema: con el esquema de particiones OTA, la flash contiene dos ubicaciones de programa (sketch A y sketch B) más el sistema de archivos; por lo tanto, un sketch OTA no puede superar la mitad útil de la flash. Se debe elegir el preset de flash correcto en Arduino IDE para evitar bucles de reinicio (boot loops).
Material
- 1 módulo ESP8266-ESP-12E (flash de 4 MB, placa «NodeMCU 1.0 (ESP-12E Module)»)
- 1 cable USB-serie para la primera carga (GPIO0 a masa durante el reset = modo flash)
- Red Wi-Fi de 2,4 GHz; el ordenador y el módulo en la misma subred (mDNS/broadcast)
- Arduino IDE con el núcleo esp8266 instalado
Código completo
#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
const char* SSID = "mon-reseau";
const char* PASS = "mot-de-passe";
void setup {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASS);
while (WiFi.status != WL_CONNECTED) { delay(250); Serial.print("."); }
Serial.printf("\nIP = %s\n", WiFi.localIP.toString.c_str);
ArduinoOTA.setHostname("esp12e-01");
ArduinoOTA.setPassword("secret-ota"); // optionnel mais recommandé
ArduinoOTA.onStart([] {
Serial.printf("OTA debut : %s\n", ArduinoOTA.getCommand == U_FLASH ? "sketch" : "fs");
});
ArduinoOTA.onEnd([] { Serial.println("\nOTA termine, redemarrage"); });
ArduinoOTA.onProgress([](unsigned int prog, unsigned int total) {
static unsigned int dernier = 0;
if (prog * 100 / total / 10 != dernier) {
dernier = prog * 100 / total / 10;
Serial.printf("%u%% ", dernier * 10);
}
});
ArduinoOTA.onError([](ota_error_t e) { Serial.printf("Erreur OTA %u\n", e); ESP.restart; });
ArduinoOTA.begin;
}
void loop {
ArduinoOTA.handle; // doit etre appele souvent : pas de blocage ici
// ... application ...
yield;
}
Verificación esperada
Tras la primera carga por cable, la consola muestra la IP del módulo. En Arduino IDE, aparece un nuevo puerto «esp12e-01 @ 192.168.1.x» (puede tardar unos segundos o requerir reiniciar el IDE). Selecciónalo, modifica el código (por ejemplo, cambiar un mensaje) y carga: el progreso se muestra en la consola serie, el módulo se reinicia y el nuevo programa se ejecuta, sin cable. En el menú, el tamaño de carga «OTA» ha reemplazado a «Serial».
Errores frecuentes
- Preset de flash incorrecto: con «Flash Size 512 KB» en un ESP-12E de 4 MB, o al revés en una verdadera de 512 KB, el bootloader no encuentra el sketch → bucle de reinicio. Elige «NodeMCU 1.0 (ESP-12E Module)»: flash de 4 MB, modo DIO.
- Intentar un sketch de más de ~1,5 MB en OTA: el esquema de particiones estándar reserva dos slots de sketch; por encima de ese límite, la carga falla (error de tamaño).
- El puerto de red no aparece: cortafuegos que bloquea el multicast/broadcast, o PC y módulo en VLANs diferentes; el puerto «esp8266-ota» del equipo remoto también es una opción.
- Olvidar ArduinoOTA.handle en loop o bloquear 30 s en el código: la actualización falla por timeout.
- Definir una contraseña OTA pero no introducirla en el IDE (menú Ports → se solicita contraseña): la carga se rechaza silenciosamente.
- La primera carga NO puede ser OTA: es el cable serie el que instala el receptor, con GPIO0 conectado a masa durante el reset.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht11.inoArduinoluxmetre.inoArduinoserveur-web.inoArduino