// Định nghĩa các hằng số như ID, tên, và mã xác thực cho Blynk
#define BLYNK_TEMPLATE_ID "TMPL6YXCaDzTM"
#define BLYNK_TEMPLATE_NAME "ESP32LAB2EX6"
#define BLYNK_AUTH_TOKEN "urWgkGbiwUy__5MWwurzs5X-g5g1V1AR"
// khai báo cho thingspeak
// Định nghĩa Số kênh ThingSpeak, Khóa API của kênh và địa chỉ máy chủ của ThingSpeak
const int myChannelNumber = 2345049;
const char* myApiKey = "POO0HMV6ZPR8GQP1";
const char* server = "api.thingspeak.com";
//
#define DATABASE_SECRET "N4h0RdYHIRsgdHD5h3fAyey4NopkYovPTayumAXJ" //mã bí mật
#define DATABASE_URL "https://dht11-ec440-default-rtdb.firebaseio.com/" //đường dẫn
//
// Khai báo thư viện
#include <WiFi.h>
#include <WiFiClient.h>
#include <string.h>
#include <DHT.h>
#include <ESP32Servo.h>
//
#include <BlynkSimpleEsp32.h>
#include "ThingSpeak.h"
#include "FirebaseESP32.h"
// Định nghĩa loại cảm biến là DHT22
#define DHT_TYPE DHT22
#define DHT_PIN 14 // DHT22 kết nối chân 14
DHT dht(DHT_PIN,DHT_TYPE); // Khởi tạo đối tượng DHT
// Khai báo các chân kết nối LED
#define LED_LIV 27 // Chân LED
#define LED_BATH 12 // Chân LED
// Khai báo chân kết nối cảm biến PIR
#define PIR 19
// Định nghĩa Servo
#define SERVO 23 // Chân kết nối Servo
Servo servo;
// Khai báo chân kết nối còi BUZZ
#define BUZZER 15
// Khai báo biến lưu trạng thái nút nhấn và góc quay của servo
int button, pos = 0;
// khai báo biến cảnh báo
String report;
// Khai báo thông tin wifi và mã xác thực Blynk
char authBlynk[] = BLYNK_AUTH_TOKEN; // mã token xác thực Blynk
char ssid[] = "Wokwi-GUEST"; // Tên wifi
char pass[] = ""; // Mật khẩu wifi
WiFiClient client;
// tạo đối tượng cho firebase
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
int x;
//
void setup() {
Serial.begin(115200);
// Kết nối với Blynk bằng mã xác thực và wifi đã khai báo trước
Blynk.begin(authBlynk, ssid, pass);
Serial.print("Dang ket noi WiFi");
// chờ kết nối wifi
while (WiFi.status() != WL_CONNECTED){
delay(100);
Serial.print(".");
}
// Thông báo đã kết nối thành công
Serial.println("Connected!");
WiFi.mode(WIFI_STA);
// Cấu hình ThingSpeak để bắt đầu gửi dữ liệu.
ThingSpeak.begin(client);
// Kết nối firebase
config.database_url = DATABASE_URL;
config.signer.tokens.legacy_token = DATABASE_SECRET;
Firebase.begin(&config, &auth);
// Khởi động DHT
// Khởi động cảm biến DHT22
dht.begin();
// Thiết lập các chân kết nối là input hay output
pinMode(LED_LIV, OUTPUT);
pinMode(PIR,INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LED_BATH, OUTPUT);
// Kết nối servo
servo.attach(SERVO);
servo.write(0);
}
// Điều khiển Led
BLYNK_WRITE(V3)
{
// Đọc trạng thái nút nhấn
button = param.asInt();
if (button == 1)
{
digitalWrite(LED_LIV, HIGH);
}
else
{
digitalWrite(LED_LIV, LOW);
}
}
// Điều khiển Servo
BLYNK_WRITE(V4)
{
// Đọc giá trị góc quay từ thanh trượt trên Blynk
pos = param.asInt();
// Cho servo quay góc được thiết lập
servo.write(pos);
delay(30);
}
void loop() {
// kết nối với blynk
Blynk.run();
// khai báo các biến lưu giá trị nhiệt độ, độ ẩm và trạng thái của PIR
float t = dht.readTemperature();
float h = dht.readHumidity();
const int IP=digitalRead(PIR);
// In ra giá trị của PIR
Serial.println(IP);
delay(100);
// Kiểm tra tính hợp lệ của giá trị nhiệt độ và độ ẩm
if (isnan(h) || isnan(t))
{
delay(500);
Serial.println("Doc gia tri DHT that bai!");
return; // nếu lỗi thì sẽ quay lại loop đến khi đc giá trị đi tiếp
}
// kiểm tra nhiệt độ nếu lớn hơn 70 độ thì báo cháy
if (t>70)
{
// Phát hiện có cháy thì cảnh báo trên Blynk, mở còi hú và cho servo mở cửa
report ="PHAT HIEN HOA HOAN";
analogWrite(BUZZER,255);
delay(1000);
pos=180;
servo.write(180);
}
// Nếu không có cháy thì thiết lập ở bình thường
else
{
analogWrite(BUZZER,0);
report ="BINH THUONG";
pos = 0;
servo.write(pos);
}
// Kiểm tra trạng thái của PIR
if(IP==1){
// Nếu có chuyển động thì để đèn sáng
digitalWrite(LED_BATH,HIGH);
delay(10000);
}
else{
// Nếu không có chuyển động thì đèn tắt
digitalWrite(LED_BATH,LOW);
delay(100);
}
// gửi giá trị lên 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);
//gửi giá trị lên thingspeak
ThingSpeak.setField(1,t);
ThingSpeak.setField(2,h);
ThingSpeak.setField(3,IP);
ThingSpeak.setField(4,pos);
// gửi giá trị lên firebase
Firebase.setFloat( fbdo,"Nhiet do", t);
Firebase.setFloat ( fbdo,"Do am", h);
Firebase.setFloat ( fbdo,"PIR", IP);
Firebase.setFloat ( fbdo,"Servo", pos);
// In giá trị
Serial.print("Temperature " + (String)t + " độ C");
Serial.print("\t");
Serial.print("Humidity " + (String)h + "%");
Serial.print("\n");
// gửi tín hiệu lên Thingspeak
x = ThingSpeak.writeFields(myChannelNumber,myApiKey);
if(x == 200){
Serial.println("tải Data thanh cong");
}else{
Serial.println("Tai that bai" + String(x));
}
delay(2000);
delay(2000);
}