#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
esp32-devkit-c-v4