#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Conexões padrão para LCD 16x2: RS=12, EN=11, D4=5, D5=4, D6=3, D7=2
#define TRIG_PIN 9 // Pino Trig do sensor ultrassônico HC-SR04
#define ECHO_PIN 10 // Pino Echo do sensor ultrassônico HC-SR04
#define BUTTON_PIN 8 // Pino do push button
#define THRESHOLD 20 // Limite de distância em cm para detectar o carrinho
unsigned long startTime = 0;
unsigned long elapsedTime = 0;
bool timerRunning = false;
int passCount = 0;
bool lastDetected = false;
bool lastButtonState = HIGH; // Inicia em HIGH devido ao pull-up interno
void setup() {
lcd.begin(16, 2); // Inicializa o LCD 16x2
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Configura o pino do botão com pull-up interno
lcd.clear();
lcd.print("Pronto para");
lcd.setCursor(0, 1);
lcd.print("corrida!");
delay(2000);
lcd.clear();
lcd.print("Aguardando...");
}
void loop() {
// Verifica o estado do botão
bool buttonState = digitalRead(BUTTON_PIN);
// Detecta borda de descida do botão (pressionado, LOW com pull-up)
if (buttonState == LOW && lastButtonState == HIGH) {
// Reinicia o cronômetro
startTime = 0;
elapsedTime = 0;
timerRunning = false;
passCount = 0;
lastDetected = false;
lcd.clear();
lcd.print("Reiniciado!");
delay(1000); // Mostra mensagem de reinício por 1 segundo
lcd.clear();
lcd.print("Aguardando...");
}
lastButtonState = buttonState;
// Mede a distância com o sensor ultrassônico
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
long distance = (duration / 2) / 29.1; // Calcula distância em cm
bool detected = (distance < THRESHOLD && distance > 0); // Detecta se o carrinho está na frente
// Detecta a borda de subida (carrinho passando)
if (detected && !lastDetected) {
passCount++;
if (passCount == 1) {
// Primeira passagem: inicia o cronômetro
startTime = millis();
timerRunning = true;
lcd.clear();
lcd.print("Cronometro");
lcd.setCursor(0, 1);
lcd.print("iniciado!");
delay(1000); // Pequeno delay para mensagem
lcd.clear();
} else if (passCount == 2) {
// Segunda passagem: para o cronômetro
elapsedTime = millis() - startTime;
timerRunning = false;
lcd.clear();
lcd.print("Tempo final:");
lcd.setCursor(0, 1);
lcd.print(elapsedTime / 1000.0, 2); // Exibe em segundos com 2 casas decimais
lcd.print(" s");
}
}
lastDetected = detected;
// Atualiza o display com o tempo correndo se o timer estiver ativo
if (timerRunning) {
unsigned long currentTime = millis() - startTime;
lcd.clear();
lcd.print("Tempo:");
lcd.setCursor(0, 1);
lcd.print(currentTime / 1000.0, 2);
lcd.print(" s");
}
delay(100); // Delay para evitar leituras muito rápidas
}