#include <Arduino.h>
#include <Wire.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
// --- DHT22 ---
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --- Soil Moisture ---
#define SOIL_PIN 34
// --- Relay ---
#define RELAY1_PIN 12
#define RELAY2_PIN 13
#define RELAY3_PIN 14
// --- LCD & RTC ---
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS3231 rtc;
// --- Variabel tampilan LCD ---
unsigned long lastSwitchTime = 0;
byte lcdPage = 0;
// --- Fungsi simulasi prediksi TinyML ---
float fakePredict(float suhu, float kelembaban_udara, float kelembaban_tanah) {
return (kelembaban_tanah < 40) ? 1.0 : 0.0;
}
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
// Relay
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT);
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
digitalWrite(RELAY3_PIN, LOW);
// RTC
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
while (1);
}
// Uncomment jika ingin set waktu awal
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
DateTime now = rtc.now();
// Baca sensor
float suhu = dht.readTemperature();
float kelembaban_udara = dht.readHumidity();
int soil_raw = analogRead(SOIL_PIN);
float kelembaban_tanah = map(soil_raw, 1023, 0, 0, 100);
if (isnan(suhu) || isnan(kelembaban_udara)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DHT Error");
delay(2000);
return;
}
// Prediksi dan kontrol Relay 1 (berdasarkan sensor)
float output = fakePredict(suhu, kelembaban_udara, kelembaban_tanah);
digitalWrite(RELAY1_PIN, (output > 0.5) ? HIGH : LOW);
// Relay 2: aktif setiap Senin jam 06:00 - 06:10
if (now.dayOfTheWeek() == 1 && now.hour() == 6 && now.minute() < 10) {
digitalWrite(RELAY2_PIN, HIGH);
} else {
digitalWrite(RELAY2_PIN, LOW);
}
// Relay 3: aktif Senin pada minggu genap jam 17:00 - 17:10
int dayOfMonth = now.day();
int weekNumber = (dayOfMonth - 1) / 7 + 1; // Minggu ke-1 sampai ke-5
if (now.dayOfTheWeek() == 1 && weekNumber % 2 == 0 && now.hour() == 17 && now.minute() < 10) {
digitalWrite(RELAY3_PIN, HIGH);
} else {
digitalWrite(RELAY3_PIN, LOW);
}
// --- LCD Bergantian ---
if (millis() - lastSwitchTime > 3000) {
lcd.clear();
lcdPage = (lcdPage + 1) % 3;
lastSwitchTime = millis();
}
switch (lcdPage) {
case 0: // Tanggal dan waktu
lcd.setCursor(0, 0);
lcd.print("Date=");
lcd.print(now.day()); lcd.print("/");
lcd.print(now.month()); lcd.print("/");
lcd.print(now.year() % 100);
lcd.setCursor(0, 1);
lcd.print("Time=");
lcd.print(now.hour()); lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute());
break;
case 1: // Data sensor
lcd.setCursor(0, 0);
lcd.print("S="); lcd.print((int)suhu);
lcd.print("°C");
lcd.print(" H="); lcd.print((int)kelembaban_udara);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("T="); lcd.print((int)kelembaban_tanah);
lcd.print("%");
break;
case 2: // Status Relay
lcd.setCursor(0, 0);
lcd.print("R1:"); lcd.print(digitalRead(RELAY1_PIN) ? "ON " : "OFF");
lcd.print(" R2:"); lcd.print(digitalRead(RELAY2_PIN) ? "ON" : "OFF");
lcd.setCursor(0, 1);
lcd.print("R3:"); lcd.print(digitalRead(RELAY3_PIN) ? "ON" : "OFF");
break;
}
delay(100);
}