#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int potentiometerPin = 13;
const int potentiometerPin2 = 2;
const int lampuPin = 13; // Sesuaikan dengan pin yang digunakan untuk mengontrol lampu
// Define constants for lamp conditions
const double on = 15;
const double off = 0;
const double hidup = 15;
const double mati = 0;
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
pinMode(lampuPin, OUTPUT);
}
void loop() {
Serial.println("========================================");
// Variables for Automatic Light
double mendung = 40;
double cerah = 70;
double potValue = analogRead(potentiometerPin);
double x = map(potValue, 0, 4095, 0, 110);
Serial.println("Lampu Otomatis: " + String(x, 0) + " °C");
double KondisiCuaca_Mendung;
if (x >= cerah) {
KondisiCuaca_Mendung = 0;
Serial.println("μKondisiCuaca_Mendung [X]: " + String(KondisiCuaca_Mendung, 0));
} else if (mendung < x && x < cerah) {
KondisiCuaca_Mendung = (cerah - x) / (cerah - mendung);
Serial.println("μKondisiCuaca_Mendung [X]: " + String(KondisiCuaca_Mendung, 4));
} else if (x <= mendung) {
KondisiCuaca_Mendung = 1;
Serial.println("μKondisiCuaca_Mendung [X]: " + String(KondisiCuaca_Mendung, 0));
}
double KondisiCuaca_Cerah;
if (x <= mendung) {
KondisiCuaca_Cerah = 0;
Serial.println("μKondisiCuaca_Cerah [X]: " + String(KondisiCuaca_Cerah, 0));
} else if (x > mendung && x < cerah) {
KondisiCuaca_Cerah = (x - mendung) / (cerah - mendung);
Serial.println("μKondisiCuaca_Cerah [X]: " + String(KondisiCuaca_Cerah, 4));
} else if (x >= cerah) {
KondisiCuaca_Cerah = 1;
Serial.println("μKondisiCuaca_Cerah [X]: " + String(KondisiCuaca_Cerah, 0));
}
// Variables for Distance Between the Barrier and the Train
double rendah = 40;
double tinggi = 80;
double potValue2 = analogRead(potentiometerPin2);
double y = map(potValue2, 0, 4095, 0, 120);
Serial.println("\nIntensitas Cahaya: " + String(y, 0) + " %");
double IntensitasCahaya_Rendah;
if (y >= tinggi) {
IntensitasCahaya_Rendah = 0;
Serial.println("μIntensitasCahaya_Rendah [Y]: " + String(IntensitasCahaya_Rendah, 0));
} else if (rendah < y && y < tinggi) {
IntensitasCahaya_Rendah = (tinggi - y) / (tinggi - rendah);
Serial.println("μIntensitasCahaya_Rendah [Y]: " + String(IntensitasCahaya_Rendah, 4));
} else if (y <= rendah) {
IntensitasCahaya_Rendah = 1;
Serial.println("μIntensitasCahaya_Rendah [Y]: " + String(IntensitasCahaya_Rendah, 0));
}
double IntensitasCahaya_Tinggi;
if (y <= rendah) {
IntensitasCahaya_Tinggi = 0;
Serial.println("μIntensitasCahaya_Tinggi [Y]: " + String(IntensitasCahaya_Tinggi, 0));
} else if (y > rendah && y < tinggi) {
IntensitasCahaya_Tinggi = (y - rendah) / (tinggi - rendah);
Serial.println("μIntensitasCahaya_Tinggi [Y]: " + String(IntensitasCahaya_Tinggi, 4));
} else if (y >= tinggi) {
IntensitasCahaya_Tinggi = 1;
Serial.println("μIntensitasCahaya_Tinggi [Y]: " + String(IntensitasCahaya_Tinggi, 0));
}
// Variables for the Time Needed for the lights to turn off condition
double sebentar = 5;
double lama = 15;
Serial.println("\n");
// [R1] if weather conditions are cloudy AND light intensity is low THEN the light condition is bright
double a1 = min(KondisiCuaca_Mendung, IntensitasCahaya_Rendah);
Serial.println("a1: " + String(a1, 4));
double Z1 = on - a1 * (on - off);
Serial.println("z1: " + String(Z1, 4));
// [R2] if weather conditions are cloudy AND light intensity is high THEN the light condition is off
double a2 = min(KondisiCuaca_Mendung, IntensitasCahaya_Tinggi);
Serial.println("a2: " + String(a2, 4));
double Z2 = hidup - a2 * (hidup - mati);
Serial.println("z2: " + String(Z2, 4));
// [R3] if weather conditions are clear AND light intensity is low THEN the light condition is on
double a3 = min(KondisiCuaca_Cerah, IntensitasCahaya_Rendah);
Serial.println("a3: " + String(a3, 4));
double Z3 = a3 * (hidup - mati) + mati;
Serial.println("z3: " + String(Z3, 4));
// [R4] if weather conditions are clear AND light intensity is high THEN the light condition is off
double a4 = min(KondisiCuaca_Cerah, IntensitasCahaya_Tinggi);
Serial.println("a4: " + String(a4, 4));
double Z4 = a4 * (hidup - mati) + mati;
Serial.println("z4: " + String(Z4, 4));
Serial.println("\nResult");
double z = (a1 * Z1 + a2 * Z2 + a3 * Z3 + a4 * Z4) /
(a1 + a2 + a3 + a4);
lcd.setCursor(0, 0);
lcd.print("Kondisi Cuaca:");
lcd.setCursor(0, 1);
lcd.print(int(x));
lcd.print(" °C/%");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Intensitas Cahaya:");
lcd.setCursor(0, 1);
lcd.print(int(y));
lcd.print(" %");
delay(1000);
lcd.clear();
// Kontrol Lampu
if (z >= sebentar && z <= lama) {
// Lampu Mati
digitalWrite(lampuPin, LOW);
lcd.setCursor(0, 0);
lcd.print("Lampu Hidup");
lcd.setCursor(0, 1);
lcd.print("Waktu: " + String(z, 4) + " menit");
delay(int(z) * 1000); // Convert menit ke milidetik dan tunggu
// Turn off the light after the specified time
digitalWrite(lampuPin, LOW);
lcd.clear();
} else {
// Lampu Hidup
digitalWrite(lampuPin, HIGH);
lcd.setCursor(0, 0);
lcd.print("Lampu Hidup");
lcd.setCursor(0, 1);
lcd.print("Waktu: " + String(z, 4) + " menit");
delay(500); // Tunggu 1 detik saat lampu mati
lcd.clear();
}
}