// Automatic Water Dispenser with refill button and potentiometer-controlled water level
#include <LiquidCrystal.h>
#define TRIG_PIN 7
#define ECHO_PIN 6
#define POT_PIN A0
#define REFILL_BUTTON_PIN 8
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int waterLevelPercent = 100;
unsigned long dispenseStartTime = 0;
bool dispensing = false;
bool glassWasPresent = false;
bool waitingForGlassRemoval = false;
bool allowSensorUpdate = false;
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(REFILL_BUTTON_PIN, INPUT_PULLUP);
lcd.begin(16, 2);
lcd.print("Water Level:");
delay(1000);
int initialLevel = map(analogRead(POT_PIN), 0, 1023, 0, 100);
waterLevelPercent = initialLevel;
showWaterLevel(waterLevelPercent);
}
long readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void showWaterLevel(int level) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Level: ");
lcd.print(level);
lcd.print("%");
lcd.setCursor(0, 1);
if (level <= 10) {
lcd.print("Tank Empty");
} else if (level <= 50) {
lcd.print("Tank Half Full");
} else {
lcd.print("Tank Full");
}
}
void loop() {
long distance = readDistanceCM();
bool glassPresent = (distance < 5);
bool refillPressed = digitalRead(REFILL_BUTTON_PIN) == LOW;
if (refillPressed) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Filling Tank...");
delay(300);
int potLevel = analogRead(POT_PIN);
int potPercent = map(potLevel, 0, 1023, 0, 100);
waterLevelPercent = potPercent;
showWaterLevel(waterLevelPercent);
delay(500);
return;
}
// Start dispensing
if (!dispensing && glassPresent && !glassWasPresent && waterLevelPercent > 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dispensing Water");
dispensing = true;
dispenseStartTime = millis();
waitingForGlassRemoval = true;
}
// During dispensing
if (dispensing) {
if (!glassPresent && waitingForGlassRemoval) {
unsigned long dispenseDuration = millis() - dispenseStartTime;
float mlDispensed = dispenseDuration / 1000.0; // 1 sec = 1 ml
int percentUsed = mlDispensed * 0.5; // 1 ml = 0.5%
if (percentUsed < 1) percentUsed = 1;
waterLevelPercent -= percentUsed;
if (waterLevelPercent < 0) waterLevelPercent = 0;
showWaterLevel(waterLevelPercent);
dispensing = false;
waitingForGlassRemoval = false;
} else if (millis() - dispenseStartTime > 15000) {
waterLevelPercent -= 7;
if (waterLevelPercent < 0) waterLevelPercent = 0;
showWaterLevel(waterLevelPercent);
dispensing = false;
waitingForGlassRemoval = false;
}
}
glassWasPresent = glassPresent;
delay(500);
}
Activate water sensor