// ESP32 Door Interlocking System with Emergency Mode, Serial Commands, and Fast Blinking
const int doorButtons[] = {12, 13, 14}; // Door control buttons
const int emergencyButton = 27; // Emergency button
const int redLEDs[] = {4, 18, 21}; // Red LEDs for doors (locked)
const int greenLEDs[] = {2, 5, 19}; // Green LEDs for doors (unlocked)
bool doorStates[] = {false, false, false}; // Track door states
unsigned long doorTimers[] = {0, 0, 0};
bool emergencyMode = false;
bool lastEmergencyState = false;
void setup() {
Serial.begin(115200);
for (int i = 0; i < 3; i++) {
pinMode(doorButtons[i], INPUT_PULLUP);
pinMode(redLEDs[i], OUTPUT);
pinMode(greenLEDs[i], OUTPUT);
digitalWrite(redLEDs[i], HIGH);
digitalWrite(greenLEDs[i], LOW);
}
pinMode(emergencyButton, INPUT_PULLUP);
Serial.println("System Ready. All doors locked.");
}
void loop() {
handleSerial();
handleButtons();
handleTimers();
if (emergencyMode) blinkAllFast();
}
void handleSerial() {
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
if (cmd == "door1") openDoor(0);
else if (cmd == "door2") openDoor(1);
else if (cmd == "door3") openDoor(2);
else if (cmd == "emergency") toggleEmergency();
else Serial.println("Unknown command");
}
}
void handleButtons() {
for (int i = 0; i < 3; i++) {
if (digitalRead(doorButtons[i]) == LOW) {
delay(100);
if (!emergencyMode) openDoor(i);
}
}
bool currentEmergencyState = digitalRead(emergencyButton) == LOW;
if (currentEmergencyState && !lastEmergencyState) {
toggleEmergency();
}
lastEmergencyState = currentEmergencyState;
}
void openDoor(int door) {
if (emergencyMode) {
Serial.println("Emergency mode: All doors already open.");
return;
}
if (anyOtherOpen(door)) {
Serial.print("Access Denied: Door ");
Serial.print(door + 1);
Serial.println(" cannot open while another door is open.");
return;
}
doorStates[door] = true;
doorTimers[door] = millis();
digitalWrite(redLEDs[door], LOW);
digitalWrite(greenLEDs[door], HIGH);
Serial.print("Door "); Serial.print(door + 1); Serial.println(" opened.");
}
bool anyOtherOpen(int skip) {
for (int i = 0; i < 3; i++) {
if (i != skip && doorStates[i]) return true;
}
return false;
}
void handleTimers() {
if (emergencyMode) return;
for (int i = 0; i < 3; i++) {
if (doorStates[i] && millis() - doorTimers[i] >= 10000) {
lockDoor(i);
}
}
}
void lockDoor(int door) {
doorStates[door] = false;
digitalWrite(redLEDs[door], HIGH);
digitalWrite(greenLEDs[door], LOW);
Serial.print("Door "); Serial.print(door + 1); Serial.println(" locked.");
}
void toggleEmergency() {
emergencyMode = !emergencyMode;
if (emergencyMode) {
Serial.println("EMERGENCY MODE ACTIVATED! All doors unlocked!");
forceOpenAll();
} else {
Serial.println("EMERGENCY MODE DEACTIVATED! All doors locked.");
for (int i = 0; i < 3; i++) lockDoor(i);
}
}
void forceOpenAll() {
for (int i = 0; i < 3; i++) {
doorStates[i] = true;
digitalWrite(redLEDs[i], HIGH);
digitalWrite(greenLEDs[i], HIGH);
}
}
void blinkAllFast() {
static unsigned long lastBlink = 0;
static bool on = false;
if (millis() - lastBlink >= 100) {
on = !on;
for (int i = 0; i < 3; i++) {
digitalWrite(redLEDs[i], on);
digitalWrite(greenLEDs[i], on);
}
lastBlink = millis();
}
}