// Include necessary libraries
#include <NewPing.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Define constants
const int TRIGGER_PIN = 2;
// Ultrasonic sensor trigger pin
const int ECHO_PIN = 3;
// Ultrasonic sensor echo pin
const int SOLENOID_PIN = 4;
// Solenoid valve control pin
const int HEATER_PIN = 5;
// Heater control pin
const int MIN_LEVEL = 5;
// Minimum water level in liters
const int MAX_LEVEL = 15;
// Maximum water level in liters
const int MAX_TEMPERATURE = 39;
// Maximum temperature in degrees Celsius
// Create instances of the libraries
NewPing sonar(TRIGGER_PIN, ECHO_PIN);
OneWire oneWire(6);
// Temperature sensor on pin 6
DallasTemperature temperatureSensor(&oneWire);
void setup() {
pinMode(SOLENOID_PIN, OUTPUT);
digitalWrite(SOLENOID_PIN, HIGH);
// Close the solenoid valve initially
pinMode(HEATER_PIN, OUTPUT);
digitalWrite(HEATER_PIN, LOW);
// Turn off the heater initially
Serial.begin(9600);
temperatureSensor.begin();
}
void loop() {
delay(500); // Add a small delay between readings for stability
// Get distance from the ultrasonic sensor in centimeters
unsigned int distance = sonar.ping_cm();
// Calculate water level in liters based on the distance
float waterLevel = calculateWaterLevel(distance);
// Read temperature from the sensor in degrees Celsius
temperatureSensor.requestTemperatures();
float temperature = temperatureSensor.getTempCByIndex(0);
Serial.print("Water Level: ");
Serial.print(waterLevel);
Serial.print(" liters Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
// Check water level and temperature to make decisions
if (waterLevel <= MIN_LEVEL) {
digitalWrite(SOLENOID_PIN, LOW);
// Open solenoid valve
}
if (waterLevel >= MAX_LEVEL) {
digitalWrite(SOLENOID_PIN, HIGH);
// Close solenoid valve
}
if (waterLevel >= MIN_LEVEL && temperature < MAX_TEMPERATURE) {
digitalWrite(HEATER_PIN, HIGH);
// Turn on heater
} else {
digitalWrite(HEATER_PIN, LOW);
// Turn off heater
}
}
// Function to calculate water level based on distance
float calculateWaterLevel(unsigned int distance) {
// Your formula to convert distance to water level in liters
// Adjust this formula based on the characteristics of your tank and sensor
// For example: waterLevel = maxLevel - (maxLevel - minLevel) * (distance / maxDistance)
return distance;
// Replace with the actual formula
}