#define BLYNK_TEMPLATE_ID "TMPL6Sw5Gqmg3"
#define BLYNK_TEMPLATE_NAME "nongtrai"
#define BLYNK_AUTH_TOKEN "f30O-UrnSoxtdhYrNWgICtwQlEE_qWRu"
#define DOAMDAT A0
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
char auth[] = "f30O-UrnSoxtdhYrNWgICtwQlEE_qWRu";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define DHTPIN 4
#define DHTTYPE DHT22 // DHT 11
#define DOAMDAT 36 // Cảm biến độ ẩm đất LM393
DHT dht(DHTPIN, DHTTYPE);
#define SCREEN_WIDTH 128 // OLED display width
#define SCREEN_HEIGHT 64 // OLED display height
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int relay_bomtuoi = 19;
int relay_den = 18;
int relay_ra = 5;
int relay_vao = 2;
#define CHEDO V0
#define NHIETDO V1
#define DOAMKK V2
#define DOAMDAT V3
#define BOMNUOC V4
#define MAICHEVAO V5
#define MAICHERA V6
#define BONGDEN V7
#define LEDKETNOI V8
BlynkTimer timer;
bool autoMode = false; // Biến toàn cục để theo dõi chế độ hoạt động
bool ledState = false; // Biến toàn cục để theo dõi trạng thái của LED
void sendSensor()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
int doamdat = analogRead(DOAMDAT);
doamdat = constrain(doamdat, 0, 4095);
int percent = map(doamdat, 0, 4095, 100, 0);
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Gửi giá trị nhiệt độ, độ ẩm và độ ẩm đất lên Blynk
Blynk.virtualWrite(NHIETDO, t);
Blynk.virtualWrite(DOAMKK, h);
Blynk.virtualWrite(DOAMDAT, percent);
if (autoMode) { // Chế độ tự động
if (percent <= 30) {
digitalWrite(relay_bomtuoi, HIGH);
Blynk.virtualWrite(V4, 1);
} else if (percent >= 80) {
digitalWrite(relay_bomtuoi, LOW);
Blynk.virtualWrite(V4, 0);
}
}
// Nhấp nháy V8 khi kết nối với Blynk
if (Blynk.connected()) {
ledState = !ledState;
Blynk.virtualWrite(V8, ledState);
}
}
BLYNK_WRITE(V0)
{
int pinValue = param.asInt(); // getting value from V0
autoMode = pinValue == 0; // Chuyển đổi chế độ khi V0 thay đổi
}
BLYNK_WRITE(V4)
{
if (!autoMode) { // Chỉ điều khiển relay khi ở chế độ thủ công
digitalWrite(relay_bomtuoi, param.asInt());
}
}
BLYNK_WRITE(V7)
{
if (!autoMode) { // Chỉ điều khiển relay khi ở chế độ thủ công
digitalWrite(relay_den, param.asInt());
}
}
BLYNK_WRITE(V6)
{
if (!autoMode) { // Chỉ điều khiển relay khi ở chế độ thủ công
digitalWrite(relay_ra, param.asInt());
}
}
BLYNK_WRITE(V5)
{
if (!autoMode) { // Chỉ điều khiển relay khi ở chế độ thủ công
digitalWrite(relay_vao, param.asInt());
}
}
void setup()
{
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
dht.begin();
pinMode(relay_bomtuoi, OUTPUT);
pinMode(relay_den, OUTPUT);
pinMode(relay_ra, OUTPUT);
pinMode(relay_vao, OUTPUT);
// Cài đặt timer để gửi dữ liệu cảm biến sau mỗi 1 giây
timer.setInterval(1000L, sendSensor);
}
void loop()
{
Blynk.run();
timer.run();
}