PROLOGO.
Quien no dispone en su cajón desastre, de un conjunto de display a LED con dos, tres o cuatro dígitos. Este es el momento de reutilizar dicho display (multiplexado) en un contador cuya aplicación puede mejorar una presentación que tenía pendiente. En este artículo, veremos como aplicar código a un display multiplexado y como debe funcionar.
INICIANDO.
Actualmente es fácil encontrar en Internet códigos sobre pantallas LCD y cómo adaptarlas a distintas aplicaciones. En cambio, son muy pocos los sitios donde se describe cómo utilizar un display de siete segmentos y no digamos, cuando se trata de conjuntos de displays de 2, 3 o 4 dígitos multiplexados. Sin embargo, este dispositivo es bastante común en un gran número de electrodomésticos que podemos desguazar y reutilizar su display. Aquí, con este artículo, voy a intentar rellenar esta laguna.
Este artículo, no se puede considerar como una extensión a uno anterior que puede verse aquí. En aquella ocasión se contemplaba el caso de aplicar el contador de dos dígitos, como contador en una aplicación del propio Arduino que, como ejercicio es esclarecedor y consigue ayudar el interesado en realizar un contador de esas características. En esta ocasión, si bien, puede utilizarse con unos pequeños ajustes, del mismo modo, la diferencia radica en que se visualizará la cuenta obtenida reflejada en un pantalla o display de dos, tres o cuatro dígitos de siete segmentos a LED, mediante la multiplexación de los dígitos utilizados. Esta es la estructura del display múltiple.
Sin más, vamos a entrar en harina, como diría un panadero. La teoría, se puede ver en el mencionado artículo, así que sólo nos preocuparemos de los tipos de pantalla a utilizar, para este caso usaremos un display múltiple (multiplexado). El display que vamos a utilizar aquí, tiene la particularidad en su encapsulado, es decir, que en una pieza ( o encapsulado) nos presenta varios dígitos. Tenemos que tener en cuenta que en algunos casos, las patillas que vienen en el encapsulado, parece que no están bien, ya que hay menos de las que se supone debería tener, esto es debido a que se han dispuesto de forma especial, lo que se llama multiplexado.
EL PROGRAMA.
La cuestión importante radica en el propio programa. El programa consta de 3 partes bien diferenciadas:
- Los displays, definición propia de los segmentos, de como se constituyen los dígitos (estructura interna).
- La asignación y correspondencia de los pines del display, del Arduino y pulsadores, para su aplicación sin posteriores consultas por ese motivo.
- Rutinas, además de la configuración (Set up), dentro del lazo (loop) se encuentran las subrutinas pertenecientes a los pulsadores.
LOS DISPLAYS.
No voy a describir con detalle cómo se construye un display, más arriba se puede ver su estructura. El display que voy a utilizar en este artículo, es el de un display multiplexado, es decir, que sus segmentos están conectados internamente de tal manera que al exterior sólo aparecen (normalmente) los correspondientes a los siete segmentos, más el común de cada uno de los dígitos que lo componen, en el caso de cuatro dígitos, muestra los siete pines de los siete segmentos, más cuatro correspondientes a cada uno de los cuatro dígitos. Estos son, unos ejemplos de encapsulados.
Hay que tener en cuenta que podemos encontrar estos displays en cátodo común y en ánodo común. Si usted, no dispone de un encapsulado de este tipo y está interesado en poner en práctica un contador de los descritos aquí y en cambio, si dispone de los display individuales, tranquilo, usted puede auto construir uno fácilmente, con los dígitos que necesite, vea cómo está construido el de 2 dígitos, de abajo y póngase a su construcción.
Se pueden apreciar con todo detalle, los dos cablecillos blancos que son los comunes de cada dígito, por otra parte los siete hilos rojos, corresponden a los 7 segmentos, los cuales unen entre sí, los pares de segmentos (porque son dos) de cada dígito en paralelo. Recuerde utilizar todos en ánodo o cátodo común.
Circuito de 1 dígito.
El circuito de montaje de encendido de un dígito, es muy simple, se muestra a continuación y debajo el código.
El código es igual de sencillo, se ha incluido el Dp (pin digital point), por ese motivo se ha añadido la octava resistencia. La secuencia enciende y apaga cada segmento y luego una secuencia de los 7 al tiempo. Por cierto, el display es un ánodo común FND507 que tenía a mano.
Encendido de 7 segmentos.
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 |
// Creado por V. García 26.02.2014 // // definimos los 7 segmentos y los asignamos a los pines int A = 2; int B = 3; int C = 4; int D = 5; int E = 6; int F = 7; int G = 8; int Dp = 9; // Configuramos los pines. void setup() { pinMode (A, OUTPUT); pinMode (B, OUTPUT); pinMode (C, OUTPUT); pinMode (D, OUTPUT); pinMode (E, OUTPUT); pinMode (G, OUTPUT); pinMode (F, OUTPUT); pinMode (Dp, OUTPUT); } // Y encendemos los segmentos. void loop() { digitalWrite(A, HIGH); delay(300); digitalWrite(A, LOW); delay(300); digitalWrite(B, HIGH); delay(300); digitalWrite(B, LOW); delay(300); digitalWrite(C, HIGH); delay(300); digitalWrite(C, LOW); delay(300); digitalWrite(D, HIGH); delay(300); digitalWrite(D, LOW); delay(300); digitalWrite(E, HIGH); delay(300); digitalWrite(E, LOW); delay(300); digitalWrite(F, HIGH); delay(300); digitalWrite(F, LOW); delay(300); digitalWrite(G, HIGH); delay(300); digitalWrite(G, LOW); delay(300); digitalWrite(Dp, HIGH); delay(300); digitalWrite(Dp, LOW); delay(600); digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH); digitalWrite(G, HIGH); delay(600); digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW); digitalWrite(G, LOW); delay(600); } |
Por supuesto que este código se puede reducir, sin embargo, he querido mostrarlo de esta forma para que los que se inician puedan seguirlo con mayor facilidad.
Circuito de 2 dígitos.
El circuito se muestra a continuación. Es muy sencillo y no creo necesario entrar a describir cada componente. Dos apuntes importantes:
- Este mismo circuito, con sólo añadir unas resistencias, nos sirve, para el resto de ejemplos que se describen.
- Los pines analógicos del Arduino (A0…A6), pueden tomarse como digitales, siguiendo el orden, A0 = A14; A1 = A15; … A6 = A19.
1er. Ejemplo.
Esta es una primera versión y su correspondiente código realizado con Arduino v.013 y v.023. El display utilizado para este caso es de cátodo común (CC). Como de costumbre, puede seleccionar el código y pegarlo en su editor dándole un nombre para guardarlo y su posterior ejecución.
Contador con dos display de 7 segmentos.
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 |
// // Doble Didplay siete-segmentos LED con botones // // Basado en un trabajo de Natalia Fargasch Norman // // // Common Catode digit 1 pin 10 // Common Catode digit 2 pin 5 // // Modificado y mejorado 11.08.11 // V. García // // Utiliza 2202 bytes con Arduino v0013 // CA1 G F A B // | | | | | | -> pines y segmentos de control // --------- --------- // | A | | A | // F| |B F| |B // |---G---| |---G---| // E| |C E| |C // | D | | D | // --------- --------- // | | | | | | -> pines y segmentos de control // D DP E C CA2 // Composición de los digitos en Segmentos // 0 => -FEDCBA // 1 => ----BC- // 2 => G-ED-BA // 3 => G--DCBA // 4 => GF--CB- // 5 => GF-DC-A // 6 => GFEDC-A // 7 => ----CBA // 8 => GFEDCBA // 9 => GF-DCBA // Pines digitales usados Arduino para encender // los correspondientes segmentos LED del display #define A 2 #define B 3 #define C 4 #define D 5 #define E 6 #define F 7 #define G 8 // Pulsadoes boton conectados a pines 9 y 10 #define BTN1 14 #define BTN2 15 #define led 13 // Pines comunes de cada display de anodo comun #define CA1 9 #define CA2 10 // Pines para A B C D E F G, en secuencia // se pueden usar los que más interesen const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 }; // Segmentos que componen cada número // Para CC. const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111}; // Para CA. descomentar las 2 líneas que siguen. // const byte numbers[10] = { 0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010, // 0b0000010, 0b1111000, 0b0000000, 0b0010000}; int digit1 = 0; int digit2 = 0; void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(F, OUTPUT); pinMode(G, OUTPUT); pinMode(BTN1, INPUT); pinMode(BTN2, INPUT); digitalWrite(BTN1, HIGH); // activa RPA digitalWrite(BTN2, HIGH); // activa RPA pinMode(CA1, OUTPUT); pinMode(CA2, OUTPUT); pinMode(led, OUTPUT); // digit1 = 9; digit2 = 9; } void loop() { // chequea boton1. Incrementa int val1 = digitalRead(BTN1); if (val1 == LOW) { if (digit2 >= 9 && digit1 >= 9) { digit2 = 0; digit1++; digit1 %= 10; if (digit1 >=9) { digit2++; } } else if (digit1 >= 9) { digit2++; digit2 %= 10; } digit1++; digit1 %= 10; delay(10); } // cheque boton2. Decrementa int val2 = digitalRead(BTN2); if (val2 == LOW) { if (digit1 >= 0) { if (digit1 < 0) { digit1 = 0; } digit1--; } if(digit1 < 0) { digit1 = 9; if (digit2 < 0) { digit2 = 0; } digit2--; } if (digit2 < 0) { digit2 = 9; } } // display numero unsigned long startTime = millis(); for (unsigned long elapsed=0; elapsed < 300; elapsed = millis() - startTime) { lightDigit1(numbers[digit1]); delay(5); lightDigit2(numbers[digit2]); delay(5); } } void lightDigit1(byte number) { digitalWrite(CA1, LOW); digitalWrite(CA2, HIGH); lightSegments(number); } void lightDigit2(byte number) { digitalWrite(CA1, HIGH); digitalWrite(CA2, LOW); lightSegments(number); } void lightSegments(byte number) { for (int i = 0; i < 7; i++) { int bit = bitRead(number, i); digitalWrite(segs[i], bit); } } |
2º ejemplo.
En este segundo ejemplo, voy a utilizar otra forma de resolver el programa y además aprovechando que dispongo de un display múltiple de 4 dígitos, haré un contador de dos dígitos.
El circuito electrónico es similar al del ejemplo anterior, con unos pocos cambios, por lo que no lo mostraré aquí. El código se muestra a continuación.
Contador 2 x 7 segmentos y 2 botones.
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 |
// // Doble Didplay siete-segmentos LED con botones // // Basado en un trabajo de Natalia Fargasch Norman // // // Common Catode digit 1 pin 10 // Common Catode digit 2 pin 5 // // Modificado y mejorado 11.08.11 // V. García // // Utiliza 2138 bytes con Arduino v0013 // // CA1 G F A B // | | | | | -> pins and segments they control // --------- --------- // | A | | A | // F| |B F| |B // |---G---| |---G---| // E| |C E| |C // | D | | D | // --------- --------- // | | | | | -> pins and segments they control // D DP E C CA2 // Composición de los digitos en Segmentos // 0 => -FEDCBA // 1 => ----BC- // 2 => G-ED-BA // 3 => G--DCBA // 4 => GF--CB- // 5 => GF-DC-A // 6 => GFEDC-A // 7 => ----CBA // 8 => GFEDCBA // 9 => GF-DCBA // Pines digitales usados Arduino para encender // los correspondientes segmentos LED del display #define A 2 #define B 3 #define C 4 #define D 5 #define E 6 #define F 7 #define G 8 // Pulsadoes boton conectados a pines 9 y 10 #define BTN1 14 #define BTN2 15 #define led 13 // Pines comunes de cada display de anodo comun #define CC1 12 #define CC2 11 int estadobtn1 = 0; int estadobtn2 = 0; int count = 0; // Pines para A B C D E F G, en secuencia // se pueden usar los que más interesen const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 }; // Segmentos que componen cada número const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111}; int digit1 = 0; int digit2 = 0; void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(F, OUTPUT); pinMode(G, OUTPUT); pinMode(BTN1, INPUT); pinMode(BTN2, INPUT); digitalWrite(BTN1, HIGH); // activa RPA digitalWrite(BTN2, HIGH); // activa RPA pinMode(CC1, OUTPUT); pinMode(CC2, OUTPUT); pinMode(led, OUTPUT); // digit1 = 9; digit2 = 9; // para depurar } void loop() { // chequea boton1. Incrementa int val1 = digitalRead(BTN1); if (val1 == LOW) { if (digit1 >= 9 ) { digit1 ++; } if (digit1 > 9) { digit1 = 0; digit2++; if (digit2 > 9) { digit2 = 0; } } } // cheque boton2. Decrementa int val2 = digitalRead(BTN2); if (val2 == LOW) { if (digit1 >= 0) { if (digit1 < 0) { digit1 = 0; } digit1--; } if(digit1 < 0) { digit1 = 9; if (digit2 < 0) { digit2 = 0; } digit2--; } if (digit2 < 0) { digit2 = 9; } } // display numero unsigned long startTime = millis(); for (unsigned long elapsed=0; elapsed < 200; elapsed = millis() - startTime) { lightDigit1(numbers[digit1]); delay(5); lightDigit2(numbers[digit2]); delay(5); } } void lightDigit1(byte number) { digitalWrite(CC1, LOW); digitalWrite(CC2, HIGH); lightSegments(number); } void lightDigit2(byte number) { digitalWrite(CC1, HIGH); digitalWrite(CC2, LOW); lightSegments(number); } void lightSegments(byte number) { for (int i = 0; i < 7; i++) { int bit = bitRead(number, i); digitalWrite(segs[i], bit); } } |
Este ejemplo, muestra un código mejorado al representado en el primer ejemplo. Como puede apreciarse, he utilizado los mismos pines del Arduino, en cada ejemplo. Con esto, trato de minorar los errores de asignación en los distintos listados de código.
Problemas a causa del multiplexado.
El problema que se puede encontrar el programador, frente a una representación por multiplexado, radica en los tiempos de muestreo de cada dígito, por este motivo, recomiendo que se tenga en cuenta, diría, muy en cuenta, no utilizar o minimizar los delay(), ya que éstos, tienden a producir el efecto de «parpadeo» que se aprecia en los dígitos.
En un multiplexado, siempre se producirá un parpadeo, aunque éste sea poco apreciable, cuantos más dígitos se muestren, más evidente se hará. Por ese motivo hay que reducir en lo posible los tiempos de muestreo.
3er. ejemplo.
Voy a presentar el código de un contador de 3 dígitos en un display de 7 segmentos LED. El lector, puede apreciar las pocas diferencias que se presentan en este código. Un punto a tener en en cuenta, se encuentra precisamente en la rutina de asignación de encendido de cada dígito, representados por digit1, digit2 y digit3, con sus fórmulas.
Contador 3 displays de 7 segmentos.
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 |
// // Basado en un trabajo de: Natalia Fargasch Norman // // Modificado y actualizado por Vins el 12.08.11 // // Three seven-segment LED Display with buttons // Common Catode digit 1 // Common Catode digit 2 // CA1 G F A B // | | | | | -> pins and segments they control // --------- --------- // | A | | A | // F| |B F| |B // |---G---| |---G---| // E| |C E| |C // | D | | D | // --------- --------- // | | | | | -> pins and segments they control // D DP E C CA2 // Segments that make each number when lit: // 0 => -FEDCBA // 1 => ----BC- // 2 => G-ED-BA // 3 => G--DCBA // 4 => GF--CB- // 5 => GF-DC-A // 6 => GFEDC-A // 7 => ----CBA // 8 => GFEDCBA // 9 => GF-DCBA // Arduino digital pins used to light up // corresponding segments on the LED display #define A 2 #define B 3 #define C 4 #define D 5 #define E 6 #define F 7 #define G 8 // Pushbuttons connected to pins 9 and 10 #define BTN1 14 #define BTN2 15 #define led 13 // Pins driving common anodes #define CA1 9 #define CA2 10 #define CA3 11 // Pins for A B C D E F G, in sequence const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 }; // Segments that make each number const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111}; int estadobtn1 = 0; int estadobtn2 = 0; int digit1 = 0; int digit2 = 0; int digit3 = 0; int count = 0; int val; int val2; void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(F, OUTPUT); pinMode(G, OUTPUT); pinMode(BTN1, INPUT); pinMode(BTN2, INPUT); pinMode(CA1, OUTPUT); pinMode(CA2, OUTPUT); pinMode(CA3, OUTPUT); digitalWrite(BTN1, HIGH); // activa RPA digitalWrite(BTN2, HIGH); // activa RPA count = 0; } void loop() { // incrementa val = digitalRead(BTN1); // lee el valor de entrada y almacénelo en val if (val != estadobtn1) // el estado de botón ha cambiado! { if (val == LOW) // compruebe si el botón es presionado { count++; count %= 1000; } } estadobtn1=val; // decrementa val = digitalRead(BTN2); // lee el valor de entrada y almacénelo en val if (val != estadobtn2) // el estado de botón ha cambiado! { if (val == LOW) // compruebe si el botón es presionado { if (count == 0) { count=999; } else { count--; } } } estadobtn2=val; // display number digit1=count / 100; digit2=(count - (digit1*100)) / 10; digit3=count % 10; // lightDigit1(numbers[digit1]); delay(2); lightDigit2(numbers[digit2]); delay(2); lightDigit3(numbers[digit3]); delay(2); } void lightDigit1(byte number) { digitalWrite(CA1, LOW); digitalWrite(CA2, HIGH); digitalWrite(CA3, HIGH); lightSegments(number); } void lightDigit2(byte number) { digitalWrite(CA1, HIGH); digitalWrite(CA2, LOW); digitalWrite(CA3, HIGH); lightSegments(number); } void lightDigit3(byte number) { digitalWrite(CA1, HIGH); digitalWrite(CA2, HIGH); digitalWrite(CA3, LOW); lightSegments(number); } void lightSegments(byte number) { for (int i = 0; i < 7; i++) { int bit = bitRead(number, i); digitalWrite(segs[i], bit); } } |
Veamos la importancia que tiene la reducción de lo que yo llamo tiempos muertos, probemos a modificar estas líneas, simplemente, comentemos las que aquí se muestran, compilemos y carguemos el programa en el Arduino:
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 |
// incrementa + + + + val = digitalRead(BTN1); // lee el valor de entrada y almacénalo en val // delay(4); // 10 milisegundos son una buena cantidad de tiempo // val2 = digitalRead(BTN1); // lee la entrada otra vez para comprobar saltos // if (val == val2) // asegurar que conseguimos 2 lecturas constantes // { if (val != estadobtn1) // el estado de botón ha cambiado! { if (val == LOW) <span style="color: #009900;"> // compruebe si el botón es presionado { count++; count %= 1000; } } estadobtn1=val; // } // decrementa - - - - val = digitalRead(BTN2); // lee el valor de entrada y almacenalo en val // delay(4); // 10 milisegundos son una buena cantidad de tiempo // val2 = digitalRead(BTN2); // lee la entrada otra vez para comprobar saltos // if (val == val2) // asegurar que conseguimos 2 lecturas constantes // { if (val != estadobtn2) // el estado de botón ha cambiado! { if (val == LOW) // compruebe si el botón es presionado { if (count == 0) { count=999; } else { count--; } } } estadobtn2=val; // } </span> |
Habrá comprobado que ahora el parpadeo no parece afectar a la normal visión del contador. A esto es, a lo que me refería, con llevar cuidado al programar, evitando rutinas que tomen excesivo tiempo en tareas que retengan el normal desarrollo del microprocesador.
Ahora, puede eliminar de su código, las líneas que ha comentado, guarde el archivo, compile y cargue el programa en el Arduino y finalmente compruebe que la solución es la esperada.
4º ejemplo.
En este ejemplo, vamos a utilizar los cuatro dígitos del encapsulado del display (es uno que tenía de una impresora). En este programa la tarea de multiplexar se dedica a cuatro displays, lo que puede llevar algún problema si no se vigilan los tiempos. Si no utilizamos bien las rutinas, aparecerán dos consecuencias, el parpadeo y una notable bajada de luminosidad de los dígitos.
Veamos el listado del código, estos listados están probados y sin duda funcionan como se espera de ellos.
Contador con 4 displays de 7 segmentos.
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 |
/* * * Esta es la colaboración que a * modificado y mejorado por Vins el 12.08.11 * * Four seven-segment LED Display with two buttons * Un botón incrementa la cuenta. Otro botón decrementa la cuenta. * Common Catode digit 1 pin 10 * Common Catode digit 2 pin 5 // CC1 A F CC3 CC2 B // | | | | | | -> pins and segments they control // --------- --------- --------- --------- // | A | | A | | A | | A | // F| |B F| |B F| |B F| |B // |---G---| |---G---| |---G---| |---G---| // E| |C E| |C E| |C E| |C // | D | | D | | D | | D | // --------- --------- --------- --------- // | | | | | | -> pins and segments they control // E D C G CC4 // Segments that make each number when lit: // 0 => -FEDCBA // 1 => ----BC- // 2 => G-ED-BA // 3 => G--DCBA // 4 => GF--CB- // 5 => GF-DC-A // 6 => GFEDC-A // 7 => ----CBA // 8 => GFEDCBA // 9 => GF-DCBA */ // Arduino digital pins used to light up // corresponding segments on the LED display #define A 2 #define B 3 #define C 4 #define D 5 #define E 6 #define F 7 #define G 8 // Pushbuttons connected to pins 9 and 10 #define BTN1 14 #define BTN2 15 // Pins driving common anodes #define CC1 9 #define CC2 10 #define CC3 11 #define CC4 12 // Pins for A B C D E F G, in sequence const int segs[7] = { 2, 3, 4, 5, 6, 7, 8 }; // Segments that make each number const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111}; int estadobtn1 = 0; int estadobtn2 = 0; int digit1 = 0; int digit2 = 0; int digit3 = 0; int digit4 = 0; int count = 0; int val; int val2; void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(F, OUTPUT); pinMode(G, OUTPUT); pinMode(BTN1, INPUT); pinMode(BTN2, INPUT); digitalWrite(BTN1, HIGH); // activa RPA digitalWrite(BTN2, HIGH); // activa RPA pinMode(CC1, OUTPUT); pinMode(CC2, OUTPUT); pinMode(CC3, OUTPUT); pinMode(CC4, OUTPUT); count = 0; } void loop() { val = digitalRead(BTN1); // lee el valor de entrada y almacénlo en val if (val != estadobtn1) // el estado de botón ha cambiado! { if (val == LOW) // compruebe si el botón es presionado { count++; count %= 10000; } } estadobtn1=val; val = digitalRead(BTN2); // lee el valor de entrada y almacénlo en val if (val != estadobtn2) // el estado de botón ha cambiado! { if (val == LOW) // compruebe si el botón es presionado { if (count == 0) { count=9999; } else { count--; } } estadobtn2=val; } // display number digit1=count / 1000; digit2=(count - (digit1 * 1000)) / 100; digit3=(count - (digit1*1000) - (digit2*100)) / 10; digit4=count % 10; lightDigit1(numbers[digit1]); delay(2); lightDigit2(numbers[digit2]); delay(2); lightDigit3(numbers[digit3]); delay(2); lightDigit4(numbers[digit4]); delay(2); } void lightDigit1(byte number) { digitalWrite(CC1, LOW); digitalWrite(CC2, HIGH); digitalWrite(CC3, HIGH); digitalWrite(CC4, HIGH); lightSegments(number); } void lightDigit2(byte number) { digitalWrite(CC1, HIGH); digitalWrite(CC2, LOW); digitalWrite(CC3, HIGH); digitalWrite(CC4, HIGH); lightSegments(number); } void lightDigit3(byte number) { digitalWrite(CC1, HIGH); digitalWrite(CC2, HIGH); digitalWrite(CC3, LOW); digitalWrite(CC4, HIGH); lightSegments(number); } void lightDigit4(byte number) { digitalWrite(CC1, HIGH); digitalWrite(CC2, HIGH); digitalWrite(CC3, HIGH); digitalWrite(CC4, LOW); lightSegments(number); } void lightSegments(byte number) { for (int i = 0; i < 7; i++) { int bit = bitRead(number, i); digitalWrite(segs[i], bit); } } |
A demás de lo comentado, el punto delicado de este sistema de multiplexado está en la elección correcta de la rutina de control de presentación de dígitos, cuanto menor tiempo se utilice en comparaciones, retardos, etc. más rápido se logrará la activación del dígito a visualizar:
1 2 3 4 5 |
// display number digit1=count / 1000; digit2=(count - (digit1 * 1000)) / 100; digit3=(count - (digit1*1000) - (digit2*100)) / 10; digit4=count % 10; |
Esto es un pequeño vídeo de baja calidad que muestra el contador de 4 dígitos y 7 segmentos a LED, ciertamente no se ve con la calidad que hubiera deseado. También puede descargar una versión, desde aquí.
Con estos ejemplos, he querido llenar un vacío que, había entre tantos ejemplos que se pueden encontrar en diferentes foros de Arduino. Realmente, en los foros se puede encontrar mucha colaboración y en la web, muchos artículos que hablan de contadores, realizados con LCD. Sin embargo, no son muchos los que se inclinan por los displays de siete segmentos a LED. En la mayoría de los que se encuentran teorizan y hablan de como funcionan, pero que lo describan en español, hay pocos. Por ese motivo, me he tomado la tarea de introducir al interesado en este tema de la multiplexación, en este caso, de unos dígitos. Tal vez le pueda ayudar a alguien en su trabajo.
Como siempre, comentarios, criticas y sugerencias para mejorar este artículo, son bienvenidos y apreciados.
Anexo.
2017-09-14 Se modifica un error en listado ‘Contador 4 dígitos 7 segmentos’, decía:
-
void lightDigit3(byte number) {digitalWrite(CA1, HIGH);digitalWrite(CC2, HIGH);digitalWrite(CC3, LOW);digitalWrite(CC4, HIGH);lightSegments(number);}
Por: -
void lightDigit3(byte number) {digitalWrite(CC1, HIGH);digitalWrite(CC2, HIGH);digitalWrite(CC3, LOW);digitalWrite(CC4, HIGH);lightSegments(number);}
Probados los programas con Arduino v.1.6.12 Pruebe a descargar las librerías desde aquí.
Muy buen dia:
Su articulo me ha sido de mucho interes por lo que me he tomado el atrevimiento de escribirles para solicitarles si es posible me provean el digrama de un contador de 4 digitos con pulsador
de antemano muchas gracias.
Saludos
Cesar Perez
Guatemala.
Muchísimas gracias, por la respuesta tan inmediata, me ha quedo interesante, se que para muchas personas estos temas son de mucho interes
y gracias nuevamente por actualizar el tema, solo quisiera hacerte una consulta mas si podrias proporcionarme la lista de materiales que se usan en este proyecto pues cuento con el arduino uno y con los 4 display
disculpa las molestias.
Saludos.
Hola Cesar, me alegra que te sirva el artículo que comentas.
He revisado dicho artículo y lo he actualizado, en él puedes ver el esquemático o mejor dicho el montaje que corresponde a un contador de 4 dígitos de 7 segmentos.
Supongo que te refieres a esto.
Si tienes alguna consulta no dudes en preguntar.
Saludos de Vicente.
Hola he revisado el articulo y me ha gustado mucho. Pero tengo una pregunta he estado queriendo ampliar el contador a 5 dígitos y tengo un error en el conteo se pierde la cuenta al llegar a los 32767 y se distrociona todo me podría dar una ayuda gracias.
Hola Ricardo Torres.
Es extraño lo que me indicas, en primer lugar, que te funcione bien el programa con 5 dígitos (sin parpadeo, no lo mencionas) y el que se ‘pierda la cuenta’, me deja perplejo, te diría que revises las soldaduras y sobre todo procura no dejar al aire los pines que no utilices en los IC, debes darles un nivel H o L según corresponda, para evitar oscilaciones indeseables.
Aunque tarde, esta es la respuesta que se me ocurre.
Saludos.
Eso es debido a que la máxima cuenta que puede almacenar la memoria de un microcontrolador de 8 bits de un numero entero de 8 bits es de -32768 hasta 32.767 en positivo. Si sobre pasa ese numero se crea un desbordamiento y eso es lo que mencionas como «se distorsiona»
Hola Luis Malavé.
Tiene razón no caí en ese detalle.
Gracias por tu colaboración.
Saludos.
hola buenas noches
para daptarlo a un display armado con varios led
como puedo amplificarlo
saludos y gacias
Hola ascec.
Disculpa pero lo que yo entiendo es que has armado un display con diodos LED, por utilizar varios LED en cada segmento, necesitas más corriente y se entiende que necesites amplificar la señal.
Si es a esto a lo que te refieres, tienes un buen trabajo. Primero, necesitarás una fuente de tensión externa al Arduino (una las masas), para alimentar a los displays que has montado y debes utilizar un transistor a cuya base mediante un resistor de 1K aplicarás la salida (que corresponda) de Arduino a ese segmento, el colector a polo positivo mediante un resistor de 10K, el emisor a masa y la salida del colector a la base de un segundo transistor (conectado) exactamente igual al descrito y su colector ahora al segmento que corresponda.
En definitiva, dos transistores por segmento con sus resistores correspondientes, es decir, un buen trabajo. Inténtalo con un segmento y si te funciona como quieres, ya sabes…
Saludos.
Hola¡ De gran ayuda su proyecto señor vicente, soy estudiante de mecatronica y quisiera saber si me prodria ayudar con un problema. El proyecto que quiero realizar se asemeja al contador, pero digamos que quiero que se puedan programar tres tiempos diferentes y entre cada tiempo haya una espera de 30 segundos para que inicie el sigueinte tiempo, basicamente quiero realizar una de estas tipo aplicaciones de ejercicio en los telefonos inteligentes donde tu programas tus tiempos de ejercicio y de descanso. No sé si me explique claramente y si me pueda dar una pista de como hacerlo. De ante mano gracias
Hola Brandon Castillo.
Lo que pides es bastante más complejo que un contador de eventos, pues, necesitas un reloj con el que distribuir los tiempos a petición del usuario y entonces se lee lo que el usuario necesita y partiendo de esos datos se programa los tiempos que se piden.
Es lo mejor que se me ocurre a bote-pronto .
Hola una el artículo es muy interesante ,y quería saber si me ayudan con una duda, como se podría hacer uno en código binario y con 4 botones ?
De antemano muchas gracias
Hola Vicente disculpa la molestia pero estoy viendo que para el Contador 3 Display 7 segmentos el código está mal ya que para compilarlo me salen demaciados errores no sé si te pasa eso a ti y me podrías pasar el código ya compilado por favor .
Hola Antonio.
El código o mejor dicho los códigos que aparecen en el artículo están bien, lo que te puedo decir es que revises todo lo descrito y por último tendrías que mirar las librerías que puede que se hayan actualizado y como consecuencia se produzcan ciertos errores que por otro lado, no son atribuibles al código.
En cuanto al código compilado, lo siento pero no dispongo de dicho archivo.
Saludos y cuídate.
Buena tarde:
acá nuevamente con nuevas dudas, disculpa las molestias, bueno quisiera saber :
1 : los display se tienen que multiplexar?
2 : no se como conectar los claves que me quedan como positivos, al multiplexarlos solo entiendo que queda un negativo por cada display.
muchas gracias de nuevo.
saludos.
Hola Marile Talonia.
Entiendo que te refieres a un contador que cuente en binario, pero no comprendo lo de los 4 botones?
Para un contador binario necesitas modificar el código de modo que se muestren los diferentes estados en el display.
Lo de lo 4 botones no me que claro.
Saludos.
Hola Cesar Perez.
En efecto los display se tiene que multiplexar y los pines libres son el negativo común de cada digito.
Saludos.
La lista de componentes que me preguntas, verás, es muy simple,
en el propio esquemático se aprecian:
4-Transistores NPN (BC547 o BC549)
7-Resistores de 220Ω para los segmentos.
4-Resistores de 4k7Ω
2-Switch NO (pulsadores Normalmente abiertos)
–
Naturalmente que se multiplexan.
En cuanto a las «claves que me quedan como positivos», no entiendo a que te refieres, puedes aclararme esto.
Saludos.
muy agradecido por su respuesta me esta haciendo de gran ayuda.
bien a lo que me refiero es que al multiplexar los displays me quedaran
7 cables rojos (estoy tomando la ilustración que esta en la pagina de los dos display multiplexados)
Saludos.
Cesar Perez
Efectivamente. Veamos, cada dígito tiene siete segmentos útiles + el punto decimal.
Los pines en cada dígito son idénticos, formado por: A B C D E F y G,
Unirás las A de cada dígito quedando una de entrada A desde el Arduino.
Unirás las B de cada dígito quedando una de entrada B desde el Arduino.
Unirás las C de cada dígito quedando una de entrada C desde el Arduino.
Y así hasta la G, por lo tanto dispondrás de 7 entradas desde Arduino.
Los comunes con un resistor a la base de cada transistor NPN o PNP, según se el display de ánodo común o cátodo común.
Espero haber aclarado el tema de tus dudas.
Saludos.
Hola, me gusta mucho el cicuito del 4to ejemplo, seria posible que me enviara el diagrama? y si me puede aclarar que para anodo comun usaria los PNP?
Muchas gracias
Amigo José, considero bastante explicito, el circuito que se muestra en el mismo ejemplo, puede verse el trazado de cada conexión. Las patillas de los transistores NPN, de izquierda a derecha son: emisor – colector – Base.
¿Tienes alguna duda al respecto?
En cuanto al tipo de transistor PNP, se puede utilizar cualquiera de tipo universal, claro que tendrías que respetar las polaridades en cada caso.
Espero haber dado luz a tus preguntas.
Saludos.
muchísimas gracias, saludos.
estaré manos a la obra sigan adelante.
Cesar Perez
Les escribo para agradecerles el tutorial que han colocado sobre los contadores con display de 7 segmentos, he logrado hacer funcionar el contador de dos dígitos y quiero comentarles que me ha servido mucho, como comentario adicional me dio un pequeño error en el código precisamente en esta línea: #define F 7 la cual cambie por esto: const int F = 7; y me ha quedado perfecto.
Quiero aprovechar para consultarles: he pensando hacer los Display con LEDS de manera que me queden mucho mas grandes, como 10cm. x 5cm o incluso hacerlos con cinta de leds los que funcionan con 12v. al parecer arduino trabaja únicamente con 3 a 5V ustedes me podrán orientar la manera para aumentar el voltaje para hacerlo funcionar.
de antemano muchas gracias por su atención, quedo muy agradecido y disculpen las molestias.
Saludos
Cesar Pérez
Guatemala
Hola Cesar, me parece bien tu idea para hacer los segmentos de mayor tamaño, las tiras de LEDs te pueden servir, aunque deberías disponer un plástico traslúcido delante para que se vea uniforme el brillo.
En cuanto a la tensión, te sugiero que utilices unos opto-acopladores como el 4N26 o 4N46 por ejemplo. Esto te protegerá de las diferencias de tensión.
Cada salida de Arduino la conectas a un 4N26.
El pin x de Arduino al pin1 del 4N26, el pin 2 de éste a masa.
El positivo de la fuente de 12V lo conectas al pin 5 del 4N26 y el pin 4 a la tira de LEDs, al otro lado un resistor (que deberás calcular) y de ésta a masa, eso siempre que la corriente sea baja, si es mayor de 25mA, debes intercalar un transistor de la potencia adecuada.
El pin x2 de Arduino al pin1 de otro 4N26, el pin 2 de éste a masa.
Y repites lo mismo para el resto.
Espero haberte dado una posible solución.
Por cierto, lo que me dices respecto al código #define F 7 la cual cambie por esto: const int F = 7; Tienes toda la razón si usas una versión mayor que la v.0023 del IDE de Arduino (por lo visto han hecho algunos cambios).
Saludos.
Con transistores lo puedes hacer..los 5v del arduino lo mandas a la hase de un transistor npn actuvando su colector ese mandandolo a la base de un transistor pnp, en el cual tu en el emisor pones 12v sacados de una fuente externa para que en el colector salgan los 12.. O la otra hacer un amplifucador de voltage con transistores.. Para que pongas 5 del arduino y a la salida te de los 12v
Estimado muchas gracias por el aporte me sirvio de mucho tu aclaracion tenia el mismo error y no podia solucionarlo saludos coordiales
Buenas días Señor Vicente
Le escribo en virtud de que desconozco la electrónica y tengo la necesidad en que me asesore en cual de los sistemas ARDUINO debo utilizar y piezas electrónicas para construir una maquina para llenado de liquido variable de 5 a 3000 mililitros. considerando que debo tener una bomba eléctrica, válvulas eléctricas, sensor de proximidad para colocar el envase y el keypad para determinar los mililitros a llenar.
Me permito agradecer su apoyo y revestirlo obviamente
Hola Carlos
Tu consulta se presta a la realización de todo un proyecto que se puede resolver de distintas formas, atendiendo a los margenes de presupuesto que tengas previsto.
Del presupuesto depende en gran manera los componentes que vayas a utilizar (están bien los descritos, pero faltan) ya que por ejemplo, un display de 7 segmentos de 4 dígitos es económico, sin embargo una pantalla LCD (20×4) no es cara y se presta a una mejor visión de lo que pienses mostrar, mas sencillez y claridad, es solo un ejemplo.
Los dispositivos como sensores, finales de carrera, mensores de volumen, etc. son algo a tener en cuenta, así como los motores, electrovalvulas, pulsadores, etc. son elementos que hay que tener en cuenta, por supuesto, pero debes ver el todo.
Yo usaría un Arduino UNO, un teclado de 4×3 o 4×4 si tienes y una pantalla LCD (Cristal Liquido) de 2 o 4 líneas, según lo que quieras mostrar. Los componentes que mencionas y alguno más esto sería lo básico.
Espero haberte aclarado el tema.
Hola Vicente.
Simplemente agradecerte que dediques parte de tu tiempo para que los demás aprendamos un poco más. Y que lo hagas con esa sencillez y claridad de exposición lo hace mucho más fácil todo.
Gracias.
Gracias a ti Carlos.
hola vicente, estos proyectos me han llevado a intentar algo mas completo que me complico un poco ,mi intencion es guardar valores numericos de dos y tres digitos en la eeprom y mostrarlos en los correspondientes displays de 7 segmentos al presionar el pulsador . para lo cual tengo que almacenar los siguientes valores 200; 404; 278; 281;47 y que al ir presionando el pulsador estos numeros vayan apareciendo en los display.
espero que se entienda cual es mi intencion y puedan ayudarme con el codigo fuente. gracias.
Estimado señor Garcia, su articulo ha sido para mi muy interesante, por lo cual me dirijo a Usted para solicitarles si es posible me indique el digrama de un contador de 4 digitos con pulsador tipo magnetico reed switch, pero con display LCD de 16×2 lineas.
Es para mi mi primer experimento en estas materias y si me resulta lo podre aplicar en mi taller.
Agradeciendo de antemano su tiempo y buena disposicion le saluda y agardece
Jorge Barrios
Hola, muchas gracias por el tutorial me servido de ayuda, soy estudiante de 2do semestre de electronica y desde el 1ro uso Arduino, he mejorado la forma de captar los digitos y una funcion antirebote para los pulsadores, muchas gracias!!! ojala esto sea de ayuda de alguien 🙂
obtener digitos para cada display=
digit1=cuenta / 1000;
digit2=(cuenta / 100) % 10 ;
digit3=(cuenta / 10 ) % 10 ;
digit4=cuenta % 10;
Funcion antirebote para pulsadores =
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==1){ // invierte los valores debido a la resistencias PulluP
estado=0;
}
else{
estado=1;
}
if (estado != estadoAnterior){
contador=0;
estadoAnterior = estado;
}
else{
contador = contador + 1;
}
delayMicroseconds(1000);
}
while(contador < timeAntirebote);
return estado;
}
Gracias Michael.
Y sobre todo gracias por el aporte. No dudes que sea de ayuda para los lectores.
Hola muy bueno tu post, solo tengo una duda, tus displays son de cátodo, para hacer lo mismo pero para displays con ánodo común como seria la configuración??
Hola IrvingD.
Lamento no haber dado respuesta a tu consulta hasta este momento.
Para utilizar displays de ánodo común, debes utilizar los drivers por los que corresponden a estos displays, creo que son difíciles de encontrar.
Repito, disculpa mi retraso en la respuesta.
Saludos.
Hola Vicente.
Interesante tu artículo.
Necesito hacerte una consulta, es muy difícil dar con gente experimentada o foros donde alguien redonda.
Yo tengo 6 displays de cátodo común.
Los gestiono con dos 74hc595, uno maneja los bits positivos para los segmentos y el otro conmuta los cátodos.
Esta muy bien porque lo puedo manejar todo con 3 pins.
El problema esta en ese rastreo/frecuencia.
A partir de 3ms ya se nota un poco la intermitencia, así que uso 1 o 2ms.
Lo que no me mola nada es que comparándolo con un segmento encendido estáticamente pierde bastante brillo.
No digo que se vea mal, puerto pierde.
Cuando está en esa forma de intermitencia, y puenteo la resistencia se ve fantástico.
Su le quitara las resistencias, el miedo que me da, es que si el arduino se para, o en un apagado o encendido se queda un segmento estático, podría quemarse ese led.
Que opinas al respecto?
Me aguanto con la pérdida en el rsstreo? Jejeje
Felicidades por el artículo, es muy chulo y se entiende bien.
Gracias por tus palabras.
Respecto de tu comentario, naturalmente que se quemaría el segmento. Por otro lado yo no quitaría la resistencia, la cual debes ajustar al mínimo, es decir, calcula el valor de modo que el segmento esté encendido y el consumo se ajuste al valor que corresponda.
Tal vez tendrías que utilizar un amplificador de modo que puedas cargar con más corriente las salidas, me refiero a utilizar un ULN2003 o un ULN2803 lo que te dará un margen mayor.
Espero que te sirva esta solución.
Perdona las palabras raras e incoherentes, dichoso móvil jejeje
Hola Vicente:
Muy interesante y explícito el contenido de tu blog. Felicitaciones.
Mira, soy una persona de bastante edad (62) y estoy tratando de ingresar a este fascinante mundo de la programación de arduino y pics. Te comento, Necesito realizar un contador digital de 1 1/2 o 2 dígitos de 0 a 12 solamente, controlado por un pulsador. Es decir, al encender el marcador, encienda el cero y al presionar el pulsador una vez, muestre el 1 . al pulsar otra vez, muestre el 2… y así hasta el 12.
Luego al pulsar otra vez, vuelva a mostrar el cero para empezar nuevamente.
Te cuento que tengo un programador para pics y también tengo una tarjeta arduíno pro micro. que puedo utilizar para dicho contador.
La consulta es la siguiente: Crees que modificando alguno de tus programas, me serviría para este fin? Me ayudarías con esto? Saludos
Hola Alberto.
Una vez más pido disculpas por el retraso en dar respuesta a alguna de las consultas que me llegan, es lamentable pero no creo tener bastantes argumentos para hacer otra cosa que disculparme.
Respecto a tu ya vieja consulta, El código estaría muy parecido al del primer ejemplo el de dos dígitos. al cual le aplicarías un comparador para que al llegar la cuenta al nivel que deseas, ponga a 0 los dos dígitos y vuelta a empezar.
Saludos.
Buenas noches.
Muy buen aporte para mi ya que así podre empezar a conocer acerca de estas materias, pero me gustaría pedir una ayuda sobre un programa que sense temperatura con el lm35 y 2 de 7 segmentos. Muchas gracias
Amigo Fabian, gracias por tus palabras, la verdad es que hago esto por ese motivo, para que la gente que le interese el tema, tenga una ayuda y pueda mejorar sus conocimientos y desarrolle su ingenio.
Por lo que me dices del termómetro con el LM35, he publicado hoy mismo un artículo que habla precisamente de esto, sólo que utiliza una pantalla de un viejo Nokia que puedes cambiar por una pantalla de las normales como la que se muestra, ya que son económicas y dan una vista muy buena al producto.
Espero te sirva.
Muy buen articulo. Estoy detras de hacer un termostato de temperatura para una incubadora de huevos de gallina usando 3 o 4 displays de 7 segmentos y tus ejemplos me seran de mucha ayuda.
Hola Arberto, respondo a tu consulta.
He leído tu propuesta y mi respuesta está condicionada (no creo necesario utilizar un PIC o un Arduino, para realizar el contador que pretendes). Otra cosa sería que a ese contador le dieras otras aplicaciones, en cuyo caso, ya estaría justificado el uso de un micro, pero no veo su necesidad en este caso concreto.
>Te cuento que tengo un programador para pics y también tengo una tarjeta arduíno pro micro. que puedo utilizar para dicho contador.
> La consulta es la siguiente: Crees que modificando alguno de tus programas, me serviría para este fin? Me ayudarías con esto?
Por lo tanto, te propongo que utilices unos circuitos integrado de la familia CMOS, conocidos por CD4000. En ese caso estaría encantado en ayudarte, si así lo consideras.
La respuesta es tuya, ya me comentas.
Saludos Vicente.
Buenos días Vicente,
Muchas gracias por tu tiempo, mi electrónica es muy básica y de programación ni te digo, pero quisiera compilar este código para pasarlo a un arduino y hacer un contador marcha atrás para la actividad de airsoft pero al pasarlo al arduino me da este error, por favor me puedes ayudar
Gracias
‘F’ was not detected in this scope
sketch_may04a.ino: In function ‘void setup()’:
sketch_may04a:78: error: ‘F’ was not declared in this scope
sketch_may04a.ino: In function ‘void lightDigit3(byte)’:
sketch_may04a:150: error: ‘CA1’ was not declared in this scope
Saludos Miguel
Por lo que me indicas, tienes más de un problema, por supuesto que el código completo ayudaría, sin embargo, por lo que veo no has declarado la variable ‘F’ en la función setup(), así como la ‘CA1’ en su correspondiente función.
Por ese motivo, el listado del código sería necesario.
Espero tu respuesta.
Saludos.
Muchas gracias, este fin de semana me pongo a ello a ver si lo consigo
Tengo una duda que harias para habilitar los display si usaras unicamente una salida, para multiplexiar los display, usando transistores. para habilitar cada display
Hola Alan
No estoy seguro de lo q
Hola Alan
No estoy seguro de lo que quieres decir.
Trata de describir más tu consulta.
Saludos.
Hola! estoy haciendo un blog en el que meteré parte de progamación en C y estoy buscando algún plugin para que WordPress lo muestre «bonito».
¿Cuál estás utilizando tú?
Muchas gracias!
Hola Emilio.
No se que pluguin se encarga de esto, pero yo lo implementé en el archivo del propio blog.
Me explico. En el blog vas a Temas/Personalizar/Editar y te abrirá un archivo que suele ser «style.css», busca la línea de ‘pre’ y cuando termine esa función (pre{…}), le añades el código de abajo, lo guardas y supongo que dispondrás de lo que me pides.
pre {background-color: #f6f6f6; background-position: initial initial; background-repeat: initial initial; border: 1px dashed #cccccc; font-family: arial; font-size: 12px; height: 200px; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 96%;}
Ya me dices si te funciona.
Saludos.
Muchas gracias por tu rápida respuesta!
Al final encontré uno que me iba bien, es éste: http://gehrcke.de/wp-geshi-highlight/
Enhorabuena por tu blog 😉
Buenos días, excelente blog. !!!FELICITACIONES!!!
Aprovechando las características y el manejo de los displays de 7 segmentos con arduino, me surgió la idea de hacer un reloj digital 12 horas. Si en tus archivos tienes el código y la pertinente información, te agradecería me lo enviaras.
!!!EXITOS!!!
Buenos días, excelente blog. !!!FELICITACIONES!!!
Aprovechando las características y el manejo de los displays de 7 segmentos con arduino, me surgió la idea de hacer un reloj digital 12 horas. Si en tus archivos tienes el código y la pertinente información, te agradecería me lo enviaras.
!!!EXITOS!!!
ola que tal sabes que estube elaborando el contador de 4 digitos y al simularlo los displays me parpadean ¿como puedo solucionar eso?
Hola a todos. No es exactamente el tema de este enlace, pero está muy vinculado. Llevo varios días buscando por internet, y no encuentro lo que necesito.
Quiero montar de forma económica un display digital para que el público vea las marcas de atletismo (saltos, lanzamientos, etc.). Somos una Federación de Atletismo que no tiene dinero para comprar uno.
He pensado en un panel de cuatro dígitos, hecho con tiras de leds, y supongo que con registros de desplazamiento, ó decodificadores de siete segmentos, que pueda conectarse simplemente a las mismas patillas de un display de una calculadora.
El que esté operando el panel, simplemente coloca la cifra con el teclado de la calculadora, y ya está.
¿Creéis que es viable? ¿Alguien ha visto algo parecido por algún sitio?
Agradecería mucho vuestra ayuda. Un saludo.
Hola Adolfo.
Tengo colgado desde haced muchos años, un artículo que puede ayudarte o acaso orientarte en la creación del panel deportivo, aunque está dirigido a dispositivos TTL y no mediante micros, en él se habla de un panel para baloncesto, igual te puede servir, el siguiente es el enlace que te llevará al artículo:
http://hispavila.com/3ds/tutores/marcador_digital_deportivo.htm
Espero te sirva.
Saludos V. García.
Hola Vicente necesito realizar un Cartel indicador de cambio de jugadores de fútbol, básicamente serian dos contadores con dos display a 7 segmentos mi consulta es que me orientes como hacer funcionar a ambos con una placa arduino uno
Esperando una respuesta te saludo atentamente
Hola Julio.
En principio debes plantearte si quieres que ambos Carteles estén sean independientes.
En ese caso, simplemente usarías un Arduino Mini en cada uno. Entonces, tendrías que programar cada uno con un simple programa como el descrito en este mismo artículo, Contador con dos display de 7 segmentos, mejorando algunos aspectos. Como la función de parpadeo cuando muestra los dígitos, un par de pulsadores, uno en cada lado para manejar cada dígito con un contador y un tercer pulsador para el parpadeo.
Creo que estaría dentro de lo posible.
Es mi opinión.
hola Vicente la idea era utilizar un solo micro o arduino uno. De hacerlo independiente lo hago como vos dices el tema era bajar los costos
Atentamente
Hola Julio.
Si es por bajar costos, te diría que utilices un interruptor por cada número en cada lado del panel, de modo que los del lado izquierdo indiquen las centenas y del lado de la derecha las unidades. Más sencillo no es posible. Pero claro es muy rudimentario.
Saludos.
Excelente articulo, tome como base el ejemplo 4 para un trabajo que estoy realizando, soy aficionado a la tematica les comparto mi sitio personal por si lo quieren ver.
74HC595
saludos!
Hola, me gustaría saber si me puedes dar indicaciones donde puedo añadir un delay al botón de decremento de numero, darle un delay de 3 segundos por ejemplo … Gracias
Hola Vicente
Gracias por tu respuesta y disculpa por no haber respondido antes(no creí que me contestarías). Con respecto a mi consulta, te cuento. Yo pertenezco a un «Club de Rayuela» con el cual realizamos campeonatos a nivel local con otros clubes.Y mi idea es hacer un marcador digital de tantos o puntos, para 2 equipos (Local-Visita) y mi idea es hacerlo inalámbrico para lo cual cuento con un enlace por radio frecuencia a 15Mhz. (emisor/receptor) de 4 botones. Entonces sigo con la idea de hacerlo con estas tarjetas arduino pro micro, y los dígitos, de tiras led con uln2003. Te cuento que entiendo de electrónica lo suficiente como para realizar esta tarea. Lo que me complica, es la parte de programación para hacer que estos marcadores cuenten solo hasta 12 y al pulsar otra vez, vuelvan a 0.Ya que los partidos se juegan a 12 «canchas» y a 12 puntos por cancha. Por eso, se me ocurre que al modificar algunas líneas de tu programa, «CONTADOR 2 X 7 SEGMENTOS Y 2 BOTONES.»pueda lograr lo que deseo. Espero no haberte aburrido y que me ayudes, si tu tiempo lo permite. Gracias de antemano y felicitaciones por toda la ayuda que prestas a los que seguimos tus aportes. Saludos.
Hola amigo Alberto, disculpa la tardanza.
El tema de que el contador alcance hasta una determinada cuenta, es una cuestión de poner un comparador, es decir, un if, de modo que si alcanza la cuenta XX ponga a 0 el contador.
Por ejemplo:
if (digit2 >= 1 && digit1 >= 2) {
digit2 = 0;
digit1 = 0;
...
Espero te sirva la idea.
Hola Vicente:
Gracias por contestar y por la respuesta; es lo que imaginaba pero no sabía como hacerlo. Ahora me voy a quemar la cabeza Para hacer que al encender el contador solo encienda el dígito1 en 0 y al llegar a 10, encienda el dígito2 y al pasar de 12, se apague el dígito2 y empiece el ciclo nuevamente. Ya que pienso ocupar solamente los segmentos B y C del dígito2. Saludos amigo Vicente y muchas gracias.
Hola Vicente:
Muy interesante el contenido de tu blog. Felicitaciones.
Te comento, Necesito realizar un candado digital con un display de 4 digitos 7 segmentos de 0 a 9 solamente, controlado por cuatro pulsadores, uno por cada digito. Es decir, al encender el marcador, encienda el cero y al presionar cada pulsador una vez, muestre el 1 . al pulsar otra vez, muestre el 2… y así hasta el 9 por separado. No se si puedas ayudarme con el codigo.
Hola Felix.
En este momento estoy liado con cambios den la web/blog y no puedo atender todo lo que me gusta como de costumbre. De todos modos, descuida que lo tendré en cuenta.
Saludos.
Hola Vicente:
Al compilar el programa del contador de 4 display de 7 segmentos me genera este error ‘lt’ was not declared in this scope for (int i = 0; i < 7; i++) muchas gracias por la ayuda.
Hola Alvaro.
Te sugiero que revises tus librerías y sobre todo el archivo «Preferences» que dependiendo de la instalación de tu IDE de Arduino, lo debes tener en «C:\Documents and Settings\Admin\Datos de programa\Arduino». Revisa este punto, para saber donde lo tienes pulsa ‘Cntrl+Coma’ o en File/Preferences.
Espero haber aclarado tu problema.
Saludos Vicente.
HHOLA BUENAS TARDES MUY BUENA INFORMACION TENGO UN EJERCICIO QUE NO PUEDO RESOLVER ME PODRIAS AYUDAR DE ANTEMANO GRACIAS.
SI EL BIT 0 DEL PUERTO A ES 0, POR UN DISPLAY SE VISUALIZA UN CONTADOR DESCENDENTE DURANTE 2 SEGUNDOS,SI ES 1,POR EL DISPLAY SE VISUALIZARA UN CONTADOR ASCENDENTE DURANTE DOS SEGUNDOS
Hola Edgar.
¿Podrías describir un poco más lo que necesitas? No llego a entender si tienes dos contadores o sólo uno al que se suman o descuentan cuentas.
Espero tu respuesta.
Saludos.
Hola buenas tardes es muy interesante tu proyecto
pero al cargar el programa me aparece error
es decir no me compila el programa
creo que es por que utilizaste una libreria especial
por favor ayudame
me interesa desarrollar este proyecto
gracias!!
Hola David.
Deberías concretar algo más tu petición, no me estás indicando a que programa te refieres, puede ser el de un display, dos, tres o cuatro dígitos.
Para el código, utilice la ver. 0013 de Arduino, sin ninguna librería especial, quiero suponer las versiones posteriores no han cambiado las librería digamos estándar y por lo tanto cabe esperar que tengas algún gazapo en tu código.
De todas formas, tampoco me indicas que error te muestra, puedo ayudarte, si tu te dejas ayudar, así que, describe lo que te ocurre, explica lo que haces. ¡¡Será por tiempo!!
Saludos Vicente.
Buenas tardes soy nuevo en esto y me gustaria aclarar una pequeña duda que tengo, como se que transistor (NPN o PNP) tengo que utilizar para un 7 segmentos ya sea de catodo o anodo comun. Muchas gracias
Hola Vicente muchísimo gusto, el tutorial excelente te felicito por el y de antemano muchos éxitos, estoy trabajando en un reloj digital pegado a un RTC y ocupo usar 6 display para desplegar hora, minutos y segundos, el programa ya lo tengo casi terminado y hasta ahorita horas y minutos funcionan perfecto pero me esta costando un poco con el delay de los otros 2 display, se que el problema lo tengo con este código:
// display number
digit1=count / 1000;
digit2=(count – (digit1 * 1000)) / 100;
digit3=(count – (digit1*1000) – (digit2*100)) / 10;
digit4=count % 10;
digit5=??
digit6=??
sera posible que me ayudaras con esto, te agradezco de antemano.
Hola Hector Guzman.
Gracias por tus palabras.
Respecto de tu consulta, creo que no tengo una respuesta que pueda servirte, ya que los tiempos del código están previstos para sólo cuatro dígitos y los delay() realmente son un estorbo.
Considera utilizar otro tipo de código, y ayudándote en algún circuito integrado de apoyo. Prueba con una librería, creo recordar que era dcf77.h o con esta otra SevSeg.h que parece más apropiada.
Lamento no disponer de tiempo para una ayuda mayor.
Espero te pueda servir.
hola Vicente soy adrian estudio TSU en gutierrez zamora ver en la UTGZ tengo un problema con un proyecto de progrsmacion me podrias ayudar
Hola Adrián dime como te podría ayudar?
Hola Vicente ayudar soy nuevo en arduino, y estoy haciendo el contador de 0 hasta el 999, pero en la programacion de arduino me sale error, copie el que esta en la pagina y me dice esto
Arduino:1.6.1 (Windows 7), Placa:»Arduino Uno»
Opciones de compilación cambiadas, reconstruyendo todo
sketch_apr13c.ino: In function ‘void setup()’:
sketch_apr13c.ino:75:6: error: redefinition of ‘void setup()’
sketch_apr13c.ino:1:6: error: ‘void setup()’ previously defined here
sketch_apr13c.ino: In function ‘void loop()’:
sketch_apr13c.ino:92:6: error: redefinition of ‘void loop()’
sketch_apr13c.ino:6:6: error: ‘void loop()’ previously defined here
Error de compilación
This report would have more information with
«Show verbose output during compilation»
activala desde Archivo > Preferencias
Me podrian ayudar se los agradeceria
Que tal Vicente, muchas gracias por ayudarnos con los ejemplos que pones en tu blog,
Mi consulta es porque necesito hacer un timer descendente desde 4 minutos hasta 0, de 3 digitos con display de 7 segmentos,mi duda es como descontar de a 1 segundo,
Desde ya muchas gracias
Hola Gustavo.
Disculpa el retraso en la respuesta.
Para lo que tu pretendes, tienes que retocar el código y donde dice
Tienes que poner
En todo caso tienes que utilizar la función millis en lugar de delay(), en una rutina que te cuente los 60 segundos aproximadamente y de esa forma intentar obtener lo que pretendes.
Un saludo.
Hola buenas tardes, tengo una pregunta el codigo para el contador de 4 digitos se puede adecuar para hacerlo de 5 digitos? espero que me responda ya hice varias pruebas y no obtengo buenos resultados.
saludos
Hola Luis David.
Creo que ya hemos comentado esto por facebook, de todas formas te diré que añadir uno o más dígitos no es sencillo ya que los tiempos de presentación son el cuello de botella de este sistema.
De todas formas, mira de probar este código, por ver si te funciona.
Pruebalo y me dices que tal te va.
Hola buenas tardes soy una persona nueva en el manejo de arduino pero tengo una necesidad relacionada con los display de 7 segmentos y varios dígitos y la verdad me gustaria que me orientaran, haber si se puede resolver, es lo siguiente tengo un dato ya escrito en un display de 7 segmentos en un equipo pero necesito saber si con arduino se puede hacer la lectura de lo que está escrito en ese display cada vez que cambie poderlo leer y guardar ese dato para después sumarlo e imprimirlo en pantalla y en papel, les agradezco si me pueden ayudar con el tema. muchas gracias por su valiosa ayuda.
Hola Edgar Delgado.
Tu pregunta me tiene un poco confundido. Porque me dices que tienes
un dato (valor) en un dígito de 7 segmentos
, supongo que te refieres a un dispositivo con un display de varios dígitos y quieres leer ese valor para operar con él y mostrar el resultado en una «pantalla».Si es así, tendrías que poder extraer las señales que controlan el driver del display y de algún modo guardar dicho valor en un buffer al que le sumarías el segundo valor y el resultado enviarlo al controlador de la «pantalla». Para eso tendrás que usar variables para cada valor leído y sumarlo.
Siento el retraso en la respuesta.
ya resolvi el problema amigo, gracias!! ahora lo que requiero hacer es un contador de 0000 a 2399, que cuando llegue a 2400 cambie a 0000 y que cada 60 segundos cambie el 3er digito, por ejemplo:
cuando llegue a 1259 cambie a 1300, ya intente modificar el programa pero no entiendo, a ver si me ayudas un poco, gracias!
de 0000 a 2359** perdon por el error, espero y puedas ayudarme!
gracias!
Hola Marco Trevino. Aunque con retraso.
Me alegra que ya te funcione. En cuanto a lo que te propones es una cuestión de utilizar un comparador como puede ser un if, de modo que cuando la cuenta llegue al punto deseado la respuesta sea:
digit1=0, digit2=0, digit3=0 y digit4=0.
Espero que te sirva la respuesta.
https://www.youtube.com/watch?v=ERdvQi1r5Kg
hola antes de nada excelente publicación estuve buscando por mas de 4 horas y este es por mucho la mejor que encontre y espero me puedas ayudar con este problema e copiado el codigo y lo e subido a mi arduino siguiendo el diagrama de 4 digitos pero no me funciona como en el video sino que solo cambian del 0 despues el nueve y des pues el 8 y eso es en todos los digitos despues solo se queda cambiando del 8 al 9
Hola JAVIER AMEZCUA.
Por lo que me cuentas, estoy seguro que tienes un error en el cableado.
Digo que es el cableado porque el programa está comprobado y funciona bien, por lo tanto si lo has subido a tu Arduino sin problemas, no queda otra posibilidad, repasa bien todos los cables y asegúrate que los transistores están bien y bien montados.
Espero que te funcione al corregir los fallos, en todo caso ya me cuentas como te va.
Saludos.
hola antes de nada gracias por contestar.
la verdad no creo que sea el cableado ya lo revise bien, el arduino que tengo es el Arduino Mega 2560 y como seme hacia extraño lo probe en mi arduino uno y ahi funciona muy bien lo unico malo es la cantidad de conecciones que se le pueden hacer al arduino uno, un compañero me dice que puede cer que el comando millis no funcione en arduino mega pero no se si sea cierto.
si fuera cierto habria alguna manera de hacer funcionar el codigo en el arduino mega? es que yo siento que si lo nesesario para compilarlo bien
Hola JAVIER AMEZCUA.
No tengo información sobre el Arduino Mega 2560 y su comportamiento con el tema de los millis(), tendrías que consultar en el foro de Arduino.
Tal vez sea una cuestión de las librerías, en algunas ocasiones he observado un comportamiento extraño, al usar un viejo programa que siempre funcionó y en la actualidad, al cambiar la versión del IDE y las librerías, se produce un quebranto en los comportamientos del programa en concreto, si ya se que suena raro, pero no alcanzo a comprender porque este extraño comportamiento, también puede ser debido al cambio de S.O., ante usaba el XP y actualmente el Windows 10 (otro que tal).
De todas formas trato de encontrar una solución a estos comportamientos no adecuados.
Siento no poder ayudarte de otra forma, por el momento.
Saludos.
Buenas. Me pasa exactamente lo mismo. ¿Conseguiste arreglarlo? ¿Da igual el transistor que se monte mientras sea NPN? Yo soy ingeniero técnico pero mecánico, de construcciones maquinarias. Y sé lo mínimo de todo esto, prácticamente nada. Este verano me pondré las pilas, espero. Por favor, me urge para exponerlo en una feria, un contador digital hecho por los alumnos.
Mil gracias
Hola Carmen.
Sigo buscando un motivo por el que no os funciona y no alcanzo a comprender que es lo que ocurre.
Voy a probar una vez más el programa tal cual aparece en el artículo, por eliminar posibilidades de error por eliminación.
Ya os tendré informados, espero encontrar el motivo.
Saludos.
cordial saludo:
por favor me orienta con el siguiente ejercicio:
representar un número binario de 8 bits leído en el puerto b, como un número positivo o negativo, de acuerdo a la tecnica de representacion numerica, signo y magnitud. muchas gracias
Porque se empeñan en hacer todo con arduino ??????
La verdad si esperan ser ingenieros electronicos/electricos o sin solo aficionados de la electronica
se deberia hacer uno de diferentes herramientas (aestables , monoestables , 555) , no simplemente
agarrar un arduino y meter un codigo que puede deducir hasta un niño de 6 años.
Perdon pero estoy cansado de ver tanto arduino en donde se supone que la gente tiene un manejo mediano de la electronica
Hola Francisco.
Me parece muy bien su punto de vista, sin duda, habrá observado que hay otras formas de hacer que funcione un display asumiendo que es un contador/descontador, mediante circuitos estándar (TTL, CMOS), y funcionan adecuadamente.
Sin embargo, usted quizás si siquiera sospecha el motivo de porque los técnicos se empeñan en utilizar microcontroladores o incluso microprocesadores para realizar aquí contadores, allá displays con funciones en 2D y 3D, por poner dos ejemplos.
Le diré que esto es debido a la flexibilidad en el manejo. De pronto, con un Arduino (por poner su ejemplo), y un mini código, se muestra un contador, y con unas pocas líneas, se ha convertido en un detector de intrusos y le envía por e-mail un aviso de que su casa esta siendo asaltada, o puede que con el cambio de unas líneas pueda manejar un sistema de luces y controlar todos los utensilios de su casa.
Dígame usted, cuantos cableados necesitaría modificar para pasar de un contador a un control de proximidad, seguro que deberá realizar un circuito impreso diferente para cada propuesta y también sabe el costo que esto significa, ya no le digo que cómo haría para enviar un e-mail con el aviso.
Es sólo a modo de ejemplo, recuerde, siempre hay un buen motivo para mejorar las cosas y eso se llama progreso.
Espero haber aclarado sin ánimo de ofender, un tanto su punto de vista.
Saludos.
amigo vicente necesito una ayuda tener una progrmacion de arduino de 0 al 9 pero quiero que cuando desconecte el arduino se quede en el numero que lo desconecte me entiende¡ osea que no se reinicie a 0 cuando se vuelva concentar sin boton
Hola Nikko.
Lo que pides es algo más complejo de lo que piensas. Sin embargo, tienes dos modo de lograrlo, 1) alimenta sólo el Atmega con un batería y de esta forma puede que te permita una mediana solución.
Y 2), en este caso es más complejo como digo, necesitas una memoria adicional y su programación, de manera que esté guardando de continuo el valor actual de la cuenta, por lo tanto, tu mismo.
Saludos.
Estimado Vicente, muchas gracias por tu blog, este me a ayudado mucho aprendiendo sobre arduinos y a como programarlos,
te explico un poco lo que quiero hacer y me gustaria mucho que me ayudes un poco o mucho…
estoy haciendo un flipper o pinball (flipper le llamamos en chile) y estoy buscando informacion de cómo hacer el tablero de puntuación con arduino R uno (o cualquier otro) y quiero hacer lo siguiente:
– Puntuacion
la puntuacion sera en 3 partes basicas de un pinball con 3 candidades de puntos diferentes
Basicos tablero – 100 puntos
Bumper – 1000
Dianas – 500
– Bolas en juego
Arduino debe saber cuantas bolas quedan en la partida y si se añade bola extra
3 marcadores fijos. que iluminare para que ponga el nombre del pinball
1 Marcador para puntos
1 Bola en juego
1 Creditos
no sé si puedas ayudarme con esto, tengo conocimientos en electrónica, por lo que necesitaria saber que componentes necesito para esto… si tiene tiempo y quiere ayudarme, expondria mi trabajo en su blog con fotos detalles y los creditos a usted….
Saludos
David
Hola David.
Es un proyecto atractivo, aunque tiene su complejidad, si te atreves.
Tiene sus problemas el hacer este tipo de programas conlleva mucho cuidado con los espúreos
se te cuelan por todas partes, más por el tipo de contactos de los flippers y demás.
– Bolas en juego
Arduino debe saber cuantas bolas quedan en la partida y si se añade bola extra
Este punto es el más sencillo; un contador regresivo y un comparador con el marcador de puntos,
cuando coincida lo previsto, se suma uno, en caso contrario al llegar a 0, se acaba la partida.
Repito los problemas quizás te surtan con los contactos de Bumpers y Dianas. Desparasita con filtros
estos puntos.
Espero te sirva de orientación.
Hola Vicente, como estas? hace un tiempo te escribí ya que quería hacer un proyecto de flipper, o pinball como le llaman en otros lugares, bueno, ya tengo la programación necesaria y funciona bien!!! pero tengo un problema..
Quiero agregarle un display 8 digitos de 7 segmentos, (max7219) puedes buscarlo como ( 7 segment display max7219)
y no e encontrado la forma de hacerlo funcionar con la programacion..
te dejo mi correo electronico, envíame un mail y te adjunto la programacion y el tipo de display que quiero agregarle, como te mencioné anteriormente, si me ayudas con esto puedo enviarte fotos y detalles para que puedas mostrarlo en tu blog y así ayudar a otras personas que posiblemente esten intentando hacer lo mismo…
David.alex1980@gmail.com
espero su correo.
David
Hola David.
Es cierto hace un tiempo que como dices, me hiciste una consulta al respecto. No se si te respondí.
Me alegro que ya tengas la programación, es un buen medio de lograr lo que pretendes. En cuanto a agregarle un display como indicas (max7219), el cual como habrás visto en la hojas de datos dispone de las entradas y salidas requeridas para tu caso. Ten en cuenta que la patilla 12 (CS, carga ) ha de estar a nivel 0V, para que se produzca la carga.
Por otra parte, si consideras a bien, puedes enviarme tu documentación y sin dudar lo expondré en este lugar indicando tu autoría.
Te adjunto una dirección en la que puedes indagar como conectar los displays y el max7219. No he tenido la ocasión de utilizar este chip y por lo tanto no tengo experiencia al respecto.
https://www.pjrc.com/teensy/td_libs_LedControl.html
Saludos.
Cuales son los transistores que se utilizan en estos circuitos?
Hola Ariel.
Normalmente son de propósito general NPN, a veces depende de los displays que uses si son C.C. o A.C.
Saludos.
me sale un error en el codigo de del contador de dos digitos con botones
D:\Usuario\Music\sketch_sep13a\sketch_sep13a.ino:46:0: warning: «F» redefined
#define F 7
^
In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:231:0,
from sketch\sketch_sep13a.ino.cpp:1:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:0: note: this is the location of the previous definition
#define F(string_literal) (reinterpret_cast(PSTR(string_literal)))
^
necesito ayuda urgente que hago
D:\Usuario\Music\sketch_sep13a\sketch_sep13a.ino:39:0: warning: «F» redefined
#define F 7
^
In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:231:0,
from sketch\sketch_sep13a.ino.cpp:1:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:38:0: note: this is the location of the previous definition
#define F(string_literal) (reinterpret_cast(PSTR(string_literal)))
^
Hola juan diego mesa sanchez.
Por lo que me indicas, tienes una re-definición del segmento F. Te recomiendo que revises el boceto porque los indicios van por ese camino, es decir, en algún lugar del programa se produce una definición por segunda vez de este segmento.
Actualiza las librerías de Arduino por asegurarte que todo es correcto.
Espero que obtengas la solución.
Saludos.
Hola.
Aunque soy muy manitas tengo que reconocer que la electrónica y la programación me superan.
Soy jugador de airsoft y para nuestras partidas necesitamos un cronómetro de cuenta atrás y no tengo ni idea de como hacerlo. Describo lo que necesito:
Debe tener dos displays donde se muestre la cuenta atrás para cada equipo. Que se puedan programar ambos cronómetros con hasta 99 minutos.
Debe tener dos pulsadores grandes, uno para cada equipo, con led indicador para cada botón (jugamos con guantes de protección y no pueden ser pequeños).
Debe tener otro botón grande para iniciar ambos cronómetros a la vez.
Este deberá ser el funcionamiento:
Al llegar el primer jugador pulsa el botón de inicio poniendo en marcha ambos cronómetros y luego pulsa el botón de su equipo. En ese momento su cronómetro para y el led se enciende para indicar el equipo que tiene detenida la cuenta atrás. El cronómetro del equipo contrario continúa funcionando.
Al llegar un jugador contrario pulsa el botón de su equipo y detiene su cronómetro encendiendo su led y pone el cronómetro contrario en funcionamiento apagando el led del otro equipo.
Así sucesivamente hasta que uno de los cronómetros llega a cero, momento en el que debe sonar una alarma (debe tener potencia para que se oiga en todo el campo de juego).
Alguien me indicó que lo que pido es un reloj de ajedrez. He mirado algunos y es lo que necesito salvo por algunas cosas:
1- Creo (perdón por mi ignorancia) que los botones que pulsan los jugadores son un conmutador que bascula a un lado u otro dependiendo del jugador que lo presiona. Necesitamos que sean pulsadores separados.
2- No llevan leds indicando quien tiene pausado el tiempo.
3- Cuando acaba el tiempo, necesitamos una alarma más potente.
Por favor, no tengo ni idea de como hacer algo así y agradecería que me dijera como monatarlo.
Gracias.
Hola Jaime Alvarez.
Entiendo lo que necesitas y realmente es muy parecido a un reloj de ajedrez al que tienes que realizar algunos cambios, unos mecánicos y otros electrónicos. La parte de programación es algo más compleja para ti, según tu reconoces y en ese caso es preferible que cuentes con los servicios de un técnico-programador que realice lo que quieres.
Saludos y Feliz 2018.
la resistencia que va al transistor que valor es?
y la del display es de 220 ohms verdad!
saludos
Hola Alexi.
La resistencia de base suele ser de 1kΩ a 10kΩ dependiendo de la tensión de alimentación y si se trata de TTL o CMOS, en este caso recuerdo haber puesto una de 4K5Ω y sí, la del display es de 220Ω normalmente.
Saludos.
muy buenas ,, una consulta quiero hacer un proyecto de marcador electronico en la que que quiero usar lo siguiente:
– 2 display de 7 segmentos para marcador local
– 2 display de 7 segmentos para marcador visitante
– 4 display de 7 segmentos para cronometrar el tiempo de juego en minutos y segundos.
mi pregunta es si sera posible usar 8 display de 7 segmentos con un mismo arduino, ademas quisiera poner 2 letras con las de iniciales de cada equipo al marcador en lugar de local y visita.. ayudeme con esta inquietud si fuera tan amable , como se podria hacer este proyecto.. gracias..
Hola Angel.
Lo que pides es bastante complejo, pues no se trata sólo de las salidas necesarias para los displays que necesitas, básicamente tienes que distribuir los tiempos de muestreo para cada grupo de displays, lo que significa un evidente parpadeo en los dígitos.
En resumen, mediante el uso del I2C-bus podrías usar los ocho displays pero lleva su trabajo. En cuanto a las letras de las iniciales de los equipos, las puedes hacer un sistema de conmutadores, ya que permanecen sin cambios durante todo el encuentro.
Tienes un gran reto por delante.
Hola buenas tardes me podéis pasar el diagrama de los 3 displays, por favor
Hola Brayan Torres.
El diagrama que pides lo tienes a tu disposición en la misma descripción, eso sí, está el diagrama práctico que talvez es más intuitivo. Si lo pasas a Fritzing, lo verás mejor.
Saludos
Hola vicente, tengo la misma falla de las personas que tambien comentaron cuando hago el de tres digitos y 4 digitos solo me pone el valor 9 y 8 y los demás dígitos no se forman bien ya lo probe en muchos simuladores y en fisico y no me sale
Hola Christian Rivera.
He buscado los comentarios que indicas y como hay tantos, no los encuentro. De todos modos, si realizas los ejemplos que comentas con los 3 dígitos, tienen que funcionar bien. Asegúrate de conectar los segmentos que correspondan y cada dígito con su transistor correctamente, cualquier cambio o un transistor en mal estado te puede llevar un tiempo descubrirlo y un trastorno, te aseguro que el código funciona bien en cada caso.
Bien es cierto que más de 4 dígitos no lo he probado porque se supone que hay circuitos integrados adecuados para ese fin.
Siento no tener otra respuesta, pero repito lo dicho, los códigos funcionan bien, la prueba está en el propio vídeo que se muestra.
Saludos.
Hola, espero no sea muy tarde para comentar esto, pero a mi me pasaba igual con mi display de 4 segmentos cc. Soy novato en esto de la programación y arduino, pero por la polaridad de los transistores que use (NPN) deduje que el posible error estaba en esta parte:
void lightDigit1(byte number) {
digitalWrite(CC1, LOW);
digitalWrite(CC2, HIGH);
digitalWrite(CC3, HIGH);
digitalWrite(CC4, HIGH);
lightSegments(number);
}
void lightDigit2(byte number) {
digitalWrite(CC1, HIGH);
digitalWrite(CC2, LOW);
digitalWrite(CC3, HIGH);
digitalWrite(CC4, HIGH);
lightSegments(number);
}
void lightDigit3(byte number) {
digitalWrite(CC1, HIGH);
digitalWrite(CC2, HIGH);
digitalWrite(CC3, LOW);
digitalWrite(CC4, HIGH);
lightSegments(number);
}
void lightDigit4(byte number) {
digitalWrite(CC1, HIGH);
digitalWrite(CC2, HIGH);
digitalWrite(CC3, HIGH);
digitalWrite(CC4, LOW);
lightSegments(number);
}
Las salidas a las bases de los transistores eran LOW (por lo poco que entiendo, LOW es igual a un pulso 0, sin embargo, el transistor, por ser NPN, necesita un pulso HIGH (un 1 lógico en código binario). Todo lo que hice fue invertir los valores LOW a HIGH y visceversa, y, de esta manera, me quedo trabajando a la perfección mi display. Dejo abajo el arreglo que hice y espero que pueda ser la posible solución a los que tienen el mismo problema.
void lightDigit1(byte number) {
digitalWrite(CC1, HIGH);
digitalWrite(CC2, LOW);
digitalWrite(CC3, LOW);
digitalWrite(CC4, LOW);
lightSegments(number);
}
void lightDigit2(byte number) {
digitalWrite(CC1, LOW);
digitalWrite(CC2, HIGH);
digitalWrite(CC3, LOW);
digitalWrite(CC4, LOW);
lightSegments(number);
}
void lightDigit3(byte number) {
digitalWrite(CC1, LOW);
digitalWrite(CC2, LOW);
digitalWrite(CC3, HIGH);
digitalWrite(CC4, LOW);
lightSegments(number);
}
void lightDigit4(byte number) {
digitalWrite(CC1, LOW);
digitalWrite(CC2, LOW);
digitalWrite(CC3, LOW);
digitalWrite(CC4, HIGH);
lightSegments(number);
}
Hola Víctor Barragán.
En efecto, lo que expones es cierto (no lo he comprobado). Pero en el programa de 3 dígitos de 7 segmentos que describo, se dice que se trata de un display de CA (ándo común) y tu hablas de un CC (cátodo común), de manera que si lo has probado y funciona, no necesito revisar tu código, aunque con un vistazo me parece correcto.
De todas formas gracias por el aporte.
Un saludo.
buenas noches
tengo una pregunta ¿que tranistores se usa para hacer la multiplexacion?
gracias
Hola Ricardo.
Los transistores que debes utilizar para un multiplexado dependerá del display que vayas a utilizar, es decir, transistor NPN para display CC y PNP para display AC.
Repasa el artículo y comprobarás lo que digo.
Saludos.
Buenas el codigo para el de 2digitos es para displays catodo comun verdad? y los pulsadores son antirebote?gracias
Hola Francisco Jose.
Según consta en el propiocódigo así es. En cuanto a los pulsadores, son simples pulsadores, el efecto de antirebote se realiza en el propio código.
Saludos.
gracias los contactos del arduino 9 y 10 son el comun de los displays verdad es asi?
Buenas tardes Vicente.
Tengo un problema cuando le doy para pasar el programa al Arduino y me sale error.
El error me sale aquí:
lightDigit1(numbers[digit1]);
delay(2);
lightDigit2(numbers[digit2]);
delay(2);
lightDigit3(numbers[digit3]);
delay(2);
lightDigit4(numbers[digit4]);
delay(2);
void lightSegments(byte number) {
for (int i = 0; i < 7; i++) {
int bit = bitRead(number, i);
digitalWrite(segs[i], bit);
En las palabras "NUMBERS" y "SEGS", podrías decirme porque?
Muchas Gracias y un saludo.
Emilio José
Hola Emilio José.
Me hablas de un errror, pero no me describes dicho error.
Me dices en que parte del código te da el error. Pero que ocurre, no muestra los digitos o no cuenta, cuenta mal???
Las palabras que indicas son simplemente una forma de identificar una función o una definición de un pin, son simples nombres que identifican por ejemplo cada pin.
Por ejemplo:
lightSegments = segmento encnedido.
numbers[digit4 = número del dígito4
lightDigit4 = Digito encendido.
Dime que tipo de error te da para poder saber que te ocurre.
Saludos.
Hola, Sr. García. Empecé a seguir su blog desde hace poco tiempo, ya que también no hace mucho que estoy con el tema de Arduino. Actualmente estoy con el proyecto de un contador descendente de dos dígitos, utilizando dos displays de siete segmentos. Pude hacer funcionar el contador, pero, al ser novato en esto, lo que realmente me está volviendo loco es el tema de colocarle un pulsador, para que el conteo sólo ocurra mientras el pulsador está apretado. El proyecto es para colocarlo en un réplica de un Rifle de pulsos visto en la película «Aliens». El mismo poseé un visor en el cual se marca la cantidad de municiones restantes, disminuyendo mientras el gatillo de acciona. En fin, la idea del proyecto es que, como dije anteriormente, el display comience en 99 (esto ya está arreglado) y, al presionar el pulsador, comience a descender, sin dejar de apretarlo. El otro punto sería que, al dejar de accionar el pulsador, el conteo se detenga en un número, para luego retomar el conteo al volver a accionarlo. Y así sucesivamente. Si me puede dar una mano, le estaría muy agradecido.
Le dejo a continuación el código que estoy usando para el contador, sin ninguna de las modificaciones (fallidas) para colocarle el pulsador.
Muchas gracias!
//
int z = 9;
int a = 2;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 7;
int g = 8;
int h = 22;
int i = 23;
int j = 24;
int k = 25;
int l = 26;
int m = 27;
int n = 28;
int x = 100;
int y = 100;
void setup() {
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(h, OUTPUT);
pinMode(i, OUTPUT);
pinMode(j, OUTPUT);
pinMode(k, OUTPUT);
pinMode(l, OUTPUT);
pinMode(m, OUTPUT);
pinMode(n, OUTPUT);
}
void loop()
{
if (z==9)
{
//Nueve decenas
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
//Nueve unidades
digitalWrite(h, HIGH);
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
digitalWrite(k, HIGH);
digitalWrite(l, LOW);
digitalWrite(m, HIGH);
digitalWrite(n, HIGH);
delay(x);
//Ocho unoidades
digitalWrite(h, HIGH);
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
digitalWrite(k, HIGH);
digitalWrite(l, HIGH);
digitalWrite(m, HIGH);
digitalWrite(n, HIGH);
delay(x);
//Siete unidades
digitalWrite(h, HIGH);
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
digitalWrite(k, LOW);
digitalWrite(l, LOW);
digitalWrite(m, LOW);
digitalWrite(n, LOW);
delay(x);
//Seis unidades
digitalWrite(h, HIGH);
digitalWrite(i, LOW);
digitalWrite(j, HIGH);
digitalWrite(k, HIGH);
digitalWrite(l, HIGH);
digitalWrite(m, HIGH);
digitalWrite(n, HIGH);
delay(x);
//Cinco unidades
digitalWrite(h, HIGH);
digitalWrite(i, LOW);
digitalWrite(j, HIGH);
digitalWrite(k, HIGH);
digitalWrite(l, LOW);
digitalWrite(m, HIGH);
digitalWrite(n, HIGH);
delay(x);
//Cuatro unidades
digitalWrite(h, LOW);
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
digitalWrite(k, LOW);
digitalWrite(l, LOW);
digitalWrite(m, HIGH);
digitalWrite(n, HIGH);
delay(x);
//Tres unidades
digitalWrite(h, HIGH);
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
digitalWrite(k, HIGH);
digitalWrite(l, LOW);
digitalWrite(m, LOW);
digitalWrite(n, HIGH);
delay(x);
//Dos unidades
digitalWrite(h, HIGH);
digitalWrite(i, HIGH);
digitalWrite(j, LOW);
digitalWrite(k, HIGH);
digitalWrite(l, HIGH);
digitalWrite(m, LOW);
digitalWrite(n, HIGH);
delay(x);
//Uno unidades
digitalWrite(h, LOW);
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
digitalWrite(k, LOW);
digitalWrite(l, LOW);
digitalWrite(m, LOW);
digitalWrite(n, LOW);
delay(x);
//Cero unidades
digitalWrite(h, HIGH);
digitalWrite(i, HIGH);
digitalWrite(j, HIGH);
digitalWrite(k, HIGH);
digitalWrite(l, HIGH);
digitalWrite(m, HIGH);
digitalWrite(n, LOW);
delay(x);
z=z-1;
if (z==8)
{
//Ocho decenas
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
if (z==7)
{
//Siete decenas
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
if (z==6)
{
//Seis decenas
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
if (z==5)
{
//Cinco decenas
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
if (z==4)
{
//Cuatro decenas
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
if (z==3)
{
//Tres decenas
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
if (z==2)
{
//Dos decenas
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
if (z==1)
{
//Uno decenas
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
if (z==0)
{
//Cero decenas
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
z=9;
}
}
Hola Diego Alberto Nuñez.
El contador que pretendes hacer es muy sencillo, te puede servir el que viene descrito en el artículo como ejemplo 1er. aunque como se indica cuenta adelante y atrás. Tendrías que utilizár el pulsador de descontar (atrás). Pero esto tiene un inconveniente, y es que sólo descuenta con cada pulsación y si mantienes pulsado el pulsador no descuenta nada más que el primero.
Se necesita un sistema que produzca un pulso a una frecuencia que tu puedas regular, de manera que si lo deseas reduciento la frecuencia los disparos por minuto sean bajos y si lo prefieres puedes acelerar la frecuencia, dando más disparos por minuto. Este pulso se aplica a una función que detecta si el pulsador de disparo está pulsado, entonces, produce una rafaga de disparos que se descontarán de otro contador (el de disparos), cuando llegue a 0 (cero) con un pulsador re restablece a 99.
Supongo que esto es un caso similar a lo que tu necesitas. Ya me dirás como te va el tema.
Saludos.
Hola, buenos días, estoy llevando un proyecto parecido al contador que has descrito en el artículo, pero no sé cómo hacerlo. El esquema si se me viene en mente, pero no la programación.
Estoy usando un Arduino Mega para desarrollar un contador de 0 a 99999 que parta desde la cifra de 8000, pero que mediante unos pulsadores se pueda añadir o restar a ese valor las siguientes cifras: +/- 1000; +/- 100; +/- 10
Hola Christian.
En primer lugar, me consultas por un contador de 5 cifras, ¿has probago a constuirlo?, lo digo porque el problema que encontrarás es los tiempos de visualización por dígito, este es el principal problema.
Respecto a los pulsadores de +/- unas cantidades definidas, no veo gran problema en la rutina a realizar.
Supongo que tienes una rutina capaz de motrar los 5 dígitos. Espero tu respuesta.
Saludos.
Buenos dias. Me podria ayudar. Me pidieron un arduino con 4 display de 7 segmentos pero que cuente de manera descendente y ascendente desde -999 a 999. Solo me sale la cuenta de 0 a 99
Hola Mirella Soledad.
Necesito más información sobre lo que te ocurre, intenta describir que ocurre y qué crees que te falla.
Por lo que dices, parece que el código esta bien, observa y revisa las conexiones de los componentes, seguro que encuentras algo que no está bien.
Saludos.
No he encontrado explicacion para el comando o expresion en un ejercicio : leftDigit = sSDisplay % 1000 / 100;
que significa?
el tanto por ciento ?
Hola Herni.
El término % está descrito en las operaciones compuestas que describe la web de Arduino y dice:
% = (resto compuesto)
Espero haber dado respuesta a tu consulta.
Hola Vicente, buenas tardes, espero todos se encuentren bien…
Tengo el proyecto de ponerle display de contador para un marcador de puntuación, evidentemente con dispay de 7 segmentos, el detalle que tengo es que no se si pueda realizarse de manera individual. Es decir, que el 1er display me funcione con un botón, y el 2do con diferente botón a su correspondiente display…
Quedo atento a cualquier comentario.
Gracias y saludos para todos.
Maravilloso el blog.
Hola Michel Madrigal.
Tengo una ligera idea de lo que pretendes, sin embargo, no se si hablas de un display de 1 dígito o de 2 dígitos en ambos displays.
¿Me puedes aclarar este punto?
Saludos y cuídate.
alguien q me ayude en la realisacion de un ejercicio por favor
Hola henry josue.
Debes decir exactamente que necesitas, no podemos imaginar tus necesidades.
Saludos y cuídate.
Hoola muy buenas tardes, necesito ayuda con este ejercicio ¿Qué me recomienda?
contador hexadecimal de un dígito con un microprocesador. El mismo se pudiera visualizar en un display de7 segmentos en puerto P1.
Se requiere una tabla de conversión BIN a 7 SEGTS. El contador avanza con la tecla PB conectada al
puerto Px. Use el registro interno B como un contador binario.
Hola MayHernandez
He elido tu consulta y me temo que no entiendo bien lo que pretendes, hacer un contador hexadecimal de un solo digito ???, no le veo mucho sentido, con 2 dígitos puedo entender que vas a entrar datos o convertir datos hex a deci o a bin, pero no entiendo tu consulta.
La tabla de conversión de bin a 7 segmentos, me descoloca (claro a mi que me importa) pero es para tener una idea de lo que pretendes.
Lo siento, no te comprendo.
Saludos y cuídate.
hola que tal soy estudiante de uni recien estoy en mi 4 mes de carrera y en el curso de electronica me piden crear un proyecto de reloj acumlativo de tiempo de jugada ¿como podria comenzar ? me lo piden con pic 16F84A
Hola JAIME.
Lamento decirte que no estoy trabajando con el PIC en los últimos años, de todas formas espero que algún lector te pueda asesorar al respecto.
Saludos.