// Định nghĩa mã ID, tên, mã Token để sử dụng Blynk
#define BLYNK_TEMPLATE_ID "TMPL68MaRAWlq" //Định nghĩa ID
#define BLYNK_TEMPLATE_NAME "Test" // Định nghĩa tên
#define BLYNK_AUTH_TOKEN "azmRCcv1BW_Tx7XG3vAX4BcH5x2tHErS" //Định nghĩa mã Token
// Khai báo thư viện cần thiết cho việc kết nối Wifi và Blynk
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <string.h>
// Khai báo thư viện DHT: thư viện để làm việc với cảm biến nhiệt độ và độ ẩm
#include <DHT.h>
// Định nghĩa loại cảm hiến DHT(DHT22) và chân kết nối (chân 14)
#define DHT_TYPE DHT22
#define DHT_PIN 14
//Khởi tạo đối tượng DHT để làm việc với cảm biến DHT
DHT dht(DHT_PIN,DHT_TYPE);
// Khai báo chân LED
#define LED_LIV 27 //Chân kết nối đèn cho phòng khách
#define LED_BATH 12 //Chân kết nối đèn cho phòng tắm
// Định nghĩa chân kết nối cho cảm biến PIR(cảm biến hồng ngoại thụ động)
#define PIR 19
//Khai báo thư viện để làm việc với servo motor và khởi tạo đối tượng servo
#include <ESP32Servo.h>
#define SERVO 23
Servo servo;
//Định nghĩa chân kết nối cho buzzer(còi)
#define BUZZER 15
//Khai báo các biến sử dụng trong chương trình.
int button,pos=0;
String report;
//Khai báo thông tin xác thực WiFi và mã token.
char auth[] = BLYNK_AUTH_TOKEN; //Token Code
char ssid[] = "Wokwi-GUEST"; //Wifi credentials
char pass[] = ""; // set password for open network
//Hàm setup, chạy một lần khi Arduino khởi động.
void setup() {
Serial.begin(115200); //Khởi động cổng Serial để giao tiếp với máy tính qua cổng USB
// WiFi.begin(ssid,pass);
// Blynk.config(auth);
//Khi gọi Blynk.begin(), nó khởi tạo kết nối đến máy chủ Blynk bằng cách sử dụng mã xác thực (auth) và thiết lập kết nối Wi-Fi với mạng được chỉ định (ssid và pass).
Blynk.begin(auth, ssid, pass); // mã token, name wifi, password
Serial.print("Connecting to WiFi");
//nếu không kết nối được wifi thì in ra màn hình là Connected Fail!!!
while (WiFi.status() != WL_CONNECTED){
delay(100);
Serial.print("Connected Fail!");//
}
Serial.println("Connected Wifi!");
dht.begin(); // Khởi động cảm biến nhiệt độ và độ ẩm DHT
//Thiết lập chế độ đầu ra cho các chân điều khiển đèn, cảm biến PIR và buzzer
pinMode(LED_LIV, OUTPUT);
pinMode(PIR,INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LED_BATH, OUTPUT);
//Gắn kết servo motor và đưa nó về trạng thái ban đầu (góc 0).
servo.attach(SERVO);
servo.write(0);
}
// LED CONTROL
//Hàm gọi lại được gọi khi giá trị của nút điều khiển LED thay đổi trên ứng dụng Blynk.
BLYNK_WRITE(V3)
{
//Lấy giá trị của nút điều khiển LED và gán vào biến button
button = param.asInt();
if (button == 1)
{
//Bật đèn trong phòng khách bằng cách đặt chân kết nối LED_LIV thành HIGH.
digitalWrite(LED_LIV, HIGH);
}
else
{
//Tắt đèn trong phòng khách bằng cách đặt chân kết nối LED_LIV thành LOW.
digitalWrite(LED_LIV, LOW);
}
}
//Hàm gọi lại được gọi khi giá trị của thanh trượt servo motor thay đổi trên ứng dụng Blynk
BLYNK_WRITE(V4)
{
// Lấy giá trị của thanh trượt servo motor và gán vào biến pos
pos = param.asInt();
servo.write(pos);//Đưa servo motor về góc được xác định bởi giá trị pos.
delay(30);//Đặt thời gian chờ 30ms để servo motor di chuyển đến góc mới.
}
void loop() {
// kết nối với blynk
Blynk.run();
// Đọc giá trị nhiệt độ, độ ẩm từ cảm biến DHT và đọc giá trị từ cảm biến PIR
float t = dht.readTemperature();
float h = dht.readHumidity();
const int IP=digitalRead(PIR);
Serial.println(IP);
delay(100);
// Kiểm tra xem giá trị nhiệt độ và độ ẩm có hợp lệ hay không.
if (isnan(h) || isnan(t))
{
delay(500);
Serial.println("Failed to read from DHT sensor!");
return; // nếu lỗi thì sẽ quay lại loop đến khi đc giá trị đi tiếp
}
// báo cháy bằng nhiệt độ
if (t>70) //Kiểm tra nhiệt độ nếu lớn hơn 70 độ C.
{
report ="PHAT HIEN HOA HOAN";
//Kích hoạt buzzer, đóng cửa servo motor và đưa servo motor về góc 180 độ.
analogWrite(BUZZER,255);
delay(1000);
pos=180;
servo.write(180);
}
else
{
//Tắt buzzer
analogWrite(BUZZER,0);
report ="BINH THUONG";
}
//báo cháy bằng cảm biến hồng
if(IP==1){
digitalWrite(LED_BATH,HIGH);
delay(1000);
}
else{
digitalWrite(LED_BATH,LOW);
delay(1000);
}
// Gửi giá trị nhiệt độ, độ ẩm, báo cáo, giá trị nút LED và giá trị thanh trượt servo motor lên ứng dụng Blynk
Blynk.virtualWrite(V0,t); // chân đặt, tên
Blynk.virtualWrite(V1,h);
Blynk.virtualWrite(V2,report);
Blynk.virtualWrite(V3,button);
Blynk.virtualWrite(V4,pos);
// In giá trị nhiệt độ và độ ẩm lên cổng Serial
Serial.print("Temperature " + (String)t + " độ C");
Serial.print("\t");
Serial.print("Humidity " + (String)h + "%");
Serial.print("\n");
//Đặt thời gian chờ 2 giây trước khi lặp lại vòng lặp loop;
}