123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- 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)
|