#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi objek LCD dengan alamat I2C 0x27, 20 kolom dan 4 baris
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Definisi pin untuk push buttons dan lampuu
const int homePin = 2;
const int optionPin = 3;
const int okPin = 4;
const int lampuPin = 5;
// Variable untuk menyimpan state tombol option
int optionState = 0;
// Variable untuk menyimpan waktu lampu menyala
unsigned long lampuStartTime = 0;
int lampuDuration = 0;
// Variable untuk melacak apakah sedang di layar home
bool isHome = true;
void setup() {
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Inisialisasi pin push button sebagai input dengan pull-up resistor
pinMode(homePin, INPUT_PULLUP);
pinMode(optionPin, INPUT_PULLUP);
pinMode(okPin, INPUT_PULLUP);
// Inisialisasi pin lampu sebagai output
pinMode(lampuPin, OUTPUT);
// Tampilkan pesan awal
showWelcomeScreen();
}
void loop() {
// Cek jika tombol home ditekan
if (digitalRead(homePin) == LOW) {
delay(50); // Debounce
if (digitalRead(homePin) == LOW) {
showWelcomeScreen();
while (digitalRead(homePin) == LOW); // Tunggu sampai tombol dilepas
}
}
// Cek jika tombol option ditekan
if (digitalRead(optionPin) == LOW) {
delay(50); // Debounce
if (digitalRead(optionPin) == LOW) {
optionState = (optionState + 1) % 3; // Cycle through 0, 1, 2
updateDisplay();
while (digitalRead(optionPin) == LOW); // Tunggu sampai tombol dilepas
}
}
// Cek jika tombol OK ditekan
if (digitalRead(okPin) == LOW) {
delay(50); // Debounce
if (digitalRead(okPin) == LOW) {
setLampuDuration();
while (digitalRead(okPin) == LOW); // Tunggu sampai tombol dilepas
}
}
// Kontrol lampu
controlLampu();
}
void showWelcomeScreen() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Welcome");
isHome = true;
optionState = 0;
}
void updateDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
switch (optionState) {
case 0:
lcd.print("5 mili");
break;
case 1:
lcd.print("10 mili");
break;
case 2:
lcd.print("15 mili");
break;
}
isHome = false;
}
void setLampuDuration() {
if (!isHome) {
switch (optionState) {
case 0:
lampuDuration = 5000; // 5 detik
break;
case 1:
lampuDuration = 10000; // 10 detik
break;
case 2:
lampuDuration = 15000; // 15 detik
break;
}
lampuStartTime = millis();
digitalWrite(lampuPin, HIGH); // Nyalakan lampu
}
}
void controlLampu() {
if (lampuDuration > 0 && (millis() - lampuStartTime >= lampuDuration)) {
digitalWrite(lampuPin, LOW); // Matikan lampu
lampuDuration = 0;
}
}