kaburi が 2024年10月30日09時25分20秒 に編集
コメント無し
本文の変更
### あいさつ 磁力を利用するタイプの開閉スイッチを使って、様々な扉の閉め忘れに対応できる警報システムを作ってみました。 ### 作成理由 私は、RaspberryPiで解決したい課題を考えるに当たって、目を離した隙に赤ちゃんやペットがどこかに行ってしまうトラブルを防止しようと思いました。 そうした脱走が知らない間に起きてしまうのは、鍵の閉め忘れや故障が発生した状態で目を離して扉が開いてしまうことが原因だと考え、扉そのものを監視することで不意の開閉にいち早く気付けると思い、このシステムを製作しました。 **使用部品** ・Raspberry Pi 4 ・市販の開閉運動スイッチ ## システムの概要 本システムは、磁力センサが感知する磁力の有無で動作する開閉スイッチからの信号をラズベリーパイで読み取り、そのままプログラム内の条件式に当てはめて用意した動作を行うというシンプルな物です。 扉が「閉じている状態」と「開いている状態」の動作をそれぞれ用意して、開閉スイッチの信号の変化に素早く反応して状態の切り替えが出来るシステムを目指しました。 ### 扉が閉じている状態の動作 > 開閉センサーから「扉が閉じている」という信号を受け取ると、扉が締められたことを示す音楽がブザーから奏でられると共に緑色のLEDが点灯して、視覚・聴覚の両方で扉の状態を通知します。その後、スイッチの信号が変化するまで静かにLEDが点灯し続けます。 これが、本システムの平常時の状態となります。 ### 扉が開いている状態の動作 > 開閉スイッチからの信号が、「扉が開いている」状態になると、赤いLEDが点灯し「扉が閉じている」状態とは別の音を発して、扉が開いたことを通知する状態になります。警報は、信号を受け取った10秒後・20秒後にも流れ、3回に渡って「扉が開いている」ことを通知します。
それでも扉が閉じられない場合は、閉め忘れている状態として「扉が閉じている」状態に移行するまで、オリジナルの警報音をループで出力して使用者が気付くまで警報を発し続けます。
**閉め忘れ状態** それでも扉が閉じられない場合は、「閉め忘れ状態」として「扉が閉じている」状態に移行するまで、オリジナルの警報音をループさせて使用者が気付くまでオリジナルの警報音を発し続けます。
```arduino:プログラムコード import RPi.GPIO as GPIO from time import sleep import sys # 出力ピン番号をBCMで指定する pwmpin = 23 # ブザー LED1 = 17 # 赤のLED LED2 = 27 # 黄のLED LED3 = 22 # 緑のLED # 音階の周波数指定 A4=440Hz基準 A3 = 220 B3 = 246 C3 = 261 D3 = 293 E3 = 329 F3 = 349 G3 = 392 A4 = 440 B4 = 493 C4 = 523 Q = 0.001 soundpitch = (60.0 / 80.0) - 0.1 bercount = 4 offtime = 0.1 / bercount soundoff = 0.1 # 音の切れ目の時間指定 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(pwmpin,GPIO.OUT) GPIO.setup(LED1,GPIO.OUT) GPIO.setup(LED2,GPIO.OUT) GPIO.setup(LED3,GPIO.OUT) pin23 = GPIO.PWM(pwmpin,10) GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP) #GPIO OPTION sw_status = 1 #SWITCH OPTION def LEDcheck(LED1,LED2,LED3): print("LED TEST") GPIO.output(LED1,True) GPIO.output(LED2,True) GPIO.output(LED3,True) sleep(1) GPIO.output(LED1,False) GPIO.output(LED2,False) GPIO.output(LED3,False) # START print("Start KONTEST.py") print("(Ctrl-C to EXIT)") print() try: #プログラムスタート # LEDのテスト LEDcheck(LED1,LED2,LED3) # ブザーのテスト print("Buzzer TEST") GPIO.output(pwmpin,GPIO.HIGH)
count = 0 #カウント用変数を宣言
count = 0 #カウント用変数を宣言
close_door = 0 #閉じられた直後を判定する関数を宣言 while True: sw_status = GPIO.input(18) #SWITCH STATUS if sw_status == 1: #閉じている状態 print("CLOSE") #print(sw_status) count = 0 #閉じられたらカウントを初期化 close_door += 1 pin23.start(0) #duty比 GPIO.output(LED1,False) GPIO.output(LED2,False) GPIO.output(LED3,True) if (close_door == 100): #閉じたことをブザーで通知 pin23.start(50) pin23.ChangeFrequency(E3) sleep(0.3) pin23.ChangeFrequency(F3) sleep(0.3) pin23.ChangeFrequency(G3) sleep(0.3) pin23.start(0)
else: #締め忘れ状態
else: #締め忘れ状態
print("OPEN") #print(sw_status) close_door = 0 #開けられたらカウントを初期化 count += 1 GPIO.output(LED1,True) GPIO.output(LED2,False) GPIO.output(LED3,False) if (count == 100) or (count == 5250) or (count == 10250): #開いた直後・約10秒後・約20秒後にアラーム pin23.start(50) pin23.ChangeFrequency(D3) sleep(0.2) pin23.ChangeFrequency(E3) sleep(0.3) pin23.start(0)
if count >= 15500: #約30秒経過したら #警報音
if count >= 15500:#締め忘れ状態 #約30秒経過で警報
pin23.start(50) #duty比
# 第1小節
# 第1小節 #オリジナル警報音の出力
pin23.ChangeFrequency(G3) sleep(0.5) pin23.ChangeFrequency(C3) sleep(0.3) pin23.ChangeFrequency(E3) sleep(0.4) pin23.ChangeFrequency(B4) sleep(0.3)
#if sw_status == 1: #中断して分岐に戻る
#if sw_status == 1: #中断して分岐に戻る
#continue # 第2小節 pin23.ChangeFrequency(B4) sleep(0.2) pin23.ChangeFrequency(G3) sleep(0.2) pin23.ChangeFrequency(C3) sleep(0.2) pin23.ChangeFrequency(F3) sleep(0.2) pin23.ChangeFrequency(B4) sleep(0.4) pin23.ChangeFrequency(E3) sleep(soundpitch) GPIO.output(pwmpin,GPIO.LOW) # LEDのテスト sleep(0.3) #LEDcheck(LED1,LED2,LED3) #全点灯はなし #分岐に戻る except KeyboardInterrupt: #停止 print("\nEND") pin23.start(0) #duty比 GPIO.output(LED1,False) GPIO.output(LED2,True) GPIO.output(LED3,False) sleep(1.5) #1.5秒間点灯 GPIO.cleanup() # クリーンアップして終了 ``` ### 使用時の活用方法 > 開閉状態の変化を音とLEDで出力して、扉の動きを継続的に通知します。 施錠の状態は感知できませんが、扉が開いた際の段階的な警報で使用者以外が扉を使用した場合も一早く気付くことが出来ます。 使用している開閉スイッチが小さく磁力の有無で感知しているので扉の形状に関わらず使用でき、ケージや窓などの感知にも用いることが出来ます。 #### まとめ