#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);
}
}
}