#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Constants and Pin Definitions
#define DHTTYPE DHT22 // Define DHT type
#define TRIG_PIN 10 // Ultrasonic sensor trigger pin
#define ECHO_PIN 11 // Ultrasonic sensor echo pin
#define SERVO_PIN 9 // Servo motor control pin
#define NUM_SENSORS 4 // Number of DHT22 sensors
#define DISTANCE_OFFSET 50.0 // Offset for waterway depth in cm
#define WATERWAY_WIDTH 50.0 // Waterway width in cm
#define VELOCITY 100.0 // Waterway flow velocity in cm/s (1 m/s)
// DHT sensor pins and objects
const int dhtPins[NUM_SENSORS] = {2, 3, 4, 5};
DHT dht[NUM_SENSORS] = {
DHT(dhtPins[0], DHTTYPE),
DHT(dhtPins[1], DHTTYPE),
DHT(dhtPins[2], DHTTYPE),
DHT(dhtPins[3], DHTTYPE)
};
// LCD and Servo
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD with I2C address 0x27
Servo myServo;
void setup() {
Serial.begin(9600);
// Initialize the LCD with 20 columns and 4 rows
lcd.begin(20, 4);
lcd.backlight();
// Initialize DHT sensors
for (int i = 0; i < NUM_SENSORS; i++) {
dht[i].begin();
}
// Set up ultrasonic sensor pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Attach servo motor
myServo.attach(SERVO_PIN);
// Display welcome message on LCD
lcd.print("Irrigation System");
delay(2000);
lcd.clear();
}
void loop() {
// Calculate average humidity and temperature
float avgHumidity = calculateAverageHumidity();
float avgTemp = calculateAverageTemperature();
// Calculate water elevation and discharge
float waterElevation = calculateWaterElevation();
float dischargeQ = calculateWaterDischarge(waterElevation);
// Display data on LCD
displayData(avgHumidity, avgTemp, dischargeQ);
// Control servo based on average humidity
controlServo(avgHumidity);
// Delay between loop iterations
delay(2000);
}
// Function to calculate average humidity from DHT22 sensors
float calculateAverageHumidity() {
float humiditySum = 0.0;
int validReadings = 0;
for (int i = 0; i < NUM_SENSORS; i++) {
float h = dht[i].readHumidity();
if (!isnan(h)) { // Only add valid readings
humiditySum += h;
validReadings++;
}
}
return (validReadings > 0) ? (humiditySum / validReadings) : 0;
}
// Function to calculate average temperature from DHT22 sensors
float calculateAverageTemperature() {
float tempSum = 0.0;
int validReadings = 0;
for (int i = 0; i < NUM_SENSORS; i++) {
float t = dht[i].readTemperature();
if (!isnan(t)) { // Only add valid readings
tempSum += t;
validReadings++;
}
}
return (validReadings > 0) ? (tempSum / validReadings) : 0;
}
// Function to measure distance using HC-SR04 ultrasonic sensor
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2; // Convert to cm
return distance;
}
// Function to calculate water elevation based on distance measurement
float calculateWaterElevation() {
float distance = getDistance();
return DISTANCE_OFFSET - distance; // Water elevation in cm
}
// Function to calculate water discharge (Q) in liters per second
float calculateWaterDischarge(float elevation) {
float crossSectionArea = elevation * WATERWAY_WIDTH; // Area in cm^2
return (crossSectionArea * VELOCITY) / 1000; // Convert to liters per second
}
// Function to display data on LCD
void displayData(float humidity, float temperature, float discharge) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Humidity: ");
lcd.print(humidity, 1);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature, 1);
lcd.print(" C");
lcd.setCursor(0, 2);
lcd.print("Water Q: ");
lcd.print(discharge, 1);
lcd.print(" lt/s");
}
// Function to control servo position based on humidity
void controlServo(float humidity) {
if (humidity < 70) {
myServo.write(90); // Open position
} else {
myServo.write(0); // Close position
}
}