#define BLYNK_TEMPLATE_NAME "farm"
#define BLYNK_AUTH_TOKEN "vO3jKNL0HrQYlmABmvEEfY88BAAzu2NS"
#define BLYNK_TEMPLATE_ID "TMPL6MBB3cq_l"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h> // Thư viện WiFi cho ESP32
#include <BlynkSimpleEsp32.h> // Thư viện Blynk
#include "DHT.h"
#include <ESP32Servo.h>
#include <IRremote.h> // include the library
#define DHTPIN 4 // Chân DHT22 kết nối GPIO4
#define DHTTYPE DHT22 // Loại cảm biến DHT22
#define RELAY_PIN 23 // Chân điều khiển relay máy bơm
#define LIGHT_PIN 25 // Chân điều khiển relay đèn
#define SDA_PIN 21 // Chân SDA cho I2C
#define SCL_PIN 22 // Chân SCL cho I2C
#define SERVO_VPIN V4 // Chân điều khiển servo (ảo)
#define SERVO_PIN 26 // Chân GPIO kết nối servo thực tế
// Khai báo WiFi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Khai báo đối tượng
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Địa chỉ I2C của LCD: 0x27 (có thể thay đổi tùy loại)
Servo myServo; // Đối tượng servo
// Biến trạng thái
bool pumpState = false;
bool lightState = false;
bool autoPumpEnabled = true; // Biến kiểm tra chế độ tự động bật máy bơm
float temperatureThreshold = 30.0; // Ngưỡng nhiệt độ bật máy bơm (có thể điều chỉnh)
BlynkTimer timer;
// Hàm điều khiển máy bơm qua nút Blynk
BLYNK_WRITE(V0) {
pumpState = param.asInt(); // Lấy giá trị từ nút Blynk
digitalWrite(RELAY_PIN, pumpState ? HIGH : LOW);
}
// Hàm điều khiển đèn qua nút Blynk
BLYNK_WRITE(V3) {
lightState = param.asInt(); // Lấy giá trị từ nút Blynk
digitalWrite(LIGHT_PIN, lightState ? HIGH : LOW);
}
// Hàm bật/tắt chế độ tự động bật máy bơm qua nút Blynk
BLYNK_WRITE(V5) {
autoPumpEnabled = param.asInt(); // Lấy trạng thái từ Blynk
Serial.print("Auto Pump: ");
Serial.println(autoPumpEnabled ? "Enabled" : "Disabled");
}
// Hàm điều khiển servo qua Blynk
BLYNK_WRITE(SERVO_VPIN) {
int command = param.asInt(); // Lấy giá trị từ nút Blynk (0 hoặc 1)
if (command == 1) {
myServo.write(90); // Mở cửa (90 độ)
Serial.println("Cửa đang mở (90 độ)");
} else if (command == 0) {
myServo.write(0); // Đóng cửa (0 độ)
Serial.println("Cửa đã đóng (0 độ)");
} else {
Serial.println("Lệnh không hợp lệ");
}
}
// Hàm đọc dữ liệu cảm biến và gửi lên Blynk
void sendSensorData() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Kiểm tra lỗi cảm biến
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
lcd.setCursor(0, 0);
lcd.print("Sensor Error!");
} else {
// Hiển thị nhiệt độ và độ ẩm trên LCD
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature);
lcd.print("C H:");
lcd.print(humidity);
lcd.print("%");
// Gửi dữ liệu lên Blynk
Blynk.virtualWrite(V1, temperature);
Blynk.virtualWrite(V2, humidity);
// Hiển thị trạng thái máy bơm và đèn trên LCD
lcd.setCursor(0, 1);
lcd.print("Pump:");
lcd.print(pumpState ? "ON " : "OFF");
lcd.print(" L:");
lcd.print(lightState ? " ON" : "OFF");
// Tự động bật máy bơm nếu nhiệt độ vượt ngưỡng và chế độ tự động được bật
if (autoPumpEnabled && temperature > temperatureThreshold && !pumpState) {
pumpState = true;
digitalWrite(RELAY_PIN, HIGH);
Serial.println("Auto Pump Activated");
} else if (autoPumpEnabled && temperature <= temperatureThreshold && pumpState) {
pumpState = false;
digitalWrite(RELAY_PIN, LOW);
Serial.println("Auto Pump Deactivated");
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
// Kết nối WiFi và Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Khởi tạo I2C với chân SDA và SCL tùy chỉnh
Wire.begin(SDA_PIN, SCL_PIN);
lcd.begin(16, 2);
lcd.backlight(); // Bật đèn nền LCD
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Tắt máy bơm ban đầu
pinMode(LIGHT_PIN, OUTPUT);
digitalWrite(LIGHT_PIN, LOW); // Tắt đèn ban đầu
lcd.setCursor(0, 0);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
// Thiết lập hàm chạy định kỳ để gửi dữ liệu cảm biến lên Blynk
timer.setInterval(2000L, sendSensorData);
// Khởi tạo Servo
myServo.attach(SERVO_PIN); // Gắn servo vào chân GPIO
myServo.write(90); // Đặt góc mặc định 90 độ
}
void loop() {
Blynk.run(); // Xử lý giao tiếp với máy chủ Blynk
timer.run(); // Chạy các tác vụ định kỳ
}