#define BLYNK_TEMPLATE_ID "TMPL6Dfh04lhB"
#define BLYNK_TEMPLATE_NAME "IOT  LAB2"
#define BLYNK_AUTH_TOKEN "lEOfPl0XJZHSg8mR3LDTYeTRPkdciaDY"
#define BLYNK_PRINT Serial

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"

#define DHTPIN 5     
#define DHTTYPE DHT22  
DHT dht(DHTPIN, DHTTYPE);
#define SOILMOISTURE_PIN 35     //chân độ ẩm đất
#define RELAY_PIN 23     //relay pin
#define BUTTON 14

char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;

char auth[] = BLYNK_AUTH_TOKEN;
int mode=0;
int nd_s=20,A;
float t,h;
#define LED 4
int tt_dc;
BLYNK_WRITE(V2){
  int ttdk = param.asInt();
  if(ttdk==0)
  {
    digitalWrite(RELAY_PIN, LOW);
    tt_dc=0;
    A=0;
  }
  else if(ttdk==1)
  {
    digitalWrite(RELAY_PIN, HIGH);
    tt_dc=1;
    A=0;
  }
}
BLYNK_WRITE(V3){
  int ttdk_A = param.asInt();
  if(ttdk_A==1)
  {
    A=1;
  }
}
BLYNK_WRITE(V1){
  nd_s = param.asInt();
}
void sendSensor()
{
  t = dht.readTemperature();
  int hu = analogRead(SOILMOISTURE_PIN);
  h = map(hu, 0, 4095, 100, 0); 
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 // ghi giá trị h lên v1 và t lên v0
  Blynk.virtualWrite(V1, t);
  Blynk.virtualWrite(V0, h); 
}
void setup()
{
  // Debug console
  Serial.begin(115200);
  delay(1000);
  Blynk.begin(auth, ssid, pass);
  pinMode(RELAY_PIN, OUTPUT);
  dht.begin();


  // Setup a function to be called every second
  timer.setInterval(1000L, sendSensor);
}

void loop()
{
  Blynk.run();
  Blynk.virtualWrite(V4, tt_dc);
  timer.run();
  if(A==1)
  {
    if(t<nd_s)
    {
      digitalWrite(RELAY_PIN, LOW);
      tt_dc=0;
    }
    else
    {
      digitalWrite(RELAY_PIN, HIGH);
      tt_dc=1;
    }
  }
}
Soil SensorBreakout
NOCOMNCVCCGNDINLED1PWRRelay Module