#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();
}
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module