/*
Forum: https://forum.arduino.cc/t/can-anybody-review-these-code/1436533
Wokwi: https://wokwi.com/projects/459209277096681473
modified Version
2026/03/22
ec2021
*/
//Motor indication
constexpr byte Mblue {12};
constexpr byte Mred {13};
//Level LED
constexpr byte Green {10};
constexpr byte Yellow {9};
constexpr byte Red {8};
//Passive buzzer
constexpr byte passiveBuzzer {6};
//Ultrasonic sensor
constexpr byte trig {5};
constexpr byte echo {4};
float distance;
//Relay
constexpr byte Relay {7};
//Water sensor
constexpr byte waterSensorPin {A0};
int sensorValue = 0;
void setup() {
Serial.begin(115200);
pinMode(Mblue, OUTPUT);
pinMode(Mred, OUTPUT);
pinMode(Green, OUTPUT);
pinMode(Yellow, OUTPUT);
pinMode(Red, OUTPUT);
pinMode(passiveBuzzer, OUTPUT);
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
pinMode(Relay, OUTPUT);
pinMode(waterSensorPin, INPUT);
createStartSound();
}
unsigned long currentMillis;
void loop() {
currentMillis = millis();
readUltraEvery(700);
readWaterSensorEvery(1000);
setLevelLedsEvery(6000);
setRelayAndMotorIndicatorEvery(1000);
}
void createStartSound() {
//Passive buzzer device on sound
tone(passiveBuzzer, 1000);
delay(300);
noTone(passiveBuzzer);
delay(100);
tone(passiveBuzzer, 1500);
delay(200);
noTone(passiveBuzzer);
}
void readUltraEvery(unsigned long interval) {
static unsigned long previousUltra;
//Ultrasonic input
if (currentMillis - previousUltra >= interval) {
previousUltra = currentMillis;
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
unsigned long duration = pulseIn(echo, HIGH, 30000);
distance = duration * 0.017;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println("cm");
}
}
void readWaterSensorEvery(unsigned long interval) {
static unsigned long previousWater;
//Water sensor input
if (currentMillis - previousWater >= interval) {
previousWater = currentMillis;
sensorValue = analogRead(waterSensorPin);
Serial.print("Level: ");
Serial.println(sensorValue);
}
}
void setLevelLedsEvery(unsigned long interval) {
static unsigned long previousLevel;
//LEVEL LED OUTPUT
if (currentMillis - previousLevel >= interval) {
previousLevel = currentMillis;
byte mode = 0;
if (distance > 8) {
mode = 1;
}
if (distance > 12) {
mode = 2;
}
switch (mode) {
case 1:
setRGY(LOW, LOW, HIGH);
break;
case 2:
setRGY(HIGH, LOW, LOW);
break;
default:
setRGY(LOW, HIGH, LOW);
}
}
}
void setRGY(byte r, byte g, byte y) {
digitalWrite(Red, r);
digitalWrite(Green, g);
digitalWrite(Yellow, y);
}
void setRelayAndMotorIndicatorEvery(unsigned long interval) {
static unsigned long previousRelay;
//Relay and Motor indication Output
if (currentMillis - previousRelay >= interval) {
previousRelay = currentMillis;
if (distance > 14) {
digitalWrite(Relay, HIGH);
digitalWrite(Mblue, HIGH);
digitalWrite(Mred, LOW);
}
else {
if (sensorValue > 250) {
digitalWrite(Relay, LOW);
digitalWrite(Mblue, LOW);
digitalWrite(Mred, HIGH);
}
}
}
}