Cronometro manipulable con 74hc595

Saludos amigos, espero me puedan ayudar en lo que me falta para terminar este proyecto. El problema que tengo es que lo que manipulo en subrutina no se me guarda para usarlo en subrutinota, osea lo que quiero es definir el numero por el que el cronometro empezara a decrementar. Espero que me ayuden tengo días con este problema y no consigo la solución aqui el codigo:

#define data 2
#define clock 3
#define LATCH 4


      const byte digito1[] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
      const byte digito2[] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
      const byte digito3[] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
      const byte digito4[] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};

int i, j,m,n;
int variable1;
int variable2;

      void setup()
      {
      pinMode(clock, OUTPUT); 
      pinMode(data , OUTPUT);
      pinMode(LATCH, OUTPUT);
      pinMode(12,INPUT);
      pinMode(11,INPUT);
      }

      void loop()
        
      {
      if(digitalRead(12)==HIGH){ 
      subrutina();     
      }    
      
      if(digitalRead(11)==HIGH){
      subrutinota();
      }
      }
        
      void subrutina(){    
   
      for(int i=0; i<10; i++){        
      for(int j=0; j<10; j=j+5){
      if(digitalRead(12)== HIGH){ 
      digitalWrite(LATCH, LOW);
      shiftOut(data, clock, MSBFIRST, digito1[j]); 
      shiftOut(data, clock, MSBFIRST, digito2[i]);            
      digitalWrite(LATCH, HIGH);
      delay(100);
      }
      
      }
      }         
      }
      
      void subrutinota(){
      
      variable1 = digito1[j];
      variable2 = digito2[i];
      
      for(int m=variable1; m>=0;m--){
      for(int n=variable2; n>=0; n--){    
      for(int a=5; a>=0; a--){
      for(int b=9; b>=0; b--){
      digitalWrite(LATCH, LOW);
      shiftOut(data, clock, MSBFIRST, digito1[a]); 
      shiftOut(data, clock, MSBFIRST, digito2[b]); 
      shiftOut(data, clock, MSBFIRST, digito3[n]);
      shiftOut(data, clock, MSBFIRST, digito4[m]);
      digitalWrite(LATCH, HIGH);
      delay(100);    
      }
      }
      }
      }
      }

Nota: este código que monte es uno de tantas pruebas que e hecho pero creo q es por el que voy bien encaminado espero que me aclaren que me falta o cual es el error. Gracias de ante mano

¿Por qué haces 4 arrays con un contenido exactamente igual? Si defines solamente 1

const byte digito[] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};

Esto:

shiftOut(data, clock, MSBFIRST, digito[a]);
shiftOut(data, clock, MSBFIRST, digito[b]);
shiftOut(data, clock, MSBFIRST, digito[n]);
shiftOut(data, clock, MSBFIRST, digito[m]);

da el mismo resultado que lo que tu tenías montado.

Ahora vamos al tema que preguntas.

El problema que tienes, es que en la subrutina vuelves a definir int i e int j, de forma que solo se usan dentro de la subrutina. En los bucles for, define otras variables, y dentro de cada bucle, haz un i++ y un j=j+5 respectivamente, de forma que usarás las variables globales y te servirán dentro de subrutinota

ejemplo:

void subrutina(){    
   
      for(int a=0; a<10; a++){
      i++;
      for(int b=0; b<10; b=b+5){
      j=j+5
      if(digitalRead(12)== HIGH){ 
      digitalWrite(LATCH, LOW);
      shiftOut(data, clock, MSBFIRST, digito[j]); 
      shiftOut(data, clock, MSBFIRST, digito[i]);            
      digitalWrite(LATCH, HIGH);
      delay(100);
      }
      
      }
      }         
      }

Incluso es posible que te funcione con solo quitar el int de los for, pero no estoy seguro porque no lo he probado, ya que no sé qué hace exactamente el código completo.

Amigo entiendo lo que dices pero eso lo e intentado y por los displays no me muestra nada, que es lo que debe hacer el circuito. Cuando presionas el pulsador del pin 12 subes un contador que va de 5 en 5 osea empieza 00 y va 05, 10, 15, 20 ... etc. luego que decidas que numero quieres q empiece a decrementar el cronometro presionas el pulsador del pin 11 para que empiece el conteo. aqui paso el circuito:

![](http://circuito cronometro)

#define data 2
#define clock 3
#define LATCH 4


      const byte digito1[] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
      const byte digito2[] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
      const byte digito3[] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
      const byte digito4[] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};

byte variable1;
byte variable2;

      void setup()
      {
      pinMode(clock, OUTPUT); 
      pinMode(data , OUTPUT);
      pinMode(LATCH, OUTPUT);
      pinMode(12,INPUT);
      pinMode(11,INPUT);
      }

      void loop()
        
      {
      if(digitalRead(12)==HIGH){ 
      subrutina();     
      }    
      
      if(digitalRead(11)==HIGH){
      subrutinota();
      }
      }
        
      void subrutina(){    
   
      for(int i=0; i<10; i++){   
      variable1++;     
      for(int j=0; j<10; j=j+5){
      variable2=variable2+5;
      if(digitalRead(12)== HIGH){ 
      digitalWrite(LATCH, LOW);
      shiftOut(data, clock, MSBFIRST, digito1[j]); 
      shiftOut(data, clock, MSBFIRST, digito2[i]);            
      digitalWrite(LATCH, HIGH);
      delay(100);
      }
      
      }
      }         
      }
      
      void subrutinota(){
                  
      
      for(int m=variable1; m>=0;m--){
      for(int n=variable2; n>=0; n--){    
      for(int a=5; a>=0; a--){
      for(int b=9; b>=0; b--){
      digitalWrite(LATCH, LOW);
      shiftOut(data, clock, MSBFIRST, digito4[a]); 
      shiftOut(data, clock, MSBFIRST, digito3[b]); 
      shiftOut(data, clock, MSBFIRST, digito2[n]);
      shiftOut(data, clock, MSBFIRST, digito1[m]);
      digitalWrite(LATCH, HIGH);
      delay(100);    
      }
      }
      }
      }
      }

Le dejo los 4 arrays xq toy usando 4 displays 7 segmentos donde cada array pertenece a cada 7 segmentos

porque no publicas tu esquema. ya te lo pidio carmeloco y no respondiste

Corregí varias cosas.
No necesitas 4 definiciones
Tu rutina de presentación esta mal.
Prueba esto.

#define data 2
#define clock 3
#define LATCH 4

const byte digito = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};

int contador = 0;

void setup()
{
	pinMode(clock, OUTPUT); 
	pinMode(data , OUTPUT);
	pinMode(LATCH, OUTPUT);
	pinMode(12,INPUT);
	pinMode(11,INPUT);
}

void loop()

{

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

	if(digitalRead(11) == HIGH){
		if (contador-- < 0) 
		    contador = 0;
	}
	display(contador);
}


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(LATCH, LOW);
	shiftOut(data, clock, MSBFIRST, digito[miles]); 
	shiftOut(data, clock, MSBFIRST, digito[centenas]); 
	shiftOut(data, clock, MSBFIRST, digito[decenas]);
	shiftOut(data, clock, MSBFIRST, digito[unidades]);
	digitalWrite(LATCH, HIGH);
}

puede ser que muestre los digitos al revés

1 Like

ya lo probe amigo muchas gracias, sube el cronometro a partir de segundo no con los minutos de 5 en 5 de todos modos mas tarde tomare su codigo de ejemplo a ver que logro xq tengo 4 display 2 para minutos y dos para segundos, la idea es que suba de 5 en 5 minutos cuando tenga presionado el pin 12 luego que cuando presiones el pin 11 empiece a decrementar o sea si deje 25 00 cuando tenia presionado el pin 12 una vez presione el pin 11 debe decrementar 24 59 y ais sucesivamente muchas gracias x ayudarme :slight_smile:

Ahh perdona.. le puse contador++
corrige asi

if (digitalRead(12) == HIGH){ 
                contador += 5;
		if (contador >= 9996)
		   contador = 9995;
	}    

	if(digitalRead(11) == HIGH){
                contador -= 5;
		if (contador < 0) 
		    contador = 0;
	}

amigo excelente ya pude probar el programa que me mando.... todo bien pero creo q no me explique bien usted mando fue un contador estoy haciendo es un cronometro, osea el pim 12 sube los minutos de 5 en 5 osea al iniciar el programa el cronometro esta en 00:00 al presionar el pim 12 va subiendo solo los minutos de 5 en 5 asi: 00:00, 05:00, 10:00, 15:00,.. 30:00, 50:00, 55:00, etc luego cuando presiones el pim 11 debe empezar la funcion de cronometro pero de forma descendente osea si lo deje en 55:00 empezara 54:59.. 54:46.....51:12 etc hasta 0 x eso el programa que monte era asi xq la idea es que cuando presione el pim 11 empiece a decrementar solo el cronometro no tengo que mantenerlo presionado ni nada para que decremente, muchas gracias de verdad pero me envio fue el codigo de un contador. Saludos desde Venezuela

Bueno en ese caso el botón del pin 12 es para escoger el tiempo, agrega cinco minutos por pulso, y el botón del pin 11 el que inicia el conteo descendente.
¿cierto?

asi es ehrja es solo eso el incremento de 5 en 5 es solo para los minutos n para segundos

Bueno no cambia nada en la presentación.
Haz una rutina de tiempos usando millis() no delay.
solo en el loop()

Como que el boton 12 es para escoger el tiempo de arranque de a 5 en 5 minutos.. ahhhhh
y el otro boton inicia la cuenta descendente desde ese tiempo hasta 0. Okay

Bueno un cambio radical al programa. Se me ocurrió otra cosa pero no tengo tiempo

#define data 		2
#define clock 		3
#define LATCH 		4

/* Useful Constants */
// Tomados de <DateTime.h>
#define SECS_PER_MIN  (60UL)
#define SECS_PER_HOUR (3600UL)
 
/* Useful Macros for getting elapsed time */
#define numeroDeSegundos(_time_) (_time_ % SECS_PER_MIN)  
#define numeroDeMinutos(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN) 

const byte digito 				= { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
const byte IncrMinPin 			= 12;
const byte StartCronPin 		= 11;

int StartTime 					= 0;
byte IncrementoMin 				= 0;
byte StartCronometro 			= 0;
unsigned long timeCronometro 	= 0;
unsigned long Cronometro        = 0;
bool StartTime					= LOW;

void setup()
{
	pinMode(clock, OUTPUT); 
	pinMode(data , OUTPUT);
	pinMode(LATCH, OUTPUT);
	pinMode(12,INPUT);
	pinMode(11,INPUT);
}

void loop()

{
	IncrementoMin = digitalRead(IncrMinPin); 
	if ( IncrementoMin == HIGH){ 
		StartTime += 5;
		if (StartTime >= 60)			// máximo 95 minutos. 
		   StartTime = 60;          // Si esta mal cambiar por 60 min o el valor que desees
	}    

	StartCronometro = digitalRead(StartCronPin); 
	if( StartCronometro == HIGH){
		StartTime != Startime;		// Cada pulso cambia el estado de prendido a apagado.
		if (StartTime)				// Si arranco, entoncer cargo contador descendente con valor StartTime
			Cronometro = Startime * 60 * 1000 + millis();
			// sumarle millis asegura que el valor incial será justamente lo preseleccionado en Minutos 

	}

    Cronometro -= millis();   // Esta operación se ejecuta cada milisegundo
    time(Cronometro/1000);
}

void time(long val){  
 
  int presentoTime = numberoDeMinutos(val)*100 + numberoDeSegundos(val);
  display(presentoTime);
}

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(LATCH, LOW);
	shiftOut(data, clock, MSBFIRST, digito[miles]); 
	shiftOut(data, clock, MSBFIRST, digito[centenas]); 
	shiftOut(data, clock, MSBFIRST, digito[decenas]);
	shiftOut(data, clock, MSBFIRST, digito[unidades]);
	digitalWrite(LATCH, HIGH);
}

Si hay errores me avisas.

Surbyte me ha ayudado mucho este codigo si se presta a lo que se desea, muchas gracias aunque ay varios errores que me ta detectando el compilador pero voy a ver si los logro corregir para probarlo en el simulador muchas gracias , aunque si me pudiese aclara en la definicion de las variable coloca bool startime =low; es una variable booleana?

otro error es en la linea que esta int presentoTime = numberoDeMinutos(val)*100 + numberoDeSegundos(val);

Espero que me pueda ayudar mas xq tiene mas experiencia que yyo en esto jeje

Que error te da.. a mi no me dio error.
A ver con el IDE. Lo pruebo y respondo aca nuevamente

200 errores por dios!! que hice cuando verifiqué... tal vez era otro código. Con Sublime Text a veces me confunde la cantidad de ventanas abiertas.

#define data 		2
#define clock 		3
#define LATCH 		4

/* Useful Constants */
// Tomados de <DateTime.h>
#define SECS_PER_MIN  (60UL)
#define SECS_PER_HOUR (3600UL)
 
/* Useful Macros for getting elapsed time */
#define numeroDeSegundos(_time_) (_time_ % SECS_PER_MIN)  
#define numeroDeMinutos(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN) 

const byte digito[10] 				= { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
const byte IncrMinPin 			= 12;
const byte StartCronPin 		= 11;

int StartTime 					= 0;
byte IncrementoMin 				= 0;
byte StartCronometro 			= 0;
unsigned long timeCronometro 	= 0;
unsigned long Cronometro        = 0;
bool bStartTime					= LOW;

void setup()
{
	pinMode(clock, OUTPUT); 
	pinMode(data , OUTPUT);
	pinMode(LATCH, OUTPUT);
	pinMode(12,INPUT);
	pinMode(11,INPUT);
}

void loop()

{
	IncrementoMin = digitalRead(IncrMinPin); 
	if ( IncrementoMin == HIGH){ 
		StartTime += 5;
		if (StartTime >= 60)			// máximo 95 minutos. 
		   StartTime = 60;          // Si esta mal cambiar por 60 min o el valor que desees
	}    

	StartCronometro = digitalRead(StartCronPin); 
	if( StartCronometro == HIGH){
		bStartTime != bStartTime;		// Cada pulso cambia el estado de prendido a apagado.
		if (bStartTime)				// Si arranco, entoncer cargo contador descendente con valor StartTime
			Cronometro = StartTime * 60 * 1000 + millis();
			// sumarle millis asegura que el valor incial será justamente lo preseleccionado en Minutos 

	}

    Cronometro -= millis();   // Esta operación se ejecuta cada milisegundo
    time(Cronometro/1000);
}

void time(long val){  
 
  int presentoTime = numeroDeMinutos(val)*100 + numeroDeSegundos(val);
  display(presentoTime);
}

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(LATCH, LOW);
	shiftOut(data, clock, MSBFIRST, digito[miles]); 
	shiftOut(data, clock, MSBFIRST, digito[centenas]); 
	shiftOut(data, clock, MSBFIRST, digito[decenas]);
	shiftOut(data, clock, MSBFIRST, digito[unidades]);
	digitalWrite(LATCH, HIGH);
}

Primero: no sabia que en sublime text se pudiese usar lenguaje arduino yo toy usando la version 2 para aprender python.

Segundo: amigo ya no marca errores pero en el simulador los numeros estan a lo loco no esta en 00:00

Sube el archivo del simulador.

Si eso seria genial, porque llevo medio día entre tutoriales moviendole al proteus para recrear la aplicación.


Un consejo:
no se si soy el mas indicado para decirlo pero, ¡hombre!, a la hora de poner nombre a las variables, funciones o constantes hay que tener un poco de imaginación, pues con el fin de poder identificar de que se trata y en que contexto va, o a que ámbito pertenece.

con que programa o pagina puedo subir un archivo a este foro? nunk e subido un archivo aqui si me pudiese decir

por eso hay que leer las normas del foro

If your code is too long to fit into a post, or you have multiple files (eg. code and libraries), or you want to show an image, click on the Additional Options button:

Si tu codigo es demasiado largo para que quepa en el psot, o tienes multiples archvios, o quieres mostrar una imagen, click en Attachments and other options

Me disculpan los dos jejejeje peor soy indio en este foro ni acostumbro a andar en foros pero trate de subir el archivo del simulador en rar, zip y no quiere cargarlo

El archivo se debe subir en zip y no puede superar 1.X mBytes no recuerdo cuanto es el límite.