Cuando activamos o desactivamos un pulsador, se producen una serie de rebotes o fluctuaciones (ruido) hasta que se asienta el valor que el pulsador va a transmitir.
La mayoría de microcontroladores, incluyendo Arduino, debido a su alta velocidad de procesamiento de instrucciones son capaces de detectar estos rebotes y como consiguiente nos encontramos con un problema a la hora de trabajar con pulsadores.
Arduino será capaz de interpretar falsos niveles lógicos cuando activemos o desactivemos un pulsador (sin la eliminación de rebotes, al presionar el pulsador una sola vez, Arduino puede creer que lo hemos presionado repetidas veces).
Lista de Materiales
- Arduino UNO Rev.3
- Cable USB tipo A-B
- Pulsador
- Resistencia de 10KΩ
- Módulo LCM 1602 I2C V1
- Display 16×2 LCD 1602
- Protoboard
- Cables de conexión
Código del programa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
/* TITULO: Pulsador antirrebote con contador de pulsaciones. AUTOR: MARIANO DEL CAMPO GARCÍA (@2015) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Con este programa se soluciona el problema de los rebotes del pulsador. Además podremos observar a ravés del monitor serie, el número de veces que hemos activado el pulsador. ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | SCL del módulo I2C | 5V/MISO2 [ ][ ] A4/SDA[ ] | SDA del módulo I2C | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | | [ ]RST MOSI/11[ ]~| | [ ]3V3 +---+ 10[ ]~| | [ ]5v -| A |- 9[ ]~| | [ ]GND -| R |- 8[ ] | | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | | -| I |- 6[ ]~| | [ ]A0 -| N |- 5[ ]~| | [ ]A1 -| O |- 4[ ] | PA | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos) - Conexión PULL-DOWN del pulsador. - PB conectado a VCC. - PA conectado a GND a través de una R=10K omhs. - La alimentación y la masa del módulo LCM 1602 I2C V1 van directamente conectadas a VCC (+5V) y GND respectivamente. */ // Importar librerías #include <Wire.h> // Librería comunicación I2C #include <LiquidCrystal_I2C.h> // Librería LCD I2C // Declaración del objeto // Poner la dirección del LCD a 0x27 para display 16x2, 20x2 y 20x4 // Terminales de conexión del LCD // addr, en,rw,rs,d4,d5,d6,d7,bl,blpol LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); const int pulsador = 4; // Entrada digital para el pulsador const int tiempoAntirrebote = 10; // tiempo en ms para evitar el rebote int cuenta = 0; int estadoBoton; int estadoBotonAnterior; // Función que evita el rebote del pulsador boolean antirrebote(int pin) { int contador = 0; boolean estado; boolean estadoAnterior; do { estado = digitalRead(pin); if(estado != estadoAnterior) { contador = 0; estadoAnterior = estado; } else { contador = contador+ 1; } delay(1); } while(contador < tiempoAntirrebote); return estado; } void setup() { Serial.begin(9600); // Configura la velocidad de la comunicación serie lcd.begin(16,2); // Inicializa el LCD para 16x2 lcd.backlight(); // LED de fondo encendido (backlight) pinMode(pulsador, INPUT); // PIN digital del pulsador como entrada // Presentamos datos por el LCD lcd.clear(); lcd.setCursor(0,0); lcd.print("Pulsaciones: "); } void loop() { estadoBoton = digitalRead(pulsador); if(estadoBoton != estadoBotonAnterior) { if(antirrebote(pulsador)) { cuenta++; lcd.setCursor(13,0); lcd.print(cuenta); // Se muestra a través del LCD el nº de veces que presionamos el pulsador } } estadoBotonAnterior = estadoBoton; } |