// Smart Greenhouse (simulation) - ESP32 + DHT22 + Soil (pot) + LDR + Relays
#include "DHTesp.h"
#include <WiFi.h> // optional for cloud lines (comment out if not used)
DHTesp dht;
// Pin definitions (match your Wokwi wiring)
const int DHT_PIN = 15; // digital pin -> DHT22 data
const int SOIL_PIN = 34; // analog pin -> potentiometer (soil)
const int LDR_DIG_PIN = 32; // digital output from photoresistor module (DO)
const int RELAY_PUMP = 18;
const int RELAY_FAN = 19;
const int RELAY_LIGHT= 21;
// Thresholds (tweak while testing)
const float TEMP_HIGH_C = 30.0; // °C threshold to start fan
const int SOIL_DRY_THRESHOLD = 2000; // ADC raw (0..4095) -> dry when > this (tune)
// lower raw = wetter depending on sensor wiring
void setup() {
Serial.begin(115200);
dht.setup(DHT_PIN, DHTesp::DHT22);
pinMode(RELAY_PUMP, OUTPUT);
pinMode(RELAY_FAN, OUTPUT);
pinMode(RELAY_LIGHT, OUTPUT);
pinMode(LDR_DIG_PIN, INPUT);
// Relays: assume active HIGH to turn them on - change logic if your relay is active LOW
digitalWrite(RELAY_PUMP, LOW);
digitalWrite(RELAY_FAN, LOW);
digitalWrite(RELAY_LIGHT, LOW);
Serial.println("Smart Greenhouse Simulator (Wokwi) starting...");
}
unsigned long lastSend = 0;
const unsigned long READ_INTERVAL = 3000; // ms
void loop() {
if (millis() - lastSend < READ_INTERVAL) return;
lastSend = millis();
// Read DHT
TempAndHumidity data = dht.getTempAndHumidity();
float tempC = data.temperature;
float humidity = data.humidity;
// Read soil (ADC)
int soilRaw = analogRead(SOIL_PIN); // 0..4095 on ESP32
// Map raw to percentage (0 = dry, 100 = wet) adjust mapping to your sensor
int soilPct = map(soilRaw, 0, 4095, 100, 0); // invert if needed
// Read LDR digital (DO): 0 or 1 depending on threshold
int lightDigital = digitalRead(LDR_DIG_PIN);
// If DO is LOW when light is present (see part docs), adjust logic accordingly
bool isDark = (lightDigital == 1); // tune to match sensor behavior in your wiring
Serial.printf("Temp: %.2f C, Hum: %.2f%%, SoilRaw: %d (%d%%), LightDigital: %d\n",
tempC, humidity, soilRaw, soilPct, lightDigital);
// Control logic
// 1) Irrigation: if soil is dry -> turn on pump for a short interval
if (soilRaw > SOIL_DRY_THRESHOLD) { // raw high => dry (tune if opposite)
digitalWrite(RELAY_PUMP, HIGH);
Serial.println("Pump ON (soil dry)");
} else {
digitalWrite(RELAY_PUMP, LOW);
Serial.println("Pump OFF");
}
// 2) Fan: if temperature exceeds threshold
if (!isnan(tempC) && tempC > TEMP_HIGH_C) {
digitalWrite(RELAY_FAN, HIGH);
Serial.println("Fan ON (temp high)");
} else {
digitalWrite(RELAY_FAN, LOW);
Serial.println("Fan OFF");
}
// 3) Grow light: if dark -> turn on grow light
if (isDark) {
digitalWrite(RELAY_LIGHT, HIGH);
Serial.println("Grow light ON (dark)");
} else {
digitalWrite(RELAY_LIGHT, LOW);
Serial.println("Grow light OFF");
}
// Optional: send to cloud (ThingSpeak / Firebase) can be implemented here
}