Python

ラズパイからLINEに通知を送る with 人感センサー

スポンサーリンク

どうも。まっきーです!

人感センサーで人を感知してLINEで送るシステム面白そう!と思って検索をしてみると、既にやっている人がたくさん…

やはり凡人の考えることは基本的に誰かが行ってくれている。

ありがたいことなのですが、いつかは自分のオリジナルのものを作ってみたいものです。

今回はありがたく先人の方の知恵をお借りして、「人感センサーで人を感知したらLINEに通知を行う」システムを作っていきます!

必要なもの

  • RaspberryPi 3B+
  • 人感センサー
  • ジャンパー線(可能ならメス・メス)
  • 携帯

今回使用した人感センサーはOsoyooの初心者キットに付属していた、「HC-SR501ボディセンサーモジュール」です。Amazonから購入できます!輸入品はめちゃくちゃ安いです。

ラズパイで人感センサーを作成する

人感センサーの仕様

製品タイプ:HC-SR501ボディセンサーモジュール
電源電圧:DC5-20V
待機時消費電流:65μA以下
出力電圧:高い3.3V 低0V
動作モード:Lは、リピートしないモード、Hはリピートモード(デフォルトはH)
遅延時間範囲:0.3s to 18s
待機時間:0.2s
基板サイズ:32mm*24mm
検知角度:120度
最大検知距離:7m(気温等の環境条件によります)
操作温度:-15~+70℃
焦電センサ制御IC:BISS0001
ネジ穴:2mm、28mm間隔
レンズ:直径23mmドーム型

HC-SR501赤外線センサ人感センサモジュールより

以下のように、簡単に取り外すこともできます。

黄色のダイヤルで感度と検知保持時間を延長できます。

感度は最大7mだそうです。自分の目的に合うようにドライバーなどを用いて調節してください!

延長時間調整は、最初に検知してから、検知出力を保持する時間を(0.3秒~15秒)に調整できます。検知後に対象物が圏外に出てもこの時間内は検知状態が保持されます。プログラム内でも操作できるので一番左でもいいかなと思います。

回路図

回路図というほどのものでもないですが、こんな感じです。

GPIOのピンはお好みで。今回は25にしてあります。

ソースコード

import RPi.GPIO as GPIO
import time 
try:
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(25,GPIO.IN)

    while True:
        if(GPIO.input(25) == GPIO.HIGH):
            print("感知しました")
            time.sleep(2)
        else:
            print(GPIO.input(25))
            time.sleep(2)
                  
except KeyboardInterrupt:
    print("中断中...")
finally:
    GPIO.cleanup()
    print("GPIOclean")
        
    

感度は目的に合わせて調節してみてください。一度反応すると感知から戻るまでに時間がかかるようです。(下図)合わせる際にはもう少しsleepを長めに取ります。

LINEに通知を送る

次に、LINEに通知を送る設定を行っていきます。

LINE Notifyの設定

https://notify-bot.line.me/ja/ こちらからLINE Notifyのページに移動する。

ここからの設定はPCで行ってください。

手順は以下の通りです。下の画像を見るだけで登録できると思います。

  1. LINE Notifyと友達になる
  2. LINEにログインする
  3. マイページへ行く
  4. アクセストークンを発行する
  5. トークン名、通知場所を設定する
  6. トークンをコピーして保存しておく

以上です。トークンは一度しか生成されませんので、忘れた場合は再度同じ手順で発行しましょう。

ソースコード

Python側の設定を行っていきます!

import requests

url = "https://notify-api.line.me/api/notify"
access_token = '取得したアクセストークン'
headers = {'Authorization': 'Bearer ' + access_token}

#メッセージを送信
message = 'ここにメッセージを記入'
payload = {'message': message}
r = requests.post(url, headers=headers, params=payload,)

'''
#画像を送る場合もメッセージは必須
message = 'Write Your Message'
image = 'test.png'  # png or jpg
payload = {'message': message}
files = {'imageFile': open(image, 'rb')}
r = requests.post(url, headers=headers, params=payload, files=files,)
'''

このコードを実行すると、LINEに通知がいきます。

メッセージのみの場合

試しにmessageのところを「raspiです」にして実行してみます。

このように通知が送られてきました。

画像の場合

下側のコードを使って、画像を送ってみましょう。画像を送る際もメッセージは必須です。メッセージがないと、通知も何もいかないという状態になるので注意が必要です。実行すると、

メッセージと一緒に画像が送信されていることを確認できました。

人を感知したらLINEに通知を送る

では、本題「人を感知したら通知を送る」に取り組んでいきます。

ソースコードは以下の通りです。

ソースコード

import RPi.GPIO as GPIO
import time
import requests

url = "https://notify-api.line.me/api/notify"
access_token = 'Your Access Token'
access_token = 'SupzUEpGZeyCQNjk0WhkmBZX62aiRvDdknaCX61MnIv'
headers = {'Authorization': 'Bearer ' + access_token}

try:
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(25,GPIO.IN)
    time.sleep(2)

    while True:
        if(GPIO.input(25) == GPIO.HIGH):
            print("感知しました")
            time.sleep(10)
            #メッセージを送信
            message = '人を感知しました'
            payload = {'message': message}
            r = requests.post(url, headers=headers, params=payload,)
        else:
            pass
                  
except KeyboardInterrupt:
    print("中断中...")
finally:
    GPIO.cleanup()
    print("GPIOclean")
        
    

人感センサーのコードと合わせただけです。

検知の頻度がどうしても高くなってしまうので、sleepを長めに取っています。

結果

手をかざすと、以下のように通知が送られてくることを確認できました。

いかがでしたでしょうか。思っていたよりも簡単に実装できたと思います。これを活用して、次回は動体検知をしたら通知を送る防犯カメラを作成したいと思います。

最後までありがとうございました!

スポンサーリンク

-Python