#include <ESP32Servo.h>
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definisi pin
#define TRIG_PIN 14
#define ECHO_PIN 12
#define DHT_PIN 4
#define LDR_AO_PIN 34
#define LDR_DO_PIN 35
#define SERVO_PIN 2
// Definisi tipe sensor DHT
#define DHT_TYPE DHT22
// Inisialisasi objek sensor dan LCD
DHT dht(DHT_PIN, DHT_TYPE);
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti 0x27 dengan alamat I2C LCD Anda jika perlu
// Variabel untuk efek blink LCD
int displayState = 0;
unsigned long lastBlinkTime = 0;
void setup() {
Serial.begin(115200);
// Inisialisasi pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LDR_AO_PIN, INPUT);
pinMode(LDR_DO_PIN, INPUT);
// Inisialisasi servo
servo.attach(SERVO_PIN, 500, 2400);
// Inisialisasi sensor DHT
dht.begin();
// Inisialisasi LCD
lcd.init();
lcd.backlight();
}
void loop() {
// Baca data sensor
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int distance = getDistance();
int ldrAnalog = analogRead(LDR_AO_PIN);
// Anti-bouncing untuk LDR Digital
int ldrDigital = digitalRead(LDR_DO_PIN);
static int lastLDRState = HIGH;
static unsigned long lastDebounceTime = 0;
const int debounceDelay = 50;
if (millis() - lastDebounceTime > debounceDelay) {
if (digitalRead(LDR_DO_PIN) != lastLDRState) {
lastLDRState = digitalRead(LDR_DO_PIN);
lastDebounceTime = millis();
}
}
ldrDigital = lastLDRState;
// Kontrol servo berdasarkan jarak dan LDR
if (distance > 50 ) {
servo.write(90);
} else {
servo.write(0);
}
// Tampilkan data di Serial Monitor
Serial.print(" | Temp: ");
Serial.print(temperature);
Serial.print(" | Hum: ");
Serial.print(humidity);
Serial.print(" | Jarak: ");
Serial.print(distance);
Serial.print(" | Nilai Ldr: ");
Serial.print(ldrAnalog);
// Tampilan LCD dengan efek blink
if (millis() - lastBlinkTime > 2000) {
lastBlinkTime = millis();
lcd.clear();
if (displayState == 0) {
lcd.setCursor(0, 0);
lcd.print("Suhu ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("kelembapan ");
lcd.print(humidity);
lcd.setCursor(0,2);
lcd.print("% LDR: ");
lcd.print(ldrAnalog);
} else if (displayState == 1) {
lcd.setCursor(0, 0);
lcd.print("Jarak ");
lcd.print(distance);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Servo: ");
lcd.print(servo.read());
}
displayState = (displayState + 1) % 2;
}
delay(500);
}
// Fungsi untuk membaca jarak dari sensor ultrasonik
int getDistance() {
digitalWrite(TRIG_PIN, LOW); // Pastikan TRIG_PIN dalam keadaan LOW
delayMicroseconds(2); // Tunggu sebentar
digitalWrite(TRIG_PIN, HIGH); // Kirim pulse trigger
delayMicroseconds(10); // Pulse trigger selama 10 mikrodetik
digitalWrite(TRIG_PIN, LOW); // Matikan trigger
int duration = pulseIn(ECHO_PIN, HIGH); // Baca durasi echo
// Periksa apakah pulseIn berhasil mendapatkan durasi yang valid
if (duration == 0) {
return -1; // Mengembalikan -1 jika tidak ada echo yang terdeteksi
}
// Hitung jarak berdasarkan durasi pulse echo
int distance = duration * 0.034 / 2; // Rumus jarak dalam cm
// Validasi jarak: pastikan jarak tidak lebih kecil dari 2 cm atau lebih besar dari 400 cm
if (distance < 2 || distance > 400) {
return 400; // Mengembalikan jarak maksimum jika hasil tidak valid
}
return distance; // Mengembalikan jarak yang valid
}