#define BLYNK_TEMPLATE_ID "TMPL6myzAUbIx"
#define BLYNK_TEMPLATE_NAME "smartfarm"
#define BLYNK_AUTH_TOKEN "o48oRkmwro54XVobn_1sqs_b7-vDVvKc"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"
// Comment this out to disable prints and save space
#define BLYNK_PRINT Serial
#define DHTPIN 32 // Chân đọc dữ liệu DHT22
#define DHTTYPE DHT22 // Loại cảm biến DHT
#define SOIL_PIN 34 // Chân đọc từ Potentiometer
#define PUMP_PIN 23 // Chân điều khiển bơm (đã thay đổi thành GPIO 22)
#define LIGHT_PIN 27 // Đèn nông trại
#define BUTTON_PIN 25 // Nút điều khiển đèn nông trại
#define HOT_LED_PIN 18 // Đèn cảnh báo nóng
#define COLD_LED_PIN 17 // Đèn cảnh báo lạnh
#define RAINY_LED_PIN 4 // Đèn cảnh báo mưa
DHT dht(DHTPIN, DHTTYPE);
// WiFi thông tin
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
// Biến trạng thái cho đèn và bơm
bool lightState = false;
bool pumpState = false; // Trạng thái máy bơm
// Các ngưỡng cảnh báo
#define HOT_TEMP_THRESHOLD 35
#define COLD_TEMP_THRESHOLD 10
#define LOW_HUMIDITY_THRESHOLD 20
#define HIGH_HUMIDITY_THRESHOLD 90
// Blynk sync on connection
BLYNK_CONNECTED() {
Blynk.syncVirtual(V1, V2, V3, V4, V5, V6, V7, V8);
}
BLYNK_WRITE(V4) {
lightState = param.asInt(); // Đọc trạng thái từ nút
digitalWrite(LIGHT_PIN, lightState ? HIGH : LOW); // Cập nhật đèn
Serial.println(lightState ? "Đèn nông trại bật" : "Đèn nông trại tắt");
}
void setup() {
pinMode(PUMP_PIN, OUTPUT);
pinMode(LIGHT_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(HOT_LED_PIN, OUTPUT);
pinMode(COLD_LED_PIN, OUTPUT);
pinMode(RAINY_LED_PIN, OUTPUT);
Serial.begin(115200);
dht.begin();
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(2000L, readSensors); // Đọc cảm biến mỗi 2 giây
timer.setInterval(100L, handleLight); // Kiểm tra nút bấm mỗi 100ms
}
void loop() {
Blynk.run();
timer.run();
}
void checkWeatherWarnings(float temp, float humidity) {
if (temp > HOT_TEMP_THRESHOLD) {
digitalWrite(HOT_LED_PIN, HIGH); // Bật LED cảnh báo
digitalWrite(COLD_LED_PIN, LOW);
digitalWrite(RAINY_LED_PIN, LOW);
Blynk.virtualWrite(V5, 1);
Blynk.virtualWrite(V7, 0);
Blynk.virtualWrite(V8, 0);
Serial.print("Nhiệt độ: ");
Serial.print(temp);
Serial.println(" °C");
Serial.println("Cảnh báo nóng!");
if (humidity < LOW_HUMIDITY_THRESHOLD) {
Serial.println("Cảnh báo khô nóng!");
} else if (humidity > HIGH_HUMIDITY_THRESHOLD) {
digitalWrite(RAINY_LED_PIN, HIGH); // Bật LED cảnh báo
Blynk.virtualWrite(V8, 1);
Serial.println("Có thể sắp mưa!");
}
}
else if (temp < COLD_TEMP_THRESHOLD) {
digitalWrite(COLD_LED_PIN, HIGH); // Bật LED cảnh báo
digitalWrite(HOT_LED_PIN, LOW);
digitalWrite(RAINY_LED_PIN, LOW);
Blynk.virtualWrite(V7, 1);
Blynk.virtualWrite(V5, 0);
Blynk.virtualWrite(V8, 0);
Serial.print("Nhiệt độ: ");
Serial.print(temp);
Serial.println(" °C");
Serial.println("Cảnh báo rét đậm!");
if (humidity < LOW_HUMIDITY_THRESHOLD) {
Serial.println("Cảnh báo rét khô!");
}
else if (humidity > HIGH_HUMIDITY_THRESHOLD) {
digitalWrite(RAINY_LED_PIN, HIGH); // Bật LED cảnh báo
Blynk.virtualWrite(V8, 1);
Serial.println("Có thể sắp mưa!");
}
}
else {
digitalWrite(HOT_LED_PIN, LOW); // Tắt LED cảnh báo
digitalWrite(COLD_LED_PIN, LOW);
digitalWrite(RAINY_LED_PIN, LOW);
Blynk.virtualWrite(V5, 0);
Blynk.virtualWrite(V7, 0);
Blynk.virtualWrite(V8, 0);
Serial.print("Nhiệt độ: ");
Serial.print(temp);
Serial.println(" °C");
if (humidity > HIGH_HUMIDITY_THRESHOLD) {
digitalWrite(RAINY_LED_PIN, HIGH); // Bật LED cảnh báo
Blynk.virtualWrite(V8, 1);
Serial.println("Có thể sắp mưa!");
}
else if (humidity < LOW_HUMIDITY_THRESHOLD) {
Serial.println("Cảnh báo khô!");
}
}
}
void readSensors() {
// Đọc nhiệt độ và độ ẩm từ DHT22
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
// Đọc giá trị từ potentiometer (mô phỏng độ ẩm đất)
int soilValue = analogRead(SOIL_PIN);
float soilPercent = map(soilValue, 0, 4095, 0, 100);
// Gửi dữ liệu lên Blynk
Blynk.virtualWrite(V1, temp); // Nhiệt độ
Blynk.virtualWrite(V2, humidity); // Độ ẩm không khí
Blynk.virtualWrite(V3, soilPercent); // Độ ẩm đất
// Kiểm tra và gửi cảnh báo thời tiết
checkWeatherWarnings(temp, humidity);
// Điều khiển bơm tự động
if (soilPercent < 30) {
if (!pumpState) {
digitalWrite(PUMP_PIN, HIGH); // Bật bơm
pumpState = true; // Cập nhật trạng thái máy bơm
Blynk.virtualWrite(V6, pumpState); // Cập nhật trạng thái máy bơm lên Blynk
Serial.println("Bơm nước bật");
}
} else {
if (pumpState) {
digitalWrite(PUMP_PIN, LOW); // Tắt bơm
pumpState = false; // Cập nhật trạng thái máy bơm
Blynk.virtualWrite(V6, pumpState); // Cập nhật trạng thái máy bơm lên Blynk
Serial.println("Bơm nước tắt");
}
}
}
// Đèn nông trại
void handleLight() {
// Đọc trạng thái nút bấm
if (digitalRead(BUTTON_PIN) == LOW) {
delay(50); // Debounce
lightState = !lightState; // Đổi trạng thái đèn
digitalWrite(LIGHT_PIN, lightState ? HIGH : LOW);
Blynk.virtualWrite(V4, lightState); // Cập nhật trạng thái đèn trên Blynk
Serial.println(lightState ? "Đèn nông trại bật" : "Đèn nông trại tắt");
delay(200); // Chờ để tránh nhấn giữ
}
}