4 digitos con display LED 7 segmentos

Hola a todos

Me gustaria me ayudaran con mi codigo,
talvez esto ya lo han hecho muchos pero se me
esta complicando.

Lo que quiero hacer dos contadores
de 0 - 99 con 4 display de segmentos.
espero me puedan ayudar estoy trabajando con
2 74HC595N y arduino uno.

#define LATCH  9  
#define CLOCK  10 
#define DATA   8  



byte POS[4] = {0X70, 0XB0, 0XD0, 0xE0};


byte NUM[10] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6,
 0xBE, 0xE0, 0xFE, 0xF6 };

void display4x7segment(byte datapin, byte clockpin, byte latchpin, byte POS, byte NUM)
{
  digitalWrite(LATCH, LOW);
  shiftOut(DATA, CLOCK, LSBFIRST, POS);  
  shiftOut(DATA, CLOCK, LSBFIRST, NUM); 
  digitalWrite(LATCH, HIGH);
}

void setup()
{
  pinMode(LATCH, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);
  digitalWrite(LATCH, HIGH); 
  delay(1000);  

}

void loop()
{  
    display4x7segment(DATA, CLOCK, LATCH, POS[0], NUM[1]);
    display4x7segment(DATA, CLOCK, LATCH, POS[1], NUM[2]);
    display4x7segment(DATA, CLOCK, LATCH, POS[2], NUM[3]);
    display4x7segment(DATA, CLOCK, LATCH, POS[3], NUM[4]);
   
}

Comienza leyendo las normas del foro y entonces edita tu post de tal modo que el código y la imagen se vean directamente en el post y no a través de descarga.
Para eso usa las etiquetas indicadas.

</> para el código
pantalla para la imagen.

Ahora ve a More, luego modify y edita tu post anterior.
La imagen la copias usando boton derecho del mouse sobre el adjunto subido.

Busca en Search 74HC595 display, hay muchos contadores y tableros digitales que se han resuelto y tienen códigos.
Arriba derecha.

Me gustaria poder hacer un contador doble
me podrian ayudar.

he buscado en internet pero solo he encontrado
con 74hc595 para digito.

pero yo lo querio hacer con 2 74hc595 como
muestro en la imagen.

espero su ayuda si recurri aqui es por que ya busque
en google, y ps no encontre mucho.

Mi amigo, si te digo que busques en search (arriba derecha) busca en search.

te dejo el link

Estas son dos respuestas.

Contador de 4 digitos
Cronometro manipulable con 74hc595

Gracias Ricardo

Disculpa, no habia entendido lo de search(arriba)
para proxima.

gracias a tus aportes en otros hilos,
hice un nuevo codigo y decidi probar
con el shift register 74HC164.

y ps mas o menos hace lo quiero.
muchas por la ayuda.

aca voy a dejar el codigo, pa que lo chequees y me digas
que te parece y no te parece que le deba cambiar.

/* 
Contador 0 - 99
con ShiftRegister 74HC164N
por Cesar Augusto Tapia
cesart050892@gmail.com  
whatsapp +50578109544

*/

#if ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif

#include "Switch.h"

const byte pinDatos   =   9; //Pin para Datos serie del 74CH164
const byte pinReloj   =   10; //Pin para reloj del 74CH164
const int pinboton1 = 5;
const int pinboton2 = 4;
const int gnd1= 11;
const int gnd2= 12;
int unidades=0;
int decenas=0;
int x;
int y;

byte DigitArray[4] = {0X70, 0XB0, 0XD0, 0xE0};  

byte NumArray[10] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6,
 0xBE, 0xE0, 0xFE, 0xF6 }; 


Switch pinmas = Switch(pinboton1, INPUT, LOW);
Switch pinmenos = Switch(pinboton2, INPUT, LOW);

int contador=0;

unsigned long currentmillis;  
unsigned long previousmillis;
unsigned long duration = 20; 


void setup() {

pinMode(gnd1, OUTPUT);
pinMode(gnd2, OUTPUT);
pinMode(pinReloj, OUTPUT);
pinMode(pinDatos, OUTPUT);

}

void loop() {




  
  pinmas.poll();
  pinmenos.poll();
  contadorf(pinmas.pushed());
  contadorR(pinmenos.pushed());
  display(contador);



  

} 


void contadorf (int boton) {

if (boton == HIGH){ 
    if (contador++>= 1000)
       contador = 9999;
  }    
}

void contadorR (int boton3) {

if(boton3 == HIGH){
    if (contador-- < 0) 
        contador = 0;
  }    
}


void display(int numero)
{
  int miles = numero / 1000;
  numero %= 1000;
  int centenas = numero / 100;
  numero %= 100;
  int decenas = numero / 10;
  numero %= 10;
  int unidades = numero;

  digitalWrite(gnd2, HIGH); //
  shiftOut(pinDatos, pinReloj, LSBFIRST, NumArray[unidades]);
  digitalWrite(gnd1, LOW); //
  delay(100);
  digitalWrite(gnd1, HIGH); //
  shiftOut(pinDatos, pinReloj, LSBFIRST, NumArray[decenas]);
  digitalWrite(gnd2, LOW); //
  delay(100); 
}

me gustari si me puedes ayudar a sustituir los delay

adjunto dejo es archivo de proteus y el codigo.

74164_2D.zip (24.9 KB)

Estos delays comentalos

digitalWrite(gnd2, HIGH); //
  shiftOut(pinDatos, pinReloj, LSBFIRST, NumArray[unidades]);
  digitalWrite(gnd1, LOW); //
  //delay(100);
  digitalWrite(gnd1, HIGH); //
  shiftOut(pinDatos, pinReloj, LSBFIRST, NumArray[decenas]);
  digitalWrite(gnd2, LOW); //
  //delay(100); 
}

Hola Ricardo

Al parecer esos delay estan demas los comente y ps no se ve ningun parpadeo.

Pero tengo un problema, pienso yo que puede ser el integrado 74HC164 que esta en mal estado
pero se me esta presentando un problema, ya con el circuito en fisico
aparece el numero que yo quiero ejemplo pongo = 1 y aparece = 0001
y ps hasta ahi esta bien pero al poco tiempo empieza alternar entre 0001 a 8888.

me gustaria tu comentario sobre esto y ps creo que puede ser que
algo esta mal en mi codigo.

Otro asunto te dejo un adjunto con codigo y proteus de 4 74HC595.

En este proyecto tu le dijiste al chico que hiciese el cicuito con 2 Shift register
proyecto_contador de 4 digitos

surbyte:
Que te parece usar dos 595 y no consumir 4 pines mas para comandar los LED?
O sea con 3 pines comandas todo?
Te queda todo el Arduino para lo que gustes?

Ahora te lo dibujo y te lo posteo en Proteus.

Me gustaria me ayudaras con esa idea,
2 shiftregisters 74HC595 de la manera de ese ejemplo.
A mi me gustan las opciones no me gusta quedar con una unca opcion.
no te pido codigo ya hecho te pido ayuda a comprender el codigo.

74595_4.zip (21 KB)

595.zip (22.8 KB)

74595_2.zip (20 KB)

Aca tienes uno de los que hice, no encuentro el tutorial en Documentación que no se si buscaste.

Contador 5 digitos con 74hc595

Vamos por partes:

  1. 74595_2 no entiendo para que pones 4 Displays multiplexados y ademas con un segundo 595 controlas el encendido del display.
    Eso require de un timer para que todo se actualice a tal velicidad que la retina del ojo no perciba los cambios.

No digo que no se pueda, pero asi de simple no.
Asi que hasta ahi esta fallido, el intento.

  1. Surbyte_4 funciona perfecto.
    4 displays multiplexados y una rutina TIMER que controla el refrezco de los 4 displays y sus datos.

Si no logras 30 fps el ojo ve el parpadeo.

  1. 74595_4 solo muestra el valor de cantidad asi que modifiqué esta linea
displayLED(cantidad++);

Y quita por favor los delays porque arruinan todo.
Usa millis().

Hola Ricardo

respuesta a tus respuestas

1 -- 74HC595_2

Es el circuito de control con 2 74HC595
a 4 displays de 7 segmentos; Estoy claro
de la velocidad de actualizacion

2 -- surbyte_595

Es el circuito de control con 4 74HC595
a 4 displays de 7 segmentos; Aqui no estoy
muy claro del uso de la rutina TIMER

3 -- 74HC595_4

Es el circuito de control con 4 74HC595
a 4 displays de 7 segmentos;
sin la rutina TIMER

Me gustaria me ayudaras a comprender
las rutina TIMER, no estoy muy claro
de cual es la ventaja de usar la en este
circuito y no se como empezar a usar las.

La rutina timer es la que hace todo el multiplexado o sea.. prenda/apaga todos los leds a tal velocidad que no te das cuenta de lo que esta ocurriendo.
Solo le envias lo que quieres mostrar y ella se encarga.

Si entiendo el concepto general
de las librerias timer.

leyendo, en los foros y en Google
encontre que No recomiendan
la libreria TimerOne, ni la libreria
TimedAction, cuando se necesitan 2
o más.

Esta la libreria timer de alextaujenis
Github alextaujenis
Bolg alextaujenis

Adjunto dejo la libreria, me gustaria me pudieras ayudar a comprender su uso en
en circuito de 2 ic 74HC595, para empezar y luego con el circuito de 4 ic 74595

RBD_Timer-master.zip (6.42 KB)

Necesito ayuda para implementar la librería rbd-timer al contador

Hola este es nuevo código, implementando la
libreria RDB_Timer y la libreria Switch

#if ARDUINO >= 100 
  #include "Arduino.h"  
#else                   
  #include "WProgram.h" 
#endif
#include <Switch.h>


#include <RBD_Timer.h>
 
RBD::Timer TiempoRefresh;

const byte IRsensor = 7; 
const byte ShotSensor = 7; 
int tirosPermitidos=10;
int Faltantes;

int cantidades;
int contador;
int i;

Switch IRsensorPin = Switch(IRsensor, INPUT, HIGH);
Switch ShotSensorPin = Switch(ShotSensor, INPUT, HIGH);  


#define LATCH  9  //Serial Output to Shift Register
#define CLOCK  10 //Shift Register Clock Pin
#define DATA   8  //pin 10 connect to DIO

// array to activate particular digit on the 8x7segment module
// it is the common anode of 7 segment
byte POS[4] = {0X70, 0XB0, 0XD0, 0xE0};

//array for decimal number, it is the cathode.
//logic low will activate the particular segment
byte NUM[10] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6,
 0xBE, 0xE0, 0xFE, 0xF6 }; 



void display4x7(byte datapin, byte clockpin, byte latchpin, byte POS, byte NUM)
  {
 	 	digitalWrite(LATCH, LOW);

  		shiftOut(DATA, CLOCK, MSBFIRST, POS); // Particular digit position
  		shiftOut(DATA, CLOCK, MSBFIRST, NUM); // array for decimal number

  		digitalWrite(LATCH, HIGH); 
}

void displayLED(int numero) {

	int unidades;
	int decimas;
	int centesimas;
	int milesimas;

  				unidades   = numero/1000;
 				numero    %= 1000;
 				decimas    = numero/100;
  				numero    %= 100;
  				centesimas = numero/10;
  				numero    %= 10;
  				milesimas = numero;
  

  display4x7(DATA, CLOCK, LATCH, POS[0], NUM[milesimas]); //digitOne centesimas
  display4x7(DATA, CLOCK, LATCH, POS[1], NUM[centesimas]); //digitOne centesimas
  display4x7(DATA, CLOCK, LATCH, POS[2], NUM[decimas]);    //digitOne decimas
  display4x7(DATA, CLOCK, LATCH, POS[3], NUM[unidades]);   // digitOne unidades
} 

void Actualiza() {
  if(TiempoRefresh.onRestart()) {
    displayLED(cantidades);
  }
}







void Validos() {
	int TirosFallidos=0;
	int AlarmPer;
	IRsensorPin.poll();
	ShotSensorPin.poll();

if (IRsensorPin.pushed()) { contador++; }

		if (contador == 4 ) { contador = 0; }
	    if (contador == 3 ) { digitalWrite(13, HIGH); }
	    if (contador == 0)  { digitalWrite(13, LOW);  }

cantidades=contador;


if (ShotSensorPin.pushed()) { TirosFallidos++; }

	Faltantes = tirosPermitidos - TirosFallidos;

if (Faltantes == 0) { 
		contador = 0; 
		AlarmPer = AlarmPer - 1;}
		Serial.print(contador);
}


void setup() {

  pinMode(LATCH, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);
  digitalWrite(LATCH, HIGH); //Wake Up Display

  TiempoRefresh.setTimeout(4);
  TiempoRefresh.restart();
}

void loop() {

Validos();
Actualiza();

	
}

buen dia
S.O.S NO PUEDO CONECTAR UN DISPLAY 7 SEGMENTOS DE 7CM X 4CM ,PROBE DE MIL MANERAS Y NO ENCIENDE ,ALGUIEN ME PUEDE AYUDAR ???

raquelLroger, bienvenida al foro ante todo.
Ahora por favor ve a leer las normas del foro y tmb lee que no debes usar Mayúsculas para escribir (es como gritarnos), asi que ahora edita tu post