#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ✅ Pin GPIO (sebaris 3.3V)
#define BUTTON_FRONT 13
#define BUTTON_REAR 14
#define MOSFET_FRONT 27
#define MOSFET_REAR 26
#define I2C_SDA 25
#define I2C_SCL 33
// ✅ Counter dan flags
int frontCount = 0;
int rearCount = 0;
bool prevFrontState = LOW;
bool prevRearState = LOW;
bool frontResetFlag = false;
bool rearResetFlag = false;
unsigned long frontPressStartTime = 0;
unsigned long rearPressStartTime = 0;
const unsigned long resetHoldTime = 8000; // 8 saat
// ✅ I2C LCD address 0x27, 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(BUTTON_FRONT, INPUT);
pinMode(BUTTON_REAR, INPUT);
// ✅ PWM setup
ledcSetup(0, 5000, 8); // channel 0 – Front
ledcAttachPin(MOSFET_FRONT, 0);
ledcSetup(1, 5000, 8); // channel 1 – Rear
ledcAttachPin(MOSFET_REAR, 1);
// ✅ Init I2C dengan custom pin
Wire.begin(I2C_SDA, I2C_SCL);
lcd.begin(); // utk ESP32, wajib kosong
lcd.backlight();
updateLCD();
}
void loop() {
bool frontState = digitalRead(BUTTON_FRONT);
bool rearState = digitalRead(BUTTON_REAR);
// ✅ Front Brake
if (frontState == HIGH && prevFrontState == LOW) {
frontPressStartTime = millis();
ledcWrite(0, 255); // ON
frontResetFlag = false;
}
else if (frontState == HIGH && prevFrontState == HIGH) {
if ((millis() - frontPressStartTime) >= resetHoldTime) {
resetCounts();
frontPressStartTime = millis();
frontResetFlag = true;
}
}
else if (frontState == LOW && prevFrontState == HIGH) {
if (!frontResetFlag && (millis() - frontPressStartTime) < resetHoldTime) {
frontCount++;
updateLCD();
}
ledcWrite(0, 0); // OFF
frontResetFlag = false;
}
prevFrontState = frontState;
// ✅ Rear Brake
if (rearState == HIGH && prevRearState == LOW) {
rearPressStartTime = millis();
ledcWrite(1, 255); // ON
rearResetFlag = false;
}
else if (rearState == HIGH && prevRearState == HIGH) {
if ((millis() - rearPressStartTime) >= resetHoldTime) {
resetCounts();
rearPressStartTime = millis();
rearResetFlag = true;
}
}
else if (rearState == LOW && prevRearState == HIGH) {
if (!rearResetFlag && (millis() - rearPressStartTime) < resetHoldTime) {
rearCount++;
updateLCD();
}
ledcWrite(1, 0); // OFF
rearResetFlag = false;
}
prevRearState = rearState;
delay(10);
}
void updateLCD() {
lcd.setCursor(0, 0);
lcd.print("Front: ");
lcd.print(frontCount);
lcd.print(" "); // pad clear
lcd.setCursor(0, 1);
lcd.print("Rear : ");
lcd.print(rearCount);
lcd.print(" "); // pad clear
}
void resetCounts() {
// Flash LED
ledcWrite(0, 255);
ledcWrite(1, 255);
for (int i = 0; i < 3; i++) {
lcd.noBacklight();
delay(200);
lcd.backlight();
delay(200);
}
frontCount = 0;
rearCount = 0;
updateLCD();
ledcWrite(0, 0);
ledcWrite(1, 0);
}
G D S
Front
Front
Front
USB 5V
GND
G D S
Rear
Rear
Rear