En esta experiencia se mostrará cómo lograr el control de display de 7 segmentos mediante pulsadores. Para ello se utilizará botones tipo «push button» los cuales aumentarán y disminuirán la cuenta mostrada en el display, según sea necesario.
Una de las maneras más fáciles de controlar cierto tipo de proyecto es mediante el uso de entradas (pulsadores) las cuales nos permiten manipular diferentes componentes. según nuestras necesidades.
Para esta experiencia utilizamos los siguientes componentes:
- 1 Protoboard.
- 7 resistencias de 220Ω.
- 2 resistencias de 4.7kΩ.
- 1 display de 7 segmentos (cátodo común).
- Jumpers.
- 1 Placa Arduino Uno.
- 2 Pulsadores.
Podemos consultar la información que ya se ha publicado en este sitio web acerca del display de 7 segmentos.
La configuración utilizada para este proyecto es la siguiente.
R1= 220Ω R2=4.7KΩ
El pulsador es un dispositivo electrónico que funciona por lo general como un interruptor eléctrico, es decir en su interior tiene dos contactos, al ser pulsado uno, se activará la función inversa de la que en ese momento este realizando.
Cuando un pin del arduino no está conectado, el valor que nos devuelve la función digitalRead() está indeterminado y puede variar aleatoriamente.
Debido a esto y para garantizar que la función nos devuelva un LOW cuando el botón no este oprimido, debemos poner lo que se conoce como una resistencia pull down, en el lado del botón conectado al pin de entrada. Esta resistencia pull down es una resistencia con un valor alto, usaremos una de 4.7 KOhms, conectada al pin de tierra o GND del Arduino.
De esta manera, cuando el botón está abierto, aseguramos tener un valor de 0 Volts o LOW, dado por la resistencia pull down conectada a tierra y cuando el botón esté cerrado, tendremos un valor de 5 Volts o HIGH. La resistencia pull down evitará que se forme un corto circuito entre el botón y el GND.
Abrimos Arduino IDE y escribimos el siguiente código:
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 |
int BotonIncremento=9;//botón de incremento int BotonDecremento=10;//botón de decremento int timeAntirebote=15;//un valor entre 10 y 15 nos da una lectura correcta del estado del botón. int cuenta=0;//lleva la cuenta int EstadoBotonIncremento; int EstadoBotonDecremento; int EstadoBotonAnteriorIncremento; int EstadoBotonAnteriorDecremento; //Función Antirebote boolean antirebote(int pin){//esta función nos va a devolver un valor booleano. int contador=0; boolean estado; //guarda el estado del botón boolean estadoAnterior;//guarda el último estado del botón do { estado=digitalRead(pin); if (estado != estadoAnterior){ contador=0; estadoAnterior = estado; } else{ contador = contador + 1; } delay(1); } while(contador < timeAntirebote); return estado; } void setup(){ pinMode(BotonIncremento,INPUT);//los botones los declaramos como entradas pinMode(BotonDecremento,INPUT); DDRD=B11111110; } void actualizarNumero(int valor){ //puerto 0 libre //puerto 1 al 7 display byte numero[10]={B11111100,B00011000,B01101110,B00111110,B10011010,B10110110,B11110110,B00011100,B11111110,B10011110}; PORTD=numero[valor]; } void loop() { //Botón de Incremento. EstadoBotonIncremento=digitalRead(BotonIncremento);//leemos el botón if((EstadoBotonIncremento !=EstadoBotonAnteriorIncremento) &&(antirebote(BotonIncremento))){//preguntamos si hay cambio respecto al estado anterior y vemos si esta presionado cuenta++;//aumentamos la cuenta if(cuenta>9){//aquí establecí un parámetro para respetar a la cuenta por asi llamarlo. cuenta=0;//en este caso si es mayor que 9 se vaya a cero (0). } } EstadoBotonAnteriorIncremento = EstadoBotonIncremento;//guardamos el estado del botón //Botón de Decremento. EstadoBotonDecremento=digitalRead(BotonDecremento);//leemos el estado del botón if((EstadoBotonDecremento != EstadoBotonAnteriorDecremento)&&(antirebote(BotonDecremento))){ cuenta--;//disminuimos la cuenta if(cuenta<0){ cuenta=9; } } EstadoBotonAnteriorDecremento = EstadoBotonDecremento; actualizarNumero(cuenta); } |
Uno de los problemas o dificultades que presenta el uso de pulsadores es que muchas veces la señal no se comporta de manera limpia como nosotros queremos y esto ocasiona errores en nuestro código; esto pasa porque Arduino ejecuta todo lo que está en la función loop muchas veces, esto lo hace a una velocidad de millones de instrucciones por segundo. Entonces para cuando soltemos el botón no sabemos en qué lugar quedo. Para ello crearemos una función muy importante al momento de trabajar con pulsadores: la función Antirrebote.
En el sketch de este proyecto vamos a hacer uso de la función Antirrebote:
«Una función es un pedazo de código que no está escrito dentro de nuestra sección principal, que sería dentro del loop.»
Una de las maneras de crear un antirrebote es mediante un delay(), sin embargo esta es una manera muy brusca de hacerlo y aun así sigue generando errores.
El siguiente código es una forma concreta de hacer una lectura correcta al presionar el pulsador. Para ello utilizamos el ciclo do-while.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
boolean antirebote(int pin){//esta función nos va a devolver un valor booleano. int contador=0; boolean estado; //guarda el estado del botón boolean estadoAnterior;//guarda el último estado del botón do { estado=digitalRead(pin);//leemos el estado del botón if (estado != estadoAnterior){//comparamos el estado actual con el estado anterior contador=0;//reiniciamos el contador estadoAnterior = estado; } else{ contador = contador + 1;//aumentamos el contador en 1 } delay(1); } while(contador < timeAntirebote); return estado; } |
La variable timeAntirebote es una constante que escribimos al inicio y es el tiempo o la duración que queremos usar para asegurarnos de tener un pulso estable, mientras más grande sea este número más exacto será nuestra función antirrebote(), pero más tiempo necesitaremos para comprobar el estado del pulsador. Un valor entre 10 y 15 nos da una lectura correcta del estado del pulsador.
Otra de las funciones que utilicé en este código fue la de actualizarNumero, en la cual incluí: Registro Port (Puerto) la cual me permitió reducir en gran tamaño el código.
Podemos leer más sobre esto en el siguiente post de Arduino:
Código Utilizado:
1 2 3 4 5 6 7 8 9 |
void setup(){ pinMode(BotonIncremento,INPUT); pinMode(BotonDecremento,INPUT); DDRD=B11111110; } void actualizarNumero(int valor){ byte numero[10]={B11111100,B00011000,B01101110,B00111110,B10011010,B10110110,B11110110,B00011100,B11111110,B10011110}; PORTD=numero[valor]; } |
Dato Curioso:
Los pines 0 y 1 son la transmisión serial (Rx y Tx respectivamente). Si colocamos en void setup(): «Serial.begin()» y si usamos alguno de esos 2 puertos (como usé en el display), no tiendrás comunicación serial. Esto se debe a que ambos pines son utilizados en el proceso de comunicación serial con la computadora.
En este código utilice arrays (en el cual pude almacenar los diversos números del display). Para definirlos se utiliza la expresión:
tipo_de_elemento nombre_del_array[número_de_elementos_del_array];
byte numero [10];
Podemos leer sobre esto en el siguiente post:
Con este código podemos controlar los números en el display aumentándolo o disminuyéndolo según nuestra necesidad.
Veamos algunas imágenes del circuito físico:
Espero que la información suministrada sea de su utilidad y comprensión.
Saludos.
dos PushButton y un Display de 7 segmentos, junto con un buzzer Cuando se presione el pushbutton 1, que en el display aparezca un 1 por 3 segundos y que se oiga un tono en el buzzer, y cuando se presione el pushbutton 2 aparezca un 2 por 3 segundos tambien oyendose el buzzer con otro tono diferente, si ninguno esta presionado que aparece un 0 (cero) en el display y el buzzer en silencio
como puedo hacer esto