#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int buttonPin = 2; // Pin untuk tombol push button
const int lampPins[] = {13, 12, 11, 10, 9, 8, 7, 6}; // Pin untuk lampu
const int numLamps = 8; // Jumlah lampu
int mode = 0; // Mode awal (0: semua lampu mati, 1: flip-flop, 2: running)
int lastButtonState = HIGH; // Status terakhir dari tombol (HIGH karena menggunakan INPUT_PULLUP)
unsigned long lastDebounceTime = 0; // Waktu saat tombol terakhir kali ditekan
unsigned long debounceDelay = 50; // Debounce delay
bool buttonPressed = false;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C 0x27, ukuran LCD 16x2
void setup() {
for (int i = 0; i < numLamps; i++) {
pinMode(lampPins[i], OUTPUT); // Mengatur pin lampu sebagai output
digitalWrite(lampPins[i], LOW); // Memastikan semua lampu mati pada awalnya
}
pinMode(buttonPin, INPUT_PULLUP); // Mengatur pin tombol sebagai input dengan pull-up internal
// Inisialisasi LCD
lcd.init();
lcd.backlight(); // Mengaktifkan backlight LCD
lcd.begin(16, 2); // Set ukuran LCD (16 karakter per baris, 2 baris)
// Menampilkan mode awal pada LCD
updateLCD();
}
void loop() {
int reading = digitalRead(buttonPin); // Membaca status tombol
// Mengecek apakah tombol ditekan (menggunakan debounce)
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading == LOW && !buttonPressed) {
buttonPressed = true;
mode = (mode + 1) % 3; // Mengubah mode antara 0, 1, dan 2
Serial.print("Mode changed to: ");
Serial.println(mode);
updateLCD(); // Memperbarui tampilan LCD setiap kali mode berubah
} else if (reading == HIGH) {
buttonPressed = false;
}
}
lastButtonState = reading;
switch (mode) {
case 0:
allOffMode();
break;
case 1:
flipFlopMode();
break;
case 2:
runningMode();
break;
}
}
void flipFlopMode() {
static bool flip = false;
static unsigned long lastChangeTime = 0;
unsigned long currentTime = millis();
if (currentTime - lastChangeTime >= 500) { // Mengubah status setiap 500ms
flip = !flip;
for (int i = 0; i < numLamps; i++) {
digitalWrite(lampPins[i], flip ? HIGH : LOW);
}
lastChangeTime = currentTime;
Serial.print("Flip-flop state: ");
Serial.println(flip ? "ON" : "OFF");
}
}
void runningMode() {
static int currentLamp = 0;
static unsigned long lastChangeTime = 0;
unsigned long currentTime = millis();
if (currentTime - lastChangeTime >= 200) { // Mengubah lampu setiap 200ms
for (int i = 0; i < numLamps; i++) {
digitalWrite(lampPins[i], LOW);
}
digitalWrite(lampPins[currentLamp], HIGH);
currentLamp = (currentLamp + 1) % numLamps;
lastChangeTime = currentTime;
Serial.print("Running mode - Lamp: ");
Serial.println(currentLamp);
}
}
void allOffMode() {
for (int i = 0; i < numLamps; i++) {
digitalWrite(lampPins[i], LOW); // Mematikan semua lampu
}
Serial.println("All lamps are OFF");
}
// Fungsi untuk memperbarui tampilan LCD sesuai mode
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mode: ");
switch (mode) {
case 0:
lcd.print("All Off");
break;
case 1:
lcd.print("Flip-Flop");
break;
case 2:
lcd.print("Running");
break;
}
}