Casi todo principiante pasa por el comando facil delay(1000). La idea es simple: espera 1 segundo. Cuando el proyecto crece, el robot se vuelve raro. Pulsas un boton y no responde, aparece un obstaculo y no frena, se sale de la linea mientras la sigue.
No culpes primero al sensor o a la bateria. A menudo el culpable es delay(), que duerme al robot como una anestesia.
1) delay congela el cerebro
Cuando Arduino encuentra delay, no hace nada mas durante ese tiempo. Ejemplo: enciende la luz, espera 2 segundos, luego gira a la izquierda. En esos 2 segundos el robot:
- No ve un muro delante (no lee ultrasonido)
- No oye el boton de parada de emergencia
- No nota que salio de la linea
delay no es un descanso; es una paralisis corta. Hasta que termina, el robot esta ciego, sordo y mudo.
2) La analogia del huevo
Metodo delay: Pones el huevo en agua y te quedas 5 minutos quieto mirando la olla. Suena el telefono? Lo ignoras. Llaman a la puerta? Lo ignoras.
Metodo millis: Anotas la hora: empece a las 14:00, lo saco a las 14:05. Luego preparas la mesa, cortas pan y miras el reloj de vez en cuando. Aun no? Sigues trabajando.
Los profesionales no dejan al robot esperando en la cocina; le ensenan a mirar el reloj.
3) Varias tareas a la vez (millis)
Si quieres parpadear un LED y seguir una linea a la vez, no uses delay. Mientras esperas el LED, no controlas motores.
Usa millis(), el reloj de Arduino. Sigue la linea y mueve motores. Mira tambien el reloj. Si pasaron 1000 ms desde el ultimo cambio del LED, cambialo — pero no te pares.
unsigned long lastTime = 0;
int ledState = LOW;
void loop() {
followLine();
if (millis() - lastTime >= 1000) {
lastTime = millis();
ledState = !ledState;
digitalWrite(LED_BUILTIN, ledState);
}
}
Nota de taller:
delayno esta siempre prohibido. Esperas cortas ensetup()o codigo de una sola vez fuera de carrera pueden valer. Dentro deloop()con sensores y motores, delay es una trampa.
Si las reacciones van tarde, busca delay en el codigo. No duermas al robot; ensenale a gestionar el tiempo. La vida real no se pausa; tu loop tampoco deberia.