#include <DHT.h>
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h> // Ganti dengan library PCF8574
#define DHTPIN 2 // Pin DHT22
#define DHTTYPE DHT22
#define ECHO_PIN 3 // Pin Echo pada HC-SR04
#define TRIG_PIN 4 // Pin Trig pada HC-SR04
#define BUZZER_PIN 5 // Pin Buzzer
#define SERVO_PIN 6 // Pin Servo
DHT dht(DHTPIN, DHTTYPE);
Servo myServo;
LiquidCrystal_PCF8574 lcd(0x27); // Menggunakan alamat I2C 0x27
void setup() {
Serial.begin(9600);
dht.begin();
myServo.attach(SERVO_PIN);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
myServo.write(0); // Set servo awal pada posisi 0 derajat
// Inisialisasi LCD
lcd.begin(20, 4);
lcd.setBacklight(255);
lcd.setCursor(0, 0);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
}
void loop() {
// Baca suhu dan kelembaban dari DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Baca jarak dari HC-SR04
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
// Kondisi 1: Cek kelembaban atau suhu
if (humidity > 70 || temperature > 30) {
myServo.write(90); // Putar servo ke posisi 90 derajat
} else {
myServo.write(0); // Kembalikan servo ke posisi awal
}
// Kondisi 2: Cek jarak objek
if (distance < 10) {
digitalWrite(BUZZER_PIN, HIGH); // Nyalakan buzzer
} else {
digitalWrite(BUZZER_PIN, LOW); // Matikan buzzer
}
// Tampilkan data pada LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm");
// Tampilkan status servo
lcd.setCursor(0, 3);
if (humidity > 70 || temperature > 30) {
lcd.print("Servo: OPEN");
} else {
lcd.print("Servo: CLOSED");
}
delay(500);
}