#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define MQ2_PIN 34 // Sensor gas analog MQ-2
#define LED_PIN 2 // LED indikator
#define BUZZER_PIN 4 // Buzzer aktif
#define BUTTON_PIN 5 // Tombol ke GND
LiquidCrystal_I2C lcd(0x27, 16, 2); // SDA = GPIO 21, SCL = GPIO 22
unsigned long waktuLED = 0;
bool statusLED = false;
unsigned long waktuBuzzer = 0;
bool statusBuzzer = false;
bool alarmDimatikan = false;
bool tombolTerakhir = HIGH;
const int ambangADC = 2000; // Ambang batas analogRead MQ-2 (0–4095)
void setup() {
Serial.begin(115200);
pinMode(MQ2_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // tombol satu kaki ke GND
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Deteksi Gas LPG");
delay(2000);
lcd.clear();
}
void loop() {
// Baca tombol
bool tombolSekarang = digitalRead(BUTTON_PIN);
if (tombolTerakhir == HIGH && tombolSekarang == LOW) {
alarmDimatikan = true;
Serial.println("Alarm dimatikan manual");
delay(200); // debounce
}
tombolTerakhir = tombolSekarang;
// Baca nilai analog sensor gas
int adcValue = analogRead(MQ2_PIN); // nilai dari 0 – 4095
Serial.print("ADC: ");
Serial.println(adcValue);
// Reset alarm jika gas normal
if (adcValue <= ambangADC) {
alarmDimatikan = false;
}
// Tampilkan status di LCD
lcd.setCursor(0, 0);
lcd.print("Status: ");
lcd.print((adcValue > ambangADC && !alarmDimatikan) ? "Bahaya" : "Aman ");
lcd.setCursor(0, 1);
lcd.print("ADC: ");
lcd.print(adcValue);
lcd.print(" "); // hapus sisa karakter
// Aktifkan alarm jika kondisi bahaya
if (adcValue > ambangADC && !alarmDimatikan) {
// LED berkedip
if (millis() - waktuLED >= 500) {
statusLED = !statusLED;
digitalWrite(LED_PIN, statusLED);
waktuLED = millis();
}
// Buzzer berbunyi putus-putus
if (millis() - waktuBuzzer >= 500) {
statusBuzzer = !statusBuzzer;
if (statusBuzzer) tone(BUZZER_PIN, 1000);
else noTone(BUZZER_PIN);
waktuBuzzer = millis();
}
} else {
// Matikan alarm
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
}
delay(100);
}