/*************************************************
* BLYNK CONFIG
*************************************************/
#define BLYNK_TEMPLATE_ID "TMPL6mirFyvNm"
#define BLYNK_TEMPLATE_NAME "SIGAMON"
#define BLYNK_AUTH_TOKEN "ScDt7ynsxLz2QRVw50rtAjP7jmdp9jf9"
#define BLYNK_PRINT Serial
/*************************************************
* LIBRARY
*************************************************/
#include <Arduino.h>
#include <Wire.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
/*************************************************
* WIFI
*************************************************/
const char* ssid = "The Boys Office";
const char* pass = "minimaljangandisebar38a";
/*************************************************
* PIN CONFIG
*************************************************/
#define MQ4_PIN 34
#define BUZZER_PIN 26
#define LED_BAHAYA 4
#define LED_WASPADA 32
#define LED_AMAN 33
#define RELAY_PIN 14
#define DHT_PIN 27
#define DHT_TYPE DHT22
/*************************************************
* PARAMETER
*************************************************/
#define SAMPLE_COUNT 10
#define GAS_DELTA_THRESHOLD 500
/*************************************************
* OBJECT
*************************************************/
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHT_PIN, DHT_TYPE);
/*************************************************
* VARIABLE
*************************************************/
int baselineADC = 0;
/*************************************************
* FUNCTION
*************************************************/
int readMQ4Average() {
long sum = 0;
for (int i = 0; i < SAMPLE_COUNT; i++) {
sum += analogRead(MQ4_PIN);
delay(5);
}
return sum / SAMPLE_COUNT;
}
/*************************************************
* SETUP
*************************************************/
void setup() {
Serial.begin(115200);
pinMode(MQ4_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_BAHAYA, OUTPUT);
pinMode(LED_WASPADA, OUTPUT);
pinMode(LED_AMAN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_BAHAYA, LOW);
digitalWrite(LED_WASPADA, LOW);
digitalWrite(LED_AMAN, LOW);
digitalWrite(RELAY_PIN, LOW);
analogReadResolution(12);
analogSetAttenuation(ADC_11db);
dht.begin();
Wire.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Gas Monitoring");
lcd.setCursor(0, 1);
lcd.print("Init System...");
delay(2000);
lcd.clear();
// ===== WIFI & BLYNK =====
lcd.print("Connecting WiFi");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
lcd.clear();
lcd.print("Blynk Connected");
delay(1500);
lcd.clear();
// ===== BASELINE MQ4 =====
lcd.print("Ambil Baseline");
Serial.println("⏳ Tunggu 10 detik ambil baseline...");
delay(10000);
baselineADC = readMQ4Average();
Serial.print("Baseline ADC: ");
Serial.println(baselineADC);
lcd.clear();
lcd.print("Baseline OK");
delay(1500);
lcd.clear();
}
/*************************************************
* LOOP
*************************************************/
void loop() {
Blynk.run();
int adcValue = readMQ4Average();
int delta = abs(adcValue - baselineADC);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// ===== KIRIM KE BLYNK =====
Blynk.virtualWrite(V1, adcValue); // Gas MQ4
Blynk.virtualWrite(V2, temperature); // Suhu
Blynk.virtualWrite(V3, humidity); // Kelembaban
// ===== LCD BARIS 1 =====
lcd.setCursor(0, 0);
lcd.print("T:");
if (!isnan(temperature)) {
lcd.print(temperature, 1);
lcd.print("C ");
} else {
lcd.print("--.-C ");
}
lcd.print("H:");
if (!isnan(humidity)) {
lcd.print(humidity, 0);
lcd.print("% ");
} else {
lcd.print("--% ");
}
// ===== KONDISI GAS =====
lcd.setCursor(0, 1);
if (delta > GAS_DELTA_THRESHOLD + 300) {
// 🔴 BAHAYA
lcd.print("GAS BAHAYA!!! ");
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(LED_BAHAYA, HIGH);
digitalWrite(LED_WASPADA, LOW);
digitalWrite(LED_AMAN, LOW);
digitalWrite(RELAY_PIN, HIGH);
delay(300);
digitalWrite(LED_BAHAYA, LOW);
delay(300);
} else if (delta > GAS_DELTA_THRESHOLD) {
// 🟡 WASPADA
lcd.print("Gas Waspada ");
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_BAHAYA, LOW);
digitalWrite(LED_WASPADA, HIGH);
digitalWrite(LED_AMAN, LOW);
digitalWrite(RELAY_PIN, LOW);
delay(500);
} else {
// 🟢 AMAN
lcd.print("Gas Aman ");
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_BAHAYA, LOW);
digitalWrite(LED_WASPADA, LOW);
digitalWrite(LED_AMAN, HIGH);
digitalWrite(RELAY_PIN, LOW);
delay(500);
}
// ===== SERIAL MONITOR =====
Serial.print("ADC: ");
Serial.print(adcValue);
Serial.print(" | ΔADC: ");
Serial.print(delta);
Serial.print(" | T: ");
Serial.print(temperature);
Serial.print(" C | H: ");
Serial.print(humidity);
Serial.println(" %");
}