#include <ESP32Servo.h>
#include <DHT.h>

#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;

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
}

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!");
    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");

  delay(1000);  // Tunggu 1 detik sebelum mengulangi loop
}
$abcdeabcde151015202530fghijfghij