#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
Servo myservo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(A0, DHT22); // Menggunakan pin A0 untuk sensor DHT22
#define trigPin 7
#define echoPin 6
#define buzzerPin 11
const int lampuHijau = 3;
const int lampuBiru = 4;
const int lampuMerah = 5;
int lowerThreshold = 10; // Batas jarak merah
int mediumThreshold = 30; // Batas jarak biru
int servoOpenAngle = 90; // Sudut untuk membuka servo
int servoCloseAngle = 0; // Sudut untuk menutup servo
void setup() {
lcd.begin(16, 2);
lcd.init();
lcd.clear();
lcd.backlight();
dht.begin();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(lampuHijau, OUTPUT);
pinMode(lampuBiru, OUTPUT);
pinMode(lampuMerah, OUTPUT);
pinMode(buzzerPin, OUTPUT);
myservo.attach(9);
Serial.begin(9600);
lcd.setCursor(0, 0);
lcd.print("PINTU AIR OTOMATIS");
delay(2000);
}
void loop() {
long duration, jarak;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
jarak = (duration / 2) / 29.1;
// Baca nilai kelembaban dari sensor DHT22
float air = dht.readHumidity();
// Tampilkan nilai di Serial Monitor (opsional)
Serial.print("Air: ");
Serial.println(air);
// Tampilkan nilai di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Air: ");
lcd.print(air, 1); // Menampilkan nilai tanpa persentase dengan satu angka di belakang koma
lcd.setCursor(0, 1);
lcd.print("Objek: ");
lcd.print(jarak);
// Kontrol lampu, buzzer, dan servo
if (jarak <= lowerThreshold) {
digitalWrite(lampuMerah, HIGH);
digitalWrite(lampuBiru, LOW);
digitalWrite(lampuHijau, LOW);
tone(buzzerPin, 1000); // Bunyikan buzzer dengan frekuensi 1000Hz
delay(100); // Tambahkan delay untuk memastikan buzzer terdengar
myservo.write(servoOpenAngle); // Buka servo
} else if (jarak <= mediumThreshold) {
digitalWrite(lampuBiru, HIGH);
digitalWrite(lampuHijau, LOW);
digitalWrite(lampuMerah, LOW);
noTone(buzzerPin); // Matikan buzzer
myservo.write(servoCloseAngle); // Tutup servo
} else {
digitalWrite(lampuHijau, HIGH);
digitalWrite(lampuBiru, LOW);
digitalWrite(lampuMerah, LOW);
noTone(buzzerPin); // Matikan buzzer
myservo.write(servoCloseAngle); // Tutup servo
}
delay(1000);
}