informatica:arduino:esp32:ejemplos
This is an old revision of the document!
LED parpadeando
OTA con LED parpadeando en el pin 13
#include <WiFi.h> #include <WebServer.h> #include <Update.h> // 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( <!DOCTYPE html> <html> <head> <title>ESP32 OTA Update</title> <meta charset="utf-8"> <style> body { font-family: sans-serif; background-color: #f4f4f4; padding: 30px; } form { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px #ccc; } input[type="submit"] { padding: 10px 20px; } </style> </head> <body> <h2>ESP32 OTA Firmware Update</h2> <form method="POST" action="/update" enctype="multipart/form-data"> <input type="file" name="update"> <input type="submit" value="Subir firmware"> </form> </body> </html> )rawliteral"; void handleRoot() { server.send(200, "text/html", "<h1>ESP32 OTA disponible en <a href='/update'>/update</a></h1>"); } 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", "<h1>❌ Fallo en la actualización</h1><p>Revisa la consola serie para más detalles.</p>"); } else { server.send(200, "text/html", "<h1>✅ Actualización exitosa</h1><p>Reiniciando en 5 segundos...</p>"); 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 <WiFi.h> #include <WebServer.h> #include <Update.h> // Config WiFi const char* ssid = "pitufina"; const char* password = "reyvisigodo"; #define RELAY_PIN 13 // Pin del LED/Relé // Variables de estado bool ledState = false; bool autoBlink = true; // Estado del parpadeo automático // 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 principal con control del LED const char* mainPage = R"rawliteral( <!DOCTYPE html> <html> <head> <title>Control ESP32</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> body { font-family: sans-serif; background-color: #f4f4f4; padding: 30px; max-width: 600px; margin: 0 auto; } .card { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px #ccc; margin-bottom: 20px; } .btn { padding: 10px 20px; border: none; border-radius: 4px; color: white; font-size: 16px; cursor: pointer; transition: background-color 0.3s; } .btn-on { background-color: #4CAF50; } .btn-on:hover { background-color: #45a049; } .btn-off { background-color: #f44336; } .btn-off:hover { background-color: #d32f2f; } .btn-auto { background-color: #2196F3; } .btn-auto:hover { background-color: #0b7dda; } .status { padding: 10px; margin: 10px 0; border-radius: 4px; text-align: center; } .on { background-color: #dff0d8; color: #3c763d; } .off { background-color: #f2dede; color: #a94442; } h2 { color: #333; } a { color: #2196F3; text-decoration: none; } a:hover { text-decoration: underline; } </style> <script> function toggleLED() { var xhr = new XMLHttpRequest(); xhr.open("GET", "/toggle", true); xhr.send(); setTimeout(function(){ location.reload(); }, 300); } function toggleAuto() { var xhr = new XMLHttpRequest(); xhr.open("GET", "/auto", true); xhr.send(); setTimeout(function(){ location.reload(); }, 300); } </script> </head> <body> <h1>Control ESP32</h1> <div class="card"> <h2>Control del LED</h2> <div class="status %LED_STATUS%">Estado actual: %LED_STATE%</div> <button class="btn %BTN_ON_CLASS%" onclick="toggleLED()">%BTN_TEXT%</button> <button class="btn btn-auto" onclick="toggleAuto()">%AUTO_TEXT%</button> </div> <div class="card"> <h2>Actualización OTA</h2> <p>Para actualizar el firmware, visita <a href="/update">la página de actualización</a></p> </div> </body> </html> )rawliteral"; // HTML para la página OTA const char* otaForm = R"rawliteral( <!DOCTYPE html> <html> <head> <title>ESP32 OTA Update</title> <meta charset="utf-8"> <style> body { font-family: sans-serif; background-color: #f4f4f4; padding: 30px; } form { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px #ccc; } input[type="submit"] { padding: 10px 20px; } </style> </head> <body> <h2>ESP32 OTA Firmware Update</h2> <form method="POST" action="/update" enctype="multipart/form-data"> <input type="file" name="update"> <input type="submit" value="Subir firmware"> </form> <p><a href="/">Volver al control principal</a></p> </body> </html> )rawliteral"; String getMainPage() { String page = mainPage; // Reemplazar placeholders según el estado actual page.replace("%LED_STATUS%", ledState ? "on" : "off"); page.replace("%LED_STATE%", ledState ? "ENCENDIDO" : "APAGADO"); page.replace("%BTN_TEXT%", ledState ? "Apagar LED" : "Encender LED"); page.replace("%BTN_ON_CLASS%", ledState ? "btn-off" : "btn-on"); page.replace("%AUTO_TEXT%", autoBlink ? "Desactivar parpadeo automático" : "Activar parpadeo automático"); return page; } void handleRoot() { server.send(200, "text/html", getMainPage()); } void handleToggle() { ledState = !ledState; digitalWrite(RELAY_PIN, ledState ? HIGH : LOW); autoBlink = false; // Al control manual, desactivamos el parpadeo automático server.send(200, "text/plain", "OK"); } void handleAuto() { autoBlink = !autoBlink; server.send(200, "text/plain", "OK"); } 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", "<h1>❌ Fallo en la actualización</h1><p>Revisa la consola serie para más detalles.</p><p><a href='/'>Volver al control principal</a></p>"); } else { server.send(200, "text/html", "<h1>✅ Actualización exitosa</h1><p>Reiniciando en 5 segundos...</p>"); 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("/toggle", handleToggle); server.on("/auto", handleAuto); server.on("/update", HTTP_GET, handleUpdateForm); server.on("/update", HTTP_POST, handleUpdateFinished, handleUpdateUpload); server.begin(); Serial.println("Servidor web iniciado"); } void loop() { server.handleClient(); if (autoBlink) { // Solo parpadea si está en modo automático Serial.println("Encendiendo Led (automático)"); digitalWrite(RELAY_PIN, HIGH); ledState = true; delay(5000); Serial.println("Apagando Led (automático)"); digitalWrite(RELAY_PIN, LOW); ledState = false; delay(5000); } else { // Pequeña pausa para no saturar el procesador delay(100); } }
informatica/arduino/esp32/ejemplos.1746214849.txt.gz · Last modified: 2025/05/02 19:40 by jose