#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define FLAME_SENSOR A0 // Pin untuk sensor flame
#define MQ2_SENSOR A1 // Pin untuk sensor MQ2
#define DHTPIN 2 // Pin untuk sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT22
#define BUZZER 13 // Pin untuk buzzer
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi LCD I2C
DHT dht(DHTPIN, DHTTYPE); // Inisialisasi sensor DHT22
int flameThreshold = 600; // Batas untuk deteksi api (nilai ini diubah menjadi 600)
int mq2Threshold = 600; // Batas untuk deteksi gas (nilai ini diubah menjadi 600)
int flameValue = 0;
int mq2Value = 0;
bool fireDetected = false; // Status deteksi api
bool gasDetected = false; // Status deteksi gas
unsigned long lastFireTime = 0; // Waktu terakhir api terdeteksi
unsigned long lastGasTime = 0; // Waktu terakhir gas terdeteksi
unsigned long debounceDelay = 5000; // Debounce delay selama 5 detik agar buzzer tidak terlalu sering berbunyi
unsigned long lastBuzzerTime = 0; // Waktu terakhir buzzer menyala
void setup() {
pinMode(FLAME_SENSOR, INPUT);
pinMode(MQ2_SENSOR, INPUT);
pinMode(BUZZER, OUTPUT);
lcd.begin(16, 2);
lcd.backlight();
dht.begin(); // Memulai sensor DHT22
Serial.begin(9600);
// Menampilkan status awal pada LCD di kiri
lcd.clear();
lcd.setCursor(0, 0); // Menampilkan di baris pertama, kolom pertama
lcd.print("Flame: No Api");
lcd.setCursor(0, 1); // Menampilkan di baris kedua, kolom pertama
lcd.print("MQ2: No Gas");
delay(2000); // Menunggu 2 detik sebelum mulai mendeteksi
}
void loop() {
flameValue = analogRead(FLAME_SENSOR); // Baca nilai sensor flame
mq2Value = analogRead(MQ2_SENSOR); // Baca nilai sensor MQ2
float humidity = dht.readHumidity(); // Baca kelembaban dari DHT22
float temperature = dht.readTemperature(); // Baca suhu dari DHT22
// Menampilkan nilai sensor di Serial Monitor
Serial.print("Flame Sensor Value: ");
Serial.println(flameValue);
Serial.print("MQ2 Sensor Value: ");
Serial.println(mq2Value);
// Menampilkan status ke LCD
lcd.clear();
lcd.setCursor(0, 0); // Menulis di baris pertama, kolom pertama
// Deteksi api
if (flameValue > flameThreshold && !fireDetected && (millis() - lastFireTime) > debounceDelay) {
fireDetected = true;
lastFireTime = millis(); // Catat waktu deteksi api
if ((millis() - lastBuzzerTime) > debounceDelay) { // Jangan terlalu sering berbunyi
tone(BUZZER, 1000); // Aktifkan buzzer dengan frekuensi 1000 Hz
lastBuzzerTime = millis(); // Catat waktu terakhir buzzer menyala
}
lcd.print("API Detected!");
}
else if (flameValue <= flameThreshold && fireDetected && (millis() - lastFireTime) > debounceDelay) {
fireDetected = false;
noTone(BUZZER); // Matikan buzzer
lcd.print("No Flame");
}
// Deteksi gas
lcd.setCursor(0, 1); // Menulis di baris kedua, kolom pertama
if (mq2Value > mq2Threshold && !gasDetected && (millis() - lastGasTime) > debounceDelay) {
gasDetected = true;
lastGasTime = millis(); // Catat waktu deteksi gas
if ((millis() - lastBuzzerTime) > debounceDelay) { // Jangan terlalu sering berbunyi
tone(BUZZER, 1500); // Aktifkan buzzer dengan frekuensi 1500 Hz
lastBuzzerTime = millis(); // Catat waktu terakhir buzzer menyala
}
lcd.print("GAS Detected!");
}
else if (mq2Value <= mq2Threshold && gasDetected && (millis() - lastGasTime) > debounceDelay) {
gasDetected = false;
noTone(BUZZER); // Matikan buzzer
lcd.print("No Gas");
}
// Menampilkan nilai sensor api dan gas secara terus menerus di kiri
lcd.setCursor(0, 0); // Menulis di baris pertama, kolom pertama
lcd.print("Flame: ");
lcd.print(flameValue);
lcd.setCursor(0, 1); // Menulis di baris kedua, kolom pertama
lcd.print("MQ2: ");
lcd.print(mq2Value);
delay(1000); // Delay 1 detik untuk pembacaan berikutnya
}