[企画・制作] ZEPエンジニアリング
M5Stack×温湿度センサで作る「熱中症モニタ」(前編)
「エアコン(冷房)をつけていたのに家族が熱中症で救急車で運ばれました」
熱中症の恐ろしさは、本人が気づかないうちに発症することです。我が家ではエアコンを27℃(冷房)設定で常時稼働させていましたが、家事の途中に気分が悪くなり、めまいやしびれなどの症状、痙攣が出て、結果として救急車のお世話になりました。
病院での診断の結果は、「熱中症」。エアコンをつけていてもキッチン周りでは、温度や湿度が急激に上昇し、熱中症の危険が高まることがわかりました。
このような背景から、急遽製作したのが、今回紹介する「熱中症モニタ(暑さ指数計)」です。M5StackとGrove接続の「温湿度気圧センサユニットVer.3(ENV III)」を組み合わせて簡単に実現できます。皆さんも熱中症対策のひとつとして準備されてはいかがでしょうか。
前編では、温湿度から暑さ指数を算出し、その数値とイラストで危険度を示すガジェットを製作しました。後編では、測定した値をクラウドサービスにアップロードし、可視化する方法をご紹介予定です。
暑さ指数計 温湿度気圧センサ ENV.IIIとM5Stack

対象機種はM5Stack Coreシリーズ(BASIC, FIRE等)です。Core2でも同様に動作します。
温湿度気圧センサについては、温湿度気圧センサユニットVer.3(ENV III)を用いました。
暑さ指数
熱中症の危険度を表す数値として、暑さ指数(WBGT(湿球黒球温度):Wet Bulb Globe Temperature)というものがあります。熱中症を予防することを目的として1954年にアメリカで提案された指標です。単位は℃になります。この値が28℃を超えると熱中症患者が著しく増加する様子がわかります。(次グラフ参照:環境省Webページから引用)

暑さ指数と日常生活、運動に関する指針は、以下のとおりです。(環境省Webページから引用)
日常生活に関する指針
温度基準
(WBGT) |
注意すべき
生活活動の目安 |
注意事項 |
危険
(31以上) |
すべての生活活動で
おこる危険性 |
高齢者においては安静状態でも発生する危険性が大きい。
外出はなるべく避け、涼しい室内に移動する。 |
厳重警戒
(28~31) |
外出時は炎天下を避け、室内では室温の上昇に注意する。 |
警戒
(25~28) |
中等度以上の生活
活動でおこる危険性 |
運動や激しい作業をする際は定期的に充分に休息を取り入れる。 |
注意
(25未満) |
強い生活活動で
おこる危険性 |
一般に危険性は少ないが激しい運動や重労働時には発生する危険性がある。 |
運動に関する指針
気温 (参考) |
暑さ指数 (WBGT) |
熱中症予防運動指針 |
35℃以上 |
31以上 |
運動は原則中止 |
特別の場合以外は運動を中止する。 特に子どもの場合には中止すべき。 |
31~35℃ |
28~31 |
厳重警戒 (激しい運動は中止) |
熱中症の危険性が高いので、激しい運動や持久走など体温が上昇しやすい運動は避ける。 10~20分おきに休憩をとり水分・塩分の補給を行う。 暑さに弱い人※は運動を軽減または中止。 |
28~31℃ |
25~28 |
警戒 (積極的に休憩) |
熱中症の危険が増すので、積極的に休憩をとり適宜、水分・塩分を補給する。 激しい運動では、30分おきくらいに休憩をとる。 |
24~28℃ |
21~25 |
注意 (積極的に水分補給) |
熱中症による死亡事故が発生する可能性がある。 熱中症の兆候に注意するとともに、運動の合間に積極的に水分・塩分を補給する。 |
24℃未満 |
21未満 |
ほぼ安全 (適宜水分補給) |
通常は熱中症の危険は小さいが、適宜水分・塩分の補給は必要である。 市民マラソンなどではこの条件でも熱中症が発生するので注意。 |
暑さ指数(WBGT)は、黒球温度、湿球温度及び乾球温度をもとに算出されます。計算式は以下のとおりです。
・屋外での計算式
WBGT(℃) =0.7 × 湿球温度(℃) + 0.2 × 黒球温度(℃) + 0.1 × 乾球温度(℃)
・屋内での計算式
WBGT(℃) =0.7 × 湿球温度(℃) + 0.3 × 黒球温度(℃)
※湿球温度、黒球温度、乾球温度が何かなど詳細については、環境省のこちらのWebページを参照ください。
上記のとおり、暑さ指数の計算には、湿球温度や黒球温度などの測定が必要ですが、室内に限れば、日本生気象学会が発行している「日常生活における熱中症予防指針 Ver.3.1」に掲載されている「室内用のWBGT簡易推定図」を用いることによって、温度と相対湿度からWBGTを求めることができます。温湿度気圧センサユニットVer.3(ENV III)の値をそのまま使用することができます。
今回は、この推定図の値をもとに温度と湿度(相対湿度)から暑さ指数を近似できる計算式を独自に求め使用しました。
不快指数
今までは熱中症対策に対する「暑さ指数」について書いてきましたが、以前は「不快指数」という値もよく用いられました。不快指数(THI:Temperature-Humidity Index)とは夏の蒸し暑さなどの体感を数量的に表した指数です。例えば、不快指数が76であれば、「半数以上の人が不快を感じる。」ということになります。(Wikipediaより引用)
不快指数と体感
不快指数 |
体感
|
?50 |
寒くてたまらない
|
50?55 |
寒い
|
55?60 |
肌寒い
|
60?65 |
何も感じない
|
65?70 |
快適
|
70?75 |
不快感を持つ人が出始める
|
75?80 |
半数以上が不快に感じる
|
80?85 |
全員が不快に感じる
|
85? |
暑くてたまらない
|
・不快指数(THI)は、乾球温度、湿球温度をもとに算出されます。計算式は以下のとおりです。
THI = 0.72 × (乾球温度(℃) + 湿球温度(℃)) + 40.6
・また、湿度を使用する場合は以下の式で計算されます。
THI = 0.81 × 乾球温度(℃) + 0.01 × 湿度(%) × (0.99 × 乾球温度(℃) - 14.3) + 46.3
※今回はこの計算式を使用しています。
熱中症モニタ(暑さ指数計)の仕様と制御プログラム
仕様は、以下のとおりです。
・約1秒ごとに温湿度を測定し、暑さ指数と不快指数を表示。
・暑さ指数から「危険、厳重警戒」などの注意をイラストでも表示
・「厳重警戒」レベル(暑さ指数28℃)以上の場合ビープを鳴らす。
・温湿度気圧センサユニットVer.3(ENV III)は気圧の測定も可能なため併せて表示
M5StackのLCD画面の「暑さ指数、不快指数」など日本語表記については、漢字フォントや漢字表示ライブラリを使用することなく、背景画像としてPhotoshopでjpegファイルを作成し表示しています。暑さ指数のレベルに応じたアイコンも同様の方法で作成しました。
作成したjpegファイルは、image.hとしてソースコード化しています。プログラム本体と一緒にコンパイルします。
※jpegファイルなどバイナリーファイルをソースコード化する方法については、別記事でご紹介予定です。
(1)開発環境構築
M5StackのArduino IDE開発環境を用います。その構築方法については、別記事「いろいろなマイコンボードに使えるArduino IDE。環境構築メモ」の「M5StackをArduino IDEで使う」の章を参考にしてください。M5Stack CORE2を使用する場合には、「M5Core2 by M5Stack」ライブラリも併せてインストールしてください。時刻を表示するだけであれば、その他追加のI/Oライブラリは、特に必要ありません。
(2)制御プログラム
プログラム本体とimage.hは、こちらよりダウンロードしてください。
制御プログラムリスト
- //暑さ指数計 Copyright (c) 2022- @logic_star
- //#define CORE2 //CORE2を使用する場合は有効化要
- #ifdef CORE2
- #include <M5Core2.h>
- #else
- #include <M5Stack.h>
- #endif
- #include "image.h" //背景画像
- #include "UNIT_ENV.h" //ENV IIIライブラリ
- SHT3X sht30; //温湿度センサ
- QMP6988 qmp6988; //気圧センサ
- float tmp = 0.0; //温度
- float hum = 0.0; //湿度
- float pressure = 0.0; //気圧
- float WBGT = 0.0; //暑さ指数
- float THI = 0.0; //不快指数
- void setup() {
- M5.begin(true, false, true, true);
- qmp6988.init(); //気圧センサ初期化
- M5.Lcd.fillScreen(TFT_WHITE); //M5Stackの画面初期化
- M5.Lcd.setTextColor(TFT_BLACK, TFT_WHITE);
- M5.Lcd.setTextDatum(TL_DATUM);
- M5.Lcd.drawJpg(image_bg, sizeof image_bg, 0, 30); //背景の表示
- }
- void loop() {
- pressure = qmp6988.calcPressure() / 100; //気圧を測定
- if(sht30.get()==0){ //Obtain the data of shT30. //温湿度を測定
- tmp = sht30.cTemp; //Store the temperature obtained from shT30.
- hum = sht30.humidity; //Store the humidity obtained from the SHT30.
- };
- WBGT = (tmp*0.003289+0.01844)*hum+(0.6868*tmp-2.022); //暑さ指数の計算
- THI = (tmp*0.81+hum*0.01*(tmp*0.99-14.3)+46.3); //不快指数の計算
- if (WBGT >= 31) M5.Lcd.drawJpg(image4, sizeof image4, 180, 80); //暑さ指数に応じてイラスト表示
- else if (WBGT >= 28) M5.Lcd.drawJpg(image3, sizeof image3, 180, 80);
- else if (WBGT >= 25) M5.Lcd.drawJpg(image2, sizeof image2, 180, 80);
- else if (WBGT >= 21) M5.Lcd.drawJpg(image1, sizeof image1, 180, 80);
- else M5.Lcd.drawJpg(image0, sizeof image0, 180, 80);
- if (WBGT >= 28){ //暑さ指数28℃以上のときにビープ音を鳴らす。CORE2を除く。
- #ifndef CORE2
- M5.Speaker.beep();
- delay(100);
- M5.Speaker.mute();
- #endif
- }
- M5.Lcd.setTextFont(6); //暑さ指数の表示
- M5.Lcd.setTextSize(1);
- M5.Lcd.setCursor(128, 44);
- M5.Lcd.printf("%2.1f", WBGT);
- M5.Lcd.setCursor(128, 100); //不快指数の表示
- M5.Lcd.printf("%2.0f", THI);
- M5.Lcd.setTextFont(4); //温度の表示
- M5.Lcd.setTextSize(1);
- M5.Lcd.setCursor(60, 153);
- M5.Lcd.printf("%2.1f 'C", tmp);
- M5.Lcd.setCursor(60, 183); //湿度の表示
- M5.Lcd.printf("%2.1f %%", hum);
- M5.Lcd.setCursor(60, 213); //気圧の表示
- M5.Lcd.printf("%4.1fhPa", pressure);
- delay(1000); //1秒ウェイト
- }
|
- 2行目 CORE2を使用する場合は「//」を削除して、CORE2定義を有効化してください。
- 19~26行目は、M5Stackとセンサ、画面の初期化を行います。
- 28~63行目がメインルーチンです。温湿度、気圧の測定。暑さ指数、不快指数の算出。暑さ指数の値に対応したイラスト表示、ビープ音の発生を行っています。
(3)サンプルプログラムの実行例
サンプルプログラムを実行したときのM5StackのLCD表示をキャプチャしたものを以下に示します。

まとめ
M5Stackは、ちょっとした困りごとを解決するツールとして最適です。本製作例でも暑さ指数を表示するだけのプロトタイプは、すぐに製作できました。その後、漢字表記やアイコン作成など、誰にでもわかりやすい表示にするなどの改善を加えていきました。このプロセスを簡単にスピーディに実現することができるのも、各種センサやライブラリが豊富なM5Stackの特徴ですね。
もしお手元にM5Stackがあれば、ぜひ試してみてください。M5Stackをお持ちでない方は、マルツから購入できます。
後編では、測定した値をクラウドサービスにアップロードし、可視化する方法などをご紹介予定です。これにより、遠隔地からの監視なども可能となります。
c2022ー @logic_star All rights reserved.