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: by jose
