cronometro

Hola, soy relativamente nuevo con arduino y quiero hacer un cronometro que se active cuando pulso el boton de un teclado, conozco lo mas basico de programacion asi que mi codigo es aun un poco robusto
El problema que tengo es que cuando pulso el boton 'A' se muestra el cronometro en ceros y no avanza, intente llamarlo por funciones y el resultado es el mismo
por favor si tienen alguna idea se los agradeceria mucho

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 24, 26, 28, 30, 32);
int verde=5;
int rojo=4;
int amarillo=3;

bool estado1=true;
bool estado2=false;
bool estado3=false;

int horas=0;
int minutos=0;
int segundos=0;
int decimas=0;
long milisegundos=0;

int moldes=0;
int modelo=0;
int tool=0;
int calidad=0;

//int boton1=3;
//int boton2=4;
//int boton3=5;

int contadorfallas=0;
int contadortecnicos=0;
int contadorreinicios=0;

boolean run = true;
#include <Keypad.h>

const byte filas = 4; //Cuatro filas
const byte cols = 4; //Cuatro columnas

byte Pins_Filas[] = {13, 12, 11, 10}; //Pines Arduino para las filas
byte Pins_Cols[] = { 9, 8, 7, 6}; // Pines Arduinopara las columnas
char Teclas [ filas ][ cols ] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, filas, cols);
void setup() {
Serial.begin(9600);

pinMode(verde,OUTPUT);
pinMode(rojo,OUTPUT);
pinMode(amarillo,OUTPUT);

digitalWrite(verde,HIGH);
digitalWrite(rojo,LOW);
digitalWrite(amarillo,LOW);

lcd.begin(16, 2);
}

void loop() {

//===============================================================================================
char pulsacion = Teclado1.getKey() ;

if(pulsacion=='A' && estado2==0 && estado3==0 )
{
milisegundos = millis();
if(milisegundos % 100 == 0){
decimas++;
if(decimas == 10){
decimas = 0;
segundos++;
}
if(segundos == 60){
segundos = 0;
minutos++;
}
if(minutos == 60){
minutos = 0;
horas++;
}
}
estado1=!estado1;
estado2=!estado2;

digitalWrite(verde,LOW);
digitalWrite(rojo,HIGH);
digitalWrite(amarillo,LOW);

Serial.println("La maquina 4 de la linea 2 ha dejado de funcionar");

contadorfallas=contadorfallas+1;

}

lcd.setCursor(0,0);
if(horas < 10){
lcd.print("0");
}
lcd.print(horas);
lcd.print(":");
lcd.setCursor(3,0);
if(minutos < 10){
lcd.print("0");
}
lcd.print(minutos);
lcd.print(":");
lcd.setCursor(6,0);
if(segundos < 10){
lcd.print("0");
}
lcd.print(segundos);
lcd.print(":");
lcd.setCursor(9,0);
lcd.print(decimas);

///////////////////////////////////////////////////////////////////////////////////////////////////////

if(pulsacion=='B' && estado1==0 && estado3==0)
{
estado2=!estado2;
estado3=!estado3;
digitalWrite(verde,LOW);
digitalWrite(rojo,LOW);
digitalWrite(amarillo,HIGH);
delay(10);

contadortecnicos=contadortecnicos+1;

}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(pulsacion=='C' && estado2==0 && estado1==0)
{
estado3=!estado3;
estado1=!estado1;
digitalWrite(verde,HIGH);
digitalWrite(rojo,LOW);
digitalWrite(amarillo,LOW);
delay(10);

contadorreinicios=contadorreinicios+1;

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

}

arduino2.0.ino (4.05 KB)

Esto

if (pulsacion=='A' && estado3==0 && estado2==0) { 
    
    imprimir();
    milisegundos = millis();
    if(milisegundos % 100 == 0){ 
       decimas++;
       if(decimas == 10){ 
         decimas = 0;
         segundos++;
       }
       if(segundos == 60){ 
         segundos = 0;
         minutos++;
       }
       if(minutos == 60){ 
         minutos = 0;
         horas++;
       }
    }
  
    estado1=!estado1;
    estado2=!estado2;
  
    digitalWrite(verde,LOW);
    digitalWrite(rojo,HIGH);
    digitalWrite(amarillo,LOW);
  
    //Serial.println("La maquina 4 de la linea 2 ha dejado de funcionar");

    contadorfallas=contadorfallas+1;
  }

Se ejecuta solo cuando presionas A

Y debe estar funcionando siempre, de modo que lo que debes hacer es que al presionar A actives una variable y la pongas en 1 y si esta en 1 esa variable entonces imprimes en el LCD
si vuelves a presionar A detienes la impresiona en el LCD
pero siempre siempre esta parte

    milisegundos = millis();
    if(milisegundos % 100 == 0){ 
       decimas++;
       if(decimas == 10){ 
         decimas = 0;
         segundos++;
       }
       if(segundos == 60){ 
         segundos = 0;
         minutos++;
       }
       if(minutos == 60){ 
         minutos = 0;
         horas++;
       }
    }
     
  }

Debería seguir a menos que cuentes tiempo de funcionamiento de la máquina.

No entiendo para que sirven estado1,2 y 3 porque no los usas para nada mas que ponerlos dentro de las condiciones
Si por ejemplo estado1 se pone en 1 cuando presionas A
es la variable que puedes usar para imprimir cuando este en 1 y detener en 0.
Lo mismo con los demas casos

estados 2 y 3 los uso para que no pueda presionar mas de 2 botones a la vez...
volvi a reescribir mi codigo de la siguiente manera y ahora si funciona...agregue mas leds pero el fin de los estados es que para 4 situaciones diferentes solo se pueda ejecutar una a la vez
char pulsacion=teclado1.getKey();
//funcion cambio de moldes
if(pulsacion=='A' && estado1==true)
{
lcd.setCursor(2,1);
lcd.print("CAMBIO MOLDES");

digitalWrite(verde,LOW);
digitalWrite(rojo,LOW);
digitalWrite(amarillo,HIGH);
digitalWrite(azul,LOW);
digitalWrite(buzzer,LOW);

run=!run;

}
if(pulsacion=='A' && estado1==false)
{

digitalWrite(verde,HIGH);
digitalWrite(rojo,LOW);
digitalWrite(amarillo,LOW);
digitalWrite(azul,LOW);
digitalWrite(buzzer,LOW);
Serial.print(horas);
Serial.print(":");
Serial.print(minutos);
Serial.print(":");
Serial.print(segundos);
Serial.print(":");
Serial.println(decimas);

horas=0;
minutos=0;
segundos=0;
decimas=0;
milisegundos=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("00:00:0:0");

}
//funcion de cronometro encender
if(run==true)
{
milisegundos=millis();
milisegundos = millis();
if(milisegundos % 100 == 0){
decimas++;
if(decimas == 10){
decimas = 0;
segundos++;
}
if(segundos == 60){
segundos = 0;
minutos++;
}
if(minutos == 60){
minutos = 0;
horas++;
}
lcd.setCursor(0,0);
if(horas < 10){
lcd.print("0");
}
lcd.print(horas);
lcd.print(":");
lcd.setCursor(3,0);
if(minutos < 10){
lcd.print("0");
}
lcd.print(minutos);
lcd.print(":");
lcd.setCursor(6,0);
if(segundos < 10){
lcd.print("0");
}
lcd.print(segundos);
lcd.print(":");
lcd.setCursor(9,0);
lcd.print(decimas);
}
}
}

crono_smed.ino (2.67 KB)

ahh muy bien, te sirvió mi guia. Me da gusto!!

Gracias :smiley: