#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <RTClib.h>
// Konfigurasi LCD 19x2
LiquidCrystal_I2C lcd(0x27, 19, 2); // Set LCD ke 19 kolom dan 2 baris
// Konfigurasi DHT22
#define DHTPIN 15 // Pin DATA DHT22
#define DHTTYPE DHT22 // Jenis sensor DHT
DHT dht(DHTPIN, DHTTYPE);
// Konfigurasi LED (Kipas)
#define FAN_LED_PIN 16 // Pin GPIO untuk mengendalikan LED (Kipas)
// Konfigurasi LDR
#define LDR_PIN 34 // Pin LDR pada GPIO 34 (pin analog)
// Pin untuk Lampu
#define LIGHT_PIN 0 // Pin GPIO untuk Lampu (LED)
// Inisialisasi RTC DS1307
RTC_DS1307 rtc;
void setup() {
// Inisialisasi komunikasi Serial
Serial.begin(115200);
Serial.println("Menghubungkan DHT22, LDR, dan Kipas");
// Inisialisasi LCD 19x2
Wire.begin(19, 2);
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Menyalakan lampu latar
lcd.setCursor(0, 0); // Posisi kursor awal
lcd.print("Mengukur...");
// Inisialisasi DHT22
dht.begin();
// Inisialisasi LED (Kipas)
pinMode(FAN_LED_PIN, OUTPUT); // Set GPIO untuk LED (Kipas) sebagai output
// Inisialisasi LDR (sebagai input)
pinMode(LDR_PIN, INPUT);
// Inisialisasi Lampu (LED)
pinMode(LIGHT_PIN, OUTPUT); // Set GPIO untuk Lampu sebagai output
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
lcd.print("RTC Error!");
while (1); // Berhenti jika RTC tidak ditemukan
}
delay(1000);
// Menyesuaikan waktu RTC (gunakan waktu kompilasi)
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
delay(2000); // Tunggu beberapa detik
}
int ldr;
void loop() {
delay(10);
// Baca suhu dan kelembaban
float suhu = dht.readTemperature(); // Membaca suhu dalam Celsius
float kelembaban = dht.readHumidity(); // Membaca kelembaban dalam %
// Periksa apakah pembacaan berhasil
if (isnan(suhu) || isnan(kelembaban)) {
Serial.println("Gagal membaca DHT22!");
lcd.setCursor(0, 0);
lcd.print("Error membaca DHT");
} else {
// Tampilkan data di Serial Monitor
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print(" C, Kelembaban: ");
Serial.print(kelembaban);
Serial.println(" %");
// Tampilkan data di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhu);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Kelembaban: ");
lcd.print(kelembaban);
lcd.print(" %");
// Kendalikan kipas (LED) berdasarkan suhu
if (suhu > 30.0) { // Jika suhu lebih dari 30°C
digitalWrite(FAN_LED_PIN, HIGH); // Nyalakan kipas (LED)
Serial.println("Kipas ON");
} else {
digitalWrite(FAN_LED_PIN, LOW); // Matikan kipas (LED)
Serial.println("Kipas OFF");
}
}
// Baca nilai LDR untuk mendeteksi cahaya
ldr = analogRead(LDR_PIN); // Membaca nilai dari LDR
// Tampilkan nilai LDR di Serial Monitor
Serial.print("Nilai LDR: ");
Serial.println(ldr);
delay(250);
// Kendalikan lampu (LED) berdasarkan cahaya dari LDR
if (ldr < 2000) { // Jika nilai LDR rendah (malam hari)
digitalWrite(LIGHT_PIN, HIGH); // Nyalakan lampu (LED)
Serial.println("Lampu ON (Malam)");
} else {
digitalWrite(LIGHT_PIN, LOW); // Matikan lampu (LED)
Serial.println("Lampu OFF (Pagi)");
}
// Baca waktu dari RTC
DateTime now = rtc.now();
// Tampilkan waktu di Serial Monitor
Serial.print("Jam: ");
Serial.print(now.hour(), DEC); // Jam
Serial.print(":");
Serial.print(now.minute(), DEC); // Menit
Serial.print(":");
Serial.print(now.second(), DEC); // Detik
Serial.println();
// Jika jam lebih dari 17 (jam 5 sore), matikan lampu
if (now.hour() >= 17) {
digitalWrite(LIGHT_PIN, LOW); // Matikan lampu
Serial.println("Lampu OFF (Jam 5 Sore)");
}
delay(2000); // Tunggu 2 detik sebelum pembacaan berikutnya
}