スイッチサイエンスさんのESP-WROOM-02開発ボード「ESPr Developer」を購入したので、これとAmbientで温度、湿度などを周期的に測定する環境モニターを作ります。

実現方法

マイコンボードはESP-WROOM-02開発ボード「ESPr Developer」を使います。コードレスにしたいので、電池駆動とし、データーをWi-Fiで飛ばします。

測定する環境データーはいろいろあると思いますが、まずは手頃なところとして気温、湿度、気圧を測ることにしました。これだとBosch製のBME280というセンサー一つで測定できます。将来は風速、風向、雨量なども測定してみたいですが、それは後の課題とします。
スイッチサイエンスさんの「ESPr」シリーズにはBME280の載った「環境センサシールド」という、まさに環境モニターのためのセンサーボードがありますが、以下の理由で使いませんでした。

  1. あまりに手軽で自作感がない
  2. 電池の減り具合も測定したい
  3. Deep sleepで複数回に1回データーを送信するため、リアルタイムクロックが必要

理由2の補足ですが、「ESPr Developer」で使われているESP8266というマイコンにはADコンバーターが一つ内蔵されていて、それで電池の電圧を測ろうとしました。ところが「環境センサシールド」には明るさを測るフォトトランジスターが付いていて、それがADコンバーターにつながっているため、電池の電圧が測れないというものです。

理由3は次の「省電力設計」で説明します。

省電力設計

モニターを電池駆動でなるべく長期間動かすために、次のような動作をさせるようにしました。

  • 測定と測定の間はDeep sleepモードで待機し、消費電力を抑える
  • 5分間Deep sleepしたら立ち上がり、センサー値を測定する
  • データー送信は毎回はおこなわず、6回に1回(30分に1回)まとめて送信する
    • Wi-Fiにつなぐのは6回に1回だけで、あとの5回はWi-Fiオフで立ち上げる
  • 何回目の立ち上がりかを判定するために、ESP8266のRTCメモリーを使う
    • RTCメモリーはDeep sleepの間も値を保持してくれるメモリーで、ユーザーエリアが512バイトある
    • 6回分のセンサー値もRTCメモリーに書き込んでおく
  • 6回分のデーターはAmbientのbulk_send()でまとめて送信する
    • bulk_send()は複数件のデーターにそれぞれタイムスタンプが必要
    • bulk_send()には次の形式のデーターを渡します。「時刻(秒)」という部分がタイムスタンプで、協定世界時(UTC)の1970年1月1日00:00:00からの経過秒数です。
{
    “writeKey” : “ライトキー”,
    “data” : [
        {“created” : 時刻(秒), “time” : 1, “d1” : “値”, “d2” : “値”, ...},
        {“created” : 時刻(秒), “time” : 1, “d1” : “値”, “d2” : “値”, ...},
        ...
        {“created” : 時刻(秒), “time” : 1, “d1” : “値”, “d2” : “値”, ...}
    ]
}
  • タイムスタンプを得るためにリアルタイムクロックを使う
  • リアルタイムクロックの初期化は電源オン直後にインターネットのSNTPプロトコルでおこなう

ArduinoのSNTPライブラリーでは sntp_get_current_timestamp() という関数で現在時刻を取得します。戻り値は、bulk_send()で必要とするのと同じ協定世界時(UTC)の1970年1月1日00:00:00からの経過秒数です。SNTPで得られた時刻をリアルタイムクロックにセットしておいて、センサーの値を読んだ時に、その時刻をリアルタイムクロックから読んで、センサーの値と一緒にメモリーに書いておきます。

リアルタイムクロックは秋月電子のリアルタイムクロックモジュール(EPSONのRX8025NB搭載)を使いました。月差13秒という高精度ですが、SNTPによる消費電力も小さいので、1日に1回SNTPで時刻を再設定することにしました。

以前、ESP8266とBME280を単3乾電池3本で動かし、5分ごとにデーターを測定して毎回Ambientに送信した時は、56日動きました。今回は送信を6回に1回にまとめているので、6倍とは言わないまでも、倍の100日、3か月以上は動くことを期待しています。

回路

ESPr Developerを使うと非常にシンプルな回路になります。I2C接続でリアルタイムクロックRX8025NBと温度・湿度・気圧センサーBME280をつないでいます。また電池の電圧を抵抗で分圧してTout(ADコンバーター)に接続しています。

回路図

実際に作ったボードの写真です。ブレッドボードを使っています。左は「ESPr Developer」を載せる前の状態です。右が「ESPr Developer」と電池をつなげた状態です。

基盤と基盤+ESPr

プログラム

プログラムは倉橋さんの書かれたものを参考にさせていただきました。倉橋さん、ありがとうございます。

プログラムの大まかな流れは「省電力設計」で説明したものと同じです。開発したプログラムはGithubに公開しました

「SimpleWeatherStation」が今回の環境モニターのプログラムです。この他に「Ambientライブラリー」と「timeライブラリー」が必要です。「Ambientライブラリー」のインストール方法は「Arduino ESP8266で温度・湿度を測定し、Ambientに送ってグラフ化する」をご覧ください。「timeライブラリー」もGithubのページにいき、「Clone or download」ボタンでZIPファイルをダウンロードし、Arduino IDEの「スケッチメニュー」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストールする」でインストールします。

気象センサーの設置

出来上がったセンサーをベランダに設置します。温湿度センサーを屋外に設置するときは、雨にあたらず、風通しがよく、直射日光にもあたらないカバーが必要になります。「ナチュラル研究所」さんのサイトを参考に、百均で買った植木鉢の受け皿を加工して、パゴダと呼ばれるカバーを作りました。

pagoda

センサーボードと電池をアクリル板の表裏に貼り付け、それをパゴダの天井に取り付けます。

pagoda+board

これをベランダの軒下に設置しました。

setting

Ambientでグラフ化

センサーを動かすと、5分間隔で測定したデーターが30分ごとにAmbientに送信されます。Ambientでは気温、湿度、気圧、電池の電圧をそれぞれグラフ化しました。
各グラフのヘッダーにある「2016」という数字はグラフに表示するデーター件数です。データーは5分に1件なので
12(件/1時間) x 24(時間) x 7(日) = 2016
で、1週間分のデーターを表示しています。2016年ではありません。
センサーの設置場所も設定しました。

チャネル公開機能を使ってライブデーターを表示しています。

ベランダ気象台@世田谷桜丘

電池を新しいものに入れ替えて、ベランダに設置したのが2016年8月27日9時11分です。それ以前のデーターはセンサーを室内に置いてテストしていた時のものです。