En el código que te he escrito uso las teclas start y pause para que se acciones solo al presionarlas.
Tomo en cada caso el valor de millis().
Ahora me doy cuenta que al presionar start o pausa no hago lo que se pretende.
EDITO: debe ser de mis peores códigos. Acabo de descubrir que omití
sprintf(buffer, "%02d:%02d:%02d.%d", horas, minutos, segundos, decimas);
ya lo edité.
Igualmente el código no hace mucho.
EDITADO:
Olvida el código anterior. Lleno de errores.
Esta tmb pero al menos se aproxima
#include <Arduino.h>
//#include <LiquidCrystal_I2C.h>//Libreria para LCD I2C
#include <Wire.h>//libreria requrida para usar SDA y SCL
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Variables para los cálculos internos del cronómetro
unsigned long horas = 0;
unsigned long minutos = 0;
unsigned long segundos = 0;
unsigned long decimas = 0;
unsigned long milisegundos = 0;
unsigned long time_reestablecer, time_pausa, nexttime, tiempo_corriendo;
int reestablecer, stop, pausa, reestablecerAnt = LOW, stopAnt = LOW, pausaAnt = LOW;
const byte pulsador_inicio = 3; // pulsador_inicio en PIN digital 10
const byte pulsador_pausa = 4; // pulsador_pausa en PIN digital 9
bool fpausa = true;
char buffer[30];
void millis2time(unsigned long tmp) {
unsigned long todosLosSegundos = tmp/1000;
horas = todosLosSegundos/3600;
unsigned long segundosRestantes = todosLosSegundos%3600;
minutos = segundosRestantes/60;
segundos = segundosRestantes%60;
decimas = (tmp/100 - todosLosSegundos*10);
}
void presentacionLCD() {
// Mostramos el tiempo a través del LCD
//lcd.setCursor(4, 1);
if (!fpausa)
millis2time(millis()-tiempo_corriendo);
else
millis2time(time_reestablecer-tiempo_corriendo);
sprintf(buffer, "%02ld:%02ld:%02ld.%ld", horas, minutos, segundos, decimas);
//lcd.print(buffer);
Serial.println(buffer);
}
void setup() {
Serial.begin(115200); // Comienzo de la comunicación serie
Serial.println("Comenzando el cronometro");
delay(1000);
pinMode(pulsador_inicio, INPUT_PULLUP); // Pin digital 10 como entrada
pinMode(pulsador_pausa, INPUT_PULLUP); // Pin digital 9 como entrada
//lcd.begin(20, 4);//Inicializar la LCD 20x4
//lcd.backlight();//Encender la luz de fondo
//lcd.setCursor(1, 0);
//lcd.print("------------------");
//lcd.setCursor(1, 3);
//lcd.print("------------------");
}
void loop() {
// Si presionamos el pulsador de pausa se congela el tiempo hasta que lo volvamos a presionar
pausa = digitalRead(pulsador_pausa);
if (!pausa && pausaAnt) {
fpausa = false;
nexttime = tiempo_corriendo = millis();
Serial.println("Inicio: "+String(tiempo_corriendo));
}
pausaAnt = pausa;
// Si presionamos el pulsador de inicio se pone todo a cero
reestablecer = digitalRead(pulsador_inicio);
if (!reestablecer && reestablecerAnt) {
time_reestablecer = millis();
Serial.println("Reestablezco: "+String(time_reestablecer));
fpausa = true;
}
reestablecerAnt = reestablecer;
if (millis() >= nexttime && !fpausa) {
presentacionLCD();
nexttime += 100;
}
}
He comentado todo lo referente a lcd asi que quita los // y lo tienes activo otra vez.
Hay cosas para mejorar aún.