LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

【Raspberry Pi】人感センサーが感知したらtimestampをFirebase Realtime Databaseに格納する

はじめに

この記事は全4章からなる記事の第3章です。

  1. IoTを駆使してお年寄りの家を見守る「だけじゃない」システムを作った【SORACOM Summer Challenge 2020】
  2. LTE-M Buttonが押されたらLINE BotへPushメッセージを送る【SORACOM】
  3. 【Raspberry Pi】人感センサーが感知したらtimestampをFirebase Realtime Databaseに格納する :arrow_backward: 今ココ
  4. SORACOMと家電とLINE Botを連携させる【Python / Flask / Raspberry Pi】 全ソース公開

きっかけ

人感センサーが反応した時刻や1時間以内に反応した回数をLINE Botに通知したい。ローカルでSQLを動かしてもいいが、人感センサーを取り付けたラズパイとLINE Botのサーバとして使っているラズパイが別々なのでクラウドデータベースに格納したほうが楽なのではないかと思い、定番のFirebaseを使用。

ラズパイと人感センサーを繋ぐ

使ったもの

  • Raspberry Pi 3 Model A+(これより上位のものならOK)
  • 人感センサーモジュール
  • ジャンパーワイヤー(メス-メス)

人感センサーはこちらのメーカのものを使いました。
人感センサー

接続

【Raspberry Pi】自作人感センサーの使い方と活用法をそのまま使わせてもらいました。
GPIOの接続間違いには気を付けてください(私は12番ピンとGroundを間違えて動かないというミスをしでかしました)。

Firebase

[python] Firebase Realtime Databaseのはじめ方を参考しさせていただきました。

パッケージのインストール

以下のコマンドでラズパイにfirebase-adminをインストールします

$ pip install firebase-admin

Databaseの作成とルールの変更

FirebaseのコンソールからDatabaseを作成します。Cloud FirestoreRealtime Databaseがありますが、今回はRealtime Databaseなので注意してください。
ルールを以下のように変更します。
※ テスト用ですので実際に運用する場合は適切なルール設定をしてください

また、「プロジェクトの概要」の右側にある歯車からプロジェクトを設定 > サービスアカウント > Firebase Admin SDKに移動し、Pythonを選択してコピー、また新しい秘密鍵の生成をクリックして、ダウンロードした秘密鍵をラズパイに保存します。

人感センサーとDatabaseの連携

以下がコードです

firebase.py
import firebase_admin
from firebase_admin import credentials
from firebase_admin import db
from datetime import datetime
import time
import RPi.GPIO as GPIO

cred = credentials.Certificate("<ダウンロードした秘密鍵>.json")
firebase_admin.initialize_app(cred, {
    'databaseURL': 'https://<databaseURL>.firebaseio.com/'
})

ref = db.reference('data')

INTERVAL = 3
SLEEPTIME = 20
GPIO_PIN = 18

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

while True:
    if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
        print(datetime.now().strftime('%Y/%m/%d %H:%M:%S'))
        new_data_ref = ref.push()
        new_data_ref.set({
            'timestamp': {'.sv': 'timestamp'}
        })
        time.sleep(SLEEPTIME)
    else:
        print(GPIO.input(GPIO_PIN))
        time.sleep(INTERVAL)

感知したらDatabaseにtimestampとともにPushします。Pushすることで一意のIDが生成されます。どうやらそのIDも時系列みたいです。

timestampの登録について

こちらのIssueでもありますが、Pythonのfirebase-adminモジュールからタイムスタンプを登録するには一癖あるみたいなので、上記の'timestamp': {'.sv': 'timestamp'}のところが参考になれば幸いです。

デモンストレーション

このように、検知するとRealtime Databaseに書き込まれます。

UNIX時間の1597307961996は2020/08/13 17:39:21なので完璧ですね。

まとめ

以上、人感センサーの反応時刻をFirebase Realtime Databaseに格納するまででした。
次はそのデータを別のラズパイから取得します。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2