Diferència entre revisions de la pàgina «Rebots i detecció de flancs a Arduino»

De binefa.com
Salta a la navegació Salta a la cerca
(Es crea la pàgina amb «= Codi d'exemple = // Definició de pins const int pinBoto = 2; const int pinLed = 13; // Variables d'estat bool estatLed = LOW; // Estat actual del LED...».)
 
 
(Hi ha una revisió intermèdia del mateix usuari que no es mostren)
Línia 30: Línia 30:
 
     delay(50);  
 
     delay(50);  
 
   }
 
   }
 
+
 
   // Desem l'estat actual per a la següent iteració
 
   // Desem l'estat actual per a la següent iteració
 
   ultimEstatBoto = estatActualBoto;
 
   ultimEstatBoto = estatActualBoto;
Línia 43: Línia 43:
 
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.
 
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.
+
'''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.

Revisió de 16:04, 9 març 2026

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.