#include <ESP32Servo.h>
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define TRIG_PIN 5
#define ECHO_PIN 18
#define DHT_PIN 4
#define LDR_AO_PIN 34
#define LDR_DO_PIN 35
#define SERVO_PIN 2
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
Servo servo;
// **Inisialisasi LCD I2C** (Alamat default 0x27, ukuran 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
int displayState = 0; // Untuk efek blink
unsigned long lastBlinkTime = 0;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LDR_AO_PIN, INPUT);
pinMode(LDR_DO_PIN, INPUT);
servo.attach(SERVO_PIN, 500, 2400);
dht.begin();
// **Inisialisasi LCD**
lcd.init();
lcd.backlight();
}
void loop() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int distance = getDistance();
int ldrAnalog = analogRead(LDR_AO_PIN);
int ldrDigital = digitalRead(LDR_DO_PIN);
// **DEBUG ke Serial Monitor**
Serial.print("Temp: "); Serial.print(temperature);
Serial.print(" | Hum: "); Serial.print(humidity);
Serial.print(" | Distance: "); Serial.print(distance);
Serial.print(" | LDR Analog: "); Serial.print(ldrAnalog);
Serial.print(" | LDR Digital: "); Serial.println(ldrDigital);
// **Servo bergerak berdasarkan Jarak Ultrasonic**
if (distance < 10) {
Serial.println("Objek dekat! Servo ke 90°");
servo.write(90);
} else {
Serial.println("Objek jauh, servo kembali ke 0°");
servo.write(0);
}
// **Efek Blink untuk LCD**
if (millis() - lastBlinkTime > 2000) { // Ganti tampilan tiap 2 detik
lastBlinkTime = millis();
lcd.clear();
if (displayState == 0) {
lcd.setCursor(0, 0);
lcd.print("Temp: " + String(temperature) + "C");
lcd.setCursor(0, 1);
lcd.print("Humidity: " + String(humidity) + "%");
} else if (displayState == 1) {
lcd.setCursor(0, 0);
lcd.print("Distance: " + String(distance) + "cm");
lcd.setCursor(0, 1);
lcd.print("LDR: " + String(ldrAnalog));
}
displayState = (displayState + 1) % 2; // Ganti tampilan bergantian
}
delay(500);
}
int getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.034 / 2;
if (distance == 0 || distance > 400) {
return 400;
}
return distance;
}