firmware: v18 — fix bug critico espReady + watchdog ESP8266

Bug: en v16 se elimino if(!espReady)return del loop() y no se restauro
en v17. Resultado: bytes basura del bootloader ESP32 (ej 0x42='B') se
ejecutaban como backward() antes y despues del handshake.

Fixes:
- Restaurado bool espReady con guard if(!espReady)return en loop()
- Restaurado handler 'G' en loop() para reinicio del ESP32:
  espReady=false + stopMotors() inmediato + nuevo handshake
- Watchdog ligero en ESP8266 (solo millis(), sin FreeRTOS):
  si no llega comando de movimiento en 1.5s -> para motores
  Evita que el coche siga moviendose si el ESP32 crashea

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Natxo1000
2026-06-02 21:59:27 +02:00
parent 88b24f9527
commit 3ef37e0f0e
6 changed files with 40 additions and 9 deletions

View File

@@ -7,7 +7,7 @@
// ================================================================ // ================================================================
// OTA CONFIG // OTA CONFIG
// ================================================================ // ================================================================
#define FW_VERSION 17 #define FW_VERSION 18
#define GITEA_HOST "https://git.nacho.myds.me" #define GITEA_HOST "https://git.nacho.myds.me"
#define GITEA_OWNER "Natxo" #define GITEA_OWNER "Natxo"
#define GITEA_REPO "Arduino-Car" #define GITEA_REPO "Arduino-Car"
@@ -110,6 +110,8 @@ static void checkOTA() {
WiFi.mode(WIFI_OFF); // apaga radio para ahorrar energía WiFi.mode(WIFI_OFF); // apaga radio para ahorrar energía
} }
bool espReady = false;
void waitForReady() { void waitForReady() {
delay(300); delay(300);
while (Serial.available()) Serial.read(); while (Serial.available()) Serial.read();
@@ -124,6 +126,7 @@ void waitForReady() {
Serial.print("OK\n"); Serial.print("OK\n");
delay(50); delay(50);
while (Serial.available()) Serial.read(); while (Serial.available()) Serial.read();
espReady = true;
// 2 pitidos: conexión entre placas lista // 2 pitidos: conexión entre placas lista
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
digitalWrite(buzzerPin, HIGH); delay(180); digitalWrite(buzzerPin, HIGH); delay(180);
@@ -138,6 +141,7 @@ void waitForReady() {
} }
delay(10); delay(10);
} }
espReady = true; // timeout: arranca igualmente
} }
void setup() { void setup() {
@@ -166,15 +170,42 @@ void setup() {
waitForReady(); 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() { void loop() {
// Watchdog: sin comandos durante 1.5s → para motores
if (motorRunning && (millis() - lastMoveMs > 1500)) {
stopMotors();
motorRunning = false;
}
if (Serial.available()) { if (Serial.available()) {
char c = Serial.read(); char c = Serial.read();
if (c == 'F') forward(); // Reinicio del ESP32-CAM: manda "GO\n" de nuevo
else if (c == 'B') backward(); if (c == 'G') {
else if (c == 'L') left(); espReady = false;
else if (c == 'R') right(); stopMotors();
else if (c == 'S') 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') { else if (c == 'V') {
int val = Serial.parseInt(); int val = Serial.parseInt();

View File

@@ -10,7 +10,7 @@
// ================================================================ // ================================================================
// OTA CONFIG // OTA CONFIG
// ================================================================ // ================================================================
#define FW_VERSION 17 #define FW_VERSION 18
#define GITEA_HOST "https://git.nacho.myds.me" #define GITEA_HOST "https://git.nacho.myds.me"
#define GITEA_OWNER "Natxo" #define GITEA_OWNER "Natxo"
#define GITEA_REPO "Arduino-Car" #define GITEA_REPO "Arduino-Car"

Binary file not shown.

View File

@@ -1 +1 @@
17 18

Binary file not shown.

View File

@@ -1 +1 @@
17 18