//Đị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
int inputPin = 2;
#define BUZZER_PIN 26
//Đây là một hàm callback được gọi khi giá trị nút nhấn trên ứng dụng Blynk thay đổi.
//Nếu giá trị của nút nhấn là 1 (được bật), thì đèn LED sẽ được bật (HIGH),
//ngược lại nếu giá trị là 0 (được tắt), đèn LED sẽ được tắt (LOW).
// BLYNK_WRITE(V2){
// int value = param.asInt();
// value? digitalWrite(LED, HIGH) : digitalWrite(LED, LOW);
// }
//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 > 50) {
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);
// 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();
lcd.clear();
lcd.createChar(1, degree_symbol);
lcd.setCursor(0, 0);
lcd.print("Temperature: ");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
}
//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();
float h = dht.readHumidity();
float t = dht.readTemperature();
lcd.setCursor(12, 0);
lcd.print(t);
lcd.write(1);
lcd.print("C");
lcd.setCursor(12, 1);
lcd.print(h);
lcd.print("%");
int val = digitalRead(inputPin);
if (val == HIGH) {
digitalWrite(LED, HIGH);
Serial.println("Motion detected!");
} else {
digitalWrite(LED, LOW);
Serial.println("No motion detected.");
}
if (t > 50) {
buzzBuzzer(); // If temperature is greater than 50°C, buzz the buzzer
}
delay(1000);
}
void buzzBuzzer() {
// Function to make the buzzer buzz
digitalWrite(BUZZER_PIN, HIGH); // Turn the buzzer on
delay(500); // Buzz for 0.5 seconds
digitalWrite(BUZZER_PIN, LOW); // Turn the buzzer off
tone(BUZZER_PIN, 1000, 500);
}