#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ✅ Pin GPIO
#define BUTTON_FRONT 4
#define BUTTON_REAR 5
#define BUTTON_RESET 32
#define LED_FRONT 18
#define LED_REAR 19
int frontCount = 0;
int rearCount = 0;
bool prevFrontState = LOW;
bool prevRearState = LOW;
bool prevResetState = HIGH; // HIGH sebab guna INPUT_PULLUP
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(BUTTON_FRONT, INPUT);
pinMode(BUTTON_REAR, INPUT);
pinMode(BUTTON_RESET, INPUT_PULLUP); // ✅ penting
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);
bool resetState = digitalRead(BUTTON_RESET); // Akan LOW bila ditekan
// Front Brake
if (frontState == HIGH && prevFrontState == LOW) {
digitalWrite(LED_FRONT, HIGH);
} else if (frontState == LOW && prevFrontState == HIGH) {
frontCount++;
updateLCD();
digitalWrite(LED_FRONT, LOW);
}
prevFrontState = frontState;
// Rear Brake
if (rearState == HIGH && prevRearState == LOW) {
digitalWrite(LED_REAR, HIGH);
} else if (rearState == LOW && prevRearState == HIGH) {
rearCount++;
updateLCD();
digitalWrite(LED_REAR, LOW);
}
prevRearState = rearState;
// ✅ External Reset (active LOW)
if (resetState == LOW && prevResetState == HIGH) {
resetCounts();
}
prevResetState = resetState;
delay(10);
}
void updateLCD() {
lcd.setCursor(0, 0);
lcd.print("Front: ");
lcd.print(frontCount);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Rear : ");
lcd.print(rearCount);
lcd.print(" ");
}
void resetCounts() {
frontCount = 0;
rearCount = 0;
updateLCD();
digitalWrite(LED_FRONT, HIGH);
digitalWrite(LED_REAR, HIGH);
for (int i = 0; i < 3; i++) {
lcd.noBacklight();
delay(200);
lcd.backlight();
delay(200);
}
digitalWrite(LED_FRONT, LOW);
digitalWrite(LED_REAR, LOW);
}