#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C
#include <DHT.h>
#define RELAY_PIN 2 // Tentukan pin yang digunakan untuk relay (misalnya GPIO2)
#define RELAY_ON_TIME 10000 // Waktu relay aktif dalam milidetik (10 detik)
RTC_DS3231 rtc; // Inisialisasi objek RTC
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set alamat I2C dan ukuran LCD (16x2)
#define DHTPIN 17 // Pin data DHT22 terhubung ke pin 2 pada ESP32
#define DHTTYPE DHT22 // Tipe sensor DHT
#define RELAY1_PIN 14 // Pin untuk relay 2
#define RELAY2_PIN 23 // Pin untuk relay 3
#define RELAY3_PIN 17 // Pin untuk relay 4
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(RELAY_PIN, OUTPUT); // Set pin relay sebagai output
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan backlight LCD
if (!rtc.begin()) {
Serial.println("Tidak dapat menemukan RTC");
lcd.print("RTC tidak ditemukan");
while (1);
}
// Atur waktu manual
rtc.adjust(DateTime(2024, 5, 20, 21, 0, 0)); // Tanggal: 20 Mei 2024, Jam: 21:00:00
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT);
digitalWrite(RELAY1_PIN, HIGH); // Mengaktifkan relay 1 secara default
dht.begin();
}
void loop() {
DateTime now = rtc.now(); // Dapatkan waktu sekarang
// Tampilkan tanggal dan waktu di Serial Monitor
Serial.print(now.day(), DEC);
Serial.print(" ");
printMonth(now.month());
Serial.print(" ");
Serial.print(now.year(), DEC);
Serial.print(" - ");
Serial.print(now.hour(), DEC);
Serial.print(':');
printDigits(now.minute());
Serial.print(':');
printDigits(now.second());
Serial.println();
// Tampilkan tanggal dan waktu di LCD
lcd.clear(); // Hapus layar sebelum menampilkan data baru
lcd.print(now.day(), DEC);
lcd.print(" ");
printMonthLCD(now.month());
lcd.print(" ");
lcd.print(now.year(), DEC);
lcd.setCursor(0, 1);
lcd.print(now.hour(), DEC);
lcd.print(':');
printDigits(now.minute());
lcd.print(':');
printDigits(now.second());
// Periksa apakah waktu saat ini adalah waktu yang ditentukan dan relay belum diaktifkan
if ((now.hour() == 21 || now.hour() == 0 || now.hour() == 3 || now.hour() == 6 ||
now.hour() == 9 || now.hour() == 12 || now.hour() == 15 || now.hour() == 18) &&
now.minute() == 0 && now.second() == 0) {
activateRelay(); // Aktifkan relay
lcd.setCursor(0, 1);
lcd.print("Relay diaktifkan");
Serial.println("Relay diaktifkan!");
} else {
digitalWrite(RELAY_PIN, LOW); // Matikan relay
lcd.setCursor(0, 1);
lcd.print("Relay dimatikan ");
}
// Baca sensor DHT
delay(2000); // Tunggu 2 detik sebelum membaca sensor
float humidity = dht.readHumidity(); // Baca kelembapan
float temperature = dht.readTemperature(); // Baca suhu dalam Celcius (default)
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Gagal membaca sensor DHT22!");
return;
}
Serial.print("Kelembapan: ");
Serial.print(humidity);
Serial.print("%\t");
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.println("°C");
// Mengontrol relay 2 berdasarkan suhu
if (temperature >= 32 && temperature < 34) {
digitalWrite(RELAY2_PIN, HIGH); // Menyalakan relay 2 saat suhu mencapai 32°C
} else {
digitalWrite(RELAY2_PIN, LOW); // Mematikan relay 2 saat suhu melebihi 34°C
}
// Mengontrol relay 3 berdasarkan kelembapan
if (humidity >= 80) {
digitalWrite(RELAY3_PIN, HIGH); // Menyalakan relay 3 saat kelembapan mencapai 55%
} else {
digitalWrite(RELAY3_PIN, LOW); // Mematikan relay 3 saat kelembapan di bawah 55%
}
delay(1000); // Tunggu 1 detik
}
void printDigits(int digits) {
// Tambahkan nol di depan jika angka kurang dari 10
if (digits < 10) {
Serial.print('0');
}
Serial.print(digits);
}
void printMonth(int month) {
switch(month) {
case 1: Serial.print("Januari"); break;
case 2: Serial.print("Februari"); break;
case 3: Serial.print("Maret"); break;
case 4: Serial.print("April"); break;
case 5: Serial.print("Mei"); break;
case 6: Serial.print("Juni"); break;
case 7: Serial.print("Juli"); break;
case 8: Serial.print("Agustus"); break;
case 9: Serial.print("September"); break;
case 10: Serial.print("Oktober"); break;
case 11: Serial.print("November"); break;
case 12: Serial.print("Desember"); break;
default: Serial.print("Invalid"); break;
}
}
void printMonthLCD(int month) {
switch(month) {
case 1: lcd.print("Januari"); break;
case 2: lcd.print("Februari"); break;
case 3: lcd.print("Maret"); break;
case 4: lcd.print("April"); break;
case 5: lcd.print("Mei"); break;
case 6: lcd.print("Juni"); break;
case 7: lcd.print("Juli"); break;
case 8: lcd.print("Agustus"); break;
case 9: lcd.print("September"); break;
case 10: lcd.print("Oktober"); break;
case 11: lcd.print("November"); break;
case 12: lcd.print("Desember"); break;
default: lcd.print("Invalid"); break;
}
}
void activateRelay() {
digitalWrite(RELAY_PIN, HIGH); // Aktifkan relay
delay(RELAY_ON_TIME); // Tunggu selama RELAY_ON_TIME
digitalWrite(RELAY_PIN, LOW); // Matikan relay setelah RELAY_ON_TIME
}