#pragma once #include #include #include bool pendienteActualizarURL = false; // URL por defecto para actualización remota vía servidor const char* firmwareUrl = "https://alumnos2026.unicarlos.es/mario_alcantud_bleda/MER/OTA/firmware/firmware.bin"; void setupOTA() { // Asegurar que el LED de pin GPIO 2 se inicializa encendido pinMode(2, OUTPUT); digitalWrite(2, HIGH); } void checkForUpdates() { Serial.println("Verificando actualizaciones desde servidor URL..."); mostrarOled("OTA Remoto", "Descargando...", "firmware.bin", "Espere..."); // Encender LED en pin GPIO 2 para que quede encendido durante y después de la actualización remota pinMode(2, OUTPUT); digitalWrite(2, HIGH); WiFiClientSecure client; client.setInsecure(); // No verificar certificado SSL HTTPClient httpOTA; if (httpOTA.begin(client, firmwareUrl)) { int httpCode = httpOTA.GET(); if (httpCode == HTTP_CODE_OK) { int contentLength = httpOTA.getSize(); Serial.printf("Tamaño del firmware: %d bytes\n", contentLength); if (Update.begin(contentLength > 0 ? contentLength : UPDATE_SIZE_UNKNOWN)) { Serial.println("Escribiendo firmware en flash..."); WiFiClient* stream = httpOTA.getStreamPtr(); size_t written = Update.writeStream(*stream); Serial.printf("Bytes escritos: %d\n", written); if (Update.end()) { if (Update.isFinished()) { Serial.println("Actualización OTA exitosa. Reiniciando..."); digitalWrite(2, HIGH); // Mantener LED GPIO 2 encendido mostrarOled("OTA OK", "Actualizado!", "Reiniciando...", ""); delay(1000); ESP.restart(); } else { Serial.println("Error: Actualización no terminada."); mostrarOled("Error OTA", "No terminado", "", ""); } } else { Serial.printf("Error al finalizar Update: %u\n", Update.getError()); mostrarOled("Error OTA", "Fallo al finalizar", "", ""); } } else { Serial.println("No hay suficiente espacio para OTA."); mostrarOled("Error OTA", "Espacio insuficiente", "", ""); } } else { Serial.printf("Error al descargar firmware. Código HTTP: %d\n", httpCode); mostrarOled("Error HTTP", String(httpCode), "", ""); } httpOTA.end(); } } void loopOTA() { if (pendienteActualizarURL) { pendienteActualizarURL = false; checkForUpdates(); } }