#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Input (sensor)
#define LEVEL_PIN 34
#define PH_PIN 35
#define TURB_PIN 32
#define RAIN_PIN 33
// Output (actuator)
#define LED_G 13
#define LED_Y 12
#define LED_R 14
#define BUZZ 27
#define PUMP 26
#define VALVE 15
// Threshold
#define LEVEL_HIGH 3000
#define LEVEL_LOW 1000
#define PH_MIN 6.5
#define PH_MAX 8.5
#define TURB_HIGH 2500
#define RAIN_TH 2000
void setup() {
Serial.begin(115200);
lcd.init(); lcd.backlight();
lcd.print("Smart Water Sys");
pinMode(LEVEL_PIN, INPUT);
pinMode(PH_PIN, INPUT);
pinMode(TURB_PIN, INPUT);
pinMode(RAIN_PIN, INPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_Y, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(BUZZ, OUTPUT);
pinMode(PUMP, OUTPUT);
pinMode(VALVE, OUTPUT);
}
void loop() {
int level = analogRead(LEVEL_PIN);
float ph = map(analogRead(PH_PIN), 0, 4095, 0, 1400) / 100.0;
int turb = analogRead(TURB_PIN);
int rain = analogRead(RAIN_PIN);
String status = "Normal";
// Paras air tinggi
if (level > LEVEL_HIGH) {
digitalWrite(LED_R, HIGH);
digitalWrite(BUZZ, HIGH);
digitalWrite(PUMP, LOW);
digitalWrite(VALVE, LOW);
status = "High Level!";
}
// Paras air rendah
else if (level < LEVEL_LOW) {
digitalWrite(LED_Y, HIGH);
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, LOW);
digitalWrite(BUZZ, HIGH);
status = "Low Level!";
}
// Kualiti air tak baik
else if (ph < PH_MIN || ph > PH_MAX || turb > TURB_HIGH) {
digitalWrite(LED_R, HIGH);
digitalWrite(BUZZ, HIGH);
digitalWrite(PUMP, LOW);
digitalWrite(VALVE, LOW);
status = "Bad Quality!";
}
// Hujan
else if (rain > RAIN_TH) {
digitalWrite(LED_Y, HIGH);
digitalWrite(PUMP, LOW);
status = "Raining!";
}
// Normal
else {
digitalWrite(LED_G, HIGH);
digitalWrite(LED_Y, LOW);
digitalWrite(LED_R, LOW);
digitalWrite(BUZZ, LOW);
digitalWrite(PUMP, HIGH);
digitalWrite(VALVE, HIGH);
}
// Paparan LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Lvl:"); lcd.print(level);
lcd.print(" pH:"); lcd.print(ph, 1);
lcd.setCursor(0, 1);
lcd.print(status);
delay(1000);
}