編集履歴一覧に戻る
kaburiのアイコン画像

kaburi が 2024年10月28日09時07分57秒 に編集

コメント無し

本文の変更

**あいさつ** 磁力を利用するタイプの開閉スイッチを使って、様々な扉の閉め忘れに対応できる警報システムを作ってみました。 **使用部品** Raspberry Pi 4 市販の開閉運動スイッチ **システムの概要** 本システムは、磁力センサが感知する磁力の有無で動作する開閉スイッチからの信号をラズベリーパイで読み取り、そのままプログラム内の条件式に当てはめて用意した動作を行うというシンプルな物です。 扉が「閉じている状態」と「開いている状態」の動作をそれぞれ用意して、開閉スイッチの信号の変化に素早く反応して状態の切り替えが出来るシステムを目指しました。 **扉が閉じている状態の動作** 開閉センサーから「扉が閉じている」という信号を受け取ると、扉が締められたことを示す音楽がブザーから奏でられると共に緑色のLEDが点灯して、視覚・聴覚の両方で扉の状態を通知します。その後は、センサの信号が変化するまで静かにLEDが点灯し続けます。 これが、本システムの平常時の状態となります。 **扉が開いている状態の動作** 開閉センサーからの信号が、「扉が開いている」状態になると、赤いLEDが点灯し「扉が閉じている」状態とは別の音を発して、扉が開いたことを通知する状態になります。警報は、信号を受け取った10秒後・20秒後にも流れ、3回に渡って「扉が開いている」ことを通知します。 それでも扉が閉じられない場合は、閉め忘れている状態として「扉が閉じている」状態に移行するまで、オリジナルの警報音をループで出力して使用者が気付くまで警報を発し続けます。 **実際の活用** 開閉状態の変化を音とLEDで通知するので、閉め忘れた場合には素早く気付くことが出来るようにします。 施錠の状態は感知できませんが、扉が開いた際の段階的な警報で使用者以外が扉を開いた場合も一早く通知します。 使用している開閉スイッチが小さく磁力の有無で感知しているので扉の形状に関わらず使用でき、ケージや窓などの感知にも用いることが出来ます。 ```arduino:プログラムコード

-

#define LED_PIN 13

-

void setup() { pinMode(LED_PIN, OUTPUT); }

+

import RPi.GPIO as GPIO from time import sleep import sys

-

void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); }

+

# 出力ピン番号を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() # クリーンアップして終了

```