#define BLYNK_TEMPLATE_ID "TMPL6T56O4Vv3"
#define BLYNK_TEMPLATE_NAME "test"
#define BLYNK_AUTH_TOKEN "m3UKugZ11yBwepjlaNHD1bfmiOBKh-HZ"
#include <WiFi.h>
#include <WiFiClient.h>
#include <Adafruit_Sensor.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"
// Khai báo các chân và loại cảm biến
#define DHTPIN 15
#define DHTTYPE DHT22
#define TRIG_PIN 5
#define ECHO_PIN 4
#define LED 26
#define LED_RED 33
#define LED_GREEN 32
#define LDR_PIN 34 // Chân kết nối cảm biến LDR (ADC)
#define SDA_Pin 21
#define SCL_Pin 12
// Thông tin Wi-Fi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Tạo đối tượng cảm biến và timer
DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;
// Hàm đọc khoảng cách từ cảm biến HC-SR04
long readDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
long distance = duration * 0.034 / 2; // Tính khoảng cách (cm)
return distance;
}
// Hàm đọc giá trị ánh sáng từ cảm biến LDR
int readLightLevel() {
int lightValue = analogRead(LDR_PIN); // Đọc giá trị ADC từ LDR
return lightValue;
}
// Điều khiển LED từ ứng dụng Blynk
BLYNK_WRITE(V3) {
int value = param.asInt();
value ? digitalWrite(LED, HIGH) : digitalWrite(LED, LOW);
}
// Hàm gửi dữ liệu cảm biến lên Blynk
void sendSensor() {
float h = dht.readHumidity(); // Đọc độ ẩm
float t = dht.readTemperature(); // Đọc nhiệt độ
long distance = readDistance(); // Đọc khoảng cách
int lightLevel = readLightLevel(); // Đọc giá trị ánh sáng
// Kiểm tra nếu không đọc được dữ liệu từ DHT
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Gửi dữ liệu cảm biến lên Blynk
Blynk.virtualWrite(V1, h); // Gửi độ ẩm lên V1
Blynk.virtualWrite(V0, t); // Gửi nhiệt độ lên V0
Blynk.virtualWrite(V2, distance); // Gửi khoảng cách lên V6
Blynk.virtualWrite(V7, lightLevel); // Gửi ánh sáng lên V7
// Điều khiển LED dựa trên nhiệt độ và ánh sáng
if (t > 60) {
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
Serial.println("CẢNH BÁO: Nhiệt độ cao! LED đỏ bật.");
} else if (t > 10 && t < 50 && h < 70 && lightLevel > 2000) {
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_RED, LOW);
Serial.println("Trạng thái an toàn: LED xanh bật.");
} else {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
Serial.println("Trạng thái bình thường: LED tắt.");
}
if (distance < 10) {
digitalWrite(LED_RED, HIGH);
delay(250);
digitalWrite(LED_RED, LOW);
delay(250);
}
// Debug: In giá trị cảm biến ra Serial Monitor
Serial.print("Nhiệt độ: ");
Serial.print(t);
Serial.print(" °C, Độ ẩm: ");
Serial.print(h);
Serial.print(" %, Khoảng cách: ");
Serial.print(distance);
Serial.print(" cm, Ánh sáng: ");
Serial.print(lightLevel);
Serial.println();
}
void setup() {
Serial.begin(9600);
delay(1000);
// Kết nối Wi-Fi và Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Khởi tạo các chân
pinMode(LED, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
// Khởi động cảm biến DHT
dht.begin();
// Gửi dữ liệu cảm biến mỗi giây
timer.setInterval(1000L, sendSensor);
}
void loop() {
Blynk.run();
timer.run();
}