#include <LiquidCrystal_I2C.h>
#define LCD_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLUMNS, LCD_ROWS);
const int PIN_POTENSIO = A0;
const int ARUS_RELAY = 6;
const int PIN_RELAY = 8;
const long INTERVAL = 1000;
unsigned long mili_detik_sebelumnya = 0;
int hitung = 0;
int status_relay = LOW;
void setup()
{
lcd.begin(16, 2);
lcd.backlight();
lcd.print("ULANG:");
pinMode(PIN_POTENSIO, INPUT);
pinMode(6, OUTPUT);
pinMode(8, OUTPUT);
Serial.begin(9600);
}
void loop()
{
unsigned long mili_detik_sekarang = millis();
int nilai_potensio = analogRead(A0);
float tegangan = nilai_potensio * (5.0 / 1023.0); // Mengkonversi nilai bacaan analog ke tegangan (dalam volt)
// int tegangan_int = map(nilai_potensio, 0, 1023, 0, 255);
int tegangan_int = tegangan;
// Atur keadaan Relay OFF
digitalWrite(PIN_RELAY, status_relay);
if(mili_detik_sekarang - mili_detik_sebelumnya >= INTERVAL){
mili_detik_sebelumnya = mili_detik_sekarang;
if(status_relay == LOW){
status_relay = HIGH;
} else {
status_relay = LOW;
hitung++;
}
}
// Arus ke relay
analogWrite(ARUS_RELAY, tegangan_int);
// Output ke LCD
lcd_output(tegangan, mili_detik_sekarang);
// 6x mati 6x hidup
if (hitung >= 6){
lcd.clear();
digitalWrite(PIN_RELAY, status_relay);
while (true){
lcd.setCursor(0,0);
lcd.print("PROGRAM BERHENTI");
}
}
}
// Fungsi untuk output LCD
String output_lcd, tegangan_string, hitung_string, detik_string, repitisi;
void lcd_output(float tegangan, unsigned long detik) {
lcd.setCursor(6, 0);
hitung_string = hitung;
// Mengonversi detik ke detik dalam format float
float detik_float = static_cast<float>(detik) / 1000.0;
// Menghitung menit, detik, dan milidetik
int menit = static_cast<int>(detik_float) / 60;
int sisa_detik = static_cast<int>(detik_float) % 60;
// Membuat string menit:detik,milidetik
String waktu_string = String(menit) + ":" + String(sisa_detik);
// Menggabungkan string berdasarkan status relay
repitisi = hitung_string + " | " +waktu_string;
lcd.print(repitisi);
lcd.setCursor(0, 1);
lcd.print(output_lcd);
tegangan_string = tegangan;
output_lcd = tegangan_string + " (V) ";
}