Diferència entre revisions de la pàgina «Rebots i detecció de flancs a Arduino»
Salta a la navegació
Salta a la cerca
m (→Codi d'exemple) |
|||
| 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.