// được lấy từ Blynk sau khi tạo device
#define BLYNK_TEMPLATE_ID "TMPL6cni3qasW"
#define BLYNK_TEMPLATE_NAME "LAB2 bai5 IOT"
#define BLYNK_AUTH_TOKEN "hpT5xxbGVGU28oV5_EblBkbIxCaD3JQf"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h> // Thư viện Blynk cho ESP32
#include <DHT.h>
// WiFi để là Wokwi-GUEST khi sử dụng mô phỏng trên wokwi và pass để trống
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Cấu hình DHT
#define DHTPIN 4 // kết nối chân 4 với DHT22
#define DHTTYPE DHT22 // Loại cảm biến DHT22
DHT dht(DHTPIN, DHTTYPE);
// dht là object được tạo từ class DHT. Sử dụng để gọi các hàm như dht.readTemperature() và dht.readHumidity() để lấy dữ liệu từ cảm biến.
// Cấu hình LED
#define LED_PIN 21 // Chân 21 để gắn LED
BlynkTimer timer; // Khởi tạo đối tượng timer cho Blynk
// Hàm này sẽ được gọi để thu thập dữ liệu từ cảm biến DHT22
void sendSensorData() {
float humidity = dht.readHumidity(); // Đọc độ ẩm từ DHT22
float temperature = dht.readTemperature(); // Đọc nhiệt độ từ DHT22
// Hàm isnan() kiểm tra xem giá trị có phải là NaN (Not a Number) hay không.
//Nếu hàm đọc dữ liệu từ cảm biến bị lỗi hoặc không thành công, biến humidity và temperature có thể nhận giá trị NaN.
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Lỗi: Không thể đọc dữ liệu từ cảm biến DHT22");
return;
//dùng return để kết thúc hàm sendSensorData(), không thực gửi dữ liệu đến Blynk.
}
// Gửi dữ liệu lên Blynk
Blynk.virtualWrite(V2, temperature); // Gửi nhiệt độ lên Virtual Pin V2
Blynk.virtualWrite(V3, humidity); // Gửi độ ẩm lên Virtual Pin V3
// Hiển thị dữ liệu trên Serial Monitor
Serial.print("Nhiệt độ: ");
Serial.print(temperature);
Serial.print("°C Độ ẩm: ");
Serial.print(humidity);
Serial.println("%");
}
// Hàm này sẽ được tự động gọi khi có sự thay đổi từ nút nhấn trên Virtual Pin V5 trên Blynk.
BLYNK_WRITE(V5) {
int pinValue = param.asInt(); // Đọc giá trị của nút nhấn từ Blynk
if (pinValue == 1) {
Serial.println("LED Blynk: BẬT");
digitalWrite(LED_PIN, HIGH); // Bật LED trên GPIO 21
} else {
Serial.println("LED Blynk: TẮT");
digitalWrite(LED_PIN, LOW); // Tắt LED trên GPIO 21
}
}
void setup() {
pinMode(LED_PIN, OUTPUT); //đặt chân LED thành chế độ OUTPUT
digitalWrite(LED_PIN, LOW); //ban đầu cho led tắt
// Cài đặt Serial Monitor
Serial.begin(115200);
Serial.println("Hello, ESP32!");
// Kết nối WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // kết nối đến mạng WiFi với SSID và mật khẩu đã define ở trên
while (WiFi.status() != WL_CONNECTED) //Chờ đến khi kết nối thành công delay(500);
{
delay(500);
Serial.print(".");
}
Serial.println("\nĐã kết nối WiFi");
// Kết nối với Blynk với token ở trên qua WiFi
Blynk.begin(BLYNK_AUTH_TOKEN, WIFI_SSID, WIFI_PASSWORD);
// Khởi động cảm biến DHT
dht.begin();
// Thiết lập hàm gửi dữ liệu cảm biến lên Blynk mỗi 1 giây
timer.setInterval(1000L, sendSensorData);
}
void loop() {
Blynk.run(); // Xử lý các hoạt động của Blynk
timer.run(); // Đây là hàm từ thư viện BlynkTimer, dùng để xử lý hàm timer.setInterval(1000L, sendSensorData) sau mỗi 1s như đã thiết lập ở trên;
}