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