Siguiendo con la temática de la entrada anterior es posible de que te hayas topado con un problema relacionado con el tipo de display del que dispones. Es por eso que hoy te traigo la solución a este problema de manera completamente gratuita y con los mismos componentes electrónicos que usaste en el proyecto que te permitirá construir un contador decimal con 74HC595 y un display ánodo común.
Y es que en el mercado existen dos tipos de displays de 7 segmentos, por un lado tenemos los displays de cátodo común como el que usé para el proyecto anterior y los displays de ánodo común
Ambos displays aunque a simple vista se ven iguales, pero su configuración es distinta por lo que si has intentado construir el proyecto del contador decimal usando un display de ánodo común muy posiblemente no haya funcionado como debería.
Y es que tan solo haciendo unos pequeñísimos retoques vamos a conseguir que el circuito funcione correctamente.
¿Qué modificaciones vamos a hacer?
Bueno pues debemos de hacer 3 modificaciones una de ellas a nivel de electrónica y las otras dos a nivel de código.
Modificación a nivel electrónico
Como has podido intuir la manera de conectar un display de ánodo común es distinta a la de cátodo común. Así que simplemente vamos a conectar los pines centrales del display directamente a VCC ya sean 3.3v o 5v dependiendo del voltaje que uses tal y como se muestra en el esquema.
Modificaciones a nivel de código
Tan solo nos hace falta retocar un poco el código original y será suficiente para que nuestro proyecto funcione correctamente.
Con estas modificaciones vamos a poder experimentar con el concepto de diferencia de potencial o voltaje que no es más que la diferencia de cargas que hay entre dos puntos de un circuito
La idea es la siguiente:
El integrado 74HC595 sigue la lógica directa que implica que un 1 lógico es un valor parecido a VCC por lo que si el display está conectado a VCC, la corriente no fluirá por el LED ya que tanto el ánodo (conectado al display) como el cátodo (conectado al integrado) están al mismo voltaje.
Por lo que solo se encenderán los leds cuya salida del integrado se mantengan en un nivel bajo o 0 lógico.
Es decir debemos de dar un 1 lógico como salida a aquellos led que NO queremos que se enciendan es decir aquellos leds que no son necesarios para formar el número que deseemos
Siguiendo esta lógica debemos retocar el código de la siguiente manera:
#define numero0 LED6
#define numero1 LED0 + LED3 + LED4 + LED5 + LED6
#define numero2 LED2 + LED5
#define numero3 LED4 + LED5
#define numero4 LED0 + LED3 + LED4
#define numero5 LED1 + LED4
#define numero6 LED1
#define numero7 LED3 + LED4 + LED5 + LED6
#define numero9 LED4
#define error LED1 + LED2
¿Parece ser que falta algo no?
Como has podido comprobar el número crear el numero 8 implica tener encendidos todos los leds del display por lo que todas las patillas de salida del integrado deben de estar a nivel bajo.
Es por ello que no es necesario incluirlo dentro de la lista de #define
Dentro de nuestra función escribirNumeros() debemos de añadir un pequeño retoque en el bloque de código en caso de que nuestra variable i se igual que 8, donde podremos todas las salidas del integrado a nivel bajo de la siguiente manera:
case 8:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,LOW);
digitalWrite(RCLK, HIGH);
Ahora si todo está bien conectado debe de funcionar exactamente igual que como se muestra en el siguiente video.
Código completo del contador decimal con 74HC595 y display Ánodo Común
Como siempre te dejo a tu disposición todo el código completo disponible para que puedas copiarlo:
/*
Contador decimal usando el integrado 74HC595 y un display de 7 segmentos
Este programa nos permite mostrar el valor decimal de una variable en un
display de 7 segmentos usando el integrado 74HC595 controlado por dos botones
que suman o restan una unidad a la variable de control (i)
Autor: Alexdevrep
Fecha: 24/3/2024
Más contenido interesante en :
-GitHub: https://www.github.com/alexdevrep
-Instagram: https://www.instagram.com/alexdevrep/
-Mi blog de WordPress: https://www.eltallerdealexdevrep.com
-Youtube: https://www.youtube.com/channel/UCNlqgVY-CaQ2Lgc5xJChaKA
*/
//Definimos los pines de control
#define SER 7
#define RCLK 8
#define SRCLK 9
//Definimos un valor de peso en bits a los led
#define LED0 1
#define LED1 2
#define LED2 4
#define LED3 8
#define LED4 16
#define LED5 32
#define LED6 64
/*
Creamos la combinación de leds que forman los números decimales en nuestro display
ver documentación completa ya que puede variar en función de como hayas conectado
las salidas del integrado con los ánodos o cátodos del display.
*/
#define numero0 LED6
#define numero1 LED0 + LED3 + LED4 + LED5 + LED6
#define numero2 LED2 + LED5
#define numero3 LED4 + LED5
#define numero4 LED0 + LED3 + LED4
#define numero5 LED1 + LED4
#define numero6 LED1
#define numero7 LED3 + LED4 + LED5 + LED6
#define numero9 LED4
#define error LED1 + LED2
//Inicializamos las variables necesarias
int i = 0;
const int botonSuma= 11;
const int botonResta= 12;
void setup() {
//Definimos los pines de entrada y salida
pinMode(SER, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(SRCLK, OUTPUT);
pinMode(botonSuma,INPUT);
pinMode(botonResta,INPUT);
//Inicializamos el valor del display a 0 (por defecto)
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero0); //MSBFIRST= Bit más significante primero
digitalWrite(RCLK, HIGH);
}
// Función que controla la salida del integrado
void escribirNumeros(int i){
switch(i){
case 0:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero0);
digitalWrite(RCLK, HIGH);
break;
case 1:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero1);
digitalWrite(RCLK, HIGH);
break;
case 2:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero2);
digitalWrite(RCLK, HIGH);
break;
case 3:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero3);
digitalWrite(RCLK, HIGH);
break;
case 4:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero4);
digitalWrite(RCLK, HIGH);
break;
case 5:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero5);
digitalWrite(RCLK, HIGH);
break;
case 6:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero6);
digitalWrite(RCLK, HIGH);
break;
case 7:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero7);
digitalWrite(RCLK, HIGH);
break;
case 8:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,LOW);
digitalWrite(RCLK, HIGH);
break;
case 9:
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,numero9);
digitalWrite(RCLK, HIGH);
break;
}
}
void loop() {
// Bucle principal de control
//Sumamos una unidad a la variable
if (digitalRead(botonSuma) == HIGH && i<10 ){
i++;
escribirNumeros(i);
delay(250);
}
//Restamos una unidad a la variable
if(digitalRead(botonResta) == HIGH && i>-1){
i--;
escribirNumeros(i);
delay(250);
}
//Mostramos el mensaje de error E
if (i>9 || i<0) {
digitalWrite(RCLK, LOW);
shiftOut(SER,SRCLK,MSBFIRST,error);
digitalWrite(RCLK, HIGH);
}
}
Hasta aquí la entrada de hoy ¿Qué te ha parecido esta solución? recuerda que también está disponible la primera parte donde abordamos exactamente el mismo proyecto pero usando un display de 7 segmentos de cátodo común te dejo el enlace para que puedas verla aquí ya que explicamos el proyecto de manera más detallada. Además recuerda que tienes más proyectos como este en mi perfil de GitHub. Si tienes alguna duda no dudes en escribirme en comentarios, estaré encantado de leerte.