🛠 Multitâche non bloquant : heartbeat + bouton avec debounce

Arduino UNO R3 · intermediaire · Schéma : IMG-uno-r3-intermediaire-3-multitache-millis-debounce.svg — UNO R3 avec bouton sur pin 2 vers GND et LED sur pin 13, horloge dessinée symbolisant millis().

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales