ラズパイでサーモセンサーからデータがとれたので
ラズパイとサーモセンサーで遊ぶ - konchangakita
いつものようにラズパイと KPS との連携をしてみます
なるべく KPS の特性を活かすべくラズパイ側ではセンサーデータを送信するだけにして、KPS 上の Function / Kubernetes Apps で可視化させます
(この方がたくさんのセンサーとつないだときに、なんらか処理を追加するのも一括でアップデートできるしね)
<やることイメージ図>
=環境=======
Raspberry Pi 4 Model B Rev 1.2
Raspbian kernel 5.4
python 3.7.3
KPS v2.1.0
=========
ラズパイの設定
AMG8833サーモセンサ と ラズパイカメラを接続したラズパイ上に Python プログラムを設置して、MQTT で Pub/Sub します
Python 環境の準備
Python のモジュールのインストール
・AMG8833サーモセンサ用: adafruit-blinka, adafruit-circuitpython-amg88xx
・MQTT用: paho-mqtt
MQTT の証明書を、KPS の Data Sources の登録の際に入手して設置します(後述)
│ ├── CACertificate.crt
│ ├── certificate.crt
│ └── privateKey.key
└── thermosensor.py
KPS へ送信する情報
ラズパイから MQTT で送信するデータは、大きく2つでサーモセンサーの温度データとラズパイカメラの画像データになります
・サーモセンサー
sensordata:8 x 8 の温度マップデータ
sensordata_t1d:Node-RED の ヒートマップ用に 1次元に変換
max_temp:一番高い温度、体温として表示する
KPS データプイプライン設定
KPS へ Data Source 登録
まずはラズパイを KPS の Data Source として登録します
サーモセンサ トピック名: data/thermo
ラズパイカメラ トピック名: data/image
カテゴリ: Data Type: Thermo
データパイプラインの作成
今回は、Function は一旦無しでスルーで Node-RED へまたMQTTへとばしちゃう
KPS Kuberenetes Apps の Node-RED に接続
いつもの KPS 上に展開している Node-RED に接続し、ノードを組み合わせていきます
「MQTT受信」ノードで KPS Service Domain の IPアドレス:1883 を指定
MQTT 用の証明書もラズパイと同様に TLS設定に設置しておきます
サーモセンサ可視化
サーモセンサーから送信されてくる温度情報をヒートマップで可視化して、温度も表示します
温度表示に 「Functtion」ノードで max_temp を適切な数値調整して表示
ヒートマップの表示には、1次元の配列である必要であるため(heat mapノードの仕様) payload.sensordata_t1d を「Change」ノードで payload へ代入し、「heat map」ノードへ送る
これでばっちしサーモセンサからヒートマップ可視化ができました
ラズパイカメラの画像を表示
Base64 でエンコードされたラズパイカメラの画像をただ表示するだけなので簡単です
ラズパイカメラの 「MQTT受信」ノード
「template」ノードで、base64デコードして画像として表示させる
これで可視化ほぼ完成
サーモセンサとラズパイカメラの位置関係はこんな感じ
サーモセンサーと手は5センチくらい?
距離センサーと組み合わせて、「特定の距離で温度が測定できたら表示する」とかにすれば、最近よく巷で見かける非接触体温測定機ができちゃいそうです
今まで作ってきたKPSアプリと組み合わせたら、アイデア次第で入退室管理+マスク検知+密検知して、全部エッジ環境に保存とか今まで作ったもので「何か」出来そう
どっかKPSのライセンス料払って置かせてくれないかな(笑)
Node-RED のフロー全体
[{"id":"fecb278d.e7c9e8","type":"template","z":"c12ca503.8449e8","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<center>\n <img src=\"data:image/jpg;base64,{{{payload}}}\">\n <br><b1><i>raspi camera</i></b1>\n</center>","output":"str","x":438.5,"y":478,"wires":[["78f1b96c.9cb0d8"]]}]