diff --git a/ESP8266/ESP8266.ino b/ESP8266/ESP8266.ino index d95005b..8c1c497 100644 --- a/ESP8266/ESP8266.ino +++ b/ESP8266/ESP8266.ino @@ -7,7 +7,7 @@ // ================================================================ // OTA CONFIG // ================================================================ -#define FW_VERSION 8 +#define FW_VERSION 9 #define GITEA_HOST "https://git.nacho.myds.me" #define GITEA_OWNER "Natxo" #define GITEA_REPO "Arduino-Car" @@ -86,6 +86,11 @@ static void checkOTA() { } delay(300); + // Fuerza pines de motor a LOW antes del flash para minimizar glitch de GPIO + analogWrite(ENA, 0); analogWrite(ENB, 0); + digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); + digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); + BearSSL::WiFiClientSecure updateClient; updateClient.setInsecure(); ESPhttpUpdate.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); diff --git a/Esp32Cam/Esp32Cam.ino b/Esp32Cam/Esp32Cam.ino index 6899d2f..6b63424 100644 --- a/Esp32Cam/Esp32Cam.ino +++ b/Esp32Cam/Esp32Cam.ino @@ -10,7 +10,7 @@ // ================================================================ // OTA CONFIG // ================================================================ -#define FW_VERSION 8 +#define FW_VERSION 9 #define GITEA_HOST "https://git.nacho.myds.me" #define GITEA_OWNER "Natxo" #define GITEA_REPO "Arduino-Car" @@ -24,24 +24,30 @@ const char *password = "Suprak1llm1ndS23S"; void startCameraServer(); void setupLedFlash(); -// ── Handshake bidireccional con ESP8266 ───────────────────────── -// Envía "GO\n" cada 300ms hasta recibir "OK\n". -// Protege contra basura del bootloader ROM (115200 baud → bytes aleatorios). -static void handshakeEsp8266() { - unsigned long deadline = millis() + 30000UL; // máx 30s +// ── Handshake bidireccional — tarea FreeRTOS (no bloquea setup) ─ +// Corre en paralelo con el servidor web. Envía "GO\n" cada 300ms +// hasta recibir "OK\n" o agotar 30s. +static void handshakeTask(void *) { + unsigned long deadline = millis() + 30000UL; + String buf = ""; while (millis() < deadline) { Serial.print("GO\n"); unsigned long t = millis(); while (millis() - t < 300) { - if (Serial.available()) { - String resp = Serial.readStringUntil('\n'); - resp.trim(); - if (resp == "OK") return; + while (Serial.available()) { + char c = Serial.read(); + if (c == '\n') { + buf.trim(); + if (buf == "OK") { vTaskDelete(NULL); return; } + buf = ""; + } else if (c != '\r' && buf.length() < 8) { + buf += c; + } } - delay(5); + vTaskDelay(pdMS_TO_TICKS(5)); } } - // Timeout: continúa sin confirmación + vTaskDelete(NULL); // timeout } // ── OTA: comprueba si hay firmware nuevo y actualiza si hace falta ── @@ -167,8 +173,8 @@ void setup() { // ── Servidor cámara ─────────────────────────────────────────────── startCameraServer(); - // Handshake bidireccional: espera ACK del ESP8266 - handshakeEsp8266(); + // Handshake en tarea separada — no bloquea setup() ni el watchdog + xTaskCreate(handshakeTask, "handshake", 4096, NULL, 1, NULL); } void loop() { diff --git a/firmware/esp32cam/firmware.bin b/firmware/esp32cam/firmware.bin index ee1179f..878e88c 100644 Binary files a/firmware/esp32cam/firmware.bin and b/firmware/esp32cam/firmware.bin differ diff --git a/firmware/esp32cam/version.txt b/firmware/esp32cam/version.txt index 301160a..f11c82a 100644 --- a/firmware/esp32cam/version.txt +++ b/firmware/esp32cam/version.txt @@ -1 +1 @@ -8 \ No newline at end of file +9 \ No newline at end of file diff --git a/firmware/esp8266/firmware.bin b/firmware/esp8266/firmware.bin index 5f2f296..9757547 100644 Binary files a/firmware/esp8266/firmware.bin and b/firmware/esp8266/firmware.bin differ diff --git a/firmware/esp8266/version.txt b/firmware/esp8266/version.txt index 301160a..f11c82a 100644 --- a/firmware/esp8266/version.txt +++ b/firmware/esp8266/version.txt @@ -1 +1 @@ -8 \ No newline at end of file +9 \ No newline at end of file