|
@@ -0,0 +1,185 @@
|
|
|
+import time
|
|
|
+import Adafruit_BBIO.GPIO as GPIO
|
|
|
+import Adafruit_BBIO.PWM as PWM
|
|
|
+
|
|
|
+class Keypad():
|
|
|
+ def __init__(self):
|
|
|
+ # CONSTANTS
|
|
|
+ self.KEYPAD = [
|
|
|
+ ["1","2","3"],
|
|
|
+ ["4","5","6"],
|
|
|
+ ["7","8","9"],
|
|
|
+ ["*","0","#"]
|
|
|
+ ]
|
|
|
+
|
|
|
+ self.ROW = ["P8_8", "P8_10", "P8_12", "P8_14"]
|
|
|
+ self.COLUMN = ["P8_16", "P8_17", "P8_18"]
|
|
|
+ self.PASS = "1234"
|
|
|
+
|
|
|
+ for r in self.ROW:
|
|
|
+ GPIO.setup(r, GPIO.OUT)
|
|
|
+ for c in self.COLUMN:
|
|
|
+ GPIO.setup(c, GPIO.IN)
|
|
|
+
|
|
|
+ def getKey(self):
|
|
|
+ for i in self.ROW:
|
|
|
+ GPIO.output(i, GPIO.HIGH)
|
|
|
+ for c in self.COLUMN:
|
|
|
+ GPIO.add_event_detect(c, GPIO.RISING)
|
|
|
+
|
|
|
+ time.sleep(1)
|
|
|
+ print("pls enter key")
|
|
|
+ while True:
|
|
|
+ for c in self.COLUMN:
|
|
|
+ if GPIO.event_detected(c):
|
|
|
+ key = self.identifyKey(c)
|
|
|
+ if key:
|
|
|
+ for c in self.COLUMN:
|
|
|
+ GPIO.remove_event_detect(c)
|
|
|
+ return key
|
|
|
+ print("refreshing")
|
|
|
+ time.sleep(0.1)
|
|
|
+
|
|
|
+ def identifyKey(self, pin):
|
|
|
+ print("identifyKey called")
|
|
|
+ col = COLUMN.index(pin)
|
|
|
+ key = None
|
|
|
+
|
|
|
+ # GPIO.output(self.ROW[0], GPIO.HIGH)
|
|
|
+ GPIO.output(self.ROW[1], GPIO.LOW)
|
|
|
+ GPIO.output(self.ROW[2], GPIO.LOW)
|
|
|
+ GPIO.output(self.ROW[3], GPIO.LOW)
|
|
|
+ if GPIO.input(pin):
|
|
|
+ key=self.KEYPAD[0][col]
|
|
|
+
|
|
|
+ GPIO.output(self.ROW[0], GPIO.LOW)
|
|
|
+ GPIO.output(self.ROW[1], GPIO.HIGH)
|
|
|
+ # GPIO.output(self.ROW[2], GPIO.LOW)
|
|
|
+ # GPIO.output(self.ROW[3], GPIO.LOW)
|
|
|
+ if GPIO.input(pin):
|
|
|
+ key=KEYPAD[1][col]
|
|
|
+
|
|
|
+
|
|
|
+ # GPIO.output(self.ROW[0], GPIO.LOW)
|
|
|
+ GPIO.output(self.ROW[1], GPIO.LOW)
|
|
|
+ GPIO.output(self.ROW[2], GPIO.HIGH)
|
|
|
+ # GPIO.output(self.ROW[3], GPIO.LOW)
|
|
|
+ if GPIO.input(pin):
|
|
|
+ key=KEYPAD[2][col]
|
|
|
+
|
|
|
+ # GPIO.output(self.ROW[0], GPIO.LOW)
|
|
|
+ # GPIO.output(self.ROW[1], GPIO.LOW)
|
|
|
+ GPIO.output(self.ROW[2], GPIO.LOW)
|
|
|
+ GPIO.output(self.ROW[3], GPIO.HIGH)
|
|
|
+ if GPIO.input(pin):
|
|
|
+ key=KEYPAD[3][col]
|
|
|
+
|
|
|
+ GPIO.output(self.ROW[0], GPIO.HIGH)
|
|
|
+ GPIO.output(self.ROW[1], GPIO.HIGH)
|
|
|
+ GPIO.output(self.ROW[2], GPIO.HIGH)
|
|
|
+ GPIO.output(self.ROW[3], GPIO.HIGH)
|
|
|
+
|
|
|
+ if key:
|
|
|
+ return key
|
|
|
+
|
|
|
+ def verify_pass(self, pass_entered):
|
|
|
+ return pass_entered == self.PASS
|
|
|
+
|
|
|
+class IR:
|
|
|
+ def __init__(self, pin, rot, laut, keypad):
|
|
|
+ self.pin = pin
|
|
|
+ self.rot = rot
|
|
|
+ self.laut = laut
|
|
|
+ self.keypad = keypad
|
|
|
+ GPIO.setup(self.pin, GPIO.IN)
|
|
|
+ GPIO.add_event_detect(self.pin, GPIO.RISING, callback=self.cb_ir)
|
|
|
+
|
|
|
+ def __del__(self):
|
|
|
+ print("IR {} deleted.".format(self.pin))
|
|
|
+ GPIO.remove_event_detect(self.pin)
|
|
|
+
|
|
|
+ def cb_ir(self, pin):
|
|
|
+ print("cb_ir called.")
|
|
|
+ self.rot.start()
|
|
|
+ time.sleep(1)
|
|
|
+ self.laut.start()
|
|
|
+ time.sleep(1)
|
|
|
+ print("pls enter pass to stop alarm")
|
|
|
+ start_time = time.time()
|
|
|
+ pass_entered = ""
|
|
|
+ digit = None
|
|
|
+ while True:
|
|
|
+ while not digit and time.time()-start_time < 50:
|
|
|
+ digit = self.keypad.getKey()
|
|
|
+ if digit:
|
|
|
+ pass_entered = pass_entered + digit
|
|
|
+ print("{} digit(s) already entered".format(len(pass_entered)))
|
|
|
+ digit = None
|
|
|
+ if len(pass_entered) >= 4:
|
|
|
+ if self.keypad.verify_pass(pass_entered[-4:]):
|
|
|
+ print("alarm cancelled")
|
|
|
+ time.sleep(1)
|
|
|
+ self.rot.stop()
|
|
|
+ time.sleep(1)
|
|
|
+ self.laut.stop()
|
|
|
+ time.sleep(1)
|
|
|
+ else:
|
|
|
+ print("wrong password")
|
|
|
+ pass_entered = ""
|
|
|
+ if time.time() - start_time > 50:
|
|
|
+ print("took too long, reset")
|
|
|
+ pass_entered = ""
|
|
|
+ if time.time() - start_time > 60:
|
|
|
+ print("60s passed, quit for test")
|
|
|
+ time.sleep(1)
|
|
|
+ self.rot.stop()
|
|
|
+ time.sleep(1)
|
|
|
+ self.laut.stop()
|
|
|
+ time.sleep(1)
|
|
|
+ break
|
|
|
+
|
|
|
+class LAUT:
|
|
|
+ def __init__(self, pin, pwm_perc=50, pwm_freq=10000):
|
|
|
+ self.pin = pin
|
|
|
+ self.pwm_perc = pwm_perc
|
|
|
+ self.pwm_freq = pwm_freq
|
|
|
+ GPIO.setup(self.pin, GPIO.OUT)
|
|
|
+
|
|
|
+ def __del__(self):
|
|
|
+ print("PWM {} deleted.".format(self.pin))
|
|
|
+
|
|
|
+ def start(self):
|
|
|
+ PWM.start(self.pin, self.pwm_perc, self.pwm_freq)
|
|
|
+
|
|
|
+ def stop(self):
|
|
|
+ PWM.stop(self.pin)
|
|
|
+
|
|
|
+
|
|
|
+class ROT():
|
|
|
+ def __init__(self, pin, pwm_perc=50, pwm_freq=1):
|
|
|
+ self.pin = pin
|
|
|
+ self.pwm_perc = pwm_perc
|
|
|
+ self.pwm_freq = pwm_freq
|
|
|
+
|
|
|
+ def __del__(self):
|
|
|
+ print("ROT {} deleted.".format(self.pin))
|
|
|
+
|
|
|
+ def start(self):
|
|
|
+ PWM.start(self.pin, self.pwm_perc, self.pwm_freq)
|
|
|
+
|
|
|
+ def stop(self):
|
|
|
+ PWM.stop(self.pin)
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ rot = ROT("P9_14")
|
|
|
+ laut = LAUT("P8_13")
|
|
|
+ keypad = Keypad()
|
|
|
+ ir = IR("P9_12", rot, laut, keypad)
|
|
|
+ try:
|
|
|
+ while True:
|
|
|
+ print("...")
|
|
|
+ time.sleep(2)
|
|
|
+ except Exception as e:
|
|
|
+ GPIO.cleanup()
|
|
|
+ PWM.cleanup()
|
|
|
+ print(e)
|