#define BLYNK_TEMPLATE_ID "TMPL63dxUmqxc"
#define BLYNK_TEMPLATE_NAME "lab3"
#define BLYNK_AUTH_TOKEN "S01Z6OSod9tR1w0JcIhKXlnOiQb0Q8vX"
//Nhúng thư viện DHTesp cho cảm biến DHT22 và thư viện Blynk cho kết nối với ứng dụng Blynk thông qua ESP32.
#include <DHTesp.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h> // Thêm thư viện LCD
#define DHTPIN 15 //Led nối chân 15
#define LED_PIN 21 //Cảm biến nối chân 21
DHTesp dht; //Tạo một đối tượng của lớp DHTesp để sử dụng cho cảm biến DHT22.
char auth[] = BLYNK_AUTH_TOKEN; //Đặt token xác thực Blynk vào một mảng ký tự.
char ssid[] = "Wokwi-GUEST"; //Đặt tên mạng WiFi mà ESP32 sẽ kết nối.
char pass[] = ""; //Đặt mật khẩu mạng WiFi. Trong trường hợp này, mật khẩu được đặt là chuỗi rỗng.
BlynkTimer timer; //Tạo một đối tượng timer để lên lịch cho việc gửi dữ liệu từ cảm biến DHT.
LiquidCrystal_I2C lcd(0x27, 16, 2); // Khởi tạo màn hình LCD có địa chỉ I2C là 0x27, 16 cột và 2 hàng
void setup() {
pinMode(LED_PIN, OUTPUT); //Thiết lập chân LED_PIN là chế độ OUTPUT để điều khiển đèn LED.
Serial.begin(115200); //Bắt đầu giao tiếp serial để ghi thông tin debug
dht.setup(DHTPIN, DHTesp::DHT22); // IKhởi tạo cảm biến DHT
Blynk.begin(auth, ssid, pass); //Kết nối với ứng dụng Blynk sử dụng token xác thực và thông tin mạng WiFi.
timer.setInterval(2000L, sendDHTData); // Gửi dữ liệu DHT cứ sau 2 giây
lcd.init(); // Khởi tạo màn hình LCD
lcd.backlight(); // Bật đèn nền
}
BLYNK_WRITE(V3) { //Hàm được gọi khi trạng thái nút trên ứng dụng Blynk thay đổi
int buttonState = param.asInt(); //Đọc trạng thái của nút từ tham số
if (buttonState == 1) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
void sendDHTData() { //Hàm gửi dữ liệu từ cảm biến DHT22 đến ứng dụng Blynk.
//Đọc dữ liệu nhiệt độ và độ ẩm từ cảm biến.
float t = dht.getTemperature();
float h = dht.getHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Không đọc được từ cảm biến DHT!");
return;
}
//Gửi dữ liệu đến ứng dụng Blynk.
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print("%\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" °C");
//Hiển thị dữ liệu lên màn hình LCD
lcd.clear(); // Xóa màn hình
lcd.setCursor(0, 0); // Đặt vị trí con trỏ ở hàng đầu tiên, cột đầu tiên
lcd.print("Temp: "); // In ra chuỗi "Temp: "
lcd.print(t); // In ra giá trị nhiệt độ
lcd.print(" C"); // In ra đơn vị độ C
lcd.setCursor(0, 1); // Đặt vị trí con trỏ ở hàng thứ hai, cột đầu tiên
lcd.print("Humi: "); // In ra chuỗi "Humi: "
lcd.print(h); // In ra giá trị độ ẩm
lcd.print(" %"); // In ra đơn vị phần trăm
}
void loop() {
Blynk.run(); //Xử lý tất cả sự kiện Blynk
timer.run(); //Kiểm tra và chạy các sự kiện đã được lên lịch trong timer.
}