Source code for DoorControl

# DoorControlApp
# Example application to detect using a proximity sensor and open, close a door.
#
# Copyright (c) 2014 Charles Weir.  Shared under the MIT Licence.

import sys, os # Python path kludge - omit these 2 lines if BrickPython is installed.
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))))

from BrickPython.TkApplication import TkApplication
from BrickPython.Sensor import Sensor
import logging

[docs]class DoorControlApp(TkApplication): '''Application to automatically open and close a door using a proximity sensor. It also closes and 'locks' it when C is pressed (so the sensor no longer opens it), starting again when S or O is pressed The door is attached to a motor, which opens it by moving through 90 degrees, and closes it the same way. The sensor is mounted above the door, so it detects approaching 'peaple'. ''' def __init__(self): TkApplication.__init__(self, {'1': Sensor.ULTRASONIC_CONT }) self.doorLocked = False self.addSensorCoroutine( self.openDoorWhenSensorDetected() )
[docs] def openDoorWhenSensorDetected(self): '''Coroutine that waits until the sensor detects something nearby, then opens the door, keeps it open for 4 seconds, then closes it again and repeats. It uses the flag *doorLocked* to determine whether the user has 'locked' the door. ''' motorA = self.motor('A') sensor1 = self.sensor('1') motorA.zeroPosition() while True: while sensor1.value() > 8 or self.doorLocked: yield logging.info( "Opening - sensor 1 value is %d" % sensor1.value() ) for i in motorA.moveTo( -2*90, 2000 ): if self.doorLocked: break yield logging.info( "Waiting 4 seconds" ) for i in self.waitMilliseconds( 4000 ): if self.doorLocked: break yield logging.info( "Shutting door" ) for i in motorA.moveTo( 0, 2000 ): yield logging.info( "Door closed" )
[docs] def onKeyPress(self, event): 'Handle key input from the user' if TkApplication.onKeyPress(self, event): return char = event.char if char in 'Cc': logging.info( "Closing and disabling door now" ) self.doorLocked = True elif char in 'SsOo': logging.info( "Re-activating door" ) self.doorLocked = False
if __name__ == "__main__": logging.basicConfig(format='%(message)s', level=logging.INFO) # All log messages printed to console. logging.info( "Starting" ) app = DoorControlApp() app.mainloop()