Raspberry Pi(人感センサー)

目次Raspberry Piロボット|センサー(温度・気圧・湿度人感)|赤外線リモコン読み上げMQTT連携IFTTT連携

ここでは、赤外線人感センサを試してみます。感知情報をメールやLINEで通知する方法も紹介いたします。

人体赤外線感応モジュールの仕様

HC-SR501の仕様

モジュールの説明

接続図

動作確認

次のプログラム(sr510.py)で動作確認します。この時に遅延時間の設定や感度の設定も調整します。

from datetime import datetime
import time
import RPi.GPIO as GPIO
GPIO_PIN = 12

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN)

if __name__ == '__main__':
    try:
        print ("処理キャンセル:CTRL+C")
        cnt = 1
        while True:
            # センサー感知
            if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
                print(datetime.now().strftime('%Y/%m/%d %H:%M:%S') +
                str(" 感知、回数({:d})").format(cnt))
                cnt = cnt + 1
            else:
                print(datetime.now().strftime('%Y/%m/%d %H:%M:%S') + " なし")
            time.sleep(3)
    except KeyboardInterrupt:
        print("終了処理中...")
    finally:
        GPIO.cleanup()
        print("GPIO clean完了")

メールで通知する

メール送信プログラム(sendmailm.py)です。sendmailmをimportしてお使いください。
下記の項目をプロバイダーメールサーバや独自(レンタルサーバー・等)メールサーバ指定の内容に書き換えてください。

※gmailサーバを使う場合はの注意事項
import smtplib
from email.utils import formatdate
from email.mime.text import MIMEText
def sendmail(msgtext): 
    # Gmailアカウント設定
    send = smtplib.SMTP("smtp.abcd.jp", 587)  # 送信メールサーバーアドレスとポート番号を指定する
    send.ehlo()
    send.starttls()
    send.ehlo()
    send.login("raspberry@pi.com","pasxxxx")  # ログインメールアドレスとパスワードを指定する
 
    # 送信メール情報    
    # メールメッセージを作成
    body = msgtext   # 本文
    msg = MIMEText(body, "plain", "utf-8") 
    msg["From"] = "raspberry@pi.com" #   送信元メールアドレス
    msg["To"] = "efgh@docomo.ne.jp"  # 送信先メールアドレス
    msg["Date"] = formatdate()          # 日付の設定
    msg["Subject"] = "Raspberyy Pi メッセージ"   # 件名

    # メール送信
    send.send_message(msg)          # メールを送信
    send.close()
    print("メール送信完了")  # 完了メッセージ表示

if __name__ == "__main__":
    sendmail("テストメッセージ")

感知通報プログラム

下記の仕様で作成しました。利用状況に応じて変更して、お試しください。

感知通知プログラム(sensor510.py)は下記の通りです。

from datetime import datetime
import time
import sendmailm 
import RPi.GPIO as GPIO
GPIO_PIN = 12

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN)

if __name__ == '__main__':
    interval = 60
    offtime  = 300
    status = "standby"
    print(datetime.now().strftime('%Y/%m/%d %H:%M:%S') + " 監視開始")
    try:
        print ("処理キャンセル:CTRL+C")
        cnt = 1
        while True:
            # センサー感知
            if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
                if ( status == "standby" ) :
                    tmp = (datetime.now().strftime('%Y/%m/%d %H:%M:%S') +
                          str(" 感知中、回数({:d})").format(cnt))
                    print(tmp)
                    sendmailm.sendmail(tmp)
                    status = "active"
                cnt = cnt + 1
                onSS = time.time()
                time.sleep(interval)
            else:
                if ( (onSS + offtime ) < time.time() and status == "active" ) : # 休止?
                    tmp = (datetime.now().strftime('%Y/%m/%d %H:%M:%S') + " 待機")
                    print(tmp)
                    sendmailm.sendmail(tmp)
                    status = "standby"
                offSS = time.time()
                time.sleep(interval)
    except KeyboardInterrupt:
        print("終了処理中...")
    finally:
        GPIO.cleanup()
        print("GPIO clean完了")

LINEで通知する

line2
「Webサービスからの通知をLINEで受信」のWebサイト(https://notify-bot.line.me/ja/)より、LINE Notifyのトークンを取得します。

サンプルプログラムは下記の通りです。requestsライブラリ(PythonのHTTP通信ライブラリ)なしの場合は
「pip install requests」コマンドでrequestsをpipからインストールします。

通知プログラム(linem.py)は下記の通りです。linemをimportしてお使いください。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
def sendline(msgtext): 
    url = "https://notify-api.line.me/api/notify" 
    token = "-------発行されたトークン-------"
    headers = {"Authorization" : "Bearer "+ token} 
    message =  msgtext 
    payload = {"message" :  message} 
    r = requests.post(url, headers = headers, params=payload) 
    print("LINE 送信完了")  # 完了メッセージ表示

if __name__ == "__main__":
    sendline("テストメッセージ") 

目次Raspberry Piロボット|センサー(温度・気圧・湿度人感)|赤外線リモコン読み上げMQTT連携IFTTT連携