#include <WiFi.h>
#include "ThingSpeak.h"
#include <DHTesp.h>
// Pin Definitions
const int DHT_PIN = 12;
const int RELAY_PIN = 18;
// WiFi Credentials
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
// ThingSpeak Configuration
const int CHANNEL_ID = 2833645;
const char* API_KEY = "EJKBWBE6KY88FUWB";
// Thresholds
const float MOISTURE_THRESHOLD = 60.0;
const float STOP_MOISTURE_THRESHOLD = 99.0;
// Variables
bool manualMode = false;
bool relayState = false;
// DHT Sensor Setup
DHTesp dht;
WiFiClient client;
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
dht.setup(DHT_PIN, DHTesp::DHT22);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected!");
ThingSpeak.begin(client);
}
void loop() {
TempAndHumidity data = dht.getTempAndHumidity();
if (isnan(data.humidity)) {
Serial.println("DHT Sensor Error!");
return;
}
float moisturePercentage = constrain(data.humidity, 0, 100);
Serial.println("Moisture: " + String(moisturePercentage, 1) + "%");
int cloudRelayStatus = ThingSpeak.readIntField(CHANNEL_ID, 2);
Serial.println("Cloud Relay Status: " + String(cloudRelayStatus));
if (cloudRelayStatus == 1) {
manualMode = true;
relayState = true;
digitalWrite(RELAY_PIN, HIGH);
} else if (cloudRelayStatus == 0) {
manualMode = false;
relayState = false;
digitalWrite(RELAY_PIN, LOW);
}
if (!manualMode) {
if (!relayState && moisturePercentage < MOISTURE_THRESHOLD) {
relayState = true;
digitalWrite(RELAY_PIN, HIGH);
} else if (relayState && moisturePercentage >= STOP_MOISTURE_THRESHOLD) {
relayState = false;
digitalWrite(RELAY_PIN, LOW);
}
}
// Push data only if conditions are met
ThingSpeak.setField(1, moisturePercentage);
if (!(manualMode && moisturePercentage < STOP_MOISTURE_THRESHOLD)) {
ThingSpeak.setField(2, relayState ? 1 : 0);
}
int response = ThingSpeak.writeFields(CHANNEL_ID, API_KEY);
Serial.println(response == 200 ? "Data pushed successfully" : "Push error: " + String(response));
delay(5000);
}