#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>
// DHT sensor
#define DHTPIN 4
#define DHTTYPE DHT22
// Soil moisture pin (potentiometer simulates soil)
#define SOIL_PIN 34
// Relay pin (pump LED)
#define RELAY_PIN 5
DHT dht(DHTPIN, DHTTYPE);
// WiFi and ThingSpeak
const char* ssid = "Wokwi-GUEST";
const char* password = "";
String apiKey = "H1TY77R5103V3KC8";
void setup() {
Serial.begin(115200);
// Setup pump GPIO
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
// Start DHT
dht.begin();
// Connect WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected!");
}
void loop() {
// Read sensors
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int soil = analogRead(SOIL_PIN);
// Print to Serial
Serial.println("---------- DATA ----------");
Serial.println("Temperature: " + String(temp) + " °C");
Serial.println("Humidity: " + String(hum) + " %");
Serial.println("Soil Moisture Value: " + String(soil));
// Pump control logic
if (soil < 2000) {
digitalWrite(RELAY_PIN, HIGH); // Pump ON
Serial.println("Pump ON (Soil Dry)");
} else {
digitalWrite(RELAY_PIN, LOW); // Pump OFF
Serial.println("Pump OFF (Soil Wet)");
}
// Send data to cloud (ThingSpeak)
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// Build URL
String url = String("http://api.thingspeak.com/update?api_key=") + apiKey;
url += "&field1=" + String(temp);
url += "&field2=" + String(hum);
url += "&field3=" + String(soil);
http.begin(url);
int httpCode = http.GET(); // HTTP request
Serial.print("ThingSpeak HTTP code: ");
Serial.println(httpCode);
http.end();
}
Serial.println("------------------------------");
delay(15000); // 15 sec delay (ThingSpeak limit)
}