#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
#define RELAYPIN 8
// Threshold suhu dan kelembaban
#define TEMP_THRESHOLD 30.0
#define HUMIDITY_THRESHOLD 60.0
// Jam operasi kipas
#define START_HOUR 7
#define END_HOUR 14
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Coba 0x27 dulu, jika tidak berfungsi coba 0x3F
RTC_DS3231 rtc;
void setup() {
Serial.begin(9600);
dht.begin();
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("Tidak bisa menemukan RTC");
while (1);
}
// Inisialisasi LCD
lcd.init(); // Gunakan init() bukan begin()
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sistem Kipas");
lcd.setCursor(0, 1);
lcd.print("Otomatis v1.0");
delay(2000);
lcd.clear();
// Setup relay pin
pinMode(RELAYPIN, OUTPUT);
digitalWrite(RELAYPIN, LOW); // Pastikan kipas mati saat startup
// Setting waktu RTC (uncomment jika perlu set manual)
/*
DateTime now = rtc.now();
rtc.adjust(DateTime(
now.year(),
now.month(),
now.day(),
8, // Jam manual
0, // Menit manual
0 // Detik
));
*/
Serial.println("Sistem siap!");
}
void loop() {
// Baca sensor DHT22
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// Baca waktu dari RTC
DateTime now = rtc.now();
// Cek apakah pembacaan sensor berhasil
if (isnan(temp) || isnan(hum)) {
lcd.setCursor(0, 0);
lcd.print("Sensor Error! ");
lcd.setCursor(0, 1);
lcd.print("Periksa koneksi ");
Serial.println("Error: Gagal membaca sensor DHT22");
delay(2000);
return;
}
// Tampilkan data di LCD
displayData(temp, hum, now);
// Logika kontrol kipas
bool shouldTurnOn = false;
// Cek kondisi: waktu operasi DAN suhu DAN kelembaban
if (now.hour() >= START_HOUR && now.hour() < END_HOUR) {
if (temp > TEMP_THRESHOLD && hum > HUMIDITY_THRESHOLD) {
shouldTurnOn = true;
}
}
// Kontrol relay
if (shouldTurnOn) {
digitalWrite(RELAYPIN, HIGH); // Kipas ON
lcd.setCursor(0, 1);
lcd.print("ON ");
Serial.println("Kipas: ON");
} else {
digitalWrite(RELAYPIN, LOW); // Kipas OFF
lcd.setCursor(0, 1);
lcd.print("OFF");
Serial.println("Kipas: OFF");
}
// Debug info ke Serial Monitor
Serial.print("Waktu: ");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(" | Suhu: ");
Serial.print(temp);
Serial.print("°C | Kelembaban: ");
Serial.print(hum);
Serial.println("%");
delay(1000);
}
void displayData(float temp, float hum, DateTime now) {
// Baris pertama: Suhu dan status kipas
lcd.setCursor(0, 0);
lcd.print("T:");
if (temp < 10) lcd.print(" ");
lcd.print(temp, 1);
lcd.print((char)223);
lcd.print("C ");
// Baris kedua: Kelembaban dan waktu
lcd.setCursor(9, 0);
lcd.print("H:");
if (hum < 10) lcd.print(" ");
lcd.print(hum, 1);
lcd.print("% ");
lcd.setCursor(4,1);
lcd.print("Pukul :");
// Tampilkan waktu di pojok kanan bawah
lcd.setCursor(10, 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());
}