Diferencia entre revisiones de «Debounce»
(→Referencias externas) |
|||
(No se muestran 17 ediciones intermedias del mismo usuario) | |||
Línea 12: | Línea 12: | ||
El siguiente boceto está basado en la versión de rebote de Limor Fried. | El siguiente boceto está basado en la versión de rebote de Limor Fried. | ||
− | < | + | <syntaxhighlight lang="c++"> |
− | </ | + | const byte pin = 2; //Pulsador |
+ | const byte para = 50; //Tiempo de rebote | ||
+ | unsigned long hora = 0; //Hora ultima vez que pulsaste | ||
+ | byte led = LOW; //Estado actual del LED | ||
+ | byte actual; //Estado actual del pulsador (buttonState) | ||
+ | byte anterior = LOW; //Estado anterior del pulsador (lastButtonState) | ||
+ | |||
+ | void setup() { | ||
+ | pinMode(pin, INPUT_PULLUP); | ||
+ | pinMode(LED_BUILTIN, OUTPUT); | ||
+ | digitalWrite(LED_BUILTIN, led); | ||
+ | } | ||
+ | void loop(){ | ||
+ | byte lee a digitalRead(pin); | ||
+ | ... falta | ||
+ | digitalWrite(LED_BUILTIN, led); | ||
+ | anterior = lee; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
== Comentarios == | == Comentarios == | ||
+ | * Cada vez que el pin de entrada pasa de HIGH a LOW, el LED prende o apaga según el caso. Hay un retraso mínimo entre los conmutadores para rebotar el circuito (es decir ignorar el ruido). | ||
+ | * Al principio el pulsador esta libre por lo que pin 2 esta en HIGH y se guarda en '''lee'''. Luego el primer if() comprueba si hay cambio de estado (lee != anterior), como no hay lo salta. El segundo if() ya que hora=0 entra y pregunta si pulsador sigue igual (lee != actual) y luego de guardar nuevamente dicho estado y pregunta si el estado actual es LOW y como no lo es salta el cuarto if() y guarda la lectura en '''anterior'''. | ||
+ | * Ahora presionamos pulsador y pin 2 se pone LOW y se guarda en '''lee'''. Luego el primer if() comprueba si hay cambio de estado y como si hay entra al if() y guarda '''hora'''. Luego va el siguiente if() y aun no paso el tiempo de '''para''' por lo que guarda '''anterior''' como LOW. | ||
+ | * EL pulsador sigue presionado por lo que pin 2 sigue LOW por lo que salta el primer if(). Continua haciendo bucles hasta que se cumple '''para''' cuando entra al segundo if(). Entra al tercer if() y guarda '''actual''' entra al cuarto if() y cambia '''led'''. | ||
== Vea también == | == Vea también == | ||
− | + | <categorytree mode=all>Digital</categorytree> | |
− | + | ||
− | + | == Referencias externas == | |
− | + | * [https://www.arduino.cc/en/Tutorial/Debounce Ejemplos incluidos] | |
− | |||
− | |||
− | |||
− | * [ | ||
− | [[Category:Digital]] | + | [[Category:Ejemplo Digital]] |
Revisión actual del 01:05 7 jul 2019
Los pulsadores a menudo generan transiciones falsas de apertura/cierre de contactos cuando se presionan, debido a problemas mecánicos y físicos: estas transiciones se pueden leer como múltiples presiones en un tiempo muy corto engañando al programa.
Este ejemplo muestra cómo eliminar el rebote de una entrada, lo que significa verificar dos veces en un corto período de tiempo para asegurarse de que el botón esté definitivamente presionado. Sin reblandecimiento, presionar el botón una vez puede causar resultados impredecibles. Este boceto usa la funcion millis() para realizar un seguimiento del tiempo transcurrido desde que se presionó el botón.
Placa aplicable
Todas.
Circuito
Conecta un pulsador entre el pin 2 y GND.
Código
El siguiente boceto está basado en la versión de rebote de Limor Fried.
const byte pin = 2; //Pulsador
const byte para = 50; //Tiempo de rebote
unsigned long hora = 0; //Hora ultima vez que pulsaste
byte led = LOW; //Estado actual del LED
byte actual; //Estado actual del pulsador (buttonState)
byte anterior = LOW; //Estado anterior del pulsador (lastButtonState)
void setup() {
pinMode(pin, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, led);
}
void loop(){
byte lee a digitalRead(pin);
... falta
digitalWrite(LED_BUILTIN, led);
anterior = lee;
}
Comentarios
- Cada vez que el pin de entrada pasa de HIGH a LOW, el LED prende o apaga según el caso. Hay un retraso mínimo entre los conmutadores para rebotar el circuito (es decir ignorar el ruido).
- Al principio el pulsador esta libre por lo que pin 2 esta en HIGH y se guarda en lee. Luego el primer if() comprueba si hay cambio de estado (lee != anterior), como no hay lo salta. El segundo if() ya que hora=0 entra y pregunta si pulsador sigue igual (lee != actual) y luego de guardar nuevamente dicho estado y pregunta si el estado actual es LOW y como no lo es salta el cuarto if() y guarda la lectura en anterior.
- Ahora presionamos pulsador y pin 2 se pone LOW y se guarda en lee. Luego el primer if() comprueba si hay cambio de estado y como si hay entra al if() y guarda hora. Luego va el siguiente if() y aun no paso el tiempo de para por lo que guarda anterior como LOW.
- EL pulsador sigue presionado por lo que pin 2 sigue LOW por lo que salta el primer if(). Continua haciendo bucles hasta que se cumple para cuando entra al segundo if(). Entra al tercer if() y guarda actual entra al cuarto if() y cambia led.
Vea también