あいさつ
磁力を利用するタイプの開閉スイッチを使って、様々な扉の閉め忘れに対応できる警報システムを作ってみました。
作成理由
私は、RaspberryPiで解決したい課題を考えるに当たって、目を離した隙に赤ちゃんやペットがどこかに行ってしまうトラブルを防止しようと思いました。
そうした脱走が知らない間に起きてしまうのは、鍵の閉め忘れや故障が発生した状態で目を離して扉が開いてしまうことが原因だと考え、扉そのものを監視することで不意の開閉にいち早く気付けると思い、このシステムを製作しました。
使用部品
・Raspberry Pi 4
・市販の開閉運動スイッチ
システムの概要
本システムは、磁力センサが感知する磁力の有無で動作する開閉スイッチからの信号をラズベリーパイで読み取り、そのままプログラム内の条件式に当てはめて用意した動作を行うというシンプルな物です。
扉が「閉じている状態」と「開いている状態」の動作をそれぞれ用意して、開閉スイッチの信号の変化に素早く反応して状態の切り替えが出来るシステムを目指しました。
扉が閉じている状態の動作
開閉センサーから「扉が閉じている」という信号を受け取ると、扉が締められたことを示す音楽がブザーから奏でられると共に緑色のLEDが点灯して、視覚・聴覚の両方で扉の状態を通知します。その後、スイッチの信号が変化するまで静かにLEDが点灯し続けます。
これが、本システムの平常時の状態となります。
扉が開いている状態の動作
開閉スイッチからの信号が、「扉が開いている」状態になると、赤いLEDが点灯し「扉が閉じている」状態とは別の音を発して、扉が開いたことを通知する状態になります。警報は、信号を受け取った10秒後・20秒後にも流れ、3回に渡って「扉が開いている」ことを通知します。
閉め忘れ状態
それでも扉が閉じられない場合は、「閉め忘れ状態」として「扉が閉じている」状態に移行するまで、オリジナルの警報音をループさせて使用者が気付くまでオリジナルの警報音を発し続けます。
プログラムコード
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 #カウント用変数を宣言
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: #締め忘れ状態
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秒経過で警報
pin23.start(50) #duty比
# 第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: #中断して分岐に戻る
#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で出力して、扉の動きを継続的に通知します。
施錠の状態は感知できませんが、扉が開いた際の段階的な警報で使用者以外が扉を使用した場合も一早く気付くことが出来ます。
使用している開閉スイッチが小さく磁力の有無で感知しているので扉の形状に関わらず使用でき、ケージや窓などの感知にも用いることが出来ます。
-
kaburi
さんが
2024/09/30
に
編集
をしました。
(メッセージ: 初版)
-
kaburi
さんが
前の木曜日の15:48
に
編集
をしました。
-
kaburi
さんが
前の木曜日の16:22
に
編集
をしました。
-
kaburi
さんが
前の月曜日の9:07
に
編集
をしました。
-
kaburi
さんが
昨日の17:22
に
編集
をしました。
-
kaburi
さんが
今日の9:25
に
編集
をしました。
ログインしてコメントを投稿する