#define DOOR_SWITCH PA12 // Door switch pin
#define PIR_PIN PB4 // PIR motion sensor pin
#define OUTPIN PA5 // Magnetic switch pin
unsigned int doorbuffertime = 1000;
typedef enum {
UNACTIVATED = 0,
DOOR_OPEN = 1,
INTRUDER = 2,
DOOR_CLOSED = 3
} Doorstate;
class DoorManagement {
private:
Doorstate MyDoorstate = UNACTIVATED;
Doorstate prevState = UNACTIVATED; // For printing only on change
int doorswitch = DOOR_SWITCH;
int magnetswitch = OUTPIN;
int pirpin = PIR_PIN;
void printState(const char* msg) {
if (MyDoorstate != prevState) {
Serial.println(msg);
prevState = MyDoorstate;
}
}
public:
void checkdoorstatus() {
switch (MyDoorstate) {
case UNACTIVATED:
if (digitalRead(doorswitch) == LOW) {
printState("System not active yet...");
} else {
MyDoorstate = DOOR_CLOSED;
printState("System activated. Door closed.");
}
break;
case DOOR_CLOSED:
if (digitalRead(doorswitch) == LOW) {
printState("System disabled.");
MyDoorstate = UNACTIVATED;
} else {
if (digitalRead(magnetswitch) == LOW) {
MyDoorstate = DOOR_CLOSED;
printState("You are safe. Door closed.");
} else {
MyDoorstate = INTRUDER;
printState("⚠️ Intruder alert!");
}
}
break;
case INTRUDER:
if (digitalRead(magnetswitch) == HIGH) {
MyDoorstate = DOOR_OPEN;
printState("🚨 High risk! Door is open. Check immediately!");
} else {
MyDoorstate = INTRUDER;
printState("⚠️ Still at risk...");
}
break;
case DOOR_OPEN:
if (digitalRead(magnetswitch) == HIGH) {
MyDoorstate = DOOR_OPEN;
printState("🚨 Door open! High risk continues.");
} else {
MyDoorstate = DOOR_CLOSED;
printState("✅ Door closed again. Situation safe.");
}
break;
}
// Extra: PIR integration (works in any state)
if (digitalRead(pirpin) == HIGH) {
Serial.println("👀 Motion detected by PIR sensor!");
}
}
};
DoorManagement MyDoor;
// Corrected timer function
void generatetimer(unsigned int time) {
static unsigned long past_time = millis();
if (millis() - past_time >= time) {
Serial.println("Timer expired.");
past_time = millis(); // reset timer
}
}
void setup() {
pinMode(DOOR_SWITCH, INPUT);
pinMode(OUTPIN, INPUT);
pinMode(PIR_PIN, INPUT);
Serial.begin(115200);
Serial.println("Hello, STM32! Security System Starting...");
}
void loop() {
MyDoor.checkdoorstatus();
generatetimer(doorbuffertime); // example timer usage
delay(100); // small delay for stability
}