#include Servo dbServo; // the deadbolt servo int locked = 0; // boolean if door is locked int blueLedPin = 13; // blue led on the board int doorOpenSensor = 4; // reed sensor pin int unlockButton = 3; // for push button or relay int lockedPos = 135; // servo position when locked int unlockedPos = 34; // servo position when unlocked int lockedLedPin = 12; // LED on when door is locked int waitTime = 5000; // the amount of time the door waits before attempting to lock again void setup() { dbServo.attach(9); pinMode(doorOpenSensor, INPUT); pinMode(unlockButton, INPUT); pinMode(lockedLedPin, OUTPUT); lock(); } void loop() { // check if override is active or if button/relay activated if (isButtonPressed() == 1 || isDoorOpen() == 1) { if (locked == 1) { unlock(); } } } /* Turns the lock LED off, unlocks the door, enters loop to wait to lock */ void unlock() { digitalWrite(lockedLedPin, LOW); dbServo.write(unlockedPos); locked = 0; delay(100); waitToLock(); } /* Returns whether the door is open or not. */ boolean isDoorOpen() { return digitalRead(doorOpenSensor); } /* Returns whether or not the button is pressed (or the relay is triggered) */ boolean isButtonPressed() { return digitalRead(unlockButton); } /* Starts a loop, waiting 5 seconds then checking to make sure the door is closed. If it is, then it locks the door and returns to normal. */ void waitToLock() { digitalWrite(blueLedPin, HIGH); while (true) { delay(waitTime); if (isDoorOpen() == 0) { delay(500); // delay an additional half second in case the reed picked up before door was fully closed lock(); break; } } digitalWrite(blueLedPin, LOW); } /* Locks door, turns lock LED on */ void lock() { dbServo.write(lockedPos); digitalWrite(lockedLedPin, HIGH); locked = 1; }