M5Stackによる「温湿度計+α」の製作

M5Stackを用いて簡単な温湿度計を作ってみました。また、追加情報として以下のものを表示するようにしました。

  • 熱中症リスク (温度、湿度より)
  • インフルエンザ感染リスク (湿度より)

開発環境

今回はArduino IDEとM5Cloudの2つを試しました。Arduino IDEではArduinoと同じように開発できます。一方M5CloudではMicroPythonという組み込み向けのPythonによる開発が可能です。また今回は試してませんがM5CloudではLuaという言語も使えるようです。私は元々Pythonが好きだったので、M5Cloud (MicroPython言語) をメインで利用しました。

開発環境の構築

Arduino IDEとM5Cloudでは必要な手順が異なります。詳しくは以下のリンクを参考にしてください。なお、M5Stackへのファームウェアの書き込みにはM5Burnerを使いました。詳しくはこちら

私が使った開発環境のバージョン等を以下に示します。

  • Windows 10 Pro 1803
  • CP210xVCPInstaller_x64_v6.7.6 (M5StackのUSBドライバ)
  • Arduino IDE 1.8.5
  • M5Burner-for-windows-v0.0.4 (M5Stackのファームウェア書き込みツール)
  • M5Cloud-v0.4.0 (M5StackのM5Cloud用ファームウェア)
  • Firefox 62.0

デバッグ

Arduino IDEの場合は、Serial.printやSerial.printlnを使ってデバッグすれば良いと思います。M5Cloudの場合は、print関数を使うとシリアル通信経由で出力されます。またエラー情報も出力されます。例えば構文エラーの場合、下図のようになります。他の情報と混じって見にくいのが難点です。

構文エラー (SyntaxError) の例。「main.py」の2行目付近にエラーがあることが分かる。

セキュリティに注意

M5Cloudは現状セキュリティが怪しいです。クラウドの開発環境への通信が暗号化されていないようなので、悪意のある人が通信を傍受することができてしまいます。中には、M5Stackを繋いだルータのSSIDとパスワードの情報も含まれているので、ルータはゲストモードにするなどの対策をしたほうが (何もしないよりは) 良いと思います。

温湿度センサ(DHT12)

M5Stack用プロトキット(温湿度センサ付き)」に入っているGrove接続のDHT12という温湿度センサを使いました。同梱されているGroveケーブルでM5Stackと接続するだけで使えるので配線は簡単です。はんだ付け等は必要ありません。

ライブラリ

ライブラリは以下のものを利用しました。

Arduino用 … https://github.com/RobTillaart/Arduino
MicroPython用 … https://github.com/m5stack/M5Cloud/blob/master/lib/dht12.py

Arduino IDE

  1. こちらより「Clone or download」→「Download ZIP」をクリックし、ZIPファイルを保存する。
  2. ZIPファイルを解凍する。
  3. 「libraries」フォルダ内の「DHT12」フォルダを、Arduinoの保存用フォルダ (Windowsの場合、普通はC:\Users\ユーザ名\Documents\Arduino) 内の「libraries」フォルダにコピーする。

以上です。なお、今回利用したライブラリは、Arduino IDEの「スケッチ」メニュー→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール...」からインストールすることはできませんでした。

M5Cloud

  1. こちらより「Clone or download」→「Download ZIP」をクリックし、ZIPファイルを保存する。
  2. ZIPファイルを解凍する。
  3. M5CloudのIDEまたはプロジェクト画面を開き、ローカルファイルのアップロード (Upload Local File) より、手順2で解凍したフォルダの中から「lib」フォルダ内の「dht12.py」をアップロードする。

サンプルプログラム

Arduino用のライブラリのサンプルスケッチは、Arduino IDEの「ファイル」メニューから「スケッチ例」→「DHT12」→「DHT12」を開くと見ることができます。

MicroPython用のライブラリのサンプルプログラムは、以下のリンクで見ることができます。なお、このプログラムはM5Stackの液晶画面には何も表示せず、シリアル通信経由で温度と湿度を表示します。USBケーブルでPCに接続し、ArduinoのシリアルモニタやTera Termを使って確認してください。ボーレート (Baudrate) は、115200 bpsで上手くいきました。

リンク: https://github.com/m5stack/M5Cloud/blob/master/examples/DHT12/main.py

MicroPythonで温湿度センサ(DHT12)のデータを液晶画面に表示する

DHT12の温度、湿度の値を3秒おきに液晶画面に表示するプログラムを以下に示します。これを「main.py」に書き込みます。


https://gist.github.com/furushei/391f54ed174b59278039531d6f09f92f

なおこのプログラムを実行する際は前述のDHT12ライブラリ (dht12.py) も同じディレクトリに配置する必要があります。(M5Cloud上で「dht12.py」という名前のファイルを新規作成し、次のリンク先の内容をコピペする方法もあります。)

https://github.com/m5stack/M5Cloud/blob/master/lib/dht12.py

熱中症リスクの判断

熱中症リスクは暑さ指数 (WBGT) を参考にしました。ただ、暑さ指数 (WBGT) の正確な測定方法を真似するのは大変そうなので、今回は次に示す早見表を使った推定を行います。

日本生気象学会「日常生活における熱中症予防指針 Ver.3」より

この表は屋内など日射がない環境を前提として、温度と湿度から暑さ指数 (WBGT) を推定するものです。この表は、環境省の「熱中症を防ごう!」というPDFファイル内に出てくる表のソースにもなってるので、信用できると思います。とは言え、気温は1℃刻み、湿度は5%刻みに丸めているので、あくまで目安程度と考えてください。

この表を元に、温度と湿度をカンマ区切りで連結した文字列をキーとし対応する暑さ指数 (WBGT) を値としてPythonの辞書型で表現することとします。また、そのデータを格納したJSONファイルを用意しました。


データ構造のイメージ

温度と湿度をカンマ区切りで連結した文字列から対応する暑さ指数 (WBGT) を得ることができます。その値を元に次の表のように場合分けして熱中症リスクを表示します。


参考: 日本生気象学会「日常生活における熱中症予防指針 Ver.3

インフルエンザ感染リスクの判断

インフルエンザの感染リスクは湿度に影響されるらしく、東京福祉保健局「冬季における有効な加湿方法」によると、40%を目標に加湿すると感染防止となるそうです。そこで、40%を閾値として警告画面を表示するようにしました。また、アイコンはこちらを利用しました。

温湿度計のプログラム

以下にGitHubリポジトリへのリンクを貼っておきます。/flash以下をM5Stackにアップロードし、/sd以下をmicroSDカードに保存します。
GitHubリポジトリ

ドキュメントについて

M5Stackの公式ドキュメントは、2018年9月現在、充実しているとは言えません。特にArduino IDEでのライブラリのAPIは、こちらのGitHubリポジトリのソースを読むくらいしかありません。以下、参考にしたソースコードへのリンクを貼ります。

また、液晶画面に関しては、ArduinoのSerialと同じインターフェースでprintやprintln関数が使えます。

MicroPythonの場合は、こちらに大体載ってます。サンプルプログラムも参考になるかもしれません。また、MicroPythonのドキュメント (pyboard用?) と共通するものは多いようです。なお、基本的な文法についてはPythonとほぼ同じなので、その部分はPythonの情報も役に立ちます。

まとめ

M5Stackを使うと、センサの接続、開発環境、画面表示などが簡単にできるので便利でした。Pythonを触ったことがある人にはM5Cloudでの開発もおすすめです。

単にセンサでデータを取るだけでなく、その場で画面に表示すると面白いしわかりやすいと思いました。M5Stackは電池もついていて気軽に持ち運べるので、温度や湿度以外にも様々なセンサと組み合わせると面白いのではないでしょうか。

この記事はインターンでスイッチサイエンスに来ていた福岡工業大学 工学部 電子情報工学科の古川貴之さんが書いた記事です。

Pocket

About ysck

販売・マーケティング活動も担当しています。ラピッドプロトタイピングを勉強するためにGainerで電子工作をはじめて、Arduinoをさわっているうちにスイッチサイエンスに入社していました。