Arduino Nano ESP32-Based Aquaponics Monitoring System with Battery Power
View and Edit Project In Cirkit Designer
Circuit Documentation
Summary
This document provides a detailed overview of an aquaponics monitoring and control system. The system utilizes various sensors to monitor water quality parameters such as temperature, pH, Total Dissolved Solids (TDS), and Dissolved Oxygen (DO). An Arduino Nano ESP32 microcontroller processes the sensor data and controls a water pump via a relay based on the water temperature.
Component List
AHT10
- Description: Temperature and Humidity Sensor
- Pins: Vcc, Gnd, SCL, SDA
Buck Converter
- Description: DC-DC Step-Down Converter
- Pins: IN+, IN-, OUT+, OUT-
LiPo Battery 2200mAH 30C
- Description: Rechargeable Lithium Polymer Battery
- Pins: VCC, GND
1-Channel Relay (5V 10A)
- Description: Relay Module for Switching High Power Devices
- Pins: NC, signal, C, power, NO, ground
PH Meter
- Description: pH Sensor for Measuring Acidity/Alkalinity
- Pins: Signal, VCC, GND
Water Pump
- Description: Pump for Water Circulation
- Pins: positive, negative
TDS Sensor
- Description: Total Dissolved Solids Sensor
- Pins: AI, GND, 5V
Temperature Sensor
- Description: DS18B20 Temperature Sensor
- Pins: Temp GND Black, Temp VDD Red, Temp DQ Data Yellow
DO Sensor
- Description: Dissolved Oxygen Sensor
- Pins: Vcc, Gnd, Out
Arduino Nano ESP32
- Description: Microcontroller for Processing Sensor Data and Controlling Actuators
- 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
Wiring Details
AHT10
- Vcc: Connected to OUT+ of Buck Converter
- Gnd: Connected to OUT- of Buck Converter
- SCL: Connected to A5 of Arduino Nano ESP32
- SDA: Connected to A4 of Arduino Nano ESP32
Buck Converter
- IN+: Connected to VCC of LiPo Battery
- IN-: Connected to GND of LiPo Battery
- OUT+: Connected to Vcc of AHT10, Vcc of DO Sensor, VCC of PH Meter, 5V of TDS Sensor, Temp VDD Red of Temperature Sensor, and power of 1-Channel Relay
- OUT-: Connected to Gnd of AHT10, Gnd of DO Sensor, GND of PH Meter, GND of TDS Sensor, Temp GND Black of Temperature Sensor, and ground of 1-Channel Relay
LiPo Battery 2200mAH 30C
- VCC: Connected to IN+ of Buck Converter and C of 1-Channel Relay
- GND: Connected to IN- of Buck Converter and ground of 1-Channel Relay
1-Channel Relay (5V 10A)
- NC: Not Connected
- signal: Connected to D8 of Arduino Nano ESP32
- C: Connected to VCC of LiPo Battery
- power: Connected to OUT+ of Buck Converter
- NO: Connected to positive of Water Pump
- ground: Connected to negative of Water Pump, IN- of Buck Converter, and GND of LiPo Battery
PH Meter
- Signal: Connected to A3 of Arduino Nano ESP32
- VCC: Connected to OUT+ of Buck Converter
- GND: Connected to OUT- of Buck Converter
Water Pump
- positive: Connected to NO of 1-Channel Relay
- negative: Connected to ground of 1-Channel Relay
TDS Sensor
- AI: Connected to A0 of Arduino Nano ESP32
- GND: Connected to OUT- of Buck Converter
- 5V: Connected to OUT+ of Buck Converter
Temperature Sensor
- Temp GND Black: Connected to OUT- of Buck Converter
- Temp VDD Red: Connected to OUT+ of Buck Converter
- Temp DQ Data Yellow: Connected to D5 of Arduino Nano ESP32
DO Sensor
- Vcc: Connected to OUT+ of Buck Converter
- Gnd: Connected to OUT- of Buck Converter
- Out: Connected to A1 of Arduino Nano ESP32
Arduino Nano ESP32
- D8: Connected to signal of 1-Channel Relay
- D5: Connected to Temp DQ Data Yellow of Temperature Sensor
- A0: Connected to AI of TDS Sensor
- A1: Connected to Out of DO Sensor
- A3: Connected to Signal of PH Meter
- A4: Connected to SDA of AHT10
- A5: Connected to SCL of AHT10
Code Documentation
#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