alarm.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import time
  2. import Adafruit_BBIO.GPIO as GPIO
  3. import Adafruit_BBIO.PWM as PWM
  4. class alarm:
  5. _alarm_duration = 60 # in second
  6. _alarm_pwm_perc = 50 # in percentage
  7. _alarm_pwm_freq = 10000 # in hz
  8. _alarm_led_freq = 2 # in hz
  9. _config = {}
  10. _pins_to_watch = {} # { pname: pin }
  11. _window_closed = True
  12. def __init__(self, config):
  13. self._config = config
  14. for pname,pconfig in self._config.items():
  15. if "mode" in pconfig:
  16. GPIO.setup(pconfig["pin"], pconfig["mode"])
  17. if "event_to_detect" in pconfig:
  18. GPIO.add_event_detect(pconfig["pin"], pconfig["event_to_detect"])
  19. self._pins_to_watch[pname] = pconfig["pin"]
  20. def trigger_alarm(self, pled, ppwm):
  21. for i in range(0, self._alarm_duration):
  22. PWM.start(self._config[ppwm]["pin"], self._alarm_pwm_perc, self._alarm_pwm_freq)
  23. GPIO.output(self._config[pled]["pin"],GPIO.HIGH)
  24. time.sleep(1/self._alarm_led_freq)
  25. GPIO.output(self._config[pled]["pin"],GPIO.LOW)
  26. time.sleep(1/self._alarm_led_freq)
  27. PWM.stop(self._config[ppwm]["pin"])
  28. GPIO.output(self._config[pled]["pin"],GPIO.HIGH)
  29. time.sleep(1/self._alarm_led_freq)
  30. GPIO.output(self._config[pled]["pin"],GPIO.LOW)
  31. time.sleep(1/self._alarm_led_freq)
  32. if __name__ == "__main__":
  33. my_config = {
  34. "inPinIR": {"pin": "P9_12", "mode": GPIO.IN, "event_to_detect": GPIO.RISING},
  35. "inPinPIR": {"pin": "P9_41", "mode": GPIO.IN, "event_to_detect": GPIO.RISING},
  36. "inPinMAG": {"pin": "P8_7", "mode": GPIO.IN, "event_to_detect": GPIO.BOTH},
  37. "outPinROT": {"pin": "P9_27", "mode": GPIO.OUT},
  38. "myPWMLAUT": {"pin":"P8_13"}
  39. }
  40. try:
  41. print("Program start. Initializing with alarm config...")
  42. my_alarm = alarm(config=my_config)
  43. print("Pins to watch:")
  44. print(my_alarm._pins_to_watch)
  45. print("Initialization succeeded. Start in 2 seconds.")
  46. time.sleep(2)
  47. while True:
  48. for pname,pin in my_alarm._pins_to_watch.items():
  49. if GPIO.event_detected(pin):
  50. print("Motion detected from {}".format(pname))
  51. if pname == "inPinMAG": # Fenster
  52. if my_alarm._window_closed:
  53. print("Fenster geoeffnet...")
  54. my_alarm._window_closed = False
  55. my_alarm.trigger_alarm(pled="outPinROT", ppwm="myPWMLAUT")
  56. else: # open
  57. print("Fenster zu...")
  58. my_alarm._window_closed = True
  59. continue
  60. if pname == "inPinIR":
  61. my_alarm.trigger_alarm(pled="outPinROT", ppwm="myPWMLAUT")
  62. continue
  63. if pname == "inPinPIR":
  64. my_alarm.trigger_alarm(pled="outPinROT", ppwm="myPWMLAUT")
  65. continue
  66. print("...")
  67. time.sleep(2)
  68. except Exception as e:
  69. print("Exception captured. Clean up and quit...")
  70. GPIO.cleanup()
  71. PWM.cleanup()
  72. print(e)