#define DO_SENSOR_PIN 34 // Analog pin connected to DO sensor AOUT
#define RELAY_PIN 14 // Digital pin connected to air pump relay
// Calibration constants (adjust based on your sensor and calibration results)
#define VREF 3.3 // ESP32 ADC reference voltage
#define ADC_RESOLUTION 4095 // 12-bit ADC resolution
#define DO_SCALING_FACTOR 0.1 // Voltage-to-DO conversion factor (in mg/L per V)
// Thresholds for DO levels (adjust based on algae requirements)
#define DO_LOW_THRESHOLD 5.0 // Minimum DO level (mg/L)
#define DO_HIGH_THRESHOLD 8.0 // Maximum DO level (mg/L)
void setup() {
Serial.begin(115200); // Initialize serial communication
analogReadResolution(12); // Set ADC resolution to 12-bit
pinMode(RELAY_PIN, OUTPUT); // Set relay pin as output
digitalWrite(RELAY_PIN, LOW); // Ensure air pump is OFF initially
Serial.println("Dissolved Oxygen Sensor with Air Pump Control Initialized");
}
void loop() {
int adcValue = analogRead(DO_SENSOR_PIN); // Read raw ADC value
float sensorVoltage = adcValue * (VREF / ADC_RESOLUTION); // Convert to voltage
// Calculate dissolved oxygen in mg/L
float dissolvedOxygen = calculateDissolvedOxygen(sensorVoltage);
// Print sensor readings
Serial.print("Sensor Voltage: ");
Serial.print(sensorVoltage);
Serial.print(" V | Dissolved Oxygen: ");
Serial.print(dissolvedOxygen);
Serial.println(" mg/L");
// Control air pump based on DO levels
controlAirPump(dissolvedOxygen);
delay(2000); // Adjust delay as needed
}
// Function to calculate dissolved oxygen from voltage
float calculateDissolvedOxygen(float voltage) {
return voltage / DO_SCALING_FACTOR; // Adjust scaling factor based on calibration
}
// Function to control the air pump based on DO levels
void controlAirPump(float doLevel) {
if (doLevel < DO_LOW_THRESHOLD) {
digitalWrite(RELAY_PIN, HIGH); // Turn ON air pump
Serial.println("Air Pump ON: Increasing DO Levels...");
} else if (doLevel > DO_HIGH_THRESHOLD) {
digitalWrite(RELAY_PIN, LOW); // Turn OFF air pump
Serial.println("Air Pump OFF: DO Levels Sufficient.");
}
}