#define BLYNK_TEMPLATE_ID "TMPL6c6fTkHdP"
#define BLYNK_TEMPLATE_NAME "DO AN"
#define BLYNK_AUTH_TOKEN "D7rX4QLZbrglNobzWBVD198QOd2Ul7_c"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Định nghĩa các chân I2C cho LCD
// #define I2C_SDA 21 // SDA nối với GPIO 21
// #define I2C_SCL 22 // SCL nối với GPIO 22
#define relay1_pin 26
#define relay2_pin 27
#define relay3_pin 14
#define relay4_pin 12
#define Nut_menu 5
#define Nut_up 18
#define Nut_dg 19
#define Nut_menu_auto 13
#define Nut_rl1 23
#define Nut_rl2 25
#define Nut_rl3 34
#define Nut_rl4 35
int rl1_str = 0,rl2_str = 0,rl3_str = 0,rl4_str = 0;
int button1;
int button2;
int button3;
int button4;
int val0; // Giá trị cảm biến ánh sáng
int val1; // Giá trị cảm biến độ ẩm đất
int ptdad;
int phantram; // Phần trăm ánh sáng
float h; // Độ ẩm
float t; // Nhiệt độ
bool menu_hoatdong = 0;
int menu_setting = 0; // 0 hoạt động bình thường // 1 cài đặt nhiệt độ 2 cài đặt độ ẩm 3 cài đặt độ ẩm đất/
// int set_nhietdo,set_doam,set_da_dat;
int set_nhietdo = 30;
int set_doam = 60;
int set_da_dat= 20;
//
// Định nghĩa các chân khác
#define DHTPIN 4 // Chân dữ liệu của DHT11 kết nối với chân GPIO 4 của ESP32
#define DHTTYPE DHT22 // Định nghĩa loại cảm biến DHT
DHT dht(DHTPIN, DHTTYPE);
// Thiết lập LCD 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4); // Địa chỉ I2C 0x27, LCD 20x4
// Định nghĩa chân cảm biến độ ẩm đất và cảm biến ánh sáng
#define DA_dat 33 // 34 Cảm biến độ ẩm đất kết nối với chân GPIO 34
//#define CB_as 35 // Cảm biến ánh sáng kết nối với chân GPIO 35
#define CB_as 32
// Định nghĩa WiFi và Blynk
// char ssid[] = "kimloan"; // Thay bằng tên WiFi của bạn
// char pass[] = "kimloan2017@!"; // Thay bằng mật khẩu WiFi của bạn
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
bool isAutoMode = true; // Biến để kiểm tra chế độ hiện tại
BlynkTimer timer;
BLYNK_WRITE(V0) {
}
BLYNK_WRITE(V3) {
}
BLYNK_WRITE(V4) {
}
BLYNK_WRITE(V5) {
}
BLYNK_WRITE(V6) {
}
void setup() {
// Khởi tạo I2C cho màn hình LCD
//Wire.begin(I2C_SDA, I2C_SCL);
//lcd.begin();
lcd.init();
lcd.backlight();
// Khởi tạo cảm biến DHT
dht.begin();
// Khởi tạo Serial để debug
Serial.begin(115200);
pinMode(DA_dat, INPUT);
pinMode(CB_as, INPUT);
pinMode(Nut_menu, INPUT_PULLUP);
pinMode(Nut_up, INPUT_PULLUP);
pinMode(Nut_dg, INPUT_PULLUP);
pinMode(Nut_menu_auto, INPUT_PULLUP);
pinMode(Nut_rl1, INPUT_PULLUP);
pinMode(Nut_rl2, INPUT_PULLUP);
pinMode(Nut_rl3, INPUT_PULLUP);
pinMode(Nut_rl4, INPUT_PULLUP);
pinMode(relay1_pin, OUTPUT);
pinMode(relay2_pin, OUTPUT);
pinMode(relay3_pin, OUTPUT);
pinMode(relay4_pin, OUTPUT);
// Kết nối WiFi và Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
//lcd.clear();
}
void loop()
{
Blynk.run(); // Chạy Blynk
timer.run();
//---------------------------------------------
if (menu_setting == 0)
{
hien_thi_md();
lcd.setCursor(0, 3);
if ( digitalRead(Nut_menu_auto) == 0 )
{
//while ( digitalRead(Nut_menu_auto) == 0 );
menu_hoatdong = !menu_hoatdong;
//Blynk.virtualWrite(V0, menu_hoatdong);
}
if (menu_hoatdong == 1)
{
Serial.println("hoat dong o auto");
if (digitalRead(CB_as) == 0) {
lcd.print("Du sang ");
digitalWrite(relay4_pin, HIGH);
} else {
lcd.print("Bat den ");
digitalWrite(relay4_pin, LOW);
}
if (ptdad < set_da_dat )
{
digitalWrite(relay1_pin, LOW);
}else
{
digitalWrite(relay1_pin, HIGH);
}
if (h < set_doam )
{
digitalWrite(relay3_pin, LOW);
}else
{
digitalWrite(relay3_pin, HIGH);
}
if (t > set_nhietdo )
{
digitalWrite(relay2_pin, LOW);
}else
{
digitalWrite(relay2_pin, HIGH);
}
}
else
{
Serial.println("hoat dong o men");
if (digitalRead(Nut_rl1) == 0)
{
delay(100);
if (digitalRead(Nut_rl1) == 0)
{
//while (digitalRead(Nut_rl1) == 0);
rl1_str = !rl1_str;
}
}
if (digitalRead(Nut_rl2) == 0)
{
delay(100);
if (digitalRead(Nut_rl2) == 0)
{
//while (digitalRead(Nut_rl2) == 0);
rl2_str = !rl2_str;
}
}
if (digitalRead(Nut_rl3) == 0)
{
delay(100);
if (digitalRead(Nut_rl3) == 0)
{
//while (digitalRead(Nut_rl3) == 0);
rl3_str = !rl3_str;
}
}
if (digitalRead(Nut_rl4) == 0)
{
delay(100);
if (digitalRead(Nut_rl4) == 0)
{
//while (digitalRead(Nut_rl4) == 0);
rl4_str = !rl4_str;
}
}
digitalWrite(relay1_pin, rl1_str);
delay(10);
digitalWrite(relay2_pin, rl2_str);
delay(10);
digitalWrite(relay3_pin, rl3_str);
delay(10);
digitalWrite(relay4_pin, rl4_str);
delay(10);
}
//delay(1000);
}
//---------------------------------------------
if (digitalRead(Nut_menu)==0)
{
//while ((digitalRead(Nut_menu)==0));
menu_setting++;
if (menu_setting > 3) menu_setting = 0;
lcd.clear();
}
if (menu_setting == 1){cai_dat_nhiet_do();}
if (menu_setting == 2){cai_dat_do_am();}
if (menu_setting == 3){cai_dat_da_dat();}
//---------------------------------------------
}
void hien_thi_md()
{
h = dht.readHumidity(); // Độ ẩm
t = dht.readTemperature(); // Nhiệt độ
int soilMoisture = analogRead(DA_dat);
//int lightLevel = analogRead(CB_as);
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhiet do: ");
lcd.print(t);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Do am: ");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Do am dat:");
val1 = analogRead(DA_dat);
ptdad = map(val1, 0, 4095, 100, 0);
lcd.print(ptdad);
lcd.print(" ");
Blynk.virtualWrite(V1, t);
Blynk.virtualWrite(V2, h);
Blynk.virtualWrite(V8, ptdad);
// Blynk.virtualWrite(V7, lightLevel);
}
void cai_dat_nhiet_do()
{
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cai dat nhiet do");
lcd.setCursor(0, 1);
lcd.print("Nhiet do: ");
lcd.print("xxx");
}
void cai_dat_do_am()
{
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cai dat do am");
lcd.setCursor(0, 1);
lcd.print("Do am: ");
lcd.print("xxx");
}
void cai_dat_da_dat()
{
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cai dat do am dat");
lcd.setCursor(0, 1);
lcd.print("Do am dat: ");
lcd.print("xxx");
}