#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);
}
$abcdeabcde151015202530354045505560fghijfghij
Loading
stm32-bluepill
NOCOMNCVCCGNDINLED1PWRRelay Module