🛠 Multitâche non bloquant : heartbeat + bouton avec debounce
Objetivos
Salir del secuencial delay: ejecutar dos tareas independientes en loop gracias a millis — un parpadeo de LED cada 500 ms y un botón con antirrebote por software cada 30 ms. Esta es la habilidad que separa al principiante del intermedio en microcontroladores desnudos (sin SO en la UNO, solo un bootloader).
Material
- 1 Arduino UNO R3 + cable USB-B
- 1 botón pulsador entre el pin 2 y GND (pull-up interno)
- 1 LED + 330 Ω en el pin 13 (o el LED integrado « L »)
Código completo
// Deux tâches sans delay : heartbeat 500 ms + toggle par bouton (debounce 30 ms).
const uint8_t LED = 13;
const uint8_t BTN = 2;
bool ledOn = false;
bool dernierEtatBtn = HIGH;
uint32_t dernierBlink = 0, dernierChangementBtn = 0;
void setup {
pinMode(LED, OUTPUT);
pinMode(BTN, INPUT_PULLUP);
Serial.begin(9600);
}
void loop {
uint32_t maintenant = millis;
// Tâche 1 : heartbeat non bloquant.
if (maintenant - dernierBlink >= 500) {
dernierBlink = maintenant;
digitalWrite(LED, !digitalRead(LED));
}
// Tâche 2 : bouton avec anti-rebond de 30 ms, front d'appui.
bool btn = digitalRead(BTN);
if (btn != dernierEtatBtn && maintenant - dernierChangementBtn >= 30) {
dernierChangementBtn = maintenant;
dernierEtatBtn = btn;
if (btn == LOW) { // appuyé (actif-bas)
ledOn = !ledOn;
Serial.print(F("toggle -> ")); Serial.println(ledOn);
}
}
digitalWrite(LED, ledOn ? HIGH : LOW);
}
Verificación esperada
El LED parpadea continuamente; cada pulsación (una sola, aunque el botón haga ruido) cambia el estado mostrado en el Monitor serie. Pruebe la diferencia: sin la ventana de 30 ms, una sola pulsación provoca de 3 a 10 cambios de estado visibles en el Monitor — el rebote mecánico es real.
Errores frecuentes
- Comparar
millis < anterior: el desbordamiento demillisocurre después de ~50 días; la resta sin signo (ahora - anterior >= X) es la única forma correcta. - Actualizar la marca de tiempo solo cuando el estado es estable: la ventana de antirrebote nunca se cierra.
- Mezclar la bandera
ledOny el heartbeat en el mismo LED sin entender quién escribe al final (aquí gana el últimodigitalWrite). - Querer «realmente» multitarea: más allá de unas pocas tareas, mire el port oficial de FreeRTOS AVR en lugar de apilar
if millis. - Olvidar que
loopdebe ser corto: ningún cálculo largo (sensor 1-Wire, espera I²C) debe bloquear el heartbeat.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-poussoir.inoArduinopwm-fade.inoArduinocapteur-lumiere-ldr.inoArduinoservo-balayage.inoArduinoruban-neopixel.inoArduino