#define HAND_SENSOR PB0
#define TRIG_PIN PA1
#define ECHO_PIN PA0
#define PUMP_PIN PB1
#define LOW_LED PB12
#define LED PB10
// Adjust after testing your container
const float LOW_LEVEL_DISTANCE = 12.0;
bool previousHandState = false;
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsigned long duration =
pulseIn(ECHO_PIN, HIGH, 30000UL);
if (duration == 0) {
return -1.0; // Invalid reading
}
return duration * 0.0343 / 2.0;
}
void setup() {
pinMode(HAND_SENSOR, INPUT_PULLUP);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PUMP_PIN, OUTPUT);
pinMode(LOW_LED, OUTPUT);
digitalWrite(PUMP_PIN, LOW);
digitalWrite(LOW_LED, LOW);
Serial.begin(115200);
Serial.println("Smart Handwash Dispenser Ready");
}
void loop() {
bool handDetected =
(digitalRead(HAND_SENSOR) == LOW);
float distance = readDistanceCM();
// Invalid readings must not permit dispensing.
bool sensorValid = (distance >= 2.0);
bool lowLiquid =
(!sensorValid ||
distance >= LOW_LEVEL_DISTANCE);
digitalWrite(LOW_LED, lowLiquid ? HIGH : LOW);
if (sensorValid) {
Serial.print("Liquid distance: ");
Serial.print(distance);
Serial.println(" cm");
} else {
Serial.println("Ultrasonic reading invalid");
}
// Dispense once for each new hand detection.
if (handDetected &&
!previousHandState &&
!lowLiquid) {
Serial.println("Hand detected: dispensing");
digitalWrite(PUMP_PIN, HIGH);
delay(700);
digitalWrite(PUMP_PIN, LOW);
Serial.println("Dispensing complete");
}
if (lowLiquid) {
Serial.println("LOW LIQUID: Refill required");
}
previousHandState = handDetected;
delay(100);
}Loading
stm32-bluepill
stm32-bluepill