#include <ESP32Servo.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Tambahkan pustaka untuk LCD
#define DHTPIN 5
#define DHTTYPE DHT22
#define TRIG_PIN 2
#define ECHO_PIN 4
#define SERVO_PIN 22
#define DISTANCE_THRESHOLD 10 // threshold jarak dalam cm
DHT dht(DHTPIN, DHTTYPE);
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD (biasanya 0x27 atau 0x3F), ukuran 16x2
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
servo.attach(SERVO_PIN);
servo.write(90); // Set awal servo ke posisi tengah (90 derajat)
dht.begin(); // Mulai sensor DHT
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Inisialisasi...");
delay(2000);
lcd.clear();
}
void loop() {
// Baca suhu dan kelembaban dari sensor DHT
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
lcd.setCursor(0, 0);
lcd.print("DHT Error!");
return;
}
// Trigger sensor ultrasonik
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Mengukur durasi pulsa
float duration_us = pulseIn(ECHO_PIN, HIGH);
// Menghitung jarak berdasarkan durasi pulsa
float distance_cm = duration_us * 0.034 / 2;
// Mengatur posisi servo berdasarkan jarak
if (distance_cm < DISTANCE_THRESHOLD) {
servo.write(0); // Posisi servo ke bawah (0 derajat) saat objek terdeteksi dalam jarak threshold
} else {
servo.write(90); // Posisi servo ke tengah (90 derajat) saat tidak ada objek dalam jarak threshold
}
// Menampilkan data ke serial monitor
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.println(" C");
Serial.print("Kelembaban: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Jarak: ");
Serial.print(distance_cm);
Serial.println(" cm");
// Menampilkan data ke LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S:"); lcd.print(temperature); lcd.print("C ");
lcd.print("H:"); lcd.print(humidity); lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Jarak: "); lcd.print(distance_cm); lcd.print("cm");
delay(1000); // Tunggu 1 detik sebelum mengulangi loop
}