#include <Wire.h>
#include <ESP32Servo.h>
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#define LDRPIN 33 // Pin untuk sensor LDR pada GPIO33
#define DHTPIN 15 // Pin untuk sensor DHT pada GPIO14
#define SWITCHPIN 2 // Pin untuk slide switch pada GPIO2
#define SERVOPIN 4 // Pin untuk servo pada GPIO4
#define DHTTYPE DHT22
// Inisialisasi sensor DHT
DHT dht(DHTPIN, DHTTYPE);
// Inisialisasi servo
Servo myServo;
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C LCD: 0x27, dengan 20 kolom dan 4 baris
void setup() {
pinMode(LDRPIN, INPUT);
pinMode(SWITCHPIN, INPUT);
Serial.begin(9600);
myServo.attach(SERVOPIN);
dht.begin();
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Menghidupkan backlight LCD
}
void loop() {
// Sensor LDR
int LDRValue = analogRead(LDRPIN);
lcd.setCursor(8, 0);
lcd.print(" "); // Membersihkan area sebelumnya
lcd.setCursor(0, 0);
lcd.print("Cahaya: ");
// Menentukan status berdasarkan nilai lux dari sensor LDR
if (LDRValue < 1000) {
lcd.print("Mendung");
} else {
lcd.print("Cerah");
}
// Sensor DHT
float t = dht.readTemperature();
float f = dht.readTemperature(true);
lcd.setCursor(6, 1);
lcd.print(" "); // Membersihkan area sebelumnya
lcd.setCursor(0, 1);
lcd.print("Suhu: ");
char buffer[6]; // Buffer untuk menyimpan nilai suhu yang dikonversi menjadi string
dtostrf(t, 4, 1, buffer); // Mengonversi float ke string dengan 1 angka di belakang koma
lcd.print(buffer); // Menampilkan nilai suhu dalam string
lcd.print(" oC"); // Simbol derajat Celsius dalam ASCII
// Slide Switch
int switchValue = digitalRead(SWITCHPIN);
bool hujan = (switchValue == HIGH); // Jika switch diatur ke hujan (HIGH)
lcd.setCursor(7, 2);
lcd.print(" "); // Membersihkan area sebelumnya
lcd.setCursor(0, 2);
lcd.print("Hujan: ");
lcd.print(hujan ? "Ya" : "Tidak"); // Menampilkan status hujan atau tidak hujan ke LCD
// Logika untuk kontrol atap berdasarkan sensor dan slider switch
if (hujan) {
closeRoof(); // Jika hujan, atap ditutup
lcd.setCursor(0, 3);
lcd.print("Atap: Tertutup");
} else {
if (LDRValue < 1000 || t < 22) {
closeRoof(); // Jika kondisi mendung atau dingin, atap ditutup
lcd.setCursor(0, 3);
lcd.print("Atap: Tertutup");
} else {
openRoof(); // Jika tidak mendung dan tidak hujan, atap terbuka
lcd.setCursor(0, 3);
lcd.print("Atap: Terbuka");
}
}
delay(100); // Berhenti sejenak untuk membaca nilai sensor secara periodik
}
void openRoof() {
myServo.write(0); // Menutup atap
}
void closeRoof() {
myServo.write(90); // Membuka atap
}