#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Mendefinisikan LCD I2C (alamat, kolom, baris)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Mendefinisikan pin LED
#define RED_1 2
#define YELLOW_1 3
#define GREEN_1 4
#define RED_2 5
#define YELLOW_2 6
#define GREEN_2 7
#define RED_3 8
#define YELLOW_3 9
#define GREEN_3 10
// Mendefinisikan durasi penundaan untuk tombol
#define BUTTON_DELAY 200 // 200 ms penundaan untuk tombol
// Durasi untuk lampu merah, kuning, dan hijau
#define RED_DURATION 5000 // 5 detik
#define YELLOW_DURATION 800 // 0,8 detik
// Mendefinisikan pin tombol
const int button1Pin = 11; // Tombol 1 untuk navigasi menu
const int button2Pin = 12; // Tombol 2 untuk memilih menu
// Variabel global
int currentMenu = 0; // Menyimpan menu yang sedang aktif
bool button1Pressed = false;
bool button2Pressed = false;
// Deklarasi fungsi terlebih dahulu
void trafficLightCycle(int ledPins[]);
void sequentialMode(int ledPins[]);
void alternatingSequentialMode(int ledPins[]);
void turnOffAllLEDs(int ledPins[]); // Tambahan fungsi untuk mematikan semua LED
// Inisialisasi
void setup() {
lcd.init();
lcd.backlight();
int ledPins[] = {RED_1, YELLOW_1, GREEN_1, RED_2, YELLOW_2, GREEN_2, RED_3, YELLOW_3, GREEN_3};
// Inisialisasi pin LED sebagai output
for (int i = 0; i < 9; i++) {
pinMode(ledPins[i], OUTPUT);
}
// Inisialisasi pin tombol sebagai input
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
// Tampilkan menu pertama di LCD
displayMenu();
}
// Menampilkan menu di LCD
void displayMenu() {
lcd.clear();
lcd.setCursor(0, 0);
if (currentMenu == 0) {
lcd.print("MENU 1");
} else if (currentMenu == 1) {
lcd.print("MENU 2");
} else if (currentMenu == 2) {
lcd.print("MENU 3");
}
// Tambahkan tulisan "RANI" di baris kedua
lcd.setCursor(0, 1); // Baris kedua, kolom pertama
lcd.print("013_RANI");
}
// Matikan semua LED
void turnOffAllLEDs(int ledPins[]) {
for (int i = 0; i < 9; i++) {
digitalWrite(ledPins[i], LOW);
}
}
// Loop utama
void loop() {
int ledPins[] = {RED_1, YELLOW_1, GREEN_1, RED_2, YELLOW_2, GREEN_2, RED_3, YELLOW_3, GREEN_3};
// Memeriksa status tombol
if (digitalRead(button1Pin) == LOW) {
if (!button1Pressed) {
button1Pressed = true;
currentMenu = (currentMenu + 1) % 3; // Menu berputar
displayMenu(); // Tampilkan menu yang sesuai
delay(BUTTON_DELAY); // Penundaan untuk menghindari lompatan menu
}
} else {
button1Pressed = false;
}
if (digitalRead(button2Pin) == LOW) {
if (!button2Pressed) {
button2Pressed = true;
lcd.clear(); // Bersihkan layar
lcd.setCursor(0, 0); // Setel ke posisi awal
lcd.print("Running..."); // Indikasi program berjalan
if (currentMenu == 0) {
trafficLightCycle(ledPins); // Mode Traffic Light
} else if (currentMenu == 1) {
sequentialMode(ledPins); // Mode Sequential
} else if (currentMenu == 2) {
alternatingSequentialMode(ledPins); // Mode Alternating Sequential
}
turnOffAllLEDs(ledPins); // Matikan semua LED setelah program selesai
displayMenu(); // Kembalikan ke menu utama setelah selesai
delay(BUTTON_DELAY); // Penundaan untuk menghindari aktivasi ganda
}
} else {
button2Pressed = false;
}
}
// Mode Traffic Light
void trafficLightCycle(int ledPins[]) {
// Lampu Merah 1 hijau, 2 & 3 merah
digitalWrite(GREEN_1, HIGH);
digitalWrite(RED_2, HIGH);
digitalWrite(RED_3, HIGH);
delay(RED_DURATION);
// Transisi ke merah melalui kuning di Lampu Merah 1
digitalWrite(GREEN_1, LOW);
digitalWrite(YELLOW_1, HIGH);
delay(YELLOW_DURATION);
digitalWrite(YELLOW_1, LOW);
digitalWrite(RED_1, HIGH);
// Transisi ke hijau melalui kuning di Lampu Merah 2
digitalWrite(RED_2, LOW);
digitalWrite(YELLOW_2, HIGH);
delay(YELLOW_DURATION);
digitalWrite(YELLOW_2, LOW);
digitalWrite(GREEN_2, HIGH);
delay(RED_DURATION);
// Transisi ke merah melalui kuning di Lampu Merah 2
digitalWrite(GREEN_2, LOW);
digitalWrite(YELLOW_2, HIGH);
delay(YELLOW_DURATION);
digitalWrite(YELLOW_2, LOW);
digitalWrite(RED_2, HIGH);
// Transisi ke hijau melalui kuning di Lampu Merah 3
digitalWrite(RED_3, LOW);
digitalWrite(YELLOW_3, HIGH);
delay(YELLOW_DURATION);
digitalWrite(YELLOW_3, LOW);
digitalWrite(GREEN_3, HIGH);
delay(RED_DURATION);
// Transisi ke merah melalui kuning di Lampu Merah 3
digitalWrite(GREEN_3, LOW);
digitalWrite(YELLOW_3, HIGH);
delay(YELLOW_DURATION);
digitalWrite(YELLOW_3, LOW);
digitalWrite(RED_3, HIGH);
}
// Mode Sequential
void sequentialMode(int ledPins[]) {
// Setiap LED yang menyala tetap menyala saat kita berpindah ke LED berikutnya.
for (int i = 0; i < 9; i++) {
digitalWrite(ledPins[i], HIGH);
delay(500); // Penundaan untuk melihat efek penyalaan LED secara bergantian
}
}
// Mode Alternating Sequential
void alternatingSequentialMode(int ledPins[]) {
// Setiap LED yang menyala tetap menyala saat kita berpindah ke LED berikutnya.
for (int i = 0; i < 9; i++) {
digitalWrite(ledPins[i], HIGH);
delay(500); // Penundaan untuk melihat efek penyalaan LED secara bergantian
digitalWrite(ledPins[i], LOW);
delay(500);
}
}