#include <Servo.h>
#include <DHT.h>
// Pin untuk sensor LDR dan LED
int ldr = A0;
int led = 2;
int kecerahan = 0;
// Pin untuk sensor ultrasonik
#define ECHO_pin 3
#define TRIG_pin 5
// Pin untuk sensor PIR dan buzzer
int pirPin = A1;
int buzzerPin = 4;
// Pin untuk sensor DHT22
#define DHT_PIN 5
#define LED_PIN 6
// Inisialisasi objek DHT22
DHT dht(DHT_PIN, DHT22);
// Pin untuk Servo
Servo myservo;
int rotasi = 90;
bool buzzerState = false; // Menyimpan status terakhir buzzer
void setup() {
// Setup untuk LDR dan LED
pinMode(ldr, INPUT);
pinMode(led, OUTPUT);
Serial.begin(9600);
// Setup untuk sensor ultrasonik dan servo
pinMode(TRIG_pin, OUTPUT);
pinMode(ECHO_pin, INPUT);
myservo.attach(10);
myservo.write(90); // Atur posisi awal servo ke 90 derajat
// Setup untuk sensor PIR dan buzzer
pinMode(pirPin, INPUT);
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW); // Matikan buzzer di awal
// Setup untuk DHT22
dht.begin();
}
void loop() {
// Bagian untuk mengontrol LED dengan sensor LDR
kontrolLampu();
// Bagian untuk mengontrol servo dengan sensor ultrasonik
kontrolServo();
// Bagian untuk mengontrol buzzer dengan sensor PIR
kontrolPIR();
// Bagian untuk membaca suhu dan kelembapan dari DHT22
kontrolDHT22();
// Tambahkan delay jika perlu untuk stabilitas loop
delay(100);
}
// Fungsi untuk mengontrol lampu dengan LDR
void kontrolLampu() {
kecerahan = analogRead(ldr); // Baca nilai dari sensor LDR
if (kecerahan < 250) { // Jika nilai LDR rendah (cahaya redup)
digitalWrite(led, HIGH); // Nyalakan LED
} else {
digitalWrite(led, LOW); // Matikan LED
}
Serial.print("Kecerahan LDR: ");
Serial.println(kecerahan); // Tampilkan nilai kecerahan LDR ke serial monitor
}
// Fungsi untuk mengontrol servo dengan sensor ultrasonik
void kontrolServo() {
float jarak = readDistanceCM(); // Baca jarak dari sensor ultrasonik
if (jarak > 0 && jarak < 100) { // Jika jarak kurang dari 100 cm
tutup(); // Tutup palang (servo bergerak ke 0 derajat)
} else {
buka(); // Buka palang (servo bergerak ke 90 derajat)
}
}
// Fungsi untuk membaca jarak dari sensor ultrasonik
float readDistanceCM() {
digitalWrite(TRIG_pin, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_pin, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_pin, LOW);
int duration = pulseIn(ECHO_pin, HIGH);
return duration * 0.034 / 2; // Menghitung jarak dalam cm
}
// Fungsi untuk menutup palang
void tutup() {
if (rotasi > 0) {
myservo.write(rotasi); // Menggerakkan servo
delay(100);
rotasi--; // Kurangi posisi servo
}
if (rotasi < 0) rotasi = 0; // Pastikan posisi tidak kurang dari 0 derajat
}
// Fungsi untuk membuka palang
void buka() {
if (rotasi < 90) {
myservo.write(rotasi); // Menggerakkan servo
delay(100);
rotasi += 4; // Tambahkan posisi servo
}
if (rotasi > 90) rotasi = 90; // Pastikan posisi tidak lebih dari 90 derajat
}
// Fungsi untuk mengontrol buzzer dengan PIR
void kontrolPIR() {
int pirState = digitalRead(pirPin); // Baca status sensor PIR
Serial.print("PIR State: ");
Serial.println(pirState); // Tampilkan status PIR di serial monitor
if (pirState == HIGH) { // Jika sensor PIR mendeteksi gerakan
digitalWrite(buzzerPin, HIGH); // Nyalakan buzzer
if (!buzzerState) { // Jika buzzer baru saja menyala
Serial.println("Buzzer ON"); // Tampilkan pesan "Buzzer ON"
buzzerState = true; // Ubah status buzzer menjadi menyala
}
} else {
digitalWrite(buzzerPin, LOW); // Matikan buzzer
if (buzzerState) { // Jika buzzer baru saja mati
Serial.println("Buzzer OFF"); // Tampilkan pesan "Buzzer OFF"
buzzerState = false; // Ubah status buzzer menjadi mati
}
}
}
// Fungsi untuk membaca suhu dan kelembapan dari DHT22
void kontrolDHT22() {
float suhu = dht.readTemperature(); // Membaca suhu dalam Celcius
float kelembapan = dht.readHumidity(); // Membaca kelembapan dalam persen
// Menampilkan suhu dan kelembapan di serial monitor
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print(" °C\t");
Serial.print("Kelembapan: ");
Serial.print(kelembapan);
Serial.println(" %");
// Memeriksa apakah suhu dan kelembapan tinggi
if (suhu > 30.0 && kelembapan > 60.0) { // Misalnya suhu > 30°C dan kelembapan > 60%
digitalWrite(LED_PIN, HIGH); // Nyalakan LED jika suhu dan kelembapan tinggi
} else {
digitalWrite(LED_PIN, LOW); // Matikan LED jika tidak
}
}