//#define BLYNK_TEMPLATE_ID "Enter Template ID"
//#define BLYNK_TEMPLATE_NAME "Enter Template Name"
//#define BLYNK_AUTH_TOKEN "Enter your authentication code"

#define BLYNK_TEMPLATE_ID "TMPL2Ymkw1tjN"
#define BLYNK_TEMPLATE_NAME "IoTGarden"
#define BLYNK_AUTH_TOKEN "xsm4rNthv8fPgpN4iVugejRqVBdKuaLS"

// Comment this out to disable prints and save space
#define BLYNK_PRINT Serial


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

#define DHT_PIN 32
#define PIN_TRIG 26
#define PIN_ECHO 25

const int PUMP_RELAY = 19;
const int SOIL_SENSOR = 34;

unsigned int waterLevelData;
int16_t soilMoistureLevelData;

float t_threshold = 30.0; // Temperature Threshold
float h_threshold = 68.0; // Humidity Threshold

int16_t soil_threshold = 15; // Soil Moisture Threshold


DHTesp dhtSensor;
BlynkTimer timer;

char auth[] = BLYNK_AUTH_TOKEN;

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Wokwi-GUEST";
char pass[] = "";

//send temperature and humidity data
void sendSensorDH(){
  float humidity = dhtSensor.getHumidity();
  float temperature = dhtSensor.getTemperature();
 
  //if no readings
  //give error message
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 
 //else
  Blynk.virtualWrite(V5, humidity);
   Blynk.virtualWrite(V4, temperature);

   if((temperature >= t_threshold) && (humidity >= h_threshold))
  {
    Blynk.logEvent("hightemp_event");
    Serial.println("The ambient temperatures are too high!!");
    Serial.println("Turning on the sprinklers.");
    digitalWrite(PUMP_RELAY, HIGH);
    Blynk.virtualWrite(V5, humidity);
    Blynk.virtualWrite(V4, temperature);
    Serial.print("Humidity: ");
    Serial.print(humidity);
    Serial.print("%\t");
    Serial.print("Temperature: ");
    Serial.print(temperature);
    Serial.println(" °C");
    
  }

  else
  {
    digitalWrite(PUMP_RELAY, LOW);
    Blynk.virtualWrite(V5, humidity);
    Blynk.virtualWrite(V4, temperature);
    Serial.print("Humidity: ");
    Serial.print(humidity);
    Serial.print("%\t");
    Serial.print("Temperature: ");
    Serial.print(temperature);
    Serial.println(" °C");
    
  }  

}

void sendSensorWaterSoil(){
  digitalWrite(PIN_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_TRIG, LOW);

  // Read the result:
  int duration = pulseIn(PIN_ECHO, HIGH);
  soilMoistureLevelData = analogRead(SOIL_SENSOR);

  Serial.print("Water Level in CM: ");
  Serial.println(duration / 58);
  Serial.print("Water Level in inches: ");
  Serial.println(duration / 148);

   //Sensing water levels in cm
  waterLevelData = duration / 58;
  waterLevelData = map(waterLevelData, 0, 400, 0, 20);
  soilMoistureLevelData = map(soilMoistureLevelData, 1600, 3600, 0, 20);

  Blynk.virtualWrite(V7, waterLevelData);
  Blynk.virtualWrite(V6, soilMoistureLevelData);
 
if((soilMoistureLevelData >= soil_threshold))
  {
    Blynk.logEvent("dry_soil_event");
    Serial.println("The Garden's soil is too dry!!");
    Serial.println("Turning on the sprinklers.");
    digitalWrite(PUMP_RELAY, HIGH);
    Blynk.virtualWrite(V7, waterLevelData);
    Blynk.virtualWrite(V6, soilMoistureLevelData);
    Serial.print("Tank Water Levels: ");
    Serial.print( waterLevelData);
    Serial.print(" cm ");
    Serial.print(" soil Moisture Levels:  ");
    Serial.print(soilMoistureLevelData);
    Serial.println(" ");
    
  }

  else
  {
    digitalWrite(PUMP_RELAY, LOW);
    Blynk.virtualWrite(V7, waterLevelData);
    Blynk.virtualWrite(V6, soilMoistureLevelData);
    Serial.print("Tank Water Levels: ");
    Serial.print( waterLevelData);
    Serial.print(" cm");
    Serial.print("soil Moisture Levels:  ");
    Serial.print(soilMoistureLevelData);
    Serial.println(" ");
    
  }  
    
  }

  
  




void setup(){
  
  pinMode(PUMP_RELAY, OUTPUT);
  digitalWrite(PUMP_RELAY, LOW);

  Serial.begin(115200);
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);

  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
  
  Blynk.begin(auth, ssid, pass);
  timer.setInterval(3000L, sendSensorDH);
  timer.setInterval(6000L, sendSensorWaterSoil);
}

void loop() {
  Blynk.run();
  timer.run();
}
$abcdeabcde151015202530354045505560fghijfghij
Soil SensorBreakout
NOCOMNCVCCGNDINLED1PWRRelay Module