#include <LiquidCrystal.h>
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int trigPin1 = PB5; // Door sensor
const int echoPin1 = PB6;
const int trigPin2 = PB8; // Top wall sensor
const int echoPin2 = PB4;
const int relayPin = PB7; // LED light pin
long duration1, duration2;
int distance1, distance2;
bool doorOpen = false;
bool wasDoorOpen = false;
bool occupied = false;
int personDetectedThreshold = 50;
void setup() {
lcd.begin(16, 2);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW); // Light initially off
lcd.setCursor(0, 0);
lcd.print("Lavatory Status");
delay(2000);
lcd.clear();
}
void loop() {
// Measure distance from door sensor
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
distance1 = duration1 * 0.034 / 2;
// Measure distance from wall sensor
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration2 = pulseIn(echoPin2, HIGH);
distance2 = duration2 * 0.034 / 2;
if (distance1 > 5) {
doorOpen = true;
} else {
doorOpen = false;
}
if (wasDoorOpen && !doorOpen) {
if (distance2 < personDetectedThreshold) {
occupied = true;
} else {
occupied = false;
}
}
if (doorOpen) {
digitalWrite(relayPin, HIGH);
}
if (!doorOpen && !occupied) {
digitalWrite(relayPin, LOW);
}
lcd.setCursor(0, 0);
if (occupied) {
lcd.print("Occupied ");
} else {
lcd.print("Vacant ");
}
wasDoorOpen = doorOpen;
delay(1000);
}
Loading
stm32-bluepill
stm32-bluepill