第28回 熱中症アラーム製作

フルカラーLEDと温湿度センサ、Dashboard使い方のまとめとして、熱中症アラームを作成してみます。

今回の記事で製作する熱中症アラームはあくまで参考の情報となります。熱中症は、活動場所や日当たり、風通しなどにより差があります。また、個人差もありますので利用の際は十分注意してください。

目次

熱中症と暑さ指数

毎年夏になると、天気予報などで熱中症の話題が出てきますよね。特に、気温と湿度が高い場所にずっといたり、炎天下で過度な運動を行うと熱中症になる危険性が高くなります。

以下の図は、厚生労働省が発行している「熱中症を防ごう!」というパンフレットに記載されている、気温・湿度と熱中症の関係を表したものです。

WBGT指数早見表

※厚生労働省「熱中症を防ごう!」より引用

上の図は、現在の気温と湿度から「暑さ指数」を算出する早見表です。例えば、気温が27度で湿度が90%のとき、暑さの指数は気温と湿度の交点から暑さ指数は「29」と読み取ることができます。

この指数は体感温度のようなもので、「WBGT指数」と呼ばれています。最近の天気予報では「WBGT指数」の予報をしていることも多くなってきました。

このWBGT指数は、25を超えると熱中症に警戒、28を超えると厳重警戒、さらに31を超えると危険という判定になっています。

WBGT指数では、例えば気温が27度の場合、湿度が50%の時は危険性はそれほど高くありませんが、湿度が65%を超えると熱中症に警戒、85%を超えると厳重警戒になってしまいます。

このように、熱中症は気温だけでなく、湿度の影響もかなり受けます。

ところで、熱中症の指標となるWBGT指数は、スマホの天気アプリなどで知ることができますが、居場所によりかなり差があるので注意が必要です。

例えば天気予報などでWBGT指数が問題ない場合でも、締め切った部屋にいる場合はその部屋の中のWBGT指数は高くなって危険なケースもあります。

現在製作している回路には、温湿度センサとフルカラーLEDがあります。今回の記事では、実際に今いる部屋の温湿度を測定して熱中症の危険度を判定するフローを作成してみます。

動作仕様

これから製作する熱中症アラームは、以下のような動作仕様にします。フルカラーLEDの発光色やDashboardに表示する内容は、ぜひご自身の好みに合わせてカスタマイズしてみてください。

  • 5秒間に1回、温湿度センサで気温と湿度を測定する
  • 測定したデータからWBGT指数を計算する
  • WBGT指数に応じて、フルカラーLEDの色を変更する
  • 同時に、Dashboardにも熱中症アラームの情報を表示する

なお、Node-REDにはWBGT指数を計算するノードはありません。そこで今回の記事では、functionノードを使用してJavaScriptでWBGT指数を計算するプログラムを制作します。

プログラミングに慣れていない場合、プログラム中にコメント(先頭が「//」で始まる行)で何をしているか説明しますので、functionノードが何をしているかを把握するようにしてみてください。

WBGT指数の計算式

WBGT指数の計算方法はいくつかあるようですが、この記事では環境省が提供している「熱中症予防情報サイト」のWBGT計算式を参考にしました。

環境省 熱中症予防情報サイト(別ウィンドウで開きます)
https://www.wbgt.env.go.jp/wbgt.php

WBGT指数は以下の式により計算します。

WBGT指数 = 0.735×気温 + 0.0374×湿度 + 0.00292×気温×湿度 + 7.619×日射量
− 4.557×日射量×日射量 − 0.0572×風速 − 4.064

なんだかすごい式ですね…

この式で使用している数値の単位は、気温は摂氏(℃)、湿度は%、日射量はkW/平方メートル、風速はm/sです。

この式からわかるように、WBGT指数は気温と湿度以外に、日射量と風の強さが関係してきます。確かに日が当たっているところと日陰では体感温度は違いますし、風の強さによっても気温の感じ方は違ってきますよね。

今回製作する熱中症アラームは、カーテンなどである程度遮光した屋内での使用を想定し、日射量は0.3kW/平方メートル、風速は0m/sにしました。(この値がWBGT指数早見表に合うようです)

熱中症アラームのフロー作成の概要

前回までの記事で作成したフローは以下のようになっています。

「フルカラーLED制御」フローは、以下のように色を指定する値を送ると、フルカラーLEDを指定した色で光らせることができます。フルカラーLEDを好きな色で点灯したい場合、このフローが流用できます。

フロー流用1

また「温湿度センサ」フローでは、温湿度センサを使用して気温と湿度が計測できるようになっています。温湿度の測定はこのフローが流用できます。

フロー流用2

今回はこれらのフローを流用して熱中症アラームのフローを作成してみます。

具体的には、以下のような順番で処理をすることにします。なお、以下のフローの図でピンク色の部分は今回新規に作成、追加するノードです。

  1. 温湿度センサで温湿度を計測して、
  2. WBGT指数を計算して、
  3. 熱中症警戒レベルを判定して、
  4. フルカラーLEDの発光色を決めてフルカラーLEDを点灯する

フロー全体像

このように既存フローを流用して作成しますが、意外にやることは多くなりそうです。そこで、これから行う作業のながれを最初にまとめておきます。

  1. 温湿度センサの値取得
    現在のフローでは、温湿度センサの値は「温湿度センサ」フローのタブで取得しています。ここで取得した値を「フルカラーLED制御」フローのタブで使用します。
    このように、あるフロータブから別のフロータブへメッセージを送りたい場合があります。このような場合にフローをまたがってメッセージを送る方法を習得します。
  2. WBGT指数の計算
    先ほど説明したように、Node-REDにはWBGT指数を計算するノードはありません。以前のフルカラーLED制御の記事で使用した、任意の機能が実装できる「function」ノードを使用してWBGT指数をJavaScriptで計算するノードを作成します。
  3. 熱中症警戒レベル判定
    WGBT指数が計算できたら、熱中症警戒レベルを判定します。今回は3段階で判定することにします。
  4. LED発光色の値を送る
    熱中症警戒レベルの判定ができたら、そのレベルに応じたLEDの発光色の値(16進数6桁)を送ります。

熱中症アラームのフロー作成

これから上の順番で作業を進めますが、最初にタブの整理を整理します。タブの整理後、上の順番で作業を進めます。

フルカラーLED制御フローの保存とフロー名変更

熱中症アラームは、現在の「フルカラーLED制御」タブのフローを変更して作成します。

そこで「フルカラーLED制御」タブを変更する前に、このフローを保存しておいてください。(保存方法を忘れてしまった場合は第24回の記事を確認してください)

次に「LED色設定」ノードは必要ありませんので、削除します。また、タブ名を「熱中症アラーム」に変更します。

フロー準備1

この状態で一度デプロイしてみてください。おそらく以下のようないつもと違うメッセージが表示されたと思います。

フロー準備2

いつもは「デプロイが成功しました」だけ表示されますが、今回は追加で「使われていないノードかあります」と表示されています。

すべてのノードは設定済みですし使用していますので、このようなメッセージが表示されるのは不思議ですよね。

これからその理由と対処方法を説明しますが、かなり細かい話になります。以下の説明部分は飛ばして読んでいただいて構いません。(このメッセージはあまり気にする必要はありません)

ちょっと複雑なのですが、これから理由と対処方法を説明しておきます。

このメッセージは「LED色設定」ノード(Dashboardのcolour pickerノード)を削除したら表示されるようになってしまいました。

この「LED色設定」ノードは、Dashboardの「GPIOスイッチ」グループに表示していましたよね。

フロー準備3

Dashboardの「GPIOスイッチ」グループには、この「LED色設定」ノードしか表示していませんでした。

今回、「LED色設定」ノードを削除したことにより「GPIOスイッチ」グループに表示するものがなくなってしまったわけです。

フロー準備4

実はDashboardの「グループ」は、Node-RED内部では「ノード」として扱われています。このノードは通常のノードとは異なり「設定ノード」と呼ばれています。

つまり「GPIOスイッチ」ノード(設定ノード)は、何も表示するものがない=使われていないノード、という扱いになってしまいました。

そのため、先ほどデプロイしたときに「使われていない設定ノードがあります」と表示されていたわけです。

「GPIOスイッチ」設定ノードは使っていないだけで、何か動作に影響するわけではありませんのでこのままで構いません。

ただ、今後は同様なケースが発生して削除する機会もあると思いますので、削除方法を説明します。

削除する方法は2通りあります。

Dashboadメニューの「GPIOスイッチ」グループを削除

最初に右上の「▼」メニューをクリックしてDashboardメニューを表示します。

フロー準備5

次に「GPIOスイッチ」グループの編集ボタンをクリックして設定画面を表示します。

フロー準備6

設定画面に削除ボタンがありますのでクリックすると削除できます。

フロー準備7

削除後はメッセージは表示されなくなります。

設定ノードメニューから「GPIOスイッチ」ノードを削除

右上に歯車アイコンの「設定ノード」メニューがありますのでクリックします。

フロー準備8

クリックすると、以下のように設定ノードが表示されます。ちょっとわかりづらいですが、各設定ノードの中に数字が書いてあります。

フロー準備9

この数字が0の設定ノードは、使われていない状態を意味しています。

設定ノード名が全部表示されていませんが、0のノードが「GPIOスイッチ」ノードですので、クリックして選択状態にして削除キー(deleteキー)を押すと削除できます。

削除後はメッセージは表示されなくなります。

1. 測定した温湿度データのメッセージを別のフローに送る

これでフローを作成する準備ができましたので、早速フローを作成していきましょう。

「温湿度センサ」タブのフローで測定した温湿度のデータを、「熱中症アラーム」タブのフローで使用できるように、メッセージをタブをまたいで送ります。

link in outノード1

このように、あるタブのメッセージを、別のタブに送りたい場合ってよくありそうですよね。

このようなときのために、「link out」と「link in」と呼ばれるノードが用意されています。

例えば、以下のように「タブA」に「link out」ノードを配置して、「タブB」に「link in」ノードを配置します。このようなフローでタブAのlink outノードのメッセージを送ると、タブBのlink inノードにメッセージが送られます。

link in outノード2

それでは、「link out」「link in」ノードを使用して、「温湿度センサ」タブの温湿度データのメッセージを「熱中症アラーム」タブに送りましょう。

最初に以下のように「温湿度センサ」のフローで、以下のように「link out」ノードを配置します。

link in outノード3

配置後、「link out」ノードをダブルクリックして設定画面を開きます。

link in outノード4

この設定画面では、「link out」ノードのノード名のみ設定します。以下のように「温湿度データ送信」という名前にします。この名称はあとでlink inノードで参照しますので、link outノード設定では、分かりやすい名称にしておくとよいでしょう。

これで「link out」ノードの設定は終わりです。

次に「熱中症アラーム」のフローで、以下のように「link in」ノードを配置します。

link in outノード5

配置後、link inノードをダブルクリックして設定画面を開きます。

link in outノード6

この設定画面では、ノード名の他に、どのlink outノードからメッセージを受け取るかの設定を行います。

ノード名は「温湿度データ受信」としました。また、先ほど設定したlink outノード「温湿度データ送信」からメッセージを受け取りますので、このノードを選択状態にします。

完了ボタンをクリックして設定完了です。

ここで、link outノードとlink inノードのデータ送受信が設定されているか確認してみます。

最初に「温湿度センサ」フローのlink outノードを選択状態にします。選択状態にすると、以下のようにメッセージをどのフローに送るか表示されます。「熱中症アラーム」のフローに設定されているか確認できます。

link in outノード7

同様に「熱中症アラーム」フローのlink inノードを選択状態にします。選択状態にすると、以下のようにメッセージをどのフローから受信するか表示されます。「温湿度センサ」のフローに設定されているか確認できます。

link in outノード8

以上で温湿度データのメッセージ送信設定ができました。

2. WBGT指数の計算

「熱中症アラーム」フローで温湿度データのメッセージが受信できるようになりました。次は、受信した温湿度データからWBGT指数を計算します。

最初に説明した通り、この計算はfunctionノードでJavaScriptプログラムにより計算します。

それでは、以下のようにfunctionノードを配置しましょう。

functionノード1

配置後、functionノードをダブルクリックして設定画面を開きます。

設定画面では、ノード名とプログラムを設定します。

functionノード2

ノード名は「WBGT指数計算」としました。

また、ブログラムは以下の内容をコピペしてください。

// 日射量の設定
let sr = 0.3;

// メッセージから気温と湿度を数値として取り出す
let temperature = parseFloat(msg.payload, 10);
let humidity = parseFloat(msg.humidity, 10);

//WBGT指数を計算する
wbgt_value =   0.735 * temperature
             + 0.0374 * humidity
             + 0.00292 * temperature * humidity
             + 7.619 * sr
             - 4.557 * sr * sr
             - 4.064;

// 送信メッセージを生成
let wbgt_message = { payload : wbgt_value };

// メッセージを送る
return wbgt_message;

これで設定完了です。

このfunctionノードは、温湿度データのメッセージを受信して、計算したWBGT指数をキーがpayload、値を数値データのメッセージ(JSON)として次のノードに送ります。

3. 熱中症警戒レベル判定

ここまでのフローでWBGT指数が計算できました。次はWBGT指数に応じて処理を振り分けます。

このようにメッセージ内容に応じて処理を分たい場合は「switch」ノードを使用します。

なお、ここで使用するswitchノードは、パレットのDashboardグループにあるswitchノードとは異なりますので注意してください。

switchノード1

第23回で使用したDashboardのswitchノードは、DashboardのUIにスイッチを表示して、Dashboard経由でGPIOを制御できる機能を持っていました。

今回使用するswitchノードは、Node-REDのフローを制御するもので、以下のような機能を持っています。

switchノード2

switchノードは上の図のように、1つの入力と1つ以上の出力を持っています。

switchノードが何かのメッセージを受け取ると、メッセージの内容に応じて、受け取ったメッセージをいずれかの出力先に送ります。上の図の例では、出力先が3つあり、受け取ったメッセージを一番下の出力先に送っています。

なお、受け取ったメッセージは加工せずにそのまま送ります。switchノードはあくまでも受け取ったメッセージの内容に応じて、出力先を切り変えるという動作です。

っていってもちょっと抽象的で分かりづらいですよね。これからswitchノードを設定していきます。具体的な設定をみるとswitchノードの働きがわかると思います。

ということで、早速switchノードを設定していきます。以下のように、switchノードを配置します。

switchノード3

配置後、functionノードと接続します。

switchノード4

これで、functinoノードからWBGT指数のメッセージを受け取ることができます。受け取るメッセージは、「payload」キーにWBGT指数が数値として設定されたJSONになっています。

次に、switchノードをダブルクリックして設定画面を表示します。

switchノード5

最初に一番上の「名前」にノード名を設定しておきましょう。「警戒レベル判定」としてみました。(他の名前でも構いません)

上の設定画面には既に数値設定していますが、この画面では次のように動作します。

  1. switchノードが受け取ったメッセージ(JSON)のキーが「payload」の値が、
  2. 25未満の場合、
  3. 1番目の出力にメッセージを送る

という動作になります。「1番目の出力」とは、上の図の右下に説明していますが、switchノードの一番上の出力という意味になります。

これからswitchノードの条件判定を設定していきます。WBGT指数は以下のように判定することにします。また、対応するLEDの発光色は以下のようしてみました。(発光色の情報はswitchノードのあとに出てくるノードで設定します)

WBGT指数 判定 LED発光色
25未満 注意
25以上、28未満 警戒
28以上、31未満 厳重警戒 黄色
31以上 危険

これからこの条件に合うようにswitchノードの設定画面で設定をしていきます。

この判定を行うためには、判定条件が4つ必要になります。そのため、switchノードの判定条件を増やす必要があります。

switchノードの判定条件を追加する場合、以下の設定画面の下の方にある「+追加」ボタンをクリックします。3回追加ボタンをクリックして、判定条件を4つにします。

switchノード6

判定条件を4個準備したら、WBGT判定条件を設定します。上の図、以下の表を参考にしてみてください。

比較条件 比較数値 出力先
25 1
28 2
31 3
>= 31 4

なお、このように条件設定した場合、条件が成立した段階で判定終了となりますので、以下のように設定画面で「最初に合致した条件で終了」を選択します。

switchノード7

switchノードの設定ができたら完了ボタンをクリッして設定画面を閉じます。

switchノードに以下のように4つの出力ができていればOKです。例えば、WGBT指数が24のときは、1番上の出力から受けとったメッセージが出力されます。また、WBGTが27のときは、2番目の出力から受けとったメッセージが出力されます。

switchノード8

これでWBGT指数のレベル判定までのフローができました。

4. LED発光色の値を送る

次は、switchノードからメッセージが出力されたときに、LED発光色データを送る必要があります。

例えば、switchノードの一番上の出力からメッセージが送られた場合、警戒レベルは「注意」でLEDの発光色は青色にしますので、以下のように青色のデータを送る必要があります。

changeノード1

このように、何かのメッセージを受け取って、任意のメッセージに変更したい場合、「change」ノードを使用します。

changeノード2

警戒レベル判定ノード(switchノード)は、判定した結果の出力先にWBGT値のメッセージを送ります。changeノードを使用して、WBGT値のメッセージを受け取ったら青色のデータを送れば機能を実現できます。

changeノード3

それでは実際にフローを作成していきましょう。

最初に以下のようにchangeノードを配置します。

changeノード4

配置後、changeノードをダブルクリックして設定画面を開きます。

changeノード5

このchangeノードはノード名を「青色」に設定します。

また、changeノードかメッセージを受け取った場合、出力するメッセージを「ルール」の領域で設定します。

Dashboardで「colour picker」ノードのフローを作成したときと同じように、payloadキーに発光色の16進数6桁の値のメッセージを送ればよいので、「値の代入」を選択、キーはpayload、代入する値は「0000FF」(青)に設定します。

なお、他の色に設定したい場合、以下のようなWebカラーのサイトで6桁の値を確認してみてください。

色見本サイト:
https://www.colordic.org/

設定できたら、完了ボタンをクリックして設定画面を閉じます。

次に、以下のようにswitchノードと設定したchangeノードを接続します。

changeノード6

これで、switchノードの一番上の出力(熱中症「注意」レベル)からメッセージが送られたら、青色の値を送ることができます。

あとは、Dashboardの「colour picker」ノードで接続したように、以下のように接続すれば完了です。

changeノード7

残りの3つについてもこの作業を繰り返していきます。ちょっと面倒ですが、ひとつひとつ設定していきましょう。

まずは警戒レベルが「警戒」(LED緑色)のフローです。

以下のようにchagneノードを配置して設定します。

changeノード8

このchangeノードは、以下のように設定してみました。LEDの発光色はご自身の好みに設定いただいて構いません。

changeノード9

設定できたらノードを接続します。

changeノード10

次は警戒レベル「厳重警戒」(LED黄色)のフローです。

以下のようにchagneノードを配置して設定、接続します。

changeノード11

このchangeノードは、以下のように設定してみました。

changeノード12

最後は警戒レベル「危険」(LED赤色)のフローです。

以下のようにchagneノードを配置して設定、接続します。

changeノード13

このchangeノードは、以下のように設定してみました。

changeノード14

これでフローが完成しました!

あとはデプロイすれば動作するはずです。

もし動作しなかった場合は、温湿度センサフローのInjectノード(タイムスタンプノード)が定期的にメッセージを送るようになっているか確認してみてください。

それでも動作しない場合は、debugノードを使用して正しいメッセージが流れているか確認してみてください。

Dashboardに熱中症アラームの情報を表示

これで熱中症アラームは完成しましたが、Dashboardにも熱中症情報を以下のように表示してみたいと思います。

textノード1

Dashboardにこのようにテキストを表示したい場合、Dashboardグループの「text」ノードを使用します。

それでは実際にフローを作成していきましょう。

最初に、パレットのDashboardグループから「text」ノードをだいたい以下の位置に配置します。

textノード2

次に、textノードを設定します。設定画面では以下の2つの値を設定しますので、最初に設定内容を確認しておきましょう。

textノード3

表示する情報のタイトルとなる文字列は、textノードの設定画面内では「label」と呼んでいます。また、表示するメッセージは「value」と呼んでいます。これから、labelとvalueの設定を行います。

それでは配置したtextノードをダブルクリックして設定画面を開きます。

textノード4

最初に「label」でタイトルとなる文字列を設定します。ここでは「熱中症アラーム」と設定してみました。

次に「value」ですが、ここでは受け取ったメッセージ(JSON)のどのキーの値を表示するか設定します。これは自由に決めて構いませんが、payloadはすでに使用していますので、ここでは「alert」にしてみました。(つまり、textノードに「alert」キーに値を設定して送ると、その値が表示されることになります)

最後に、「label」と「value」の表示形式(位置関係)を選択します。文字数が多くなりそうですので、縦の関係を選択してみました。

次に、このtextノードに表示する文字列のメッセージを送る必要があります。メッセージは、キーが先ほど設定した「alert」、値に表示する文字列を設定します。

例えば青色LEDを点灯する場合、青色ノード(chageノード)がメッセージを送っています。

青色ノードがLEDの点灯色のデータを送るときに、一緒にDashboardのtextノードに表示する文字列も送ってもらうことにします。

それでは、フローの「青色」ノード(chageノード)をダブルクリックして設定画面を開いてください。

textノード5

現在は、LEDの発光色のデータしか送っていませんが、追加でDashboardに表示する文字列、つまりtextノードに送るメッセージも追加します。

上の画面の下の方にある「+追加」ボタンをクリックします。

textノード6

クリックすると、送るメッセージが追加されますので、キーに「alert」、値に表示する文字列を設定します。青色の注意レベルですが、通常状態なので「通常状態です」に設定してみました。

残りの「緑色」「黄色」「青色」ノードも以下のように設定します。(表示文字列はご自身の好みで構いませんが、あまり長くない方がよいでしょう)

textノード7

最後に、textノードと各changeノードを接続します。

textノード8

これで設定ができましたのでデプロイします。デプロイに問題がなければDashboardを開いて熱中症アラームの情報が表示されている確認してみてください。

textノード9

移動平均

ところで、エアコンなどで気温を制御している場合、エアコンの運転状況によって気温や湿度が頻繁に変わってしまいます。

熱中症判定レベルが境界付近の場合、少しでも値が変わると判定レベルが変わってしまい、LEDの色がすぐに変わってしまうことになります。

このように値に敏感に反応してしまう場合は、過去何回かの測定データの平均を取ると安定します。

そこで、最後に測定データを安定させる方法を説明します。

データを安定させるために、過去何回かの測定データの平均を取る方法は「移動平均」と呼ばれています。

「移動平均」は計測分野や株やFXなどのトレードでもよく出てきますので、ご存じの方も多いかもしれませんね。

Node-REDにはデフォルトで移動平均を計算する「smooth」ノードが用意されています。smoothノードの使い方は簡単で、移動平均を取りたいメッセージを入力するだけでOKです。

説明するより、実際にフローを作成した方がわかりやすいですので、早速フローを作成しましょう。

パレットの機能グループにある「smooth」ノードを以下のように配置します。

smoothノード1

配置後、smoothノードをダブルクリックして設定画面を開きます。

smoothノード2

主な設定は2つです。ひとつは移動平均を計算する対象のメッセージ(JSON)のキー、もうひとつは過去何回分の移動平均を取るか、の設定です。

WBGT指数メッセージのキーはpayloadですので、キーはデフォルトのままで問題ありません。

また、デフォルトで過去10回分の移動平均を取る設定になっています。最初は10回分にしてみて、様子を見て増やしてみてください。

最後に、WBGT指数計算ノードと、警戒レベル判定ノードの間にsmoothノードがくるように接続すれば完了です。

smoothノード3

これでフローが完成しました!

デプロイして正常に動作するか確認してみてください。


今回の記事で、温湿度センサとフルカラーLEDを扱う内容は終わりになります。次回からスイッチや別のタイプのフルカラーLEDの回路を製作してフローを作成していきます。

更新履歴

日付 内容
2022.8.2 新規投稿
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次