Cirkit Designer Logo
Cirkit Designer
Your all-in-one circuit design IDE
Home / 
Project Documentation

ESP32-Based Aquaponics Monitoring System with Multi-Parameter Sensors and Relay Control

Image of ESP32-Based Aquaponics Monitoring System with Multi-Parameter Sensors and Relay Control

Circuit Documentation

Summary

The circuit in question is designed to monitor and control an aquaponics system. It includes sensors for measuring temperature, humidity, pH, total dissolved solids (TDS), and dissolved oxygen (DO). An Arduino Nano ESP32 microcontroller serves as the central processing unit, interfacing with the various sensors and controlling a relay that can switch a water pump on or off based on the water temperature.

Component List

AHT10 - Humidity and Temperature Sensor

  • Description: A sensor used to measure air temperature and humidity.
  • Pins: Vcc, Gnd, SCL, SDA

Buck Converter

  • Description: A device that steps down voltage from the battery to a lower voltage.
  • Pins: IN+, IN-, OUT+, OUT-

Lipo Battery 2200mAh 30C

  • Description: A rechargeable battery that provides power to the circuit.
  • Pins: VCC, GND

1-Channel Relay (5V 10A)

  • Description: An electromechanical switch used to control the water pump.
  • Pins: NC, Signal, C, Power, NO, Ground

PH Meter

  • Description: A sensor used to measure the pH level of the water.
  • Pins: Signal, VCC, GND

Water Pump

  • Description: A pump used to circulate water in the aquaponics system.
  • Pins: Positive, Negative

Arduino Nano ESP32

  • Description: A microcontroller board based on the ESP32. It is the brain of the circuit, reading sensor data and controlling the relay.
  • Pins: D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, GND, RST, RX0, TX1, D13, 3.3V, B0, A0, A1, A2, A3, A4, A5, A6, A7, VBUS, B1, VIN

TDS Sensor

  • Description: A sensor used to measure the total dissolved solids in the water.
  • Pins: AI, GND, 5V

Temperature Sensor

  • Description: A sensor used to measure the water temperature.
  • Pins: Temp GND Black, Temp VDD Red, Temp DQ Data Yellow

DO Sensor

  • Description: A sensor used to measure the dissolved oxygen in the water.
  • Pins: Vcc, Gnd, Out

Wiring Details

AHT10 - Humidity and Temperature Sensor

  • Vcc connected to the positive voltage rail.
  • Gnd connected to the ground rail.
  • SCL connected to Arduino Nano ESP32 A5.
  • SDA connected to Arduino Nano ESP32 A4.

Buck Converter

  • IN+ connected to Lipo Battery VCC.
  • IN- connected to Lipo Battery GND and Water Pump Negative.
  • OUT+ connected to the positive voltage rail.
  • OUT- connected to the ground rail.

1-Channel Relay (5V 10A)

  • NC not connected in this configuration.
  • Signal connected to Arduino Nano ESP32 D8.
  • C connected to Lipo Battery VCC.
  • Power connected to the positive voltage rail.
  • NO connected to Water Pump Positive.
  • Ground connected to the ground rail.

PH Meter

  • Signal connected to Arduino Nano ESP32 A3.
  • VCC connected to the positive voltage rail.
  • GND connected to the ground rail.

Water Pump

  • Positive connected to Relay NO.
  • Negative connected to Buck Converter IN-.

TDS Sensor

  • AI connected to Arduino Nano ESP32 A0.
  • GND connected to the ground rail.
  • 5V connected to the positive voltage rail.

Temperature Sensor

  • Temp GND Black connected to the ground rail.
  • Temp VDD Red connected to the positive voltage rail.
  • Temp DQ Data Yellow connected to Arduino Nano ESP32 D5.

DO Sensor

  • Vcc connected to the positive voltage rail.
  • Gnd connected to the ground rail.
  • Out connected to Arduino Nano ESP32 A1.

Documented Code

#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <AHT10.h>
#include <DFRobot_ESP_PH.h>
#include <DFRobot_DO.h> // Added dissolved oxygen sensor library

// Pin Definitions
#define TDS_SENSOR_PIN A0
#define PH_SENSOR_PIN A3
#define DS18B20_PIN 5
#define RELAY_PIN 8
#define ONE_WIRE_BUS DS18B20_PIN
#define DO_SENSOR_PIN A1 // Added pin for dissolved oxygen sensor
#define SCL_PIN A5 // Typical SCL pin for I2C
#define SDA_PIN A4 // Typical SDA pin for I2C

// Sensor Objects
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature tempSensor(&oneWire);
AHT10 aht10;
DFRobot_ESP_PH ph;
DFRobot_DO do_sensor; // Dissolved oxygen sensor object
float tdsSensorValue = 0;
float phValue = 0;
float doValue = 0; // Dissolved oxygen value

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

    // Initialize I2C with specific SCL and SDA pins
    Wire.begin(SDA_PIN, SCL_PIN);

    // Initialize Sensors
    tempSensor.begin();

    // AHT10 Initialization
    if (!aht10.begin())
    {
        Serial.println("AHT10 not found. Check wiring!");
    }

    // PH Sensor Initialization
    ph.begin();

    // Dissolved Oxygen Sensor Initialization
    do_sensor.begin();

    // Relay Setup
    pinMode(RELAY_PIN, OUTPUT);
    digitalWrite(RELAY_PIN, LOW);
}

void loop()
{
    // Read Temperature Sensors
    tempSensor.requestTemperatures();
    float waterTemp = tempSensor.getTempCByIndex(0);

    // Read AHT10 (Humidity and Air Temperature)
    float humidity = aht10.readHumidity();
    float airTemp = aht10.readTemperature();

    // Read TDS Sensor
    tdsSensorValue = readTDSSensor();

    // Read PH Sensor
    phValue = readPHSensor();

    // Read Dissolved Oxygen Sensor
    doValue = readDOSensor(waterTemp);

    // Print Sensor Readings
    Serial.println("--- Aquaponics Sensor Readings ---");
    Serial.print("Water Temperature: ");
    Serial.print(waterTemp);
    Serial.println(" °C");

    Serial.print("Air Temperature: ");
    Serial.print(airTemp);
    Serial.println(" °C");

    Serial.print("Humidity: ");
    Serial.print(humidity);
    Serial.println(" %");

    Serial.print("TDS Value: ");
    Serial.print(tdsSensorValue);
    Serial.println(" ppm");

    Serial.print("PH Value: ");
    Serial.print(phValue);
    Serial.println("");

    Serial.print("Dissolved Oxygen: ");
    Serial.print(doValue);
    Serial.println(" mg/L");

    // Control Relay (example: turn on if water temp is below 20°C)
    if (waterTemp < 20.0)
    {
        digitalWrite(RELAY_PIN, HIGH);
    }
    else
    {
        digitalWrite(RELAY_PIN, LOW);
    }

    delay(5000); // Read sensors every 5 seconds
}

float readTDSSensor()
{
    int sensorValue = analogRead(TDS_SENSOR_PIN);
    float voltage = sensorValue * (3.3 / 4095.0);
    float tdsValue = (133.42 * voltage * voltage * voltage - 255.86 * voltage * voltage + 857.39 * voltage) * 0.5;
    return tdsValue;
}

float readPHSensor()
{
    static unsigned long samplingTime = millis();
    static unsigned long printTime = millis();
    static float pHValue, voltage;

    if (millis() - samplingTime > 20)
    {
        pHValue = ph.readPH(analogRead(PH_SENSOR_PIN), 25.0); // 25.0°C temperature compensation
        samplingTime = millis();
    }

    return pHValue;
}

float readDOSensor(float temperature)
{
    // Read dissolved oxygen sensor with temperature compensation
    float doValue = do_sensor.readDO(analogRead(DO_SENSOR_PIN), temperature);
    return doValue;
}

This code is designed to run on the Arduino Nano ESP32 microcontroller. It initializes the sensors, reads their values, and prints the readings to the serial monitor. It also controls a relay based on the water temperature, which can be used to turn a water pump on or off.