ラズパイで見守りセンサーを作ろう②(プログラミング編)

ICT
この記事は約10分で読めます。

皆さん、こんにちは。

昨今、IoT・ICTの技術が発展しており、センサやマイコンが簡単に入手できるようになりました。それと同時に少子高齢化社会を迎え、高齢者や共働き世帯における子ども帰宅確認など見守りの必要性も高まっています。本記事では、前回に続きラズパイを使い、人感センサで安否を確認し、その内容をLINEで通知するシステムについて解説を行いたいと思います。なお、ラズパイの準備や人感センサの繋ぎこみなどは、前回記事をご覧ください。

下準備(LINE Notifyのトークン取得)

LINE Notifyとは?

最初に、LINE Notifyのトークンを取得しましょう。LINE Notifyとは、各種WEBサービスと連携してLINEの通知を行うための仕組みです。今回は、このLINE Notifyを使い、人感センサの情報をLINEに通知します。

LINEのグループを作成

先ずは、通知を行うLINEグループを作成してください(通知するのが自分1名であっても、グループを作る必要があります)。手順は、LINEの「トーク」→「右上の+マーク」→「グループ」→「友達を選択」でグループに加える友達を選ぶ(自分にのみ通知する場合は、誰も選ばない)→「次へ」→グループ名を入力→右上の「作成」をクリックでOKです。

LINE Notifyにアクセスしログイン

LINE Notifyにアクセスしてください(https://notify-bot.line.me/ja/)。右上に「ログイン」ボタンがあるのでクリックし、登録してあるIDとパスワードを入力してください

「ログイン」ボタンがあった場所に自分のLINEのIDが表示されるのでクリックしてください。すると選択肢が表示されるので「マイページ」を選んでください。

トークンの発行

出てきた画面の「トークンを発行する」をクリックしてください。

出てきた画面の「トークン名」の欄に適当な名前を入力してください。そして、通知を行うグループを選択します(個々のIDには直接送付出来ず、グループで指定しなければなりません)。そして、「発行する」をクリックすると、「トークン」という英数字の羅列が表示されます。こちらは、画面を消すと二度と表示されないので、メモ帳などにコピーして保存しておいてください。後に使用します。

プログラム作成

メイン構造

プログラムのメイン構造ですが、以下の通りです。先ずは①現在時刻を取得し、②その時刻が正時であれば必要に応じて③④人感センサの作動状況レポートの送付を行います。また、⑤⑥設定した時刻に起床フラグをリセットし、その時刻以降にセンサが反応した際はLINEでお知らせするようにしています。その後、⑦人感センサの検知有無を判断し、検知していれば⑧合図のためにLEDを点滅させます。また、⑨人感センサ作動時に起床フラグが0であれば、⓾LINEで通知を行います(起床時・帰宅時等にお知らせをするイメージ)。以降、同じことを延々と繰り返します。

スクリプト

動作に必要なスクリプトは以下の通りです。先ほどの項目で示したループ部分は、中段のメインプログラム部分です。メインプログラム中のコメント番号は、上記メイン構造の図と一致しているのご確認ください。また、「LINEでメッセージを送るためのサブルーチン」にあるtokenに、先ほどLINE Notifyで取得したトークンを入力してください。そして、「sensor.py」など適当な名前で保存してください。

# -*- coding: utf-8 -*-
import requests
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
import time
import datetime
import math

# 初期値設定
DETEC_TIME = 0.3 # 人感センサの検索間隔
REPORT_TIME = [8, 10, 12, 14, 16, 18, 20, 22] # レポート送付時刻をリストに追加する
# 上記は、8時, 10時, 12時, 14時, 16時, 18時, 20時, 22時にそれぞれレポートを送付するという意味です
WUP_TIME = 6 # 起床フラグをリセットする時間

# GPIO初期設定
GPIO_SENSOR_PIN = 20 # 人感センサをつなぐGPIO
GPIO_LED_PIN = 26 # LED(検知用)をつなぐGPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_SENSOR_PIN,GPIO.IN)
GPIO.setup(GPIO_LED_PIN,GPIO.OUT)

# 変数初期化
wake_up = 0
past_min = 0

sensor_c = []
check_c = []
for i in range(24):
    sensor_c.append(0)
    check_c.append(0)
# 右記を作りたい sensor_c = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

# 起動確認のためLEDチカチカ
for i in range(3):
    GPIO.output(GPIO_LED_PIN, True) # LEDを点灯
    time.sleep(DETEC_TIME)
    GPIO.output(GPIO_LED_PIN, False) # LEDを消灯
    time.sleep(DETEC_TIME)

time.sleep(10)

def report(message): # LINEでメッセージを送るためのサブルーチン
    url = "https://notify-api.line.me/api/notify"
    token = "LINE Notifyで取得したトークンを入力"
    headers = {"Authorization" : "Bearer "+ token}

    line_send = {"message" :  message}
    requests.post(url ,headers = headers ,params=line_send)

# メインプログラム
try:
    while True:
        # ①時刻情報の取得
        dt_now = datetime.datetime.now()
        time_hour = dt_now.hour
        time_min = dt_now.minute

        # ②正時になった際の処理
        if(time_min < past_min): #59分→0分に変化
            # レポート送付
            if(time_hour in REPORT_TIME): # ③レポート送付時刻か
                # ④レポート送付
                message1 = ''
                for i in range(24): # 時間帯別のセンサ動作割合を整理
                     message1 += str(i) + '時:' + str(int(round(sensor_c[i] * 100 / max(check_c[i], 1)))) +'% ' 
                report(message1)

            # 起床フラグを初期化(この時間以降にセンサの動きを検知するとお知らせ)
            if(time_hour == WUP_TIME): # ⑤起床フラグリセット時刻か
                wake_up = 0 # ⑥起床フラグを0に
                
            sensor_c[time_hour] = 0 # 前日のセンサ情報を初期化
            check_c[time_hour] = 0 # 前日のセンサカウント回数を初期化

        # 人感センサ情報の取得
        if(GPIO.input(GPIO_SENSOR_PIN) == GPIO.HIGH): # ⑦人感センサ検知
            sensor_c[time_hour] += 1
            
            # ⑧LEDをチカチカさせて、人感センサの動作を確認
            for i in range(3):
                GPIO.output(GPIO_LED_PIN, True) # LEDを点灯(人感センサ検知をお知らせ)
                time.sleep(DETEC_TIME)
                GPIO.output(GPIO_LED_PIN, False) # LEDを消灯
                time.sleep(DETEC_TIME)
                
            if(wake_up == 0): # ⑨起床フラグが0か
                # LINEで通知を行い、フラグを1に変更する
                message2 = "おはよう!"
                report(message2)
                wake_up = 1  # 起床フラグを1に
        else:
            time.sleep(DETEC_TIME * 6) # 人感センサのスリープ
                
        past_min = time_min # past_minに現在の「分」情報を代入
        check_c[time_hour] += 1

except KeyboardInterrupt:
    GPIO.cleanup() # GPIO設定クリア
    
finally:
    GPIO.cleanup() # GPIO設定クリア

動作テスト

さて、いよいよ仕上げです。上記で作成した「sensor.py」をラズパイの適当な場所に保存し、実行してみてください(LX Terminalで「sensor.py」を保存したフォルダまで移動し、「python sensor.py」で実行可能です)。例えば、「/home/pi/raspi/sensor」にファイルを保存した場合は、「cd raspi」→「cd sensor」→「python sensor.py」とコマンドラインに入力すれば実行できます(ちなみに、cdはフォルダの移動を行うという意味です)。現在のフォルダに存在するファイルを知りたい場合は、「dir」と入力するとわかります。ここまで実施すれば、人感センサの作動状況に合わせてLEDが動作し、LINEにも通知が来るはずですが、如何でしょうか?

cronの設定

ここまでの作業で見守りシステムとしては作動しますが、ラズパイを再起動した際に自動的に「sensor.py」が動作する方が便利ですので、その処理も行っておきましょう。ここでは「cron」を活用します。先ず、①ラズパイでLX Terminalを起動しましょう。そして、コマンドラインに以下を入力してEnterを押してください。

crontab -e

初回起動時は、どのエディターを使うか聞かれます。「nano」が使いやすいと思うので、そちらを選択してください。そして、出てきた画面の最下部に以下を入力してください。

@reboot python /home/pi/raspi/sensor/sensor.py

上記は、再起動時に「sensor.py」を実行する指令です。「python」以降は、実際にファイルを保存したフォルダの場所を記載してください。その後「Ctrlキー」+「X」を同時押しすると、「保存しますか?」と聞かれるので「Y」キーを押してください。

設定は以上で終了で、ラズパイを再起動しても自動で「sensor.py」が実行されるはずです。

まとめ

後は、ラズパイに電源とLANケーブルを繋ぎ(もちろんWifiでもOK)、人感センサを人にいる向きに置いておけば、毎日LINEで報告をしてくれます。プログラム自体は単純なので、ご自分の都合の良いように改造してみてください。もし、動作が優れない際はラズパイを再起動してみてください。

ラズパイにカメラを取り付けて、プログラムを少し改造すれば、人感センサの動きが暫くない時に、写真を撮ってLINEに送ることもできるかと思います(プライバシーには注意してください)。それでは、ラズパイライフをお楽しみください!

免責事項

・本サイトの内容は、予告なしに変更・追加・削除等をする場合があります。
・本サイトおよび管理人は、本サイトの利用者が、本サイトの内容に依拠し、または本サイトの情報を信頼して行った行動等により被った、いかなる生命、身体、財産上の損失又は損害についても責任を負いかねます。

コメント

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