#define DEBUG_MODE 0
// Define pin numbers
const int redLedPin = 4; // to show lock active or inactive state
const int blueLedPin = 7; // to show door open /close status
const int relayPin = 12;
const int doorStatePin = 11; // input feed back from magnetic lock
// Define variables
bool doorClosed = true;
bool doorTriggered = false;
bool door_state=0;
unsigned long lastDoorNotCloseDetectedTime = 0;
unsigned long lastDoorOpenedTime = 0;
uint16_t power_state=0;
void setup()
{
// Initialize serial communication
Serial.begin(9600);
// Set pin modes
pinMode(redLedPin, OUTPUT);
pinMode(blueLedPin, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(doorStatePin, INPUT);// external pull up added
digitalWrite(blueLedPin,HIGH);// default LED on
digitalWrite(relayPin,HIGH);// active low Realay HIGH => off and LOW => ON
Serial.println("SYSTEM ONLINE");
}
void loop()
{
power_state=analogRead(A6);
door_state =digitalRead(doorStatePin);
#if DEBUG_MODE == 1
Serial.print("\r\n POWER:");Serial.print(power_state);
Serial.print(" DOOR state");Serial.print(door_state);
#endif
// Check for serial input
if (Serial.available() > 0)
{
delay(10);// wait till all bytes received
String command = Serial.readStringUntil('\n');
if (command == "OPEN")
{
openDoor();
}
}
// Check if the switch is pressed
if ((door_state == HIGH) || (power_state >500))// door open then high , door closed then loW when power cut of by other device PC817 gives high so 1023
{
if(doorClosed == true)// to do only once
{
doorClosed = false;
Serial.println("DOOR NOT CLOSED");
lastDoorNotCloseDetectedTime = millis(); // Record the time when the switch was pressed
}
digitalWrite(blueLedPin, HIGH);
}
else
{
if(doorClosed == false)// to do only once
{
doorClosed = true;
Serial.println("DOOR CLOSED");
delay(1000);// for deboucing feed back from lock
}
digitalWrite(blueLedPin, LOW);
}
// Check if the door is not closed within 3 seconds after turning off the relay
if (!doorTriggered && !doorClosed && ((millis() - lastDoorNotCloseDetectedTime) > 3000)) //
{
Serial.println("DOOR NOT CLOSED");
lastDoorNotCloseDetectedTime = millis(); // reseting time
}
if(doorTriggered && ((millis()-lastDoorOpenedTime )>= 5000))//OPEN
{
digitalWrite(redLedPin, LOW); // Turn off the red LED
digitalWrite(relayPin, HIGH); // Deactivate the relay
doorTriggered=false;
delay(1000);// for deboucing feed back from lock
}
}
void openDoor()
{
if((doorTriggered == false) && (doorClosed == true))
{
digitalWrite(redLedPin, HIGH); // Turn on the red LED
digitalWrite(relayPin, LOW); // Activate the relay
doorClosed = false;
doorTriggered = true;
Serial.println("DOOR OPENED");
// Wait for 3 seconds
// lastDoorOpenedTime= millis();
delay(1000);// for deboucing feed back from lock
}
else if((doorTriggered == false) && (doorClosed == false))
{
digitalWrite(redLedPin, HIGH); // Turn on the red LED
digitalWrite(relayPin, LOW); // Activate the relay
doorTriggered = true;
Serial.println("DOOR NOT CLOSED");
delay(1000);// for deboucing feed back from lock
}
else
{
// Serial.println("DOOR OPENED");
Serial.println("DOOR NOT CLOSED");
lastDoorNotCloseDetectedTime = millis(); // reseting time
}
lastDoorOpenedTime= millis();// if another triggere comes with in time
// delay(3000);
// digitalWrite(redLedPin, LOW); // Turn off the red LED
// digitalWrite(relayPin, HIGH); // Deactivate the relay
// delay(1000);// for deboucing feed back from lock
}