//Định nghĩa các thông số liên quan đến dự án Blynk.
//Đây là thông tin cần thiết để kết nối ESP32 của bạn với dự án Blynk cụ thể*/
#define BLYNK_TEMPLATE_ID "TMPL6hZZRFLN8"
#define BLYNK_TEMPLATE_NAME "Project6"
#define BLYNK_AUTH_TOKEN "uy3FEMRGcnoASknXljzXZHXIDqrydXp7"
// định nghĩa cách bạn muốn ghi log ra Serial Monitor để theo dõi tình trạng hoạt động của chương trình.
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte degree_symbol[8] =
{
0b00111,
0b00101,
0b00111,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
//Đây là định nghĩa liên quan đến cảm biến DHT22. Được sử dụng để đọc độ ẩm và nhiệt độ từ cảm biến.
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//Định nghĩa tên và mật khẩu của mạng Wi-Fi mà ESP32 sẽ kết nối.
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//Định nghĩa một đối tượng BlynkTimer được sử dụng để quản lý thời gian trong chương trình.
BlynkTimer timer;
//Đây là Auth Token, được sử dụng để xác thực thiết bị với dự án Blynk cụ thể.
char auth[] = BLYNK_AUTH_TOKEN;
//Định nghĩa các chân GPIO được sử dụng
#define LED 4
#define GLED 26
int inputPin = 2;
#define BUZZER_PIN 26
//Hàm này đọc dữ liệu từ cảm biến DHT22 và sau đó gửi dữ liệu này lên dự án Blynk.
//Điều này cho phép bạn theo dõi độ ẩm và nhiệt độ trên ứng dụng Blynk của bạn.
void sendSensor()
{
// gán giá trị nhiệt độ và độ ẩm vào 2 biến h và t
float h = dht.readHumidity();
float t = dht.readTemperature();
int val = digitalRead(inputPin);
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
if (val == HIGH) {
digitalWrite(LED, HIGH);
Blynk.virtualWrite(V2, "Motion detected!");
} else {
digitalWrite(LED, LOW);
Blynk.virtualWrite(V2, "No Motion detected");
}
if (t > 70 && t < 80) {
Blynk.virtualWrite(V3, "Warning");// If temperature is greater than 50°C, buzz the buzzer
}
else Blynk.virtualWrite(V3, "Safe");
// ghi giá trị h lên v1 và t lên v0
Blynk.virtualWrite(V1, h);
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V4, val);
Serial.print("Temperature : ");
Serial.print(t);
Serial.print(" Humidity : ");
Serial.println(h);
}
//Trong hàm setup(), chương trình bắt đầu bằng việc thiết lập kết nối với ứng dụng Blynk,
//khai báo các chân GPIO, khởi động cảm biến DHT22, và thiết lập một bộ định thời (timer)
//để gửi dữ liệu từ cảm biến lên Blynk cứ sau mỗi giây.
void setup()
{
// Debug console
Serial.begin(115200);
delay(1000);
Blynk.begin(auth, ssid, pass);
pinMode(LED, OUTPUT);
pinMode(inputPin, INPUT);
pinMode(GLED, OUTPUT);
// You can also specify server:
//Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);
dht.begin();
timer.setInterval(1000L, sendSensor);
lcd.init();
lcd.backlight();
}
//Hàm loop() chứa vòng lặp chính, trong đó Blynk.run() và timer.run() được gọi liên tục để duy trì kết nối với Blynk và quản lý thời gian gửi dữ liệu từ cảm biến.
void loop()
{
Blynk.run();
timer.run();
digitalWrite(GLED, HIGH);
float h = dht.readHumidity();
float t = dht.readTemperature();
lcd.clear(); // Xóa toàn bộ nội dung trên LCD
lcd.setCursor(0, 0);
lcd.print("Tran Quoc Si");
lcd.setCursor(0, 1);
if (digitalRead(inputPin) == HIGH) {
lcd.print("Motion Detected");
digitalWrite(LED, HIGH);
Serial.println("Motion detected!");
} else {
lcd.print("No Motion");
digitalWrite(LED, LOW);
Serial.println("No motion.");
}
if (t > 70 && t < 80) {
// Nếu nhiệt độ nằm trong khoảng từ 70 đến 80, bật đèn đỏ chớp tắt
digitalWrite(LED, HIGH);
delay(500); // Đèn đỏ bật trong 0.5 giây
digitalWrite(LED, LOW);
delay(500); // Đèn đỏ tắt trong 0.5 giây
}
delay(1000);
}