final1.2_mit_Verzoegerung.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import time
  2. import Adafruit_BBIO.GPIO as GPIO
  3. import Adafruit_BBIO.PWM as PWM
  4. class Keypad():
  5. def __init__(self):
  6. # CONSTANTS
  7. self.KEYPAD = [
  8. ["1","2","3"],
  9. ["4","5","6"],
  10. ["7","8","9"],
  11. ["*","0","#"]
  12. ]
  13. self.ROW = ["P8_8", "P8_10", "P8_12", "P8_14"]
  14. self.COLUMN = ["P8_16", "P8_17", "P8_18"]
  15. self.PASS = "1234"
  16. def getKey(self):
  17. # Set all columns as output low
  18. for i in range(len(self.COLUMN)):
  19. GPIO.setup(self.COLUMN[i], GPIO.OUT)
  20. GPIO.output(self.COLUMN[i], GPIO.LOW)
  21. # Set all rows as input
  22. for i in range(len(self.ROW)):
  23. GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP)
  24. # Scan rows for pushed key/button
  25. # A valid key press should set "rowVal" between 0 and 3.
  26. rowVal = -1
  27. for i in range(len(self.ROW)):
  28. tmpRead = GPIO.input(self.ROW[i])
  29. if tmpRead == 0:
  30. rowVal = i
  31. if rowVal <0 or rowVal >3:
  32. self.reset()
  33. return
  34. # Convert columns to input
  35. for j in range(len(self.COLUMN)):
  36. GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_UP)
  37. # Switch the i-th row found from scan to output
  38. GPIO.setup(self.ROW[rowVal], GPIO.OUT)
  39. GPIO.output(self.ROW[rowVal], GPIO.LOW)
  40. # Scan columns for still-pushed key/button
  41. # A valid key press should set "colVal" between 0 and 2.
  42. colVal = -1
  43. for j in range(len(self.COLUMN)):
  44. tmpRead = GPIO.input(self.COLUMN[j])
  45. if tmpRead == 0:
  46. colVal=j
  47. if colVal <0 or colVal >2:
  48. self.reset()
  49. return
  50. # Return the value of the key pressed
  51. self.reset()
  52. return self.KEYPAD[rowVal][colVal]
  53. def reset(self):
  54. # Reinitialize all rows and columns
  55. for i in range(len(self.ROW)):
  56. GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP)
  57. for j in range(len(self.COLUMN)):
  58. GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_UP)
  59. def verify_pass(self, pass_entered):
  60. return pass_entered == self.PASS
  61. class IR:
  62. _name = ""
  63. _pin = ""
  64. _mode = GPIO.IN
  65. _rot = None
  66. _laut = None
  67. _keypad = None
  68. def __init__(self, name, pin, rot, laut, keypad):
  69. self._name = name
  70. self._pin = pin
  71. self._rot = rot
  72. self._laut = laut
  73. self._keypad = keypad
  74. GPIO.setup(self._pin, self._mode)
  75. GPIO.add_event_detect(self._pin, GPIO.RISING, callback=self.cb_ir)
  76. def __del__(self):
  77. print("IR {} deleted.".format(self._name))
  78. GPIO.remove_event_detect(self._pin)
  79. def cb_ir(self, pin):
  80. print("cb_ir called. enter password to cancel alarm")
  81. pass_entered = ""
  82. digit = None
  83. for i in range(self._laut._duration * self._rot._blink_freq):
  84. self._laut.start()
  85. self._rot.start()
  86. time.sleep(1/self._rot._blink_freq)
  87. self._rot.stop()
  88. self._laut.stop()
  89. digit = self._keypad.getKey()
  90. if digit != None:
  91. pass_entered = pass_entered + digit
  92. print("{} digit(s) alreadt entered".format(len(pass_entered)))
  93. digit = None
  94. if len(pass_entered) == 4:
  95. if self._keypad.verify_pass(pass_entered):
  96. print("alarm cancelled")
  97. self._rot.stop()
  98. self._laut.stop()
  99. return
  100. else:
  101. print("wrong password")
  102. pass_entered = ""
  103. class PIR:
  104. _name = ""
  105. _pin = ""
  106. _mode = GPIO.IN
  107. _rot = None
  108. _laut = None
  109. def __init__(self, name, pin, rot, laut):
  110. self._name = name
  111. self._pin = pin
  112. self._rot = rot
  113. self._laut = laut
  114. GPIO.setup(self._pin, self._mode)
  115. GPIO.add_event_detect(self._pin, GPIO.RISING, callback=self.cb_pir)
  116. def __del__(self):
  117. print("PIR {} deleted.".format(self._name))
  118. GPIO.remove_event_detect(self._pin)
  119. def cb_pir(self, pin):
  120. print("cb_pir called")
  121. for i in range(self._laut._duration * self._rot._blink_freq):
  122. self._laut.start()
  123. self._rot.start()
  124. time.sleep(1/self._rot._blink_freq)
  125. self._rot.stop()
  126. self._laut.stop()
  127. class MAG:
  128. _name = ""
  129. _pin = ""
  130. _mode = GPIO.IN
  131. _window_closed = True
  132. _rot = None
  133. _laut = None
  134. def __init__(self, name, pin, rot, laut):
  135. self._name = name
  136. self._pin = pin
  137. self._rot = rot
  138. self._laut = laut
  139. GPIO.setup(self._pin, self._mode)
  140. GPIO.add_event_detect(self._pin, GPIO.BOTH, callback=self.cb_mag)
  141. def __del__(self):
  142. print("MAG {} deleted.".format(self._name))
  143. GPIO.remove_event_detect(self._pin)
  144. def cb_mag(self, pin):
  145. if self._window_closed:
  146. print("Fenster geoeffnet...")
  147. self._window_closed = False
  148. for i in range(self._laut._duration * self._rot._blink_freq):
  149. self._laut.start()
  150. self._rot.start()
  151. time.sleep(1/self._rot._blink_freq)
  152. self._rot.stop()
  153. self._laut.stop()
  154. else:
  155. print("Fenster zu...")
  156. self._window_closed = True
  157. class ROT:
  158. _name = ""
  159. _pin = ""
  160. _mode = GPIO.OUT
  161. _blink_freq = 2
  162. def __init__(self, name, pin, blink_freq=2):
  163. self._name = name
  164. self._pin = pin
  165. self._blink_freq = blink_freq
  166. GPIO.setup(self._pin, self._mode)
  167. def __del__(self):
  168. print("ROT {} deleted.".format(self._name))
  169. def start(self):
  170. GPIO.output(self._pin, GPIO.HIGH)
  171. def stop(self):
  172. GPIO.output(self._pin, GPIO.LOW)
  173. class LAUT:
  174. _name = ""
  175. _pin = ""
  176. _mode = GPIO.OUT
  177. _duration = 60 # in second
  178. _pwm_perc = 50 # in percentage
  179. _pwm_freq = 10000 # in hz
  180. def __init__(self, name, pin, duration=60, pwm_perc=50, pwm_freq=10000):
  181. self._name = name
  182. self._pin = pin
  183. self._duration = duration
  184. self._pwm_perc = pwm_perc
  185. self._pwn_freq = pwm_freq
  186. GPIO.setup(self._pin, self._mode)
  187. def __del__(self):
  188. print("PWM {} deleted.".format(self._name))
  189. def start(self):
  190. PWM.start(self._pin, self._pwm_perc, self._pwm_freq)
  191. def stop(self):
  192. PWM.stop(self._pin)
  193. if __name__ == "__main__":
  194. try:
  195. print("Program start. Initializing with alarm config...")
  196. keypad = Keypad()
  197. rot = ROT("outPinROT", "P9_27")
  198. laut = LAUT("myPWMLAUT", "P8_13", duration=4)
  199. ir = IR("inPinIR", "P9_12", rot, laut, keypad)
  200. pir = PIR("inPinPIR", "P9_41", rot, laut)
  201. mag = MAG("inPinMAG", "P8_7", rot, laut)
  202. print("Initialization succeeded. Start in 2 seconds.")
  203. time.sleep(2)
  204. while True:
  205. # print("...")
  206. time.sleep(2)
  207. except Exception as e:
  208. print("Exception captured. Clean up and quit...")
  209. GPIO.cleanup()
  210. PWM.cleanup()
  211. print(e)