les vencimos · offline
L08. Parpadeo y por qué delay bloquea
Maestro
El parpadeo ya lo tienes. La lección de hoy es el precio: delay detiene el programa entero. Mientras espera, no puede mirar un botón ni un sensor. Por eso más adelante existirá millis. Hoy no se escribe esa otra forma. Hoy se entiende por qué la espera tonta estorba.
El sketch de parpadeo enciende, espera, apaga, espera. Es correcto para una sola luz. Es una trampa en cuanto quieres dos cosas. Imagina un botón que debería contar clics. Durante delay el chip no lee el pin. El clic que caiga ahí dentro no existe para el programa.
No es que el botón falle. Es que pediste una pausa total. En un ordenador de mesa otro proceso seguiría. Aquí no hay otro proceso. loop es la única vida del chip, y está dormido dentro de delay.
La salida, que verás cuando toque el tiempo de verdad, es anotar el reloj y seguir. Esa función se llama millis y no se adelanta hoy: si la copias de memoria a medias, mezclas dos estilos y no ves el fallo. Quédate con el síntoma. Si «a veces no pilla el botón» y hay un delay largo, el retraso es el primer sospechoso.
El LED del pin 13 sigue siendo la luz de prueba. Si ya tienes un LED externo, ponle su resistencia de 220 ohmios y puedes mover el número de pin, pero no quites la idea: la espera bloquea igual en el pin que elijas.
Montaje
Pines de esta lección
Por qué
El parpadeo no es una propiedad del LED. Es la suma de dos esperas. 500 y 500 dan un hertzio aproximado: una vez por segundo cambia el estado completo. 1000 y 1000 es más lento. Si las dos esperas no son iguales, el ojo lo llama parpadeo irregular, y está bien: es otro mensaje.
delay cuenta milisegundos. 500 no es medio minuto ni 500 microsegundos. Si escribes delay(1) el LED parece fijo, encendido a medias, porque el ojo no separa los cambios. No está fundido. Está yendo demasiado rápido.
Mientras delay trabaja, el chip no hace otra línea. En esta lección no importa. Si más tarde lees un botón dentro del mismo loop, el botón solo se mira entre esperas. Un dedo rápido se pierde. Por eso el ritmo de hoy se queda simple.
El LED de a bordo y el externo del pin 13 comparten el mismo HIGH. No puedes apagar uno y dejar el otro. Si necesitas una luz testigo que no sea la del experimento, usa otro pin y otra resistencia.
Práctica
- Parte del sketch de la lección anterior. No desarmes el LED.
- Pon los dos delay en 500. Carga.
- Cuenta diez parpadeos. Tiene que caberte en unos diez segundos.
- Pon 2000 y 200. Carga. Di en voz alta: largo, corto.
- Pon 50 y 50. Carga. Anota si lo ves fijo o tembloroso.
- Vuelve a 500 y 500 antes de salir de la lección, para que la siguiente tenga un ritmo conocido.
- No añadas Serial.print para medir el tiempo. El reloj es tu cuenta.
Práctica en la página
Medio segundo encendido y medio apagado. La simulación arranca encendida.
Ejemplos resueltos
Parece encendido fijo
Los dos delay quedaron en 1. El LED de a bordo se ve encendido, quizá un poco menos brillante. El programa corre. El ojo promedia.
Se sube a 300 y 300 y reaparece el parpadeo. No se cambia de pin ni se quita la resistencia.
Uno de los dos delay se borró
Solo hay un delay, el de HIGH. El LOW dura lo que tarda el loop en volver, que es casi nada. Se ve una luz fija con un apagón invisiblemente corto.
Hacen falta las dos esperas, una tras cada digitalWrite. El comentario del sketch no sustituye a la línea.
En la mesa
Con el mismo cable del 13, cambia solo números y vuelve a cargar cada vez. Primero quinientos y quinientos: un segundo el ciclo completo, más o menos, contado con la palabra mil-uno. Luego cien y novecientos: un golpe. Luego novecientos y cien: una luz casi fija. Di el nombre del mensaje antes de mirar el LED, y comprueba si el ojo coincide. Si no coincide, los delay están cruzados respecto a HIGH y LOW, no está sucio el LED.
Prueba delay de uno y uno. Verás luz fija. Anótalo como trampa: fijo no significa pin atascado. Vuelve a quinientos. La trampa, reconocida una vez, no te robará una tarde cuando alguien deje un delay diminuto en un sketch copiado.
No abras el monitor. No añadas prints. Hoy el instrumento es el ojo y la cuenta. Si necesitas un número, es el que está escrito entre paréntesis, y se lee en el sketch, no en una ventana nueva. Cierra la sesión con quinientos y quinientos cargados, que es un ritmo fácil de reconocer mañana si la placa sigue enchufada.
Sketch
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
Ejercicio
En el parpadeo, pon un delay de cinco segundos. Intenta imaginar, o probar, un botón leído dentro de ese loop. Anota si el programa puede ver el clic durante la espera. La respuesta honesta es no.
Autoevaluación
1. Mientras delay cuenta, ¿el programa puede leer un botón?
No. delay detiene todo el sketch.
2. ¿Por qué en un ordenador de mesa esto se nota menos?
Porque hay más de un proceso. En el microcontrolador, loop es la única vida.
3. ¿Hay que escribir ya millis en esta lección?
No. Solo hace falta entender por qué delay estorba.