my code stock.com

Alejandro Mascotto

Lección 09 - Controlando el efecto rebote
by Alejandro Mascotto

Los cambios de estado en un pin de entrada pueden ser ocasionados por ruidos eléctricos no deseados. Este el caso al utilizar pulsadores, pues el contacto físico es muy errático a nivel microscópico.

Snippet options

Download: Download snippet as leccion-09-controlando-el-efecto-rebote.txt.
Copy snippet: For this you need a free my code stock.com account.
Embed code : You will find the embed code for this snippet at the end of the page, if you want to embed it into a website or a blog!

/* De-bounce o Anti-rebote
 
 Cada vez que una entrada pasa de nivel bajo a alto (como cuando se presiona un pulsador)
 el pin de salida cambia de LOW a HIGH o de HIGH a LOW (según el código de programa).
 Existe un tiempo de demora pequeño entre variaciones necesario para evitar el llamado 
 "efecto rebote" del circuito (por ejemplo, ruido eléctrico ocasionado por la imperfección
 de las superficies de contacto vistas a nivel microscópico)
 
 El circuito:
 * LED conectado desde el pin 13 a tierra.
 * pulsador conectado desde el pin 2 a los +5V
 * resistor 10K conectado desde el pin 12 a tierra (PULL-DOWN)
 * Nota: en la mayoría de los Arduinos, ya existe un LED incorporado en la placa 
   y conectado al pin 13, y por lo tanto no se requiere la adición de hardware.
 
 
 creado el 21 de Nov del 2006
 por David A. Mellis
 modificado el 30 de Ago del 2011
 por Limor Fried
 modificado el 28 de Dic del 2012
 por Mike Walters
 
 El código de este ejemplo pertenece al dominio público 
 
 http://www.arduino.cc/en/Tutorial/Debounce

   ========================================================================
                         DECLARACION DE CONSTANTES
                     Las constantes no pueden cambiar
   ======================================================================== */

const int pinPulsador = 12;         // Número de pin donde esta conectado el pulsador
const int pinLed = 13;              // Número de pin donde esta conectado el LED

/* ========================================================================
                         DECLARACION DE VARIABLES
   Las variables pueden cambiar. Algunas variables son del tipo 'long' puesto 
   que el tiempo, medido en milisegundos, crece rápidamente generando un número 
   mayor al que puede almacenarse en un variable de tipo entero (int).
   ======================================================================== */

boolean estadoLed = HIGH;            // Variable para almacenar el estado actual del pin de salida
boolean estadoPulsador;              // Variable para almacenar la lectura del estado del pin de entrada
boolean estadoPulsadorAnterior = LOW;// Variable que almacena el estado anterior del pin de entrada
                                     // Recuerden que HIGH = 1 y LOW = 0, son valores lógicos
long tiempoAntirreboteInicial = 0;   // Tiempo en que se detecta el cambio de estado inicial (disparo)
long demoraAntirrebote = 50;         // Tiempo de antirrebote; puede incrementarse si la salida parpadea

void setup() {                       // Bloque de configuraciones
  pinMode(pinPulsador, INPUT);
  pinMode(pinLed, OUTPUT);
  digitalWrite(pinLed, estadoLed);   // Se fija el estado inicial del LED (encendido)
  Serial.begin(9600);                // Habilita la comunicación Serie
}

void loop() {

  boolean lecturaPuls = digitalRead(pinPulsador); // Lee y almacena el estado del pulsador

  /* El programa revisará si se ha presionado el pulsador 
     (es decir, si la entrada cambió de LOW a HIGH), y si ha trancurrido un
     tiempo suficiente desde la última vez para evitar lecturas erradas por posibles ruidos. */

  if (lecturaPuls != estadoPulsadorAnterior) {    // Si el pulsador cambia, sea por ruido o pulsación
    tiempoAntirreboteInicial = millis();          //// se mide el tiempo de inicio para el antirrebote
  } 
  
    /* Cualquiera sea el valor de 'lecturaPuls', debe permanecer así durante un
       período de tiempo mayor al de 'demoraAntirrebote' para que sea considerado
       el estado actual del pulsador. Esto elimina lecturas ocasionadas por ruidos. 
       Por tanto, lo que hacemos a continuación es verificar si pasó el tiempo necesario.*/
       
  if (millis() - tiempoAntirreboteInicial > demoraAntirrebote) { // ¿Tiempo cumplido? 
  
    if (lecturaPuls != estadoPulsador) {    // Si el estado del pulsador ha cambiado, manteniéndose
      estadoPulsador = lecturaPuls;         //// durante el tiempo esperado, se almacena el nuevo estado
      Serial.print("Pulsador cambia a ");   // Se informa del cambio de estado
      Serial.println(estadoPulsador);
  
      if (estadoPulsador == HIGH) {         // Sólo cuando el estado del pulsador es HIGH
        estadoLed = !estadoLed;             //// se invierte el estado del LED (con una negación)
      } // Fin del tercer if
    } // Fin del segundo if
  } // Fin del primer if
  
  digitalWrite(pinLed, estadoLed);          // fija el estado del LED
  Serial.print("Estado del LED en ");
  Serial.println(estadoLed);
                                            // Copia y guarda el valor de 'lecturaPuls' para la próxima
  estadoPulsadorAnterior = lecturaPuls;     //// ejecución de loop a 'estadoPulsadorAnterior',
                                            //// independientemente de si hubo o no un cambio.
} // Fin de loop

Create a free my code stock.com account now.

my code stok.com is a free service, which allows you to save and manage code snippes of any kind and programming language. We provide many advantages for your daily work with code-snippets, also for your teamwork. Give it a try!

Find out more and register now

You can customize the height of iFrame-Codes as needed! You can find more infos in our API Reference for iframe Embeds.