#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BUTTON_ONOFF 26
#define BUTTON_MODE 25
#define BUTTON_DECREMENT 32
#define BUTTON_INCREMENT 33
#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 // slide potentiometer
#define SOIL_SENSOR2 14 // slide potentiometer
#define TRIG_PIN 5
#define ECHO_PIN 18
LiquidCrystal_I2C lcd(0x27, 16, 2);
int displayMode = 0;
bool systemOn = false;
int soilMoistureThreshold = 100;
int waterLvlThreshold = 20;
int flowThreshold = 10;
int soilMoisture1 = 0, soilMoisture2 = 0;
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_MODE, INPUT_PULLUP);
pinMode(BUTTON_DECREMENT, INPUT_PULLUP);
pinMode(BUTTON_INCREMENT, 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 = analogRead(SOIL_SENSOR1);
soilMoisture2 = analogRead(SOIL_SENSOR2);
flowRate = analogRead(FLOW_SENSOR); // Simulate flow sensor, adjust as needed
int distanceCM = measureWaterLvl();
waterlevel = calcWaterLevel(distanceCM);
}
String waterLvlStatus(int waterLevel) {
if (waterLevel <= 100) {
return "WARNING";
} else {
return "NORMAL";
}
}
String soilMoistureStatus(int soilMoisture) {
if (soilMoisture < soilMoistureThreshold) {
return "WARNING";
} else {
return "NORMAL";
}
}
String flowRateStatus(int flowRate) {
if (flowRate < flowThreshold) {
return "WARNING";
} else {
return "NORMAL";
}
}
void updateDisplay() {
lcd.clear();
switch (displayMode) {
case 0:
lcd.setCursor(0, 0);
lcd.print("Automated");
lcd.setCursor(0, 1);
lcd.print("Irrigation");
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("Soil 1: ");
lcd.print(soilMoisture1);
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print(soilMoistureStatus(soilMoisture1));
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Soil 2: ");
lcd.print(soilMoisture2);
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print(soilMoistureStatus(soilMoisture2));
break;
case 3:
lcd.setCursor(0, 0);
lcd.print("WaterLvl: ");
lcd.print(waterlevel);
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print(waterLvlStatus(waterlevel));
break;
case 4:
lcd.setCursor(0, 0);
lcd.print("Flow: ");
lcd.print(flowRate);
lcd.setCursor(0, 1);
lcd.print("Flow: ");
lcd.print(flowRateStatus(flowRate));
break;
/*case 5:
lcd.setCursor(0, 0);
lcd.print("Thresholds:");
lcd.setCursor(0, 1);
lcd.print("Soil 1: ");
lcd.print(soilMoistureThreshold);
lcd.print("WaterLvl: ");
lcd.print(waterLvlThreshold);
break;*/
}
}
void handleWarnings() {
if (waterlevel < waterLvlThreshold || flowRate < flowThreshold) {
digitalWrite(LED_ALERT, HIGH);
} else {
digitalWrite(LED_ALERT, LOW);
}
}
void controlActuators() {
if (soilMoisture1 < soilMoistureThreshold) {
digitalWrite(LED_PUMP, HIGH);
digitalWrite(LED_VALVE1, HIGH);
} else {
digitalWrite(LED_VALVE1, LOW);
}
if (soilMoisture2 < soilMoistureThreshold) {
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_MODE) == LOW) {
delay(200);
displayMode = (displayMode + 1) % 4;
}
if (digitalRead(BUTTON_DECREMENT) == LOW) {
delay(200);
soilMoistureThreshold = max(0, soilMoistureThreshold - 10);
waterLvlThreshold = max(0, waterLvlThreshold - 1);
}
if (digitalRead(BUTTON_INCREMENT) == LOW) {
delay(200);
soilMoistureThreshold += 1;
waterLvlThreshold += 10;
}
}
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);
}