#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <DHT.h>
// Inisialisasi LCD (alamat I2C: 0x27, ukuran 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin sensor dan komponen
#define trigPin 9
#define echoPin 10
#define gasPin A0
#define pirPin 2
#define ldrPin A1
#define dhtPin 3
#define switchPin 4
#define buzzerPin 6
#define ledRedPin 7
#define ledGreenPin 8
Servo myservo;
DHT dht(dhtPin, DHT22); // DHT22
void setup() {
// Inisialisasi pin
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(gasPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(ldrPin, INPUT);
pinMode(switchPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledRedPin, OUTPUT);
pinMode(ledGreenPin, OUTPUT);
// Inisialisasi servo
myservo.attach(9);
// Inisialisasi LCD dan DHT22
lcd.begin(16, 2); // Menentukan 16 kolom dan 2 baris
lcd.backlight();
dht.begin();
// Tampilkan pesan awal di LCD
lcd.setCursor(0, 0);
lcd.print("Sistem Start...");
delay(2000);
lcd.clear();
}
void loop() {
// Baca status switch (menghidupkan/mematikan sistem)
int switchState = digitalRead(switchPin);
if (switchState == HIGH) {
lcd.setCursor(0, 0);
lcd.print("Sistem Aktif");
// 1. Jarak dari sensor Ultrasonik
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1; // Menghitung jarak dalam cm
// 2. Gas Sensor (MQ-2)
int gasLevel = analogRead(gasPin);
// 3. PIR Sensor (Passive Infrared)
int pirState = digitalRead(pirPin);
// 4. LDR (Light Sensor)
int ldrValue = analogRead(ldrPin);
// 5. DHT22 Sensor (Suhu dan Kelembaban)
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Tampilkan hasil sensor di LCD
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Gas: ");
lcd.print(gasLevel);
// Logika sistem untuk LED, Servo, dan Buzzer berdasarkan sensor
if (gasLevel > 300 || pirState == HIGH || distance < 50) {
// Kondisi berbahaya (Gas, Gerakan, Jarak terlalu dekat)
digitalWrite(ledRedPin, HIGH); // Nyalakan LED Merah
digitalWrite(ledGreenPin, LOW); // Matikan LED Hijau
digitalWrite(buzzerPin, HIGH); // Nyalakan Buzzer
myservo.write(90); // Gerakkan Servo
lcd.setCursor(0, 1);
lcd.print("Danger! ");
} else {
// Kondisi aman
digitalWrite(ledGreenPin, HIGH); // Nyalakan LED Hijau
digitalWrite(ledRedPin, LOW); // Matikan LED Merah
digitalWrite(buzzerPin, LOW); // Matikan Buzzer
myservo.write(0); // Servo kembali ke posisi awal
lcd.setCursor(0, 1);
lcd.print("All Safe ");
}
delay(1000); // Pembaruan setiap 1 detik
} else {
// Jika switch dimatikan, sistem dalam mode standby
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistem Mati");
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledRedPin, LOW);
digitalWrite(buzzerPin, LOW);
myservo.write(0); // Servo kembali ke posisi awal
}
}