// #include <Wire.h>
// #include <LiquidCrystal_I2C.h>
// #include <DHT.h>
// // Thư viện DHT
// #define BUTTON2_PIN 18
// #define PIR_PIN 4 // Chân kết nối cảm biến PIR
// #define LED_PIN 16 // Chân kết nối LED chính KHI CÓ CHÁY SẼ SÁNG
// #define LED2_PIN 25 // Chân kết nối LED mới (HÀNH LANG)
// #define BUZZER_PIN 23 // Chân kết nối còi báo động
// #define DHT_PIN 22 // Chân kết nối cảm biến DHT22
// #define DHT_TYPE DHT22 // Loại cảm biến DHT22
// #define BUTTON_PIN 5 // Chân kết nối nút nhấn đầu tiên (Điểm danh)
// DHT dht(DHT_PIN, DHT_TYPE);
// LiquidCrystal_I2C lcd(0x27, 16, 2); // Địa chỉ I2C 0x27, 16 cột, 2 dòng
// bool isDoorOpen = false; // Trạng thái cửa
// int personCount = 0; // Số người trong phòng họp
// bool lastButtonState = LOW; // Trạng thái nút nhấn trước đó
// bool buttonState = LOW; // Trạng thái nút nhấn hiện tại
// bool lastButton2State = HIGH; // Trạng thái nút nhấn BUTTON2 trước đó
// bool button2State = HIGH; // Trạng thái nút nhấn BUTTON2 hiện tại
// unsigned long lastDebounceTime = 0; // Thời gian nhấn nút BUTTON2 cuối cùng
// unsigned long debounceDelay = 50; // Thời gian debounce
// // Hàm bật đèn chính
// void turnOnLED() {
// digitalWrite(LED_PIN, HIGH); // Bật LED chính
// Serial.println("LED ON.");
// }
// // Hàm tắt đèn chính
// void turnOffLED() {
// digitalWrite(LED_PIN, LOW); // Tắt LED chính
// Serial.println("LED OFF.");
// }
// // Hàm bật còi và đèn LED2
// void triggerAlarm() {
// digitalWrite(LED2_PIN, HIGH); // Bật LED2
// tone(BUZZER_PIN, 1000); // Bật còi báo động
// Serial.println("Alarm triggered!");
// }
// // Hàm tắt còi và LED2
// void stopAlarm() {
// digitalWrite(LED2_PIN, LOW); // Tắt LED2
// noTone(BUZZER_PIN); // Tắt còi
// Serial.println("Alarm stopped.");
// }
// // Hàm kiểm tra nhiệt độ và độ ẩm
// void checkTemperatureHumidity(float temp, float hum) {
// if (isnan(temp) || isnan(hum)) {
// Serial.println("Failed to read from DHT sensor!");
// } else {
// Serial.print("Temperature: ");
// Serial.print(temp);
// Serial.print("°C ");
// Serial.print("Humidity: ");
// Serial.print(hum);
// Serial.println("%");
// if ((temp > 30.0 || hum > 70.0) && !isDoorOpen) {
// lcd.setCursor(0, 1);
// lcd.print("fire detected");
// triggerAlarm(); // Kích hoạt còi và đèn khi nhiệt độ/độ ẩm cao
// } else {
// stopAlarm();
// // Dừng còi và đèn khi điều kiện trở lại bình thường
// }
// }
// }
// void setup() {
// // Cảm biến PIR và LED
// pinMode(PIR_PIN, INPUT);
// pinMode(LED_PIN, OUTPUT);
// pinMode(LED2_PIN, OUTPUT);
// // Nút nhấn
// pinMode(BUTTON_PIN, INPUT_PULLUP); // Sử dụng kéo lên (pull-up) cho nút nhấn
// pinMode(BUTTON2_PIN, INPUT_PULLUP); // Sử dụng kéo lên cho BUTTON2
// // Cảm biến DHT22
// dht.begin();
// // LCD
// Wire.begin(21, 19); // Khởi tạo I2C với chân SDA là GPIO 21 và SCL là GPIO 19
// lcd.begin(16, 2);
// lcd.setCursor(0, 0);
// lcd.print("People Count:");
// lcd.setCursor(0, 1);
// lcd.print(personCount);
// Serial.begin(9600); // Khởi tạo serial để debug
// }
// void loop() {
// // Kiểm tra chuyển động từ cảm biến PIR
// if (digitalRead(PIR_PIN) == HIGH) {
// turnOnLED(); // Bật LED chính khi phát hiện chuyển động
// } else {
// turnOffLED(); // Tắt LED khi không có chuyển động
// }
// // Kiểm tra nhiệt độ và độ ẩm
// float temp = dht.readTemperature(); // Đọc nhiệt độ
// float hum = dht.readHumidity(); // Đọc độ ẩm
// checkTemperatureHumidity(temp, hum);
// // Kiểm tra trạng thái nút nhấn đầu tiên (Điểm danh)
// buttonState = digitalRead(BUTTON_PIN);
// if (buttonState == LOW && lastButtonState == HIGH) {
// if (personCount < 10) {
// personCount++; // Tăng số người
// } else {
// lcd.clear();
// personCount = 0; // Reset về 0 nếu đã đủ 10 người
// isDoorOpen = false;
// }
// lcd.setCursor(0, 1);
// lcd.print("person: ");
// lcd.print(personCount);
// Serial.print("People count: ");
// Serial.println(personCount);
// }
// lastButtonState = buttonState;
// // Kiểm tra trạng thái nút nhấn thứ hai để thay đổi trạng thái cửa (chỉ hiển thị)
// button2State = digitalRead(BUTTON2_PIN);
// if (button2State == LOW && lastButton2State == HIGH && (millis() - lastDebounceTime) > debounceDelay) {
// if (!isDoorOpen) {
// isDoorOpen = true;
// Serial.println("Door opened.");
// } else {
// isDoorOpen = false;
// Serial.println("Door closed.");
// }
// lastDebounceTime = millis(); // Cập nhật thời gian nhấn cuối cùng
// }
// lastButton2State = button2State;
// // Hiển thị trạng thái cửa
// lcd.setCursor(0, 0);
// lcd.print("Door: ");
// lcd.print(isDoorOpen ? "Open" : "Closed");
// delay(50); // Delay nhỏ để tránh nhấn nút nhiều lần liên tiếp
// }
// Cấu hình WiFi và Blynk
#define BLYNK_TEMPLATE_NAME "lab2"
#define BLYNK_AUTH_TOKEN "UB4u4h_zIytlRJtFb5baHxVwjL-Jz0oh"
#define BLYNK_TEMPLATE_ID "TMPL6A76K4YD7"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
// Thư viện DHT
#define BUTTON2_PIN 18
#define PIR_PIN 4
#define LED_PIN 16
#define LED2_PIN 25
#define BUZZER_PIN 23
#define DHT_PIN 22
#define DHT_TYPE DHT22
#define BUTTON_PIN 5
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
char auth[] = "UB4u4h_zIytlRJtFb5baHxVwjL-Jz0oh";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
bool isDoorOpen = false;
int personCount = 0;
bool lastButtonState = LOW;
bool buttonState = LOW;
bool lastButton2State = HIGH;
bool button2State = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
// Hàm xử lý nút Blynk trên V3 để điều khiển trạng thái cửa
BLYNK_WRITE(V3) {
int buttonValue = param.asInt(); // Lấy giá trị từ nút V3
if (buttonValue == 1) { // Nếu nút được nhấn
isDoorOpen = !isDoorOpen; // Đảo trạng thái cửa
Serial.println(isDoorOpen ? "Door opened via Blynk." : "Door closed via Blynk.");
// Hiển thị trạng thái lên LCD
lcd.setCursor(0, 0);
lcd.print("Door: ");
lcd.print(isDoorOpen ? "Open" : "Closed");
// Gửi trạng thái cửa về Blynk
Blynk.virtualWrite(V5, isDoorOpen ? "Open" : "Closed");
}
}
void checkTemperatureHumidity(float temp, float hum) {
if (isnan(temp) || isnan(hum)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print("°C ");
Serial.print("Humidity: ");
Serial.print(hum);
Serial.println("%");
// Gửi dữ liệu nhiệt độ và độ ẩm đến Blynk
Blynk.virtualWrite(V0, temp);
Blynk.virtualWrite(V1, hum);
if ((temp > 30.0 || hum > 70.0) && !isDoorOpen) {
lcd.setCursor(0, 1);
lcd.print("fire detected");
digitalWrite(LED2_PIN, HIGH);
tone(BUZZER_PIN, 1000);
Serial.println("Alarm triggered!");
} else {
digitalWrite(LED2_PIN, LOW);
noTone(BUZZER_PIN);
lcd.setCursor(0, 1);
lcd.print(" ");
Serial.println("Alarm stopped.");
}
}
void setup() {
// Cảm biến PIR và LED
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
// Nút nhấn
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
// Cảm biến DHT22
dht.begin();
// LCD
Wire.begin(21, 19);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("People Count:");
lcd.setCursor(0, 1);
lcd.print(personCount);
Serial.begin(9600);
// Kết nối WiFi và Blynk
Blynk.begin(auth, ssid, pass);
Serial.println("Connected to Blynk!");
}
void loop() {
// Kiểm tra chuyển động từ cảm biến PIR
if (digitalRead(PIR_PIN) == HIGH) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
// Kiểm tra nhiệt độ và độ ẩm
float temp = dht.readTemperature();
float hum = dht.readHumidity();
checkTemperatureHumidity(temp, hum);
// Kiểm tra nút nhấn và trạng thái cửa
buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW && lastButtonState == HIGH) {
if (personCount < 10) {
personCount++;
} else {
lcd.clear();
personCount = 0;
isDoorOpen = false;
}
lcd.setCursor(0, 1);
lcd.print("person: ");
lcd.print(personCount);
Serial.print("People count: ");
Serial.println(personCount);
}
lastButtonState = buttonState;
button2State = digitalRead(BUTTON2_PIN);
if (button2State == LOW && lastButton2State == HIGH && (millis() - lastDebounceTime) > debounceDelay) {
isDoorOpen = !isDoorOpen;
Serial.println(isDoorOpen ? "Door opened." : "Door closed.");
lastDebounceTime = millis();
}
lastButton2State = button2State;
// Hiển thị trạng thái cửa
lcd.setCursor(0, 0);
lcd.print("Door: ");
lcd.print(isDoorOpen ? "Open" : "Closed");
delay(50);
Blynk.run(); // Duy trì kết nối Blynk
}
// #define BLYNK_TEMPLATE_NAME "lab2"
// #define BLYNK_AUTH_TOKEN "UB4u4h_zIytlRJtFb5baHxVwjL-Jz0oh"
// #define BLYNK_TEMPLATE_ID "TMPL6A76K4YD7"
// #include <Wire.h>
// #include <LiquidCrystal_I2C.h>
// #include <DHT.h>
// #include <BlynkSimpleEsp32.h> // Thư viện Blynk
// // Cấu hình WiFi và Blynk
// char auth[] = "UB4u4h_zIytlRJtFb5baHxVwjL-Jz0oh"; // Mã xác thực Blynk từ ứng dụng
// char ssid[] = "Bạn tầng 2"; // Tên WiFi
// char pass[] = "123456789@"; // Mật khẩu WiFi
// // #define BLYNK_TEMPLATE_NAME "lab2"
// // #define BLYNK_AUTH_TOKEN "UB4u4h_zIytlRJtFb5baHxVwjL-Jz0oh"