Grove:心拍センサ
Groveの心拍センサを接続し、Tibbo-Piのデジタル入力機能を使って、センサにより心拍情報および心拍数を取得します。
(Groveデバイスの詳細は上記リンクから参照願います。)
Tibbitの配置
Tibbit #00-3 と Groveデバイスを接続したTPbit #02を挿入します。
ノードの配置
鼓動検知時動作
鼓動が検知されたときと検知が解除されたときのみデータを取得します(イベント動作)。
以下のようにフローを配置します。
Tibbit#00ノードの設定を開き、以下のようにスロットとIN_Edgeを選択します。
Node-REDデプロイ後、センサのクリップを耳たぶに挟むと、鼓動発生時(心臓収縮時)、変数「v」として「1」が、心臓拡張時「0」が取得できます。
サンプルフロー
1 |
[{"id":"97cf263a.a70bd8","type":"Tibbit-#00 in","z":"c2fa6897.58c3f8","name":"","tpSlot":"S01","communication":"GPIO","outputOnly":true,"pinA":"IN_Edge","pinB":"other","pinC":"other","pinD":"other","serialConf":"","connectedStatus":"start","host":"","x":300,"y":140,"wires":[["3bad4c7.6e81ab4"]]},{"id":"3bad4c7.6e81ab4","type":"debug","z":"c2fa6897.58c3f8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":510,"y":140,"wires":[]}] |
心拍数演算
心拍数(1分あたりの鼓動数=bpm)を演算します。
switchノードとfunctionノードを使用します。
以下のように、上記の「鼓動検知時動作」のフローの間にノードを追加配置します。
switchノードのプロパティを開き、鼓動発生時のみ以降の動作を行うよう、以下のように設定します。
次に「鼓動間隔msec」のfunctionノードに、鼓動間隔を演算するように、以下のようにJavaScriptでコードを書き込みます。
さらに「心拍数bpm」のfunctionノードに、最新3つの鼓動間隔msecの値から1分間の鼓動数を演算するよう、以下のようにJavaScriptでコードを書き込みます。
Node-REDデプロイ後、3つの鼓動間隔msec情報取得するまでは「wait…」と表示され、それ以降は心拍数(1分あたりの鼓動数=bpm)が表示されます。
サンプルフロー
1 |
[{"id":"b980367c.f30c48","type":"Tibbit-#00 in","z":"c2fa6897.58c3f8","name":"","tpSlot":"S01","communication":"GPIO","outputOnly":true,"pinA":"IN_Edge","pinB":"other","pinC":"other","pinD":"other","serialConf":"","connectedStatus":"start","host":"","x":200,"y":280,"wires":[["a312f462.6c7238"]]},{"id":"847d1cb3.97fc9","type":"debug","z":"c2fa6897.58c3f8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":670,"y":440,"wires":[]},{"id":"b20a2224.0feaa","type":"function","z":"c2fa6897.58c3f8","name":"鼓動間隔msec","func":"var cur_time = Date.now();\nvar old_time = context.get('old_time') || cur_time;\nmsg.payload = cur_time - old_time; // 最初は0が入る\ncontext.set('old_time', cur_time);\nreturn msg;","outputs":1,"noerr":0,"x":420,"y":360,"wires":[["7b41b8f1.b9dbd8"]]},{"id":"a312f462.6c7238","type":"switch","z":"c2fa6897.58c3f8","name":"鼓動時","property":"payload.v","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":310,"y":320,"wires":[["b20a2224.0feaa"]]},{"id":"7b41b8f1.b9dbd8","type":"function","z":"c2fa6897.58c3f8","name":"心拍数bpm","func":"// 鼓動間隔データ配列に確保\nvar val = context.get('val') || [];\nval.push(msg.payload);\nif (val.length > 3) val.shift();\ncontext.set('val', val);\n\n// 心拍数演算\nif (val.length == 3 && val[0] !== 0) {\n var sum = 0;\n for (var i = 0; i < 3; i++) {\n sum += val[i];\n }\n var avrg = sum / 3;\n bpm = 60 * 1000 / avrg; // 心拍数\n msg.payload = Math.round(bpm * 10) / 10; // 小数第一位で四捨五入\n} else { // データが3つ集まるまではwait\n msg.payload = 'wait...';\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":550,"y":400,"wires":[["847d1cb3.97fc9"]]}] |