#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Inisialisasi RTC, LCD, DHT, dan sensor kelembapan tanah
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti alamat jika perlu
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define SOIL_PIN A0 // Sensor kelembapan tanah analog
// Variabel tampilan bergantian
unsigned long lastSwitchTime = 0;
const unsigned long interval = 3000; // 3 detik
int displayState = 0; // 0: Waktu, 1: DHT, 2: Tanah
void setup() {
Serial.begin(9600);
Wire.begin();
lcd.begin(16, 2);
lcd.backlight();
lcd.clear();
dht.begin();
if (!rtc.begin()) {
Serial.println("RTC tidak ditemukan");
lcd.setCursor(0, 0);
lcd.print("RTC Error");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.setCursor(0, 0);
lcd.print("Sistem Siap");
delay(2000);
lcd.clear();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - lastSwitchTime >= interval) {
displayState = (displayState + 1) % 3; // 0 -> 1 -> 2 -> kembali ke 0
lastSwitchTime = currentMillis;
lcd.clear();
}
if (displayState == 0) {
// Tampilan waktu
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print(now.day());
lcd.print('/');
lcd.print(now.month());
lcd.print('/');
lcd.print(now.year());
lcd.setCursor(0, 1);
if (now.hour() < 10) lcd.print('0');
lcd.print(now.hour());
lcd.print(':');
if (now.minute() < 10) lcd.print('0');
lcd.print(now.minute());
lcd.print(':');
if (now.second() < 10) lcd.print('0');
lcd.print(now.second());
}
else if (displayState == 1) {
// Tampilan suhu & kelembapan udara
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (isnan(temp) || isnan(hum)) {
lcd.setCursor(0, 0);
lcd.print("DHT Error");
} else {
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum : ");
lcd.print(hum);
lcd.print("%");
}
}
else if (displayState == 2) {
// Tampilan kelembapan tanah
int soilValue = analogRead(SOIL_PIN); // nilai 0–1023
int soilPercent = map(soilValue, 1023, 0, 0, 100); // sesuaikan arah pembacaan
lcd.setCursor(0, 0);
lcd.print("Soil: ");
lcd.print(soilPercent);
lcd.print("%");
}
delay(500); // delay pendek untuk stabilisasi
}