#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BUTTON_FRONT 4
#define BUTTON_REAR 5
#define LED_FRONT 18
#define LED_REAR 19
int frontCount = 0;
int rearCount = 0;
bool prevFrontState = LOW;
bool prevRearState = LOW;
unsigned long frontPressStartTime = 0;
unsigned long rearPressStartTime = 0;
const unsigned long resetHoldTime = 8000; // 8 seconds in milliseconds
bool frontResetFlag = false;
bool rearResetFlag = false;
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C LCD address
void setup() {
pinMode(BUTTON_FRONT, INPUT);
pinMode(BUTTON_REAR, INPUT);
pinMode(LED_FRONT, OUTPUT);
pinMode(LED_REAR, OUTPUT);
lcd.init();
lcd.backlight();
updateLCD();
}
void loop() {
bool frontState = digitalRead(BUTTON_FRONT);
bool rearState = digitalRead(BUTTON_REAR);
// Front brake logic
if (frontState == HIGH && prevFrontState == LOW) {
// Button just pressed
frontPressStartTime = millis();
digitalWrite(LED_FRONT, HIGH);
frontResetFlag = false; // Reset flag when new press begins
}
else if (frontState == HIGH && prevFrontState == HIGH) {
// Button still pressed - check for reset
if ((millis() - frontPressStartTime) >= resetHoldTime) {
resetCounts();
frontPressStartTime = millis(); // Reset timer to prevent multiple resets
frontResetFlag = true; // Set flag to ignore the next release
}
}
else if (frontState == LOW && prevFrontState == HIGH) {
// Button released
if (!frontResetFlag && (millis() - frontPressStartTime) < resetHoldTime) {
// Normal press (not a reset)
frontCount++;
updateLCD();
}
digitalWrite(LED_FRONT, LOW);
frontResetFlag = false; // Reset the flag after release
}
prevFrontState = frontState;
// Rear brake logic
if (rearState == HIGH && prevRearState == LOW) {
// Button just pressed
rearPressStartTime = millis();
digitalWrite(LED_REAR, HIGH);
rearResetFlag = false; // Reset flag when new press begins
}
else if (rearState == HIGH && prevRearState == HIGH) {
// Button still pressed - check for reset
if ((millis() - rearPressStartTime) >= resetHoldTime) {
resetCounts();
rearPressStartTime = millis(); // Reset timer to prevent multiple resets
rearResetFlag = true; // Set flag to ignore the next release
}
}
else if (rearState == LOW && prevRearState == HIGH) {
// Button released
if (!rearResetFlag && (millis() - rearPressStartTime) < resetHoldTime) {
// Normal press (not a reset)
rearCount++;
updateLCD();
}
digitalWrite(LED_REAR, LOW);
rearResetFlag = false; // Reset the flag after release
}
prevRearState = rearState;
delay(10);
}
void updateLCD() {
lcd.setCursor(0, 0);
lcd.print("Front: ");
lcd.print(frontCount);
lcd.print(" "); // Clear any leftover characters
lcd.setCursor(0, 1);
lcd.print("Rear : ");
lcd.print(rearCount);
lcd.print(" ");
}
void resetCounts() {
// Visual feedback for reset
digitalWrite(LED_FRONT, HIGH);
digitalWrite(LED_REAR, HIGH);
// Flash LCD backlight
for (int i = 0; i < 3; i++) {
lcd.noBacklight();
delay(200);
lcd.backlight();
delay(200);
}
// Reset counts
frontCount = 0;
rearCount = 0;
updateLCD();
// Turn off LEDs
digitalWrite(LED_FRONT, LOW);
digitalWrite(LED_REAR, LOW);
}