#include <DHT.h> // Untuk sensor suhu dan kelembaban DHT22/DHT11
#include <Wire.h> // Diperlukan untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Untuk LCD I2C
// --- Definisi Pin Hardware ---
#define DHTPIN 13
#define DHTTYPE DHT22
#define GREEN_LED_PIN 5
#define RED_LED_PIN 23
#define BUZZER_PIN 2 // Pin untuk Buzzer (misalnya GPIO 2)
#define MQ2_PIN 12
// ... (Bagian inisialisasi DHT dan LCD sama seperti sebelumnya) ...
// Setup sensor DHT
#define DHTTYPE DHT22 // Tipe sensor DHT 22 (AM2302, AM2321)
DHT dht(DHTPIN, DHTTYPE);
// Setup LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD 0x27, 16 kolom dan 2 baris
// --- Setup: Fungsi yang Berjalan Sekali Saat ESP32 Dinyalakan/Reset ---
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT); // Tetap diatur sebagai OUTPUT
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistem Monitoring");
lcd.setCursor(0, 1);
lcd.print("Loading...");
delay(2000);
lcd.clear();
Serial.println("Sistem Pemantauan Lingkungan Dimulai!");
Serial.println("-------------------------------------");
}
// --- Loop: Fungsi yang Berjalan Berulang Kali Setelah Setup ---
void loop() {
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
int gasValue = analogRead(MQ2_PIN);
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print(" °C | Kelembaban: ");
Serial.print(kelembaban);
Serial.print(" % | Gas: ");
Serial.println(gasValue);
// --- Logika Kondisi dan Aksi ---
// 1. Cek Kondisi Prioritas Tertinggi: GAS/ASAP
if (gasValue > 3000) {
// Aksi Hardware
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, HIGH);
tone(BUZZER_PIN, 1000); // Buzzer berbunyi terus menerus pada frekuensi 1000 Hz
// Output ke Serial Monitor
Serial.println(">>> Deteksi Gas/Asap! <<<");
Serial.println("Status: Peringatan Gas/Asap!");
Serial.print("Nilai Gas: ");
Serial.println(gasValue);
// Output ke LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BAHAYAA!");
lcd.setCursor(0, 1);
lcd.print("Nilai: ");
lcd.print(gasValue);
} else if (suhu > 30.0 || kelembaban > 70.0) {
// 2. Cek Kondisi Peringatan Suhu/Kelembaban (jika tidak ada gas)
// Aksi Hardware
digitalWrite(GREEN_LED_PIN, LOW);
// Simulasi LED Merah berkedip perlahan (0.5 detik ON, 0.5 detik OFF)
digitalWrite(RED_LED_PIN, HIGH);
delay(500);
digitalWrite(RED_LED_PIN, LOW);
delay(500);
// Simulasi Buzzer berbunyi intermiten (0.5 detik ON, 0.5 detik OFF)
tone(BUZZER_PIN, 500); // Bunyikan nada 500 Hz
delay(500); // Selama 0.5 detik
noTone(BUZZER_PIN); // Matikan nada
delay(500); // Jeda 0.5 detik sebelum potensi bunyi lagi
// Output ke Serial Monitor
Serial.println(">>> Suhu/Kelembaban Tinggi! <<<");
Serial.println("Status: Peringatan Suhu/Kelembaban!");
if (suhu > 30.0) {
Serial.print("Suhu Melebihi Batas: ");
Serial.println(suhu);
}
if (kelembaban > 70.0) {
Serial.print("Kelembaban Melebihi Batas: ");
Serial.println(kelembaban);
}
// Output ke LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Waspada !");
lcd.setCursor(0, 1);
lcd.print("S:"); lcd.print(suhu, 1);
lcd.print(" K:"); lcd.print(kelembaban, 1);
} else {
// 3. Kondisi Normal (jika tidak ada peringatan gas atau suhu/kelembaban)
// Aksi Hardware
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(RED_LED_PIN, LOW);
noTone(BUZZER_PIN); // Pastikan buzzer mati jika kondisi normal
// Output ke Serial Monitor
Serial.println(">>> Kondisi Normal <<<");
Serial.println("Status: Normal");
// Output ke LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Kondisi Normal");
lcd.setCursor(0, 1);
lcd.print("S:"); lcd.print(suhu, 1);
lcd.print(" K:"); lcd.print(kelembaban, 1);
}
Serial.println("-------------------------------------");
delay(2000); // Delay antara pembacaan sensor dan pembaruan (2 detik)
}