Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

ESP32-Based Environmental Monitoring and Water Management System

View and Edit Project In Cirkit DesignerImage of ESP32-Based Environmental Monitoring and Water Management System

Circuit Documentation

Summary

The circuit is designed to monitor and control various environmental parameters for an application such as a greenhouse or aquarium. It includes sensors for measuring temperature, humidity, light intensity, water level, pH, and total dissolved solids (TDS). Actuators in the circuit include relays for controlling lights, a fan, water pumps, and solenoid valves. The central control unit is an ESP32 microcontroller, which processes sensor data and manages the actuators accordingly.

Component List

Wiring Details

DHT22

PH Meter

BH1750

HC-SR04 Ultrasonic Sensor

TDS Sensor

Water Pump

1-Channel Relay (5V 10A)

Green Light 220VAC

220V Fan

Plastic Solenoid Valve

AC Supply

HLK-PM12

6 Relays Module

Documented Code

#include "DHT.h"
#include <Wire.h>
#include <BH1750.h>

// DHT22 Sensor
#define DHTPIN 4       // Pin where the DHT22 is connected (GPIO 4)
#define DHTTYPE DHT22  // DHT22 sensor type
DHT dht(DHTPIN, DHTTYPE);

// Light Intensity Sensor
BH1750 lightMeter;
#define LIGHT_RELAY 17 // Relay pin for light bulbs

// Water Level Sensor
#define TRIGPIN 27     // Ultrasonic sensor trigger pin
#define ECHOPIN 12     // Ultrasonic sensor echo pin
#define WATER_RELAY 18 // Relay pin for water level

// pH Sensor
#define PH_PIN 34      // Analog pin for pH sensor
#define PH_RELAY 13    // Relay pin for pH control

// TDS Sensor
#define TDS_PIN 32     // Analog pin for TDS sensor
#define TDS_RELAY_1 25 // Relay pin for solenoid valve 1
#define TDS_RELAY_2 26 // Relay pin for solenoid valve 2

// Main Water Pump
#define PUMP_RELAY 14  // Relay pin for main water pump

// Temperature and Humidity Thresholds
float tempThreshold = 30.0;        // Temperature threshold for fan
float humidityThreshold = 40.0;    // Humidity threshold for misters

// Light Intensity Threshold
float lightThreshold = 200.0;      // Light intensity threshold (lux)

// Water Level Threshold
const float WATER_LEVEL_THRESHOLD = 300.0;  // Water level threshold (mm)

// pH Threshold
const float PH_THRESHOLD = 6.5;    // pH threshold value

// TDS Threshold
const int thresholdTDS = 300;      // TDS threshold value

// Main Pump Timing
unsigned long previousMillis = 0;
const long onInterval = 2000;      // Pump ON time (ms)
const long offInterval = 3000;     // Pump OFF time (ms)
bool pumpState = false;            // Main pump state

void setup() {
  Serial.begin(115200);

  // Initialize DHT22
  dht.begin();

  // Initialize Light Sensor
  Wire.begin();
  lightMeter.begin();

  // Relay Pins Setup
  pinMode(LIGHT_RELAY, OUTPUT);
  pinMode(WATER_RELAY, OUTPUT);
  pinMode(PH_RELAY, OUTPUT);
  pinMode(TDS_RELAY_1, OUTPUT);
  pinMode(TDS_RELAY_2, OUTPUT);
  pinMode(PUMP_RELAY, OUTPUT);

  // Set relays to OFF (assume active LOW relays)
  digitalWrite(LIGHT_RELAY, HIGH);
  digitalWrite(WATER_RELAY, HIGH);
  digitalWrite(PH_RELAY, HIGH);
  digitalWrite(TDS_RELAY_1, HIGH);
  digitalWrite(TDS_RELAY_2, HIGH);
  digitalWrite(PUMP_RELAY, HIGH);

  // Water Level Sensor Pins
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
}

void loop() {
  // --- DHT22 Sensor ---
  float temp = dht.readTemperature();
  float humidity = dht.readHumidity();

  if (!isnan(temp) && !isnan(humidity)) {
    Serial.print("Temperature: ");
    Serial.println(temp);
    Serial.print("Humidity: ");
    Serial.println(humidity);

    // Fan control based on temperature
    if (temp > tempThreshold) {
      Serial.println("Fan ON");
      digitalWrite(PUMP_RELAY, LOW); // Fan ON (active low)
    } else {
      Serial.println("Fan OFF");
      digitalWrite(PUMP_RELAY, HIGH); // Fan OFF
    }

    // Misters control based on humidity
    if (humidity < humidityThreshold) {
      Serial.println("Misters ON");
      digitalWrite(PUMP_RELAY, LOW); // Misters ON (active low)
    } else {
      Serial.println("Misters OFF");
      digitalWrite(PUMP_RELAY, HIGH); // Misters OFF
    }
  }

  // --- Light Intensity Sensor ---
  float lux = lightMeter.readLightLevel();
  Serial.print("Light Intensity: ");
  Serial.println(lux);

  if (lux < lightThreshold) {
    Serial.println("LED Bulbs ON");
    digitalWrite(LIGHT_RELAY, LOW); // Turn on LED bulbs
  } else {
    Serial.println("LED Bulbs OFF");
    digitalWrite(LIGHT_RELAY, HIGH); // Turn off LED bulbs
  }

  // --- Water Level Sensor ---
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(30);
  digitalWrite(TRIGPIN, LOW);

  long duration = pulseIn(ECHOPIN, HIGH);
  float distance = (duration / 2.0) * 0.343;
  
  Serial.print("Water Level Distance: ");
  Serial.println(distance);

  if (distance > WATER_LEVEL_THRESHOLD) {
    Serial.println("Water Level Low: Solenoid ON");
    digitalWrite(WATER_RELAY, LOW