#include <ESP32Servo.h>
#define IR_PIN 26
#define RELAY_PIN 27
#define SERVO_PIN 25
#define TRIG_PIN 5
#define ECHO_PIN 18
Servo pumpServo;
long duration;
float distance;
void setup() {
Serial.begin(115200);
pinMode(IR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pumpServo.attach(SERVO_PIN);
pumpServo.write(0);
digitalWrite(RELAY_PIN, LOW);
Serial.println("Simple Water Dispenser Ready");
}
void loop() {
int irState = digitalRead(IR_PIN);
// Read distance from ultrasonic sensor
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
Serial.print("IR: ");
Serial.print(irState == LOW ? "HAND" : "NO HAND");
Serial.print(" | Distance: ");
Serial.print(distance);
Serial.println(" cm");
// If hand is detected and distance is close
if (irState == LOW && distance < 5) {
digitalWrite(RELAY_PIN, HIGH);
pumpServo.write(90);
Serial.println("Pump ON");
delay(2000); // Pump runs for 2 seconds
pumpServo.write(0);
digitalWrite(RELAY_PIN, LOW);
Serial.println("Pump OFF");
// Wait until the hand is removed
while (digitalRead(IR_PIN) == LOW) {
delay(50);
}
}
delay(200);
}