#define BLYNK_TEMPLATE_ID "TMPL6V1JqnA3R"
#define BLYNK_TEMPLATE_NAME "Đồ án 1"

#include <Wire.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
//  dht22
#define DHTTYPE DHT22
DHT dht_1(5, DHTTYPE); //phong 1
DHT dht_2(25, DHTTYPE);// phong 2
DHT dht_3(12, DHTTYPE); // phong 3
// MQ2
#define MQ2_1 A0 
#define MQ2_2 34
#define MQ2_3 35
// firesensor
#define FIRE_SENSOR_1 13
#define FIRE_SENSOR_2 15
#define FIRE_SENSOR_3 16
// button 
#define btn_1 17
#define btn_2 18
#define btn_3 19

#define LED_PIN 2
#define BUZZER_PIN 4
// blynk 
char auth[]= "--ugAMQyPQqKIQieUf6Dmv73L528Zz1K";
char ssid []="Wokwi-GUEST";
char pass[] ="";
unsigned long lastSendTime = 0;

bool ledstate = false;       //led của hệ thống
bool statecontrol = false;   // led tùy chỉnh qua blynk

unsigned long lastNotifyTime = 0;
const unsigned long notifyInterval = 10000; // 1PHUT


LiquidCrystal_I2C lcd(0x27, 16, 2);
int CrRoom=1;


BLYNK_WRITE (V10) {
int state = param.asInt(); // chỉ nhận 2 giá trị là 1 và 0
if (!ledstate) {
  statecontrol = state;
digitalWrite(LED_PIN, state);
Blynk.virtualWrite(V2, state? 255 : 0); // Cập nhật trạng thái LED ảo (V2) 255 là mức sáng cao nhất tức là mức HIGHT 

}
}
void setup() {
  Blynk.begin(auth, ssid, pass);
  Blynk.virtualWrite(V7, "1");
  Blynk.virtualWrite(V8, "2");
  Blynk.virtualWrite(V9, "3");
  Serial.begin(115200);
  lcd.init();
  lcd.backlight();
  // dht 
   dht_1.begin();
   dht_2.begin();
   dht_3.begin();
  // mq2 
  pinMode(MQ2_1, INPUT);
  pinMode(MQ2_2, INPUT);
  pinMode(MQ2_3, INPUT);
  // flame 
  pinMode(FIRE_SENSOR_1, INPUT);
  pinMode(FIRE_SENSOR_2, INPUT);
  pinMode(FIRE_SENSOR_3, INPUT);
  //btn 
  
  pinMode(btn_1, INPUT_PULLUP);
  pinMode(btn_2, INPUT_PULLUP);
  pinMode(btn_3, INPUT_PULLUP);
 
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
}


void loop() {

  Blynk.run();
  unsigned long now = millis();
  if (now - lastSendTime > 1000) {   // đọc cảm biến, xử lý cảnh báo, cập nhật LCD, gửi Blynk
  lastSendTime = now;
// check btn 

  if (digitalRead(btn_1) == LOW) CrRoom = 1;
  if (digitalRead(btn_2) == LOW) CrRoom = 2;
  if (digitalRead(btn_3) == LOW) CrRoom = 3;
  // read data 
float temps[3] = {
    dht_1.readTemperature(),
    dht_2.readTemperature(),
    dht_3.readTemperature()
  };
    Blynk.virtualWrite(V0, temps[0]);
    Blynk.virtualWrite(V2, temps[1]);
    Blynk.virtualWrite(V4,temps[2]);

  int gases[3] = {
    analogRead(MQ2_1),
    analogRead(MQ2_2),
    analogRead(MQ2_3)
  };
    Blynk.virtualWrite(V1, gases[0]);
    Blynk.virtualWrite(V3, gases[1]);
    Blynk.virtualWrite(V5, gases[2]);

  int flames[3] = {
    digitalRead(FIRE_SENSOR_1),
    digitalRead(FIRE_SENSOR_2),
    digitalRead(FIRE_SENSOR_3)
  };

    bool warning[3];
    bool fireW[3]; 
    // gửi thông báo //////////////////////////////////////////////////
    if (now - lastNotifyTime > notifyInterval) {
        String fireMsg = "";
        String tempMsg = "";
         String gasMsg = "";

  for (int i = 0; i < 3; i++) {
    if (flames[i] == LOW) {
      fireMsg += "Phòng " + String(i+1) + " ";
    }
    if (temps[i] > 60) {
      tempMsg += "Phòng " + String(i+1) + " (" + String(temps[i],1) + "°C) ";
    }
    if (gases[i] > 1200) {
      gasMsg += "Phòng " + String(i+1) + " (" + String(gases[i]) + "ppm) ";
    }
  }
    if (fireMsg != "") {
    Blynk.logEvent("co_chay", "Cháy tại: " + fireMsg);
  }
  if (tempMsg != "") {
    Blynk.logEvent("canh_bao_nhiet", "Nhiệt độ cao: " + tempMsg);
  }
  if (gasMsg != "") {
    Blynk.logEvent("canh_bao_gas", "Khí gas cao: " + gasMsg);
  }

  lastNotifyTime = now;
}
  
/////////////////////////////////////
    String Warning_Rooms ="";
    String fireWs="";
  for (int i = 0; i < 3; i++) {
    warning[i] = (temps[i] > 60 || gases[i] > 1200 || flames[i] == LOW);
    fireW[i] =(flames[i]==LOW);
  
      if(warning[i]) {
        if(Warning_Rooms !="") 
          Warning_Rooms += ", " ;
     Warning_Rooms +=String(i+1);
      }

      if(fireW[i]) {
        if(fireWs !="") 
          fireWs += ", " ;
      fireWs +=String(i+1);
    }
    }
    lcd.clear();
    /// SET UP FIRE SENSOR
   if (fireWs != "") {
   lcd.setCursor(0,0);
   lcd.print("CO CHAY!!");
   lcd.setCursor(0,1);
   lcd.print("Room"+fireWs);
   digitalWrite(LED_PIN, HIGH);
   digitalWrite(BUZZER_PIN, HIGH);
   ledstate = true; 
   Blynk.virtualWrite(V10,1);
   Blynk.virtualWrite(V6, 255);
   delay(500);  // Chờ một chút trước khi tắt LED và buzzer
   digitalWrite(LED_PIN, LOW);
   digitalWrite(BUZZER_PIN, LOW);
   delay(500);  // Chờ một chút trước khi bật lại LED và buzzer 
   }
   // Warning!! 
   else if (Warning_Rooms != "") {
   lcd.setCursor(0,0);
   lcd.print("WARNING!!");
   lcd.setCursor(0, 1);
   lcd.print("Room "+Warning_Rooms);
   digitalWrite(LED_PIN, HIGH);
   digitalWrite(BUZZER_PIN, HIGH);
   ledstate=true; 
   Blynk.virtualWrite(V10,1);
   Blynk.virtualWrite(V6,255);
  } else {
    // Không có cảnh báo, hiển thị phòng đang chọn
    digitalWrite(BUZZER_PIN, LOW);    
    ledstate = false;
    digitalWrite(LED_PIN, statecontrol);
    Blynk.virtualWrite(V6,statecontrol ? 255:0);

    float temp = temps[CrRoom - 1];
    int gas = gases[CrRoom - 1];

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp");
    lcd.print(": ");
    lcd.print(temp, 1);
    lcd.print((char)223);
    lcd.print("C");

    lcd.setCursor(0, 1);
    lcd.print("Gas: ");
    lcd.print(gas);
    lcd.print(" ppm");
    lcd.setCursor(14, 1);
    lcd.print("R");
    lcd.print(CrRoom);
    }
    delay(100);
 }
  }
  
Loading
esp32-devkit-c-v4