#define BLYNK_TEMPLATE_ID "TMPL6sjVZ-KgR"
#define BLYNK_TEMPLATE_NAME "Hoàng Thiên Ân"
#define BLYNK_AUTH_TOKEN "YGQnGjbp7PePY2ln9U-QXWk2fmdvYt03"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// WiFi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Cấu hình phần cứng
#define DHTPIN 5
#define DHTTYPE DHT11
#define MQ2_PIN 36
#define FIRE_SENSOR_PIN 13
#define LED_PIN 2
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool ledState = false;
bool fireAlertShown = false;
// Điều khiển LED bằng nút V10
BLYNK_WRITE(V10) {
int value = param.asInt();
ledState = value;
digitalWrite(LED_PIN, ledState);
Blynk.virtualWrite(V6, ledState); // Đồng bộ LED STATE
}
void sendSensorData() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int gasValue = analogRead(MQ2_PIN);
bool fireDetected = (digitalRead(FIRE_SENSOR_PIN) == LOW); // LOW là có cháy
// Gửi dữ liệu sensor
if (!isnan(temperature)) Blynk.virtualWrite(V0, temperature);
if (!isnan(humidity)) Blynk.virtualWrite(V12, humidity);
Blynk.virtualWrite(V1, gasValue);
// Cảnh báo cháy
if (fireDetected) {
if (!fireAlertShown) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("!!! CO CHAY !!!");
lcd.setCursor(0, 1);
lcd.print("NGUY HIEM !");
fireAlertShown = true;
}
Blynk.virtualWrite(V11, 1); // Gửi 1 nếu có cháy
digitalWrite(LED_PIN, HIGH); // Bật LED
Blynk.virtualWrite(V10, 1); // Gạt nút BUTTON sang ON
Blynk.virtualWrite(V6, 1); // Đồng bộ LED STATE
} else {
fireAlertShown = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhiet:");
lcd.print(temperature, 1);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Gas:");
lcd.print(gasValue);
lcd.print("ppm");
Blynk.virtualWrite(V11, 0); // Không cháy
digitalWrite(LED_PIN, ledState); // Điều khiển theo trạng thái nút
Blynk.virtualWrite(V6, ledState); // Đồng bộ trạng thái LED
}
}
unsigned long previousMillis = 0;
const unsigned long interval = 2000; // 2 giây
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(FIRE_SENSOR_PIN, INPUT);
dht.begin();
lcd.init();
lcd.backlight();
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}
void loop() {
Blynk.run();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
sendSensorData();
}
}