#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Initialize LCD objects with I2C addresses and screen sizes
LiquidCrystal_I2C lcd1(0x25,16,4);
LiquidCrystal_I2C lcd2(0x26,16,4);
LiquidCrystal_I2C lcd3(0x27,16,4);
// Pin definitions
int soilMoisture1_Pin = A0;
int soilMoisture2_Pin = A1;
int soilMoisture3_Pin = A2;
int valveRelay1_Pin = 13;
int valveRelay2_Pin = 12;
int valveRelay3_Pin = 11;
int motorRelay_Pin = 10;
// Moisture level thresholds % (adjusted for each sensor)
int dryThreshold1 = 50;
int dryThreshold2 = 50;
int dryThreshold3 = 50;
// Defined soil moisture initial value
int soilMoisturelvl1 = 0;
int soilMoisturelvl2 = 0;
int soilMoisturelvl3 = 0;
void setup() {
// put your setup code here, to run once:
// Set pin modes
pinMode(soilMoisture1_Pin, INPUT);
pinMode(soilMoisture2_Pin, INPUT);
pinMode(soilMoisture3_Pin, INPUT);
pinMode(valveRelay1_Pin, OUTPUT);
pinMode(valveRelay2_Pin, OUTPUT);
pinMode(valveRelay3_Pin, OUTPUT);
pinMode(motorRelay_Pin, OUTPUT);
// Initialize relays as off
digitalWrite(valveRelay1_Pin, HIGH);
digitalWrite(valveRelay2_Pin, HIGH);
digitalWrite(valveRelay3_Pin, HIGH);
digitalWrite(motorRelay_Pin, HIGH);
lcd1.init();
lcd1.backlight();
lcd2.init();
lcd2.backlight();
lcd3.init();
lcd3.backlight();
Serial.begin(9600);;
}
// Function to map sensor value to percentage (0 to 1023 -> 30% to 80%)
int mapToMoisturePercentage(int sensorValue) {
return map(sensorValue, 1023, 0, 0, 100); // 1023 (dry) -> 30%, 0 (wet) -> 80%
}
void loop() {
// put your main code here, to run repeatedly:
soilMoisturelvl1 = analogRead(soilMoisture1_Pin);
soilMoisturelvl2 = analogRead(soilMoisture2_Pin);
soilMoisturelvl3 = analogRead(soilMoisture3_Pin);
// Debugging: Print values to Serial Monitor
Serial.print("Soil Moisture 1: ");
Serial.println(soilMoisturelvl1);
Serial.print("Soil Moisture 2: ");
Serial.println(soilMoisturelvl2);
Serial.print("Soil Moisture 3: ");
Serial.println(soilMoisturelvl3);
// Map sensor values to percentage
int soilmoisturePercent1 = mapToMoisturePercentage(soilMoisturelvl1);
int soilmoisturePercent2 = mapToMoisturePercentage(soilMoisturelvl2);
int soilmoisturePercent3 = mapToMoisturePercentage(soilMoisturelvl3);
// Display readings on LCDs
lcd1.clear();
lcd1.setCursor(0,0);
lcd1.print("Soil Moisture 1: ");
lcd1.setCursor(0,1);
lcd1.print(soilmoisturePercent1);
lcd1.print("%");
lcd2.clear();
lcd2.setCursor(0,0);
lcd2.print("Soil Moisture 2: ");
lcd2.setCursor(0,1);
lcd2.print(soilmoisturePercent2);
lcd1.print("%");
lcd3.clear();
lcd3.setCursor(0,0);
lcd3.print("Soil Moisture 3: ");
lcd3.setCursor(0,1);
lcd3.print(soilmoisturePercent3);
lcd1.print("%");
// Control water valves and pump based on soil moisture readings
if (soilmoisturePercent1 > dryThreshold1) {
digitalWrite(valveRelay1_Pin, LOW); // Open valve 1
} else {
digitalWrite(valveRelay1_Pin, HIGH); // Close valve 1
}
if (soilmoisturePercent2 > dryThreshold2) {
digitalWrite(valveRelay2_Pin, LOW); // Open valve 2
} else {
digitalWrite(valveRelay2_Pin, HIGH); // Close valve 2
}
if (soilmoisturePercent3 > dryThreshold3) {
digitalWrite(valveRelay3_Pin, LOW); // Open valve 3
} else {
digitalWrite(valveRelay3_Pin, HIGH); // Close valve 3
}
// Control water pump
if (soilmoisturePercent1 > dryThreshold1 || soilmoisturePercent2 > dryThreshold2 || soilmoisturePercent3 > dryThreshold3) {
digitalWrite(motorRelay_Pin, LOW); // Turn on water pump
} else {
digitalWrite(motorRelay_Pin, HIGH); // Turn off water pump
}
delay(2000); // Wait for 2 seconds before taking another reading
}