// IoT-based Irrigation System for ThingSpeak
// Based on ESP32 WOKWI Simulator by ThinkIOT
// ThingSpeak channel can be found here: https://thingspeak.com/channels/2383114
#include <WiFi.h>
#include <WebServer.h>
#include "ThingSpeak.h"
#include "DHT.h"
/************ PIN DEFINITIONS ************/
#define SOIL_MOISTURE_PIN 34
#define SPRINKLER_CONTROL_PIN 19
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
/************ WIFI ************/
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
/************ THINGSPEAK ************/
long myChannelNumber = 3275375;
const char* myApiKey = "BMRA4X3BRXD4WEE2";
WiFiClient client;
WebServer server(80);
/************ GLOBAL STATUS ************/
bool SPRINKLER_STATUS = false;
/************ HTTP HANDLER ************/
void handleSprinkler()
{
if (server.hasArg("state"))
{
String state = server.arg("state");
if (state == "on")
{
SPRINKLER_STATUS = true;
digitalWrite(SPRINKLER_CONTROL_PIN, HIGH);
server.send(200, "text/plain", "Sprinkler ON");
}
else if (state == "off")
{
SPRINKLER_STATUS = false;
digitalWrite(SPRINKLER_CONTROL_PIN, LOW);
server.send(200, "text/plain", "Sprinkler OFF");
}
}
else
{
server.send(400, "text/plain", "Missing state parameter");
}
}
/************ SETUP ************/
void setup()
{
Serial.begin(115200);
pinMode(SPRINKLER_CONTROL_PIN, OUTPUT);
dht.begin();
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
Serial.print("ESP32 IP: ");
Serial.println(WiFi.localIP());
// Web server route
server.on("/sprinkler", handleSprinkler);
server.begin();
ThingSpeak.begin(client);
}
/************ LOOP ************/
void loop()
{
server.handleClient(); // Listen for Raspberry Pi commands
/******** SENSOR READ ********/
int sensorValue = analogRead(SOIL_MOISTURE_PIN);
int soilMoisture =
constrain(map(sensorValue, 4095, 0, 0, 100), 0, 100);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity))
{
Serial.println("DHT Read Failed");
return;
}
/******** SERIAL OUTPUT ********/
Serial.println("------ DATA ------");
Serial.print("Soil: "); Serial.println(soilMoisture);
Serial.print("Temp: "); Serial.println(temperature);
Serial.print("Humidity: "); Serial.println(humidity);
Serial.print("Sprinkler: ");
Serial.println(SPRINKLER_STATUS ? "ON" : "OFF");
/******** THINGSPEAK ********/
ThingSpeak.setField(1, soilMoisture);
ThingSpeak.setField(2, temperature);
ThingSpeak.setField(3, humidity);
// ThingSpeak.setField(4, SPRINKLER_STATUS);
ThingSpeak.writeFields(myChannelNumber, myApiKey);
delay(15000);
} // Thingspeak allows for an update every 15 seconds