#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BUTTON_ONOFF 26
#define BUTTON_DISPLAYMODE 25
#define LED_SYSTEM_FAULT 4
#define LED_SYSTEM_ON 16
#define LED_ALERT 17
#define LED_PUMP 0 // water pump
#define LED_VALVE1 2 // solenoid valve 1
#define LED_VALVE2 15 // solenoid valve 2
#define FLOW_SENSOR 12 // potentiometer
#define SOIL_SENSOR1 27 // push button for Moisture1
#define SOIL_SENSOR2 14 // push button for Moisture2
#define TRIG_PIN 5
#define ECHO_PIN 18
LiquidCrystal_I2C lcd(0x27, 16, 2);
int displayMode = 0;
bool systemOn = false;
int waterLvlThreshold = 20;
int flowThreshold = 10;
int soilMoisture1 = 1, soilMoisture2 = 1; // Default to 1 (normal)
int waterlevel = 0, flowRate = 0;
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.clear();
setupPins();
}
void setupPins() {
pinMode(BUTTON_ONOFF, INPUT_PULLUP);
pinMode(BUTTON_DISPLAYMODE, INPUT_PULLUP);
pinMode(LED_SYSTEM_FAULT, OUTPUT);
pinMode(LED_SYSTEM_ON, OUTPUT);
pinMode(LED_ALERT, OUTPUT);
pinMode(LED_PUMP, OUTPUT);
pinMode(LED_VALVE1, OUTPUT);
pinMode(LED_VALVE2, OUTPUT);
pinMode(FLOW_SENSOR, INPUT);
pinMode(SOIL_SENSOR1, INPUT);
pinMode(SOIL_SENSOR2, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(LED_PUMP, LOW);
digitalWrite(LED_VALVE1, LOW);
digitalWrite(LED_VALVE2, LOW);
}
int measureWaterLvl() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.0343 / 2;
}
int calcWaterLevel(int distanceCM) {
return distanceCM;
}
void readSensors() {
soilMoisture1 = digitalRead(SOIL_SENSOR1);
soilMoisture2 = digitalRead(SOIL_SENSOR2);
flowRate = analogRead(FLOW_SENSOR); // Simulate flow sensor, adjust as needed
int distanceCM = measureWaterLvl();
waterlevel = calcWaterLevel(distanceCM);
}
String waterLvlStatus(int waterLevel) {
return (waterLevel <= waterLvlThreshold) ? "WARNING" : "NORMAL";
}
String soilMoistureStatus1(int soilMoist1) {
return (soilMoist1 == 0) ? "DRY" : "MOIST";
}
String soilMoistureStatus2(int soilMoist2) {
return (soilMoist2 == 0) ? "DRY" : "MOIST";
}
String flowRateStatus(int flowRate) {
return (flowRate < flowThreshold) ? "WARNING" : "NORMAL";
}
void updateDisplay() {
lcd.clear();
switch (displayMode) {
case 0:
lcd.setCursor(1, 0);
lcd.print("Automated");
lcd.setCursor(1, 1);
lcd.print("Irrigation");
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("Soil1: ");
//lcd.setCursor(11, 0);
lcd.print(soilMoistureStatus1(soilMoisture1));
lcd.setCursor(0, 1);
lcd.print("Soil2: ");
//lcd.setCursor(11, 1);
lcd.print(soilMoistureStatus2(soilMoisture2));
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("WaterLvl: ");
lcd.print(waterlevel);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print(waterLvlStatus(waterlevel));
break;
case 3:
lcd.setCursor(0, 0);
lcd.print("FlowRate:");
lcd.print(flowRate);
lcd.print("L/min");
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print(flowRateStatus(flowRate));
break;
}
}
void handleWarnings() {
if (waterlevel < waterLvlThreshold || flowRate < flowThreshold) {
digitalWrite(LED_ALERT, HIGH);
} else {
digitalWrite(LED_ALERT, LOW);
}
}
void controlActuators() {
if (soilMoisture1 == 0) {
digitalWrite(LED_PUMP, HIGH);
digitalWrite(LED_VALVE1, HIGH);
} else {
digitalWrite(LED_VALVE1, LOW);
}
if (soilMoisture2 == 0) {
digitalWrite(LED_PUMP, HIGH);
digitalWrite(LED_VALVE2, HIGH);
} else {
digitalWrite(LED_VALVE2, LOW);
}
if (digitalRead(LED_VALVE1) == LOW && digitalRead(LED_VALVE2) == LOW) {
digitalWrite(LED_PUMP, LOW);
}
}
void handleButtons() {
if (digitalRead(BUTTON_ONOFF) == LOW) {
delay(200);
systemOn = !systemOn;
}
if (digitalRead(BUTTON_DISPLAYMODE) == LOW) {
delay(200);
displayMode = (displayMode + 1) % 4; // Cycle through display modes
}
}
void loop() {
handleButtons();
if (systemOn) {
digitalWrite(LED_SYSTEM_ON, HIGH);
readSensors();
updateDisplay();
handleWarnings();
controlActuators();
} else {
digitalWrite(LED_SYSTEM_ON, LOW);
digitalWrite(LED_ALERT, LOW);
digitalWrite(LED_PUMP, LOW);
digitalWrite(LED_VALVE1, LOW);
digitalWrite(LED_VALVE2, LOW);
}
delay(500);
}