Diferencia entre revisiones de «Debounce»

De ArduWiki
Saltar a: navegación, buscar
(Código)
(Referencias externas)
 
(No se muestran 11 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.
  
<pre>
+
<syntaxhighlight lang="c++">
const int pin = 2;       //Pulsador
+
const byte pin = 2;     //Pulsador
 
const byte para = 50;    //Tiempo de rebote
 
const byte para = 50;    //Tiempo de rebote
 
unsigned long hora = 0;  //Hora ultima vez que pulsaste
 
unsigned long hora = 0;  //Hora ultima vez que pulsaste
Línea 26: Línea 26:
 
}
 
}
 
void loop(){
 
void loop(){
   int lee a digitalRead(pin);
+
   byte lee a digitalRead(pin);
 
   ... falta
 
   ... falta
 
   digitalWrite(LED_BUILTIN, led);
 
   digitalWrite(LED_BUILTIN, led);
 
   anterior = lee;
 
   anterior = lee;
 
}
 
}
</pre>
+
</syntaxhighlight>
  
 
== Comentarios ==
 
== Comentarios ==
Línea 40: Línea 40:
  
 
== Vea también ==
 
== Vea también ==
* [[Blink without delay]]
+
<categorytree mode=all>Digital</categorytree>
* [[Button]]
 
* [[Digital input pullup]]
 
* [[State change detection]]
 
* [[Tone keyboard]]
 
* [[Tone melody]]
 
* [[Tone múltiple]]
 
* [[Tone pitch follower]]
 
  
[[Category:Digital]]
+
== Referencias externas ==
 +
* [https://www.arduino.cc/en/Tutorial/Debounce Ejemplos incluidos]
 +
 
 +
[[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

no se ha encontrado nada


Referencias externas