Browse Source

Dateien hochladen nach ''

Yang Zhang 4 years ago
parent
commit
bddd5f4466
2 changed files with 356 additions and 0 deletions
  1. 185 0
      final_new_keypad_bad.py
  2. 171 0
      final_old_keypad_good.py

+ 185 - 0
final_new_keypad_bad.py

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

+ 171 - 0
final_old_keypad_good.py

@@ -0,0 +1,171 @@
+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"
+     
+    def getKey(self):
+        # Set all columns as output low
+        for i in range(len(self.COLUMN)):
+            GPIO.setup(self.COLUMN[i], GPIO.OUT)
+            GPIO.output(self.COLUMN[i], GPIO.LOW)
+         
+        # Set all rows as input
+        for i in range(len(self.ROW)):
+            GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP)
+         
+        # Scan rows for pushed key/button
+        # A valid key press should set "rowVal"  between 0 and 3.
+        rowVal = -1
+        for i in range(len(self.ROW)):
+            tmpRead = GPIO.input(self.ROW[i])
+            if tmpRead == 0:
+                rowVal = i
+                 
+        if rowVal <0 or rowVal >3:
+            self.reset()
+            return
+         
+        # Convert columns to input
+        for j in range(len(self.COLUMN)):
+            GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_UP)
+         
+        # Switch the i-th row found from scan to output
+        GPIO.setup(self.ROW[rowVal], GPIO.OUT)
+        GPIO.output(self.ROW[rowVal], GPIO.LOW)
+ 
+        # Scan columns for still-pushed key/button
+        # A valid key press should set "colVal"  between 0 and 2.
+        colVal = -1
+        for j in range(len(self.COLUMN)):
+            tmpRead = GPIO.input(self.COLUMN[j])
+            if tmpRead == 0:
+                colVal=j
+                 
+        if colVal <0 or colVal >2:
+            self.reset()
+            return
+ 
+        # Return the value of the key pressed
+        self.reset()
+        return self.KEYPAD[rowVal][colVal]
+         
+    def reset(self):
+        # Reinitialize all rows and columns
+        for i in range(len(self.ROW)):
+            GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP) 
+        for j in range(len(self.COLUMN)):
+            GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_UP)
+    
+    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()
+            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)