#include <WiFi.h>
#define MOISTURE_PIN 34
#define NUTRIENT_PIN 35
#define RELAY_PIN 26
#define STATUS_LED 25
#define FERT_LED 27
#define BUTTON_PIN 14
bool autoMode = true;
int moistureThreshold = 2500;
int nutrientThreshold = 2500;
String apiKey = "YOUR_API_KEY";
const char* server = "api.thingspeak.com";
WiFiClient client;
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
pinMode(STATUS_LED, OUTPUT);
pinMode(FERT_LED, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
}
void loop() {
// Mode toggle
if (digitalRead(BUTTON_PIN) == LOW) {
autoMode = !autoMode;
delay(500);
}
int moisture = analogRead(MOISTURE_PIN);
int nutrient = analogRead(NUTRIENT_PIN);
Serial.println("------ SENSOR DATA ------");
Serial.print("Moisture: ");
Serial.println(moisture);
Serial.print("Nutrient: ");
Serial.println(nutrient);
int moisturePercent = map(moisture, 0, 4095, 100, 0);
Serial.print("Moisture %: ");
Serial.println(moisturePercent);
// AUTO MODE
if (autoMode) {
if (moisture < moistureThreshold) {
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(STATUS_LED, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(STATUS_LED, LOW);
}
if (nutrient < nutrientThreshold) {
digitalWrite(FERT_LED, HIGH);
} else {
digitalWrite(FERT_LED, LOW);
}
} else {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(FERT_LED, LOW);
}
// ThingSpeak
if (client.connect(server, 80)) {
String url = "/update?api_key=" + apiKey;
url += "&field1=" + String(moisture);
url += "&field2=" + String(nutrient);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"Connection: close\r\n\r\n");
client.stop();
}
delay(15000);
}