はじめに
今年も暑い夏真っ只中です。熱中症予防に有効な暑さ指数(WBGT(湿球黒球温度))を活用すべくmicro:bitを使用して、簡単で作り易いWBGT表示器を作成しました。
暑さ指数(WBGT:Wet Bulb Globe Temperature)について
暑さ指数についての解説は総務省の熱中症予防情報サイトに詳しく記載されており、熱中症を予防することを目的として1954年にアメリカで提案された指標で、暑さ指数(WBGT)が28(厳重警戒)を超えると熱中症患者が著しく増加するとのことです。比較的近年になってから聞く言葉のような気がしていましたが、かなり昔からあった指標なのですね。
求め方については黒球温度、湿球温度、乾球温度といった3種類の測定値をもとに算出されます。
算出式は屋外と屋内の場合で分けて定義されています。
・屋外:WBGT =0.7 × 湿球温度 + 0.2 × 黒球温度 + 0.1 × 乾球温度
・屋内:WBGT =0.7 × 湿球温度 + 0.3 × 黒球温度
熱中症対策が義務化
令和7年6月1日から職場における熱中症対策を強化するため、改正労働安全衛生規則が施行されています。
義務化の対象は屋外や高温環境での作業が中心となりますが、条件を満たす全ての事業者が対象とのことで、「WBGT値28度以上又は気温31度以上の環境下で連続1時間以上又は1日4時間を超えての実施」が見込まれる作業です。
人命にかかわることでもあり、作業者に必要な熱中症対策ができていないことは許されないですね。まずは現場のWBGT・温度の状況を測定して可視化することが必要かもしれません。
実測したその瞬間・その場所のWBGTを知ることはとても大切ですが、朝に測定した結果から昼間のWBGTを予測することはできない点がもどかしいところではあります。
少し調べてみると、環境省では、未来時刻における実況推定値をダウンロードできるデータ取得APIを提供していることが分かりましたので、それを利用してWBGT予測値を取得し表示できるデバイスがあれば多少なりとも活用できると思い、今回電子工作で作ってみることにしました。
環境省APIの利用方法
環境省 熱中症予防情報サイトAPI仕様書を読むことでAPIの使い方は理解できると思いますのでここでは簡単に記載します。
API仕様書には例として次のような記述があります。
- 2023年5月1日0時から2023年5月11日0時までの期間において、観測所番号「10110」、「12011」の予測値を取得する。
WEBブラウザで上記URLに行くと下のようなjson形式でデータを所得することができます。
{
"status": "success",
"data": [
{
"reference_time": "2023/05/01 00:00:00",
"wbgt_no": 11001,
"forecast_val": "40",
"forecast_time": "2023/05/01 03:00:00",
"flag": 0
},
{
"reference_time": "2023/05/01 00:00:00",
"wbgt_no": 11001,
"forecast_val": "40",
"forecast_time": "2023/05/01 06:00:00",
"flag": 0
},
{
"reference_time": "2023/05/01 00:00:00",
"wbgt_no": 11001,
"forecast_val": "50",
"forecast_time": "2023/05/01 09:00:00",
"flag": 0
},
{各パラメータの意味は以下の通りです。
- reference_time:データの発表日、時刻
- wbgt_no:地点番号
- forecast_val:暑さ指数(WBGT)予測値
- forecast_time:予測日、時刻
実際にAPIを使用してみたところ、1時間ごとに発表されるデータは、丁度、0分に提供されてはおらず、毎時30分付近で提供されるようでした。(2026年8月2日現在)
”wbgt_no”と表記されている”地点番号”とはWBGTの情報提供地点番号となります。こちらに全国各地の地点番号が記載されている一覧表がありますので参照してください。
”forecast_time”は3時間ごとになります。なお、予測値データ取得の場合は、”reference_time”時刻より以前の”forecast_time”時刻における”forecast_val”は提供されません。
(上の例で言うと、5/1 00:00:00 における5/1 00:00:00のデータは提供されていません)
実際にESP32マイコンのArduinoプログラムでWBGTを取得するには、WiFiClientSecureライブラリを使用することで可能となります。
micro:bitのディスプレイ表示について
今日、今現在以降のWBGTの最大値が取得できれば、その日におけるその時刻以降の熱中症予防には有効であるとの考え方から、本日の現在時刻以降の最大WBGTを表示するようにしました。具体的には、本日の最新”reference_time”で提供されている本日の”forecast_time”から最大のWBGTを抽出しています。
micro:bitのLEDディスプレイを使用して、最大WBGT値と、WBGTを一定の範囲で区分して、区分ごとに表情が変化する顔を模したピクトグラムを表示することにしました。

なお、おまけ機能的に、明日のお出かけ時の熱中症対策用として、Aボタンを押すことで明日のWBGT値を一回表示するようにしました。
作り方
使用したパーツとその役割
- micro:bit V2
ディスプレイ表示とESPr側へWBGT値の要求を行っています。
- ESPr® Branch 32
環境省のAPIを用いてWBGTを取得およびMicrobitへWBGT値を転送しています。SSL/TLSで通信可能なESP32モジュールであれば動作するように思います。作成当初はGrove WifiV2モジュールを使用してAPIアクセスを検討していましたが、環境省のサイトからSSL/TLSでの通信を行うことができないようなのでESP32モジュールを利用することにしました。
- Grove コネクタ
micro:bitとESPrはUARTで通信しています。2つのデバイス間のUART配線(Tx,Rx)とVCCおよびGNDの接続を行います。
- Grove Shield for BBC micro:bit
- micro:bit本体のみで扱える端子数が少ないことに加えて直接Groveコネクタを接続することができないため使用しました。
micro:bitとESPr Branch 32の結線
micro:bitとESPr Branch 32の間の通信用はシリアル通信で行います。どちらか一方のボードへUSB端子から電源を供給すれば動作するように、シリアルの2本だけでなく、Groveケーブルの4線をすべて使用しています。

| デバイス/信号 | Tx | Rx | 3.3V | グラウンド |
| micro:bit | Pin 16 | Pin 2 | 3V3 | GND |
| ESPr32 | IO25 | IO14 | 3.3V | GND |
プログラムと実際の動作
micro:bit側は、MicroPythonでプログラムを作成し、ESPr側はArduinoで作成しました。
先ほどの繰り返しになりますが、micro:bit側はディスプレイ表示とESPr側へWBGT値の要求が主な動作となり、ESPr側は環境省からWBGT情報の取得およびMicrobitへWBGT値を転送することが主な動作となります。
- micro:bit側のフローチャート
┌──────────────────────────────┐
│ 開始 │
└───────┬──────────────────────┘
▼
初期化(UART / 画像 / 変数)
▼
┌──────────────────────────────┐
│ メインループ │
└───────┬──────────────────────┘
▼
today/tomorrow が None?
├── Yes → "REQ"送信 → WAIT表示
▼
UART 受信 → today/tomorrow 更新
▼
キャッシュ揃った?
├── No → ループ先頭へ
▼
Aボタン押された?
├── Yes → TMR → 明日の値 → アニメ6回
└── No → 今日の値 → 数字 or アニメ
▼
0.1秒待機
▼
ループへ戻る
- ESPr側のフローチャート
┌──────────────────────────────────────────┐
│ 開始 │
└───────────────┬──────────────────────────┘
▼
WiFi 接続(成功までループ)
▼
NTP 時刻同期(成功/失敗)
▼
client.setInsecure()
▼
updateCacheAndSend() ← ★ 起動直後にキャッシュ更新
▼
┌──────────────────────────────────────────┐
│ メインループ開始 │
└───────────────┬──────────────────────────┘
▼
現在時刻取得(getLocalTime)
▼
┌───────────────────────────────┐
│ 毎時35分? │
└───────────────────────────────┘
│Yes
▼
updateCacheAndSend()
updatedThisHour = true
│
└──→(No の場合は次へ)
▼
┌───────────────────────────────┐
│ 30分? │
└───────────────────────────────┘
│Yes
▼
updatedThisHour = false
│
└──→(No の場合は次へ)
▼
┌───────────────────────────────┐
│ micro:bit から REQ 受信? │
└───────────────────────────────┘
│Yes
▼
req == "REQ" ?
│Yes
▼
sendCacheToMicrobit()
│
└──→(No の場合は何もしない)
▼
ループ先頭へ戻る
具体的なプログラム全体はgithubに格納しています。また、実際のプログラムの実行結果も下の動画でご覧いただければと思います。
おわりに
以前にご紹介したTouchGFX使用して作成した熱中症予防表示器では部屋の温湿度を取得して疑似的にWBGTを算出するソリューションを試みましたが、日本全国のWBGTをAPIで取り出せるソリューションを使用することでご自身のお住まい地域のWBGTを簡単に取得でき、活用し易いように思います。もちろんテレビの天気予報やスマホのお天気情報サイトでも知ることができますが、手元でいつでもサクッと見れるようなデバイスが置いてあれば便利かと思います。

コメント