ドアオープンを開けて閉じた時だけ検出する

マグネットスイッチを使ってドアオープン検出をする例はよく見るが、開いたら開いたで検出、閉じたら閉じたで閉じている状態を検出しているだけ、の例はよく見るが、開けて閉じた、の閉じたを検出したい。

from gpiozero import Button
from line import
from time import sleep
import subprocess

# 初期化
SW_GPIO = 21

# ButtonクラスでGPIOピンを指定し、プルアップを指定
button = Button(SW_GPIO, pull_up=True)

# 写真のパスとファイル名
PHOTO_PATH = '/home/pi/image.jpg'

# 状態の初期化
old_state = button.is_pressed

# 無限ループ
while True:
    try:
        # 現在の状態を取得
        new_state = button.is_pressed

        # 条件分岐
        if old_state and not new_state:
            pass
            # print('Close')
        elif not old_state and not new_state:
            pass
            # print('Open')
        elif old_state and new_state:
            pass
            # print('Close->Open')
        elif not old_state and new_state:
            try:
                # 写真を撮影し、LINEへ送信
                subprocess.run(f'fswebcam -r 640x480 -F 1 -S 0 {PHOTO_PATH}', shell=True)
                line.line_photo("\n玄関ドアが開いたよ", PHOTO_PATH)
            except:
                pass
            pass
            # print('Open->Close')

        old_state = new_state
        sleep(0.1)
    except:
        # エラーや強制終了の場合
        print('Err')
        break

# 終了処理
print('End')

これはとても安定して動く。もう、5年は動かしている。当初はRPi.GPIOで書いていたが、gpiozeroに直した。

#line.py
import requests
def line_photo(message: str, photo_path: str):
    #token='取得したtoken'
    url = "https://notify-api.line.me/api/notify"
    headers = {"Authorization": "Bearer " + token}
    params = {"message":  message}
    files = {"imageFile": open(photo_path, "rb")}
    r = requests.post(url, headers=headers, params=params, files=files)
    print(r.text)
if __name__ == '__main__':
    default_path = "/home/pi/image.jpg"
    line_photo("\nラズパイから写真を送信", default_path)

これでLINEに画像を送信。USBカメラはC270nを使用。玄関ドアを開ける、誰かが入る、ドアを閉じる、画像を撮影、LINEに送信、という流れで誰が帰って来たかがわかる。

コメント

タイトルとURLをコピーしました