Let me ask you a question about whether the code is correct or not, how can you set a threshold that send a fire alarm via email?

[Unformatted code removed by moderator]

@nhutan2003 Please edit your post, using the pencil icon at the bottom, and add triple backticks at the beginning and end of your code so that it displays correctly.
Triple backticks look like this:
```

Copy and paste these if you can’t find the correct symbol on your keyboard.

Pete.

Compilation error: stray ‘`’ in program

if you don’t edit your original post and add triple backticks at the beginning and end the unformatted code will be deleted.

If you have a compilation error message I suggest you post the full message, including the part which shows which bit of the code that the error message is pointing to. You also need to use triple backticks at the beginning and end of compiler error message, ot that will be deleted too.

Pete.

// Lấy mã TOKEN trong Blynk
#define BLYNK_TEMPLATE_ID "TMPL6D-GgvLNc"
#define BLYNK_TEMPLATE_NAME "DO AN VI DIEU KHIEN"
#define BLYNK_AUTH_TOKEN "iFeIkQ5cgLAbH47LcwVtXmCaKIUvWxbM"

// Thông tin kết nối Wifi
char ssid[] = "Thao Tram 2.4G";       // Tên Wifi
char pass[] = "0939117738";      // Mật khẩu Wifi

bool fetch_blynk_state = true;  //true or false

// Mã Hex điều khiển từ xa IF
#define IR_Button_1   0x80BF49B6
#define IR_Button_2   0x80BFC936
#define IR_Button_3   0x80BF33CC
#define IR_Button_4   0x80BF718E
#define IR_All_Off    0x80BF3BC4

// Khai báo thư viện
#include <ESP8266WiFi.h>        
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>  
#include <IRremote.h>

#define DHTPIN              D4 //D4  pin connected with DHT
#define IR_RECV_PIN         D9 // SD2 (IR receiver pin)

// 
#define DHTTYPE DHT11         // Xác nhận loại cảm biến
IRrecv irrecv(IR_RECV_PIN);   // Thư viện dùng để nhận tính hiệu IF từ remote điều khiển
decode_results results;       // Dùng để lưu trử tín hiệu IR sau khi giải mã
  
// define the GPIO connected with Relays and switches
#define RelayPin1 5  //D1
#define RelayPin2 4  //D2
#define RelayPin3 14 //D3
#define RelayPin4 12 //D4

#define SwitchPin1 10  //SD3
#define SwitchPin2 D3   //D3 
#define SwitchPin3 13  //D7
#define SwitchPin4 3   //RX

#define wifiLed   16   // Tham chiếu với chân led trên ESP 8266 để bật/tắt led 
//Change the virtual pins according the rooms
#define VPIN_BUTTON_1    V1   // cảm biến chạm pin 1 để mở relay
#define VPIN_BUTTON_2    V2   // cảm biến chạm pin 2 để mở relay
#define VPIN_BUTTON_3    V3   // cảm biến chạm pin 3 để mở relay
#define VPIN_BUTTON_4    V4   // cảm biến chạm pin 4 để mở relay

#define VPIN_BUTTON_C    V5   // Taoh chân ảo để tắt cả các relay thông qua ứng dụng BLYNK
#define VPIN_TEMPERATURE V6   // Hiển thị nhiệt độ từ DHT qua giao diện Blynk
#define VPIN_HUMIDITY    V7   // Hiển thị độ ẩm  từ DHT qua giao diện Blynk

// Khối Relay
bool toggleState_1 = HIGH; // Trạng thái mặt định của 
bool toggleState_2 = HIGH; // Trạng thái mặt định của 
bool toggleState_3 = HIGH; // Trạng thái mặt định của 
bool toggleState_4 = HIGH; // Trạng thái mặt định của 
// Khối cảm biến
bool SwitchState_1 = LOW; // Trạng thái mặt định của 
bool SwitchState_2 = LOW; // Trạng thái mặt định của 
bool SwitchState_3 = LOW; // Trạng thái mặt định của 
bool SwitchState_4 = LOW; // Trạng thái mặt định của 

int wifiFlag = 0;
float temperature1 = 0;   // Lưu giá trị nhiệt độ đọc từ cảm biến DHT11
float humidity1   = 0;    // Lưu giá trị độ ẩm đọc từ cảm biến DHT11

char auth[] = BLYNK_AUTH_TOKEN; // Xác nhận kêt nói với Blynk
int smokeA0 = A0;
int data = 0;
int sensorThres = 100;// Đặt ngưỡng giá trị cho biếm biến để phát hiện khói hoặc khí gas
BlynkTimer timer;             // Gọi hàm theo định kì
DHT dht(DHTPIN, DHTTYPE);     // Khởi tạo cảm biến DHT với chân kết nói và cảm biến

// Khi nút nhấn chuyển trạng thái
BLYNK_WRITE(VPIN_BUTTON_1) {
  toggleState_1 = param.asInt();
  digitalWrite(RelayPin1, !toggleState_1);
}

BLYNK_WRITE(VPIN_BUTTON_2) {
  toggleState_2 = param.asInt();
  digitalWrite(RelayPin2, !toggleState_2);
}

BLYNK_WRITE(VPIN_BUTTON_3) {
  toggleState_3 = param.asInt();
  digitalWrite(RelayPin3, !toggleState_3);
}

BLYNK_WRITE(VPIN_BUTTON_4) {
  toggleState_4 = param.asInt();
  digitalWrite(RelayPin4, !toggleState_4);
}

BLYNK_WRITE(VPIN_BUTTON_C) { 
  all_SwitchOff();  // chuyển trạng hái tất cả
}

void all_SwitchOff(){  //Đặt tất cả các biến trạng thái relay thành 0
  toggleState_1 = 0; digitalWrite(RelayPin1, LOW); Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1); delay(100);  // Tắt Relaypin1 và cập nhận trạng thái trong Blynk và thời gian đợi 100ms
  toggleState_2 = 0; digitalWrite(RelayPin2, LOW); Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2); delay(100);  // Tắt Relaypin2 và cập nhận trạng thái trong Blynk và thời gian đợi 100ms
  toggleState_3 = 0; digitalWrite(RelayPin3, LOW); Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3); delay(100);  // Tắt Relaypin3 và cập nhận trạng thái trong Blynk và thời gian đợi 100ms
  toggleState_4 = 0; digitalWrite(RelayPin4, LOW); Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4); delay(100);  // Tắt Relaypin4 và cập nhận trạng thái trong Blynk và thời gian đợi 100ms
  Blynk.virtualWrite(VPIN_HUMIDITY, humidity1); // Cập nhật giá trị độ ẩm trong Blynk
  Blynk.virtualWrite(VPIN_TEMPERATURE, temperature1); // Cập nhật giá trị nhiệt độ trong Blynk
}

void checkBlynkStatus() { // khiểm tra trạng thái kết nói 

  bool isconnected = Blynk.connected();  // Kiểm tra xem thiết bị có đang kết nói với Blynk 
  if (isconnected == false) {    // Nếu không kết nói được
    wifiFlag = 1;                // Đặt widiFlag thành 1 để chỉ ra không có kết nối
    Serial.println("Blynk Not Connected");  // In thông báo ra cổng Serial
    digitalWrite(wifiLed, HIGH);   // // Bật LED trạng thái WiFi để chỉ ra rằng không có kết nối
  }
  if (isconnected == true) {  // Nếu có kết nói được
    if (!fetch_blynk_state){  // Đặt widiFlag thành 0 để chỉ ra không có kết nối
    Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);  // Cập nhật trạng thái của các nút trong Blynk với trạng thái hiện tại của các RelayPin1
    Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);  // Cập nhật trạng thái của các nút trong Blynk với trạng thái hiện tại của các RelayPin2
Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);  // Cập nhật trạng thái của các nút trong Blynk với trạng thái hiện tại của các RelayPin3
    Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);  // Cập nhật trạng thái của các nút trong Blynk với trạng thái hiện tại của các RelayPin4
    }
    digitalWrite(wifiLed, LOW);  //Tắt LED trạng thái WiFi để chỉ ra rằng có kết nối
    Serial.println("Blynk Connected");  // In thồn báo ra cổng Serial  
  }
}


void readSensor(){
  
 float h = dht.readHumidity();
 float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit


  if (isnan(h) || isnan(t)) {  //// Nếu đọc cảm biến DHT thất bại
    Serial.println("Không đọc được từ cảm biến DHT!");  //In thông báo lỗi ra cổng Serial
    Serial.print("Pin A0: ");
   Serial.println(data);  // In giá trị cảm biến khói ra cổng Serial
    return;  // Kết thúc hàm nếu có lỗi
  }
  else {
    humidity1 = h; // Cập nhật biến độ ẩm
    temperature1 = t; // Cập nhật biến độ ẩm
     Serial.println(temperature1); //In ra cổng Serial
     Serial.println(humidity1);  //In ra cổng Serial
  }  
}

void sendSensor() // Hàm đọc giá trị cảm biến 
{
  readSensor();
  Blynk.virtualWrite(VPIN_HUMIDITY, humidity1);  // Gửi giá trị độ ẩm đến Blynk
  Blynk.virtualWrite(VPIN_TEMPERATURE, temperature1); //  Gửi giá trị nhiệt độ đến Blynk
  int data = analogRead(smokeA0);
  Blynk.virtualWrite(V0, data);
  Serial.print("Pin A0: ");
  Serial.println(data);


  if(data > 399)     // Change the Trashold value
  {
   Blynk.logEvent("BÁO ĐỘNG🔥🔥🔥🔥", "Phát Hiện Lửa !!!");
    Blynk.logEvent("rain", "Water Detected!");
  }
}

void ir_remote(){   // Hàm xử ký tín hiệu điều khiển từ xa IF
  if (irrecv.decode(&results)) {  // Nếu có tín hiệu IR được nhận và giải mã
      switch(results.value){   // Kiểm tra giá trị của tín hiệu IR
          case IR_Button_1:    
            digitalWrite(RelayPin1, toggleState_1);  // Đổi trạng thái relay 1
            toggleState_1 = !toggleState_1;   // Cập nhật biến trạng thái
            Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);// Gửi trạng thái mới đến Blynk
            delay(100);   // Đợi 100ms
break;
          case IR_Button_2:  
            digitalWrite(RelayPin2, toggleState_2);
            toggleState_2 = !toggleState_2;
            Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
            delay(100);            
            break;
          case IR_Button_3:  
            digitalWrite(RelayPin3, toggleState_3);
            toggleState_3 = !toggleState_3;
            Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
            delay(100);            
            break;
          case IR_Button_4:  
            digitalWrite(RelayPin4, toggleState_4);
            toggleState_4 = !toggleState_4;
            Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
            delay(100);            
            break;
          case IR_All_Off:
            all_SwitchOff();   // Gọi hàm tắt tất cả relay
            break;  
          default : break;    // Nếu không khớp với bất kỳ trường hợp nào, không làm gì cả      
        }   
        Serial.println(results.value, HEX);    
        irrecv.resume();    // Chuẩn bị nhận tín hiệu IR tiếp theo  
  } 
}

void manual_control()  // Hàm kiểm tra và cập nhật trạng thái công tắc và Relay
{
  if (digitalRead(SwitchPin1) == LOW && SwitchState_1 == LOW) { 
    digitalWrite(RelayPin1, LOW); // Bật Relay1
    toggleState_1 = HIGH; // Cập nhật biến trạng thái
    SwitchState_1 = HIGH; // // Cập nhật biến trạng thái công tắc
    Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1); // Gửi trạng thái mới đến Blynk
    Serial.println("Switch-1 on");  // In thông báo ra cổng Serial
  }
  if (digitalRead(SwitchPin1) == HIGH && SwitchState_1 == HIGH) {
    digitalWrite(RelayPin1, HIGH);
    toggleState_1 = LOW;
    SwitchState_1 = LOW;
    Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);
    Serial.println("Switch-1 off");
  }
  if (digitalRead(SwitchPin2) == LOW && SwitchState_2 == LOW) {
    digitalWrite(RelayPin2, LOW);
    toggleState_2 = HIGH;
    SwitchState_2 = HIGH;
    Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
    Serial.println("Switch-2 on");
  }
  if (digitalRead(SwitchPin2) == HIGH && SwitchState_2 == HIGH) {
    digitalWrite(RelayPin2, HIGH);
    toggleState_2 = LOW;
    SwitchState_2 = LOW;
    Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
    Serial.println("Switch-2 off");
  }
  if (digitalRead(SwitchPin3) == LOW && SwitchState_3 == LOW) {
    digitalWrite(RelayPin3, LOW);
    toggleState_3 = HIGH;
    SwitchState_3 = HIGH;
    Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
    Serial.println("Switch-3 on");
  }
  if (digitalRead(SwitchPin3) == HIGH && SwitchState_3 == HIGH) {
    digitalWrite(RelayPin3, HIGH);
    toggleState_3 = LOW;
    SwitchState_3 = LOW;
    Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
    Serial.println("Switch-3 off");
  }
  if (digitalRead(SwitchPin4) == LOW && SwitchState_4 == LOW) {
digitalWrite(RelayPin4, LOW);
    toggleState_4 = HIGH;
    SwitchState_4 = HIGH;
    Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
    Serial.println("Switch-4 on");
  }
  if (digitalRead(SwitchPin4) == HIGH && SwitchState_4 == HIGH) {
    digitalWrite(RelayPin4, HIGH);
    toggleState_4 = LOW;
    SwitchState_4 = LOW;
    Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
    Serial.println("Switch-4 off");
  }
}  

void setup()
{
  Serial.begin(9600);  // Khởi tạo cổng Serial 9600 baund
  Blynk.begin(auth, ssid, pass); //Kết bói với Blynk
  timer.setInterval(100L, sendSensor); //Thiết lập thời gian gửi dữ liệu đến cảm biến 
  pinMode(smokeA0, INPUT);  //Khai báo chân đầu vào cảm biến khói
  pinMode(RelayPin1, OUTPUT);  //Khai báo chân đầu vào RelayPin1
  pinMode(RelayPin2, OUTPUT);  //Khai báo chân đầu vào RelayPin2
  pinMode(RelayPin3, OUTPUT);  //Khai báo chân đầu vào RelayPin3
  pinMode(RelayPin4, OUTPUT);  //Khai báo chân đầu vào RelayPin4

  pinMode(wifiLed, OUTPUT);   // Cài đặt chân LED WiFi là đầu ra
  pinMode(SwitchPin1, INPUT_PULLUP); //Cài đặt chân công tắc là đầu vào với điện trở kéo lên
  pinMode(SwitchPin2, INPUT_PULLUP);
  pinMode(SwitchPin3, INPUT_PULLUP);
  pinMode(SwitchPin4, INPUT_PULLUP);

  // Khi khởi động, tất cả relay nên được TẮT
  digitalWrite(RelayPin1, !toggleState_1);
  digitalWrite(RelayPin2, !toggleState_2);
  digitalWrite(RelayPin3, !toggleState_3);
  digitalWrite(RelayPin4, !toggleState_4);

  irrecv.enableIRIn(); // Kích hoạt cảm biến IR
  dht.begin();    // Kích hoạt cảm biến DHT

  digitalWrite(wifiLed, HIGH);  // Bật LED WiFi

  WiFi.begin(ssid, pass);  //// Kết nối WiFi
  timer.setInterval(100L, checkBlynkStatus); // Kiểm tra trạng thái Blynk mỗi
  timer.setInterval(100L, sendSensor); // Kiểm tra cảm biến Blynk mỗi 
  Blynk.config(auth);   // Cấu hình Blynk
  delay(100);  // Đợi 1 giây
  
  if (!fetch_blynk_state){
    Blynk.virtualWrite(VPIN_BUTTON_1, toggleState_1);  // Cập nhật trạng thái ban đầu của các nút trong Blynk
    Blynk.virtualWrite(VPIN_BUTTON_2, toggleState_2);
    Blynk.virtualWrite(VPIN_BUTTON_3, toggleState_3);
    Blynk.virtualWrite(VPIN_BUTTON_4, toggleState_4);
  }
}

void loop()  // Vòng lập
{ 
  manual_control();// Kiểm soát bằng tay
  ir_remote(); //Điều khiển từ xa hồng ngoại
  Blynk.run(); // Điều khiển thông qua ứng dụng Blynk
  timer.run();  //// Chạy các hàm theo định kỳ đã thiết lập bởi timer
}

[Unformatted compiler error message removed by moderator]

Compilation error: stray ‘`’ in program

As I said…

Pete.