#define BLYNK_TEMPLATE_ID "TMPL6RWhSBc4f"
#define BLYNK_TEMPLATE_NAME "TestDHT11"
#define BLYNK_AUTH_TOKEN "olRuQIVBUBmU-f275fNnP78sOpMoZTOc"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define DHTpin 15
#define DHTTYPE DHT22
#define muccanhbao2 65 // Ngưỡng độ ẩm
#define muccanhbao1 28 // Ngưỡng nhiệt độ
#define buzzer 2
#define led1 4
#define led2 5
bool warningState = false;
unsigned long blinkPreviousMillis = 0; // Để theo dõi thời gian nhấp nháy LED
const long blinkInterval = 1000; // Khoảng thời gian nhấp nháy (2 giây)
#define button1_pin 26
#define button2_pin 25
#define relay1_pin 13
#define relay2_pin 12
int relay1_state = 0;
int relay2_state = 0;
#define button1_vpin V4
#define button2_vpin V5
BLYNK_CONNECTED() {
Blynk.syncVirtual(button1_vpin);
Blynk.syncVirtual(button2_vpin);
}
BLYNK_WRITE(button1_vpin) {
relay1_state = param.asInt();
digitalWrite(relay1_pin, relay1_state);
}
BLYNK_WRITE(button2_vpin) {
relay2_state = param.asInt();
digitalWrite(relay2_pin, relay2_state);
}
WidgetLED ledconnect(V0);
WidgetLED ledwarning(V3);
DHT dht(DHTpin, DHTTYPE);
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
unsigned long previousMillis = 0;
const long interval = 2000;
// Khai báo các hàm trước khi sử dụng
void listen_push_buttons();
void control_relay(int relay);
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
Blynk.begin(auth, ssid, pass);
pinMode(buzzer, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(button1_pin, INPUT_PULLUP);
pinMode(button2_pin, INPUT_PULLUP);
pinMode(relay1_pin, OUTPUT);
pinMode(relay2_pin, OUTPUT);
digitalWrite(relay1_pin, LOW);
digitalWrite(relay2_pin, LOW);
digitalWrite(buzzer, LOW);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
}
void loop() {
Blynk.run();
listen_push_buttons();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("ERROR: Failed to read from DHT sensor");
return;
}
Blynk.virtualWrite(V1, t);
Blynk.virtualWrite(V2, h);
if (Blynk.connected()) {
ledconnect.on();
}
else {
ledconnect.off();
}
if (t > muccanhbao1 || h < muccanhbao2) {
digitalWrite(buzzer, HIGH);
digitalWrite(led2, HIGH);
if (!warningState) {
warningState = true;
ledwarning.on();
if( t > muccanhbao1){
Blynk.logEvent("canh_bao", "Nhiệt độ vượt ngưỡng: " + String(t) + "°C");
}
if(h < muccanhbao2){
Blynk.logEvent("canh_bao", "Độ ẩm dưới ngưỡng: " + String(h) + "%");
}
}
else {
digitalWrite(buzzer, LOW);
digitalWrite(led2, LOW);
if (warningState) {
warningState = false;
ledwarning.off();
}
}
}
Serial.print("DO AM : ");
Serial.print(h);
Serial.println("%");
Serial.print("NHIET DO : ");
Serial.print(t);
Serial.print(" *C | ");
Serial.print(f);
Serial.println(" *F");
lcd.setCursor(0, 0);
lcd.print("DO AM:");
lcd.setCursor(8,0);
lcd.print(h);
lcd.setCursor(13,0);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print(t);
lcd.setCursor(5, 1);
lcd.print("*C");
lcd.setCursor(8, 1);
lcd.print("|");
lcd.setCursor(10, 1);
lcd.print(f);
lcd.setCursor(15, 1);
lcd.print("*F");
}
// Xử lý nhấp nháy LED
if (warningState && (currentMillis - blinkPreviousMillis >= blinkInterval)) {
blinkPreviousMillis = currentMillis; // Đặt lại thời gian nhấp nháy
// Chuyển đổi trạng thái đèn LED vật lý
digitalWrite(led2, !digitalRead(led2));
// Chuyển đổi trạng thái đèn LED ảo
if (ledwarning.getValue()) {
ledwarning.off(); // Tắt đèn LED ảo
} else {
ledwarning.on(); // Bật đèn LED ảo
}
}
}
void listen_push_buttons() {
if(digitalRead(button1_pin) == LOW) {
delay(200);
control_relay(1);
Blynk.virtualWrite(button1_vpin, relay1_state);
} else if (digitalRead(button2_pin) == LOW) {
delay(200);
control_relay(2);
Blynk.virtualWrite(button2_vpin, relay2_state);
}
}
void control_relay(int relay) {
if(relay == 1) {
relay1_state = !relay1_state;
digitalWrite(relay1_pin, relay1_state);
} else if(relay == 2) {
relay2_state = !relay2_state;
digitalWrite(relay2_pin, relay2_state);
}
delay(50);
}