#define BLYNK_TEMPLATE_ID "TMPL6UiEHAFLt"
#define BLYNK_TEMPLATE_NAME "LAB2 bai6 IOT"
#define BLYNK_AUTH_TOKEN "aHKMiQKFkUaakc54dp6mWhVjPcI86YGv"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
// Thông tin WiFi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Cấu hình DHT
#define DHTPIN 12 // Chân GPIO kết nối với DHT22
#define DHTTYPE DHT22 // Loại cảm biến DHT22
DHT dht(DHTPIN, DHTTYPE);
// Cấu hình LED, PIR và Buzzer
#define LED_PIN 5 // Chân GPIO 5 để điều khiển LED
#define PIR_PIN 14 // Chân GPIO 14 nối với chân D của cảm biến PIR
#define BUZZER_PIN 21 // Chân GPIO 21 nối với Buzzer
BlynkTimer timer; // Khởi tạo đối tượng timer cho Blynk
// Biến kiểm tra trạng thái của switch
int chophepbaodong=0; // Đặt mặc định là báo động tắt
// Hàm gửi dữ liệu cảm biến DHT22
void sendSensorData() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Lỗi: Không thể đọc dữ liệu từ cảm biến DHT22");
return;
}
Blynk.virtualWrite(V0, temperature); // Gửi nhiệt độ lên Virtual Pin V0
Blynk.virtualWrite(V1, humidity); // Gửi độ ẩm lên Virtual Pin V1
Serial.print("Nhiệt độ: ");
Serial.print(temperature);
Serial.print("°C Độ ẩm: ");
Serial.print(humidity);
Serial.println("%");
}
// Hàm được gọi khi trạng thái của Virtual Pin V2 thay đổi (từ Blynk )
BLYNK_WRITE(V2) {
chophepbaodong = param.asInt(); // Đọc trạng thái của switch từ Blynk (0: tắt, 1: bật)
if (chophepbaodong) {
Serial.println("Báo động bật");
} else {
Serial.println("Báo động tắt");
}
}
// Hàm kiểm tra trạng thái của cảm biến PIR và kích hoạt báo động nếu cần
void checkPIRSensor() {
int pirState = digitalRead(PIR_PIN); // Đọc trạng thái của cảm biến PIR
// Nếu báo động được bật và có chuyển động
if (chophepbaodong && pirState == HIGH)
{
Serial.println("Phát hiện chuyển động");
Blynk.virtualWrite(V3, 1); // Gửi trạng thái lên Blynk (Virtual Pin V3)
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(LED_PIN, HIGH); // Bật LED để biểu thị báo động
tone(BUZZER_PIN,500);//cho buzzer kêu
}
else // Không có chuyển động hoặc báo động tắt
{
noTone(BUZZER_PIN);//cho buzzer không kêu
digitalWrite(LED_PIN, LOW); // Tắt LED
Blynk.virtualWrite(V3, 0); // Cập nhật trạng thái lên Blynk (Virtual Pin V3)
}
}
void setup() {
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
pinMode(PIR_PIN, INPUT); // Thiết lập chân PIR là INPUT
pinMode(BUZZER_PIN, OUTPUT); // Thiết lập chân Buzzer là OUTPUT
Serial.begin(115200);
Serial.println("Khởi động ESP32...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nĐã kết nối WiFi");
Blynk.begin(BLYNK_AUTH_TOKEN, WIFI_SSID, WIFI_PASSWORD);
dht.begin();
// Thiết lập các khoảng thời gian để gọi hàm gửi dữ liệu cảm biến và kiểm tra PIR
timer.setInterval(1000L, sendSensorData); // Cập nhật dữ liệu DHT mỗi giây
timer.setInterval(500L, checkPIRSensor); // Kiểm tra cảm biến PIR mỗi 500ms
}
void loop() {
Blynk.run(); // Xử lý các yêu cầu Blynk
timer.run(); // Xử lý các tác vụ định kỳ
}