#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Pinos do display LCD
#define pinBtnIniciaPausa 7
#define pinBtnReset 6
unsigned long tempoInicial = 0;
unsigned long tempoAtual = 0;
unsigned long tempoDecorrido = 0;
unsigned long tempoPausa = 0;
byte centesimos = 0;
byte segundos = 0;
byte minutos = 0;
bool auxMinuto = true;
bool estaRodando = false;
bool ultimoEstadoBtnIniciaPausa = false;
bool primeiraRodada = true;
void setup() {
pinMode(pinBtnIniciaPausa, INPUT);
pinMode(pinBtnReset, INPUT);
lcd.init(); // Inicia o display lcd
lcd.backlight(); // Acende a luz de fundo do lcd
lcd.print("Tempo atual:"); // Exibe o texto "Tempo atual" no display
}
void loop() {
bool btnIniciaPausa = digitalRead(pinBtnIniciaPausa);
bool btnReset = digitalRead(pinBtnReset);
// Verifica se ao clicar no botão btnIniciaPausa o cronômetro está rodando ou pausado e inverte o estado
if (btnIniciaPausa != ultimoEstadoBtnIniciaPausa && btnIniciaPausa) {
estaRodando = !estaRodando;
if (estaRodando && primeiraRodada) {
tempoInicial = millis(); // Inicia a contagem de tempo
primeiraRodada = false;
}
}
ultimoEstadoBtnIniciaPausa = btnIniciaPausa;
// Libera o inicio da contagem e as pausas quando o botão btnIniciaPausa for pressionado
if (estaRodando) {
tempoAtual = millis();
tempoDecorrido = tempoAtual - tempoInicial - tempoPausa;
} else {
tempoPausa = millis() - tempoAtual;
}
// Se botão reset for pressionado, chama a função reset()
if (btnReset && (!estaRodando)) resetar();
atualizaCronometro();
atualizaDisplay();
}
// Atualiza as variáveis do cronômetro
void atualizaCronometro() {
centesimos = (tempoDecorrido / 10) % 100;
segundos = tempoDecorrido / 1000 % 60;
if (segundos != 0) auxMinuto = false;
if (segundos == 0 && auxMinuto == false) {
minutos++;
auxMinuto = true;
}
}
// Imprime o texto no display
void atualizaDisplay() {
char buffer[9];
sprintf(buffer, "%02d:%02d:%02d", minutos, segundos, centesimos);
lcd.setCursor(0, 1); // Define a posição de exibição do tempo
lcd.print(buffer);
}
// Atribui o estado inicial para todas as variáveis
void resetar() {
tempoInicial = 0;
tempoAtual = 0;
tempoDecorrido = 0;
tempoPausa = 0;
centesimos = 0;
segundos = 0;
minutos = 0;
auxMinuto = true;
estaRodando = false;
primeiraRodada = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tempo atual:");
}