#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// PIN DEKLARASI
const int buttonPin = 14; // GPIO14 - Tombol
const int servoPin = 23;// GPIO23 - Servo
const int buzzerPin = 18;// GPIO18 - Buzzer
const int ledRed = 2;// GPIO2 - LED Merah
const int ledGreen = 4; // GPIO4 - LED Hijau
// LCD I2C
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// STATUS KUNCI
bool terkunci = false;
// Debounce tombol
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
// Dummy servo class
class ServoSim {
public:
void attach(int pin) { /* Wokwi uses pin for simulator setup */ }
void write(int angle) { /* Wokwi servo handles movement automatically */ }
};
ServoSim servoKunci;
// Fungsi untuk memperbarui tampilan LCD, LED, dan Servo
void updateStatus(bool statusKunci) {
terkunci = statusKunci;
lcd.clear();
if (terkunci) {
// Status LOCKED
digitalWrite(ledGreen, LOW);
digitalWrite(ledRed, HIGH);
servoKunci.write(100); // Kunci Terkunci
// Tampilkan di LCD
lcd.setCursor(0, 0);
lcd.print("Status Kunci:");
lcd.setCursor(0, 1);
lcd.print("LOCKED");
Serial.println("Status: LOCKED");
} else {
// Status UNLOCKED
digitalWrite(ledGreen, HIGH);
digitalWrite(ledRed, LOW);
servoKunci.write(0);// Kunci Terbuka
// Tampilkan di LCD
lcd.setCursor(0, 0);
lcd.print("Status Kunci:");
lcd.setCursor(0, 1);
lcd.print("UNLOCKED");
Serial.println("Status: UNLOCKED");
}
}
void setup() {
Serial.begin(115200);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Inisialisasi pin
pinMode(buttonPin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(ledGreen, OUTPUT);
// Inisialisasi Servo
servoKunci.attach(servoPin);
Serial.println("--- Kunci Sepeda IoT Siap ---");
// Status awal: UNLOCKED
updateStatus(false);
}
void loop() {
// Baca status tombol
int tombol = digitalRead(buttonPin);
static int lastButtonState = HIGH;
// LOGIKA TOMBOL (TOGGLE KUNCI)
if (tombol != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (tombol == LOW && lastButtonState == HIGH) {
// Tombol ditekan
// Toggle status kunci
updateStatus(!terkunci);
// Bunyikan buzzer sebentar untuk notifikasi toggle
digitalWrite(buzzerPin, HIGH);
delay(100);
digitalWrite(buzzerPin, LOW);
}
}
lastButtonState = tombol;
// LOGIKA ALARM (SIMULASI GETARAN)
// Jika terkunci DAN tombol ditekan (simulasi sensor getaran)
if (terkunci && tombol == LOW) {
// Bunyikan alarm terus-menerus
digitalWrite(buzzerPin, HIGH);
} else if (terkunci && tombol == HIGH) {
// Matikan buzzer jika tombol dilepas
digitalWrite(buzzerPin, LOW);
}
// Pastikan buzzer mati saat UNLOCKED
if (!terkunci) {
digitalWrite(buzzerPin, LOW);
}
}