Rebots i detecció de flancs a Arduino

De binefa.com
Salta a la navegació Salta a la cerca

Codi d'exemple

// Definició de pins
const int pinBoto = 2;
const int pinLed = 13;

// Variables d'estat
bool estatLed = LOW;       // Estat actual del LED
bool ultimEstatBoto = HIGH; // Estat del botó en el cicle anterior (comença en HIGH pel pull-up)

void setup() {
  pinMode(pinBoto, INPUT);  // Entrada amb pull-up físic
  pinMode(pinLed, OUTPUT);  // El LED de la placa
  digitalWrite(pinLed, estatLed);
}

void loop() {
  // 1. Llegim l'estat actual del botó
  bool estatActualBoto = digitalRead(pinBoto);

  // 2. DETECCIÓ DE FLANC (Edge Detection)
  // Comprovem si l'estat ha canviat de HIGH a LOW (pulsació)
  if (ultimEstatBoto == HIGH && estatActualBoto == LOW) {
   
    // 3. ACCIÓ: Canviem l'estat del LED (Toggle)
    estatLed = !estatLed;
    digitalWrite(pinLed, estatLed);

    // 4. DEBOUNCING (Antirebots)
    // Esperem un instant perquè les vibracions metàl·liques del polsador s'aturin
    delay(50); 
  }

  // Desem l'estat actual per a la següent iteració
  ultimEstatBoto = estatActualBoto;
}

El Flanc (Edge Detection)

Si només fessis un if (digitalRead(2) == LOW), el LED s'encendria i s'apagaria milers de vegades per segon mentre tinguessis el dit premut (perquè el bucle loop és molt ràpid).

Detecció de flanc: Només actuem quan l'estat canvia. En aquest cas, busquem el flanc de baixada (de 1 a 0), que és el moment exacte en què prems el botó.

El Rebot (Debouncing)

Els botons són mecànics. Quan prems, dues làmines de metall xoquen i, a nivell microscòpic, "reboten" durant uns mil·lisegons. L'Arduino és tan ràpid que llegeix aquests rebots com si haguessis premut el botó 10 vegades seguides.

Solució: El delay(50); fa que l'Arduino "es quedi sord" durant 50 ms després de detectar el primer flanc, ignorant així tots els rebots elèctrics posteriors.