diff --git a/ESP8266/ESP8266.ino b/ESP8266/ESP8266.ino index f786b7b..ec532b4 100644 --- a/ESP8266/ESP8266.ino +++ b/ESP8266/ESP8266.ino @@ -7,7 +7,7 @@ // ================================================================ // OTA CONFIG // ================================================================ -#define FW_VERSION 17 +#define FW_VERSION 18 #define GITEA_HOST "https://git.nacho.myds.me" #define GITEA_OWNER "Natxo" #define GITEA_REPO "Arduino-Car" @@ -110,6 +110,8 @@ static void checkOTA() { WiFi.mode(WIFI_OFF); // apaga radio para ahorrar energía } +bool espReady = false; + void waitForReady() { delay(300); while (Serial.available()) Serial.read(); @@ -124,6 +126,7 @@ void waitForReady() { Serial.print("OK\n"); delay(50); while (Serial.available()) Serial.read(); + espReady = true; // 2 pitidos: conexión entre placas lista for (int i = 0; i < 2; i++) { digitalWrite(buzzerPin, HIGH); delay(180); @@ -138,6 +141,7 @@ void waitForReady() { } delay(10); } + espReady = true; // timeout: arranca igualmente } void setup() { @@ -166,15 +170,42 @@ void setup() { waitForReady(); } +// Watchdog ligero en ESP8266: si no llega comando de movimiento en 1.5s → para +// Evita que el coche siga moviéndose si el ESP32 se cuelga o reinicia +unsigned long lastMoveMs = 0; +bool motorRunning = false; + void loop() { + // Watchdog: sin comandos durante 1.5s → para motores + if (motorRunning && (millis() - lastMoveMs > 1500)) { + stopMotors(); + motorRunning = false; + } + if (Serial.available()) { char c = Serial.read(); - if (c == 'F') forward(); - else if (c == 'B') backward(); - else if (c == 'L') left(); - else if (c == 'R') right(); - else if (c == 'S') stopMotors(); + // Reinicio del ESP32-CAM: manda "GO\n" de nuevo + if (c == 'G') { + espReady = false; + stopMotors(); + motorRunning = false; + Serial.readStringUntil('\n'); + Serial.print("OK\n"); + delay(50); + while (Serial.available()) Serial.read(); + espReady = true; + return; + } + + // Ignorar todo hasta que el handshake esté completo + if (!espReady) return; + + if (c == 'F') { forward(); lastMoveMs = millis(); motorRunning = true; } + else if (c == 'B') { backward(); lastMoveMs = millis(); motorRunning = true; } + else if (c == 'L') { left(); lastMoveMs = millis(); motorRunning = true; } + else if (c == 'R') { right(); lastMoveMs = millis(); motorRunning = true; } + else if (c == 'S') { stopMotors(); motorRunning = false; } else if (c == 'V') { int val = Serial.parseInt(); diff --git a/Esp32Cam/Esp32Cam.ino b/Esp32Cam/Esp32Cam.ino index bbd784e..6eed0f6 100644 --- a/Esp32Cam/Esp32Cam.ino +++ b/Esp32Cam/Esp32Cam.ino @@ -10,7 +10,7 @@ // ================================================================ // OTA CONFIG // ================================================================ -#define FW_VERSION 17 +#define FW_VERSION 18 #define GITEA_HOST "https://git.nacho.myds.me" #define GITEA_OWNER "Natxo" #define GITEA_REPO "Arduino-Car" diff --git a/firmware/esp32cam/firmware.bin b/firmware/esp32cam/firmware.bin index 64bd5b1..adc8253 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 8e2afd3..25bf17f 100644 --- a/firmware/esp32cam/version.txt +++ b/firmware/esp32cam/version.txt @@ -1 +1 @@ -17 \ No newline at end of file +18 \ No newline at end of file diff --git a/firmware/esp8266/firmware.bin b/firmware/esp8266/firmware.bin index 6551e3d..20ba3af 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 8e2afd3..25bf17f 100644 --- a/firmware/esp8266/version.txt +++ b/firmware/esp8266/version.txt @@ -1 +1 @@ -17 \ No newline at end of file +18 \ No newline at end of file