// #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"
// #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 V1
// // 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)
// // Biến trạng thái
// bool pumpState = false;
// bool lightState = false;
// 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 đọ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");
// }
// }
// 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);
// // Khởi tạo LCD với 16 cột và 2 dòng
// 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);
// }
// 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ỳ
// }
#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ế
#define IR_RECEIVE_PIN 27 // Chân kết nối với IR Receiver
// 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
IRrecv irrecv(IR_RECEIVE_PIN); // Tạo đối tượng IRrecv
// 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ỳ
}