#include <WiFi.h>
#include <ThingSpeak.h>
#include "DHTesp.h"
// WiFi & ThingSpeak
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
#define CHANNEL_ID 3131689
#define READ_CHANNEL_ID 3131689
#define WRITE_API_KEY "MHZ381ONN2VJZQQO"
#define READ_API_KEY "JPR9FRBRPJ0U85EP"
WiFiClient client;
// Pins
#define DHT_PIN 15
#define TRIG_PIN 14
#define ECHO_PIN 27
#define RELAY_PIN 5
DHTesp dht;
#define READ_FIELD 1 // ThingSpeak field for relay control
void setup() {
Serial.begin(115200);
dht.setup(DHT_PIN, DHTesp::DHT22);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
Serial.print("Connecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASS);
int retries = 0;
while (WiFi.status() != WL_CONNECTED && retries < 20) {
Serial.print(".");
delay(1000);
retries++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\n✅ WiFi Connected!");
} else {
Serial.println("\n❌ WiFi Failed!");
}
ThingSpeak.begin(client);
}
void loop() {
// --- Read DHT22 ---
TempAndHumidity data = dht.getTempAndHumidity();
float temp = data.temperature;
float hum = data.humidity;
// --- Read Ultrasonic ---
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms timeout
float distance = (duration > 0) ? duration * 0.034 / 2 : -1; // -1 if timeout
// --- Display ---
Serial.println("=======================");
Serial.println("🌡 Temp: " + String(temp, 1) + " °C");
Serial.println("💧 Humidity: " + String(hum, 1) + " %");
Serial.println("📏 Water Level: " + String(distance, 1) + " cm");
// --- Upload to ThingSpeak ---
ThingSpeak.setField(1, hum);
ThingSpeak.setField(2, temp);
ThingSpeak.setField(3, distance);
int code = ThingSpeak.writeFields(CHANNEL_ID, WRITE_API_KEY);
if (code == 200) {
Serial.println("✅ Data sent to ThingSpeak");
} else {
Serial.println("❌ Error sending data. HTTP code: " + String(code));
}
// --- Read Relay Control Key ---
float controlKey = ThingSpeak.readFloatField(READ_CHANNEL_ID, READ_FIELD, READ_API_KEY);
Serial.println("🔑 Control Key: " + String(controlKey));
if (controlKey == 1) {
digitalWrite(RELAY_PIN, HIGH);
Serial.println("🔔 Pump ON");
} else {
digitalWrite(RELAY_PIN, LOW);
Serial.println("💤 Pump OFF");
}
delay(15000);
}