#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin Definitions
int batteryPin = A0; // Pin untuk membaca tegangan baterai
int ledPin1 = 13; // LED hijau
int ledPin2 = 8; // LED merah
int ledPin3 = 7; // LED biru (indikasi tegangan rendah)
int buzzerPin = 12; // Pin untuk buzzer
// Button Definitions
#define BUTTON_MENU 2
#define BUTTON_SELECT 3
#define BUTTON_OK 4
#define BUTTON_ADD 5
// Menu variables
int menuIndex = 0;
int totalMenus = 3;
const char *menus[] = {"Pengaturan", "Nama Anggota", "Uji Baterai"};
// Battery voltage variables
float batteryVoltage = 0.0;
float voltageDividerRatio = 2.0; // Rasio pembagi tegangan (contoh 2:1)
float maxBatteryVoltage = 5.0; // Tegangan maksimum yang dapat diukur (5V)
float lowBatteryVoltage = 3.0; // Tegangan minimum baterai
void setup() {
// Pin Modes
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(BUTTON_MENU, INPUT_PULLUP);
pinMode(BUTTON_SELECT, INPUT_PULLUP);
pinMode(BUTTON_OK, INPUT_PULLUP);
pinMode(BUTTON_ADD, INPUT_PULLUP);
// Initialize LCD
lcd.init();
lcd.backlight();
displayMenu();
// Initialize Serial
Serial.begin(9600);
}
void loop() {
// Button handling
if (debounceButton(BUTTON_MENU)) {
menuIndex = (menuIndex + 1) % totalMenus; // Cycle through menus
displayMenu();
}
if (debounceButton(BUTTON_SELECT)) {
handleMenuSelection();
}
// Measure and display battery voltage if in "Uji Baterai" menu
if (menuIndex == 2) {
measureBatteryVoltage();
}
}
// Function to handle menu selection
void handleMenuSelection() {
switch (menuIndex) {
case 0:
displayPengaturan();
break;
case 1:
displayNamaAnggota();
break;
case 2:
displayBatteryVoltage();
break;
}
}
// Function to display the menu
void displayMenu() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Menu:");
lcd.setCursor(0, 1);
lcd.print("> ");
lcd.print(menus[menuIndex]);
}
// Function to measure battery voltage
void measureBatteryVoltage() {
int rawADC = analogRead(batteryPin);
batteryVoltage = (rawADC / 1023.0) * 5.0 * voltageDividerRatio; // Menghitung tegangan baterai
// Batasi pembacaan hingga maksimum 5V
if (batteryVoltage > 5.0) {
batteryVoltage = 5.0;
}
Serial.print("Battery Voltage: ");
Serial.println(batteryVoltage);
}
// Function to display battery voltage
void displayBatteryVoltage() {
while (true) {
measureBatteryVoltage();
// Display the voltage on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Baterai:");
lcd.setCursor(0, 1);
lcd.print(batteryVoltage, 2);
lcd.print("V");
// Update LED and buzzer based on battery voltage
if (batteryVoltage >= maxBatteryVoltage) {
setLEDState(true, false, false); // LED hijau menyala
digitalWrite(buzzerPin, LOW); // Buzzer mati
} else if (batteryVoltage >= lowBatteryVoltage) {
setLEDState(false, true, false); // LED merah menyala
digitalWrite(buzzerPin, LOW); // Buzzer mati
} else {
setLEDState(false, false, true); // LED biru menyala
digitalWrite(buzzerPin, HIGH); // Buzzer menyala
}
// Wait and check for button input
delay(500);
if (debounceButton(BUTTON_SELECT)) {
displayMenu();
return;
}
}
}
// Function to set LED states
void setLEDState(bool green, bool red, bool blue) {
digitalWrite(ledPin1, green);
digitalWrite(ledPin2, red);
digitalWrite(ledPin3, blue);
}
// Function to display member names and change them with BUTTON_OK
void displayNamaAnggota() {
const char *anggota[] = {"Sulhan Efendi", "Zaki Dhaifullah", "Irvan Zukhri"};
int totalAnggota = sizeof(anggota) / sizeof(anggota[0]);
int currentAnggotaIndex = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Anggota:");
lcd.setCursor(0, 1);
lcd.print(anggota[currentAnggotaIndex]);
while (true) {
if (debounceButton(BUTTON_OK)) {
currentAnggotaIndex = (currentAnggotaIndex + 1) % totalAnggota;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Anggota:");
lcd.setCursor(0, 1);
lcd.print(anggota[currentAnggotaIndex]);
}
// Exit to menu with BUTTON_SELECT
if (debounceButton(BUTTON_SELECT)) {
displayMenu();
return;
}
}
}
// Function to display settings
void displayPengaturan() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pengaturan");
lcd.setCursor(0, 1);
lcd.print("MaxV:");
lcd.print(maxBatteryVoltage, 2);
while (true) {
if (debounceButton(BUTTON_SELECT)) {
displayMenu();
return;
}
}
}
// Debounce function
bool debounceButton(int buttonPin) {
static unsigned long lastPressTimes[6] = {0}; // Array untuk melacak waktu tombol
unsigned long currentTime = millis();
if (digitalRead(buttonPin) == LOW && (currentTime - lastPressTimes[buttonPin] > 200)) {
lastPressTimes[buttonPin] = currentTime;
return true;
}
return false;
}