====== LED parpadeando ====== OTA con LED parpadeando en el pin 13 #include #include #include // Config WiFi const char* ssid = "XXXXXXXX"; const char* password = "XXXXXXXX"; #define RELAY_PIN 13 // usa cualquier pin digital disponible // IP fija (opcional) IPAddress ip(192, 168, 1, 112); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); IPAddress dns(8, 8, 8, 8); WebServer server(80); // HTML para la página OTA const char* otaForm = R"rawliteral( ESP32 OTA Update

ESP32 OTA Firmware Update

)rawliteral"; void handleRoot() { server.send(200, "text/html", "

ESP32 OTA disponible en /update

"); } void handleUpdateForm() { server.sendHeader("Connection", "close"); server.send(200, "text/html", otaForm); } void handleUpdateUpload() { HTTPUpload& upload = server.upload(); if (upload.status == UPLOAD_FILE_START) { Serial.printf("\nIniciando actualización: %s\n", upload.filename.c_str()); if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { Update.printError(Serial); } } else if (upload.status == UPLOAD_FILE_WRITE) { if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { Update.printError(Serial); } Serial.print("."); } else if (upload.status == UPLOAD_FILE_END) { if (Update.end(true)) { Serial.printf("\nActualización completa: %u bytes\n", upload.totalSize); } else { Update.printError(Serial); } } yield(); } void handleUpdateFinished() { if (Update.hasError()) { server.send(200, "text/html", "

❌ Fallo en la actualización

Revisa la consola serie para más detalles.

"); } else { server.send(200, "text/html", "

✅ Actualización exitosa

Reiniciando en 5 segundos...

"); server.client().stop(); // cerrar conexión limpiamente delay(5000); ESP.restart(); } } void setup() { pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); // asegúrate de que esté apagado al inicio Serial.begin(115200); delay(1000); // WiFi WiFi.config(ip, gateway, subnet, dns); WiFi.begin(ssid, password); Serial.print("Conectando a WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi conectado. IP: "); Serial.println(WiFi.localIP()); // Rutas web server.on("/", handleRoot); server.on("/update", HTTP_GET, handleUpdateForm); server.on("/update", HTTP_POST, handleUpdateFinished, handleUpdateUpload); server.begin(); Serial.println("Servidor web OTA iniciado"); } void loop() { server.handleClient(); Serial.println("Encendiendo Led"); digitalWrite(RELAY_PIN, HIGH); // activa el relé delay(5000); // bomba encendida 5 segundos Serial.println("Apagando Led"); digitalWrite(RELAY_PIN, LOW); // desactiva el relé delay(5000); // bomba apagada 5 segundos }
====== Encender LED desde página WEB ====== #include #include #include // =================== HTMLS =================== const char* mainPage = R"rawliteral( Control ESP32

Control ESP32

Control del LED

Estado actual: %LED_STATE%

Actualización OTA

)rawliteral"; const char* successPage = R"rawliteral( Actualización exitosa

✅ Actualización exitosa

El ESP32 se reiniciará automáticamente en unos segundos...

)rawliteral"; // Configuración WiFi const char* ssid = "XXXXXX"; const char* password = "XXXXXXXX"; // IP estática (opcional) IPAddress ip(192, 168, 1, 112); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); IPAddress dns(8, 8, 8, 8); #define RELAY_PIN 13 WebServer server(80); bool ledState = false; bool autoBlink = true; unsigned long previousMillis = 0; const unsigned long interval = 500; void setup() { Serial.begin(115200); pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); WiFi.config(ip, gateway, subnet, dns); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(100); Serial.print("Conectado: "); Serial.println(WiFi.localIP()); server.on("/", []() { String html = mainPage; html.replace("%LED_STATE%", ledState ? "ENCENDIDO" : "APAGADO"); html.replace("%LED_STATUS%", ledState ? "on" : "off"); html.replace("%BTN_TEXT%", ledState ? "Apagar" : "Encender"); html.replace("%BTN_ON_CLASS%", ledState ? "btn-off" : "btn-on"); html.replace("%AUTO_TEXT%", autoBlink ? "Auto: ON" : "Auto: OFF"); server.send(200, "text/html; charset=utf-8", html); }); server.on("/toggle", []() { ledState = !ledState; autoBlink = false; digitalWrite(RELAY_PIN, ledState); server.send(200, "text/plain", "OK"); }); server.on("/auto", []() { autoBlink = !autoBlink; server.send(200, "text/plain", "OK"); }); server.on("/update", HTTP_POST, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html; charset=utf-8", successPage); delay(2000); ESP.restart(); }, []() { HTTPUpload& upload = server.upload(); if (upload.status == UPLOAD_FILE_START) { Serial.printf("OTA iniciada: %s\n", upload.filename.c_str()); if (!Update.begin(UPDATE_SIZE_UNKNOWN)) Update.printError(Serial); } else if (upload.status == UPLOAD_FILE_WRITE) { if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) Update.printError(Serial); } else if (upload.status == UPLOAD_FILE_END) { if (Update.end(true)) Serial.println("OTA finalizada correctamente"); else Update.printError(Serial); } }); server.begin(); } void loop() { server.handleClient(); if (autoBlink) { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; ledState = !ledState; digitalWrite(RELAY_PIN, ledState); } } }