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.
#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.