En este tutorial, aprenderás a controlar un contador utilizando dos pulsadores y visualizarlo en un display de 7 segmentos de ánodo común de un solo dígito. Cuando presionas el pulsador de incremento, se agrega una unidad a la cuenta. Por otro lado, al presionar el pulsador de decremento, se resta una unidad a la cuenta. Aquí en Panama Hitek ya hemos escrito sobre este tema, pero en este post traemos un enfoque distinto.
Es importante mencionar que la cuenta no puede pasar de 0 a 9 ni viceversa. Esto significa que si llegas al número 9 y presionas nuevamente el pulsador de incremento, el número que se muestra en el display seguirá siendo 9. Del mismo modo, si estás en el número 0 y presionas el pulsador de decremento, tanto la cuenta como el display permanecerán en 0.
En este proyecto, utilizaremos un display de 7 segmentos de cátodo común llamado LMS5161AS, que cuenta con una luz roja y un tamaño de dígito de 0.56».
Para obtener el brillo óptimo del display, es importante colocar una resistencia de 220Ω en cada terminal, en lugar de una sola resistencia en el común (en este caso, el común no llevaría resistencia). Aunque para fines de prueba, este montaje es suficiente. Si deseas obtener más información sobre la utilización del display, te recomendamos revisar el POST «Display de 7 segmentos de un solo dígito» publicado anteriormente.
Lista de Materiales
-
- Arduino UNO Rev.3
- Cable USB tipo A-B
- Display de 7 segmentos de cátodo común (LMS5161AS)
- Resistencia de 220Ω
- 2 Pulsadores
- 2 Resistencias de 10KΩ
- 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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
/* TITULO: Contador ascendente/descendente con display de 7 segmentos. AUTOR: MARIANO DEL CAMPO GARCÍA (@2016) --> 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 controlamos un conteo ascendente/descendente (del 0 al 9 y viceversa) mediante 2 pulsadores, y visualizamos el número en el que estamos a través de un display de 7 segmentos. ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | Terminal "g" del display | [ ]IOREF MISO/12[ ] | Terminal "f" del display | [ ]RST MOSI/11[ ]~| Terminal "e" del display | [ ]3V3 +---+ 10[ ]~| Terminal "d" del display | [ ]5v -| A |- 9[ ]~| Terminal "c" del display | [ ]GND -| R |- 8[ ] | Terminal "b" del display | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | Terminal "a" del display | -| I |- 6[ ]~| PA(I) | [ ]A0 -| N |- 5[ ]~| PA(D) | [ ]A1 -| O |- 4[ ] | | [ ]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) - pulsadorIncremento --> Terminales PA(I) y PB(I). - pulsadorDecremento --> Terminales PA(D) y PB(D). - Conexión PULL-DOWN de los pulsadores. - PB(I) y PB(D) conectados a VCC. - PA(I) y PA(D) conectados a GND a través de una R=10K omhs (cada uno con su resistencia por separado). - El terminal "com" del display conectado a GND a través de una R=220 ohms */ const int pulsadorIncremento = 6; // Pin digital para el pulsador de incremento const int pulsadorDecremento = 5; // Pin digital para el pulsador de decremento const int tiempoAntirrebote = 10; // Variable para almacenar el tiempo antirrebote // Variables necesarias para los cálculos internos int cuenta = 0; int estadoPulsadorIncremento; int estadoPulsadorAnteriorIncremento; int estadoPulsadorDecremento; int estadoPulsadorAnteriorDecremento; // Función antirrebote 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; } // Función del display: Se reciben 7 variables y se asignan a cada una de las salidas void display (int a, int b, int c, int d, int e, int f, int g) { digitalWrite (7,a); digitalWrite (8,b); digitalWrite (9,c); digitalWrite (10,d); digitalWrite (11,e); digitalWrite (12,f); digitalWrite (13,g); } // Función que actualiza el número que aparece en el display de 7 segmentos void actualizarNumero() { switch(cuenta){ case 0: display (1,1,1,1,1,1,0); // Número "0" break; case 1: display (0,1,1,0,0,0,0); // Número "1" break; case 2: display (1,1,0,1,1,0,1); // Número "2" break; case 3: display (1,1,1,1,0,0,1); // Número "3" break; case 4: display (0,1,1,0,0,1,1); // Número "4" break; case 5: display (1,0,1,1,0,1,1); // Número "5" break; case 6: display (1,0,1,1,1,1,1); // Número "6" break; case 7: display (1,1,1,0,0,0,0); // Número "7" break; case 8: display (1,1,1,1,1,1,1); // Número "8" break; case 9: display (1,1,1,0,0,1,1); // Número "9" break; } } void setup() { // Asignación de los pines digitales para el display de 7 segmentos como salidas pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); // Asignación de los pines digitales para los pulsadores como entradas pinMode(pulsadorIncremento, INPUT); pinMode(pulsadorDecremento, INPUT); } void loop() { // Leemos el estado del pulsador de incremento estadoPulsadorIncremento = digitalRead(pulsadorIncremento); // Si hay un cambio en el estado del pulsador de incremento if(estadoPulsadorIncremento != estadoPulsadorAnteriorIncremento) { // y si se ha eliminado ya el rebote del pulsador de incremento if(antirrebote(pulsadorIncremento)) { // Se incrementa la cuenta en una unidad cuenta++; // Si la cuenta es mayor que 9, permanece en 9. if(cuenta > 9) { cuenta = 9; } } } // Actualizamos el estado anterior del pulsador de incremento estadoPulsadorAnteriorIncremento = estadoPulsadorIncremento; // Leemos el estado del pulsador de decremento estadoPulsadorDecremento = digitalRead(pulsadorDecremento); // Si hay un cambio en el estado del pulsador de decremento if(estadoPulsadorDecremento != estadoPulsadorAnteriorDecremento) { // y si se ha eliminado ya el rebote del pulsador de decremento if(antirrebote(pulsadorDecremento)) { // Se decrementa la cuenta en una unidad cuenta--; // Si la cuenta es menor que 0, permanece en 0. if(cuenta < 0) { cuenta = 0; } } } // Actualizamos el estado anterior del pulsador de decremento estadoPulsadorAnteriorDecremento = estadoPulsadorDecremento; // Actualizamos el número que aparece en el display de 7 segmentos actualizarNumero(); } |