ESP8266を使って電池駆動の環境モニターを作っています。今回、三つ目のバージョンとして、温度、湿度、気圧に加えて照度を測定するようにしました。

1号機から3号機までのハードウェア構成

写真の左が1号機、真ん中が2号機、右が3号機です。

 

  1号機 2号機 3号機
マイコン ESPr Developer
(スイッチサイエンス)
ESP-WROOM-02
DIP化キット(秋月電子)
ESPr Developer
(スイッチサイエンス)
センサー 温湿度・気圧センサー 温湿度・気圧センサー 温湿度・気圧センサー
照度センサー
その他 RTCモジュール RTCモジュール  

 

1~3号機のハードウェア構成を簡単に表にまとめました。マイコンはどれもESP8266を搭載したもので、1号機と3号機はスイッチサイエンスさんのESPr Developer、2号機は秋月電子さんのESP-WROOM-02 DIP化キットを使いました。ESPr DeveloperはUSBシリアル通信モジュールやリセットスイッチなどが搭載され、コンパクトにまとめられています。価格は2,160円(2017年1月10日時点)。秋月電子さんのDIP化キットはUSBシリアル通信モジュールやリセットスイッチなどは外付けする必要がありますが、価格は650円(2017年1月10日時点)。USBシリアル通信モジュールなどの価格を合わせると、ESPr Developerとあまり変わらない価格になります。USBシリアル通信モジュールはプログラムの書き込みやデバッグに必要ですが、同じものを複数台作るなら1台に搭載すればいいので、端末をたくさん作るならDIP化キットは有利です。

1、2号機はリアルタイムクロック(RTC)モジュールを使いましたが、3号機は時刻をプログラムで管理し、空いたスペースに照度センサーNJL7502LとADコンバーターMCP3002を搭載しました。

1号機は基盤むき出しでパゴダと呼ばれるカバーの中に入れました。2号機は温湿度・気圧センサーだけを外に出し、マイコン類は密閉ケースに入れました。3号機はブレッドボードと電池がぴったり入るケースが見つかったので、そのケースに入れ、ケースをパゴダの中に設置しています。

プログラム概要

1~3号機とも、温度、湿度、気圧は5分間隔で測定しています。電池で長期間駆動するために、測定と測定の間はdeep sleepします。ESP8266はWi-Fiに接続する時に大きな電力を消費するので、データーは毎回送信せず、6回分まとめて30分に1回送信するようにしています。

Ambientは複数回分のデーターをまとめて送るbulk_sendを提供しており、各回の測定時刻を引数として渡す必要があります。

    {
        “writeKey” : “ライトキー”,
        “data” : [
            {“created” : 時刻(秒), “time” : 1, “d1” : “値”, “d2” : “値”, ...},
            {“created” : 時刻(秒), “time” : 1, “d1” : “値”, “d2” : “値”, ...},
            ...
            {“created” : 時刻(秒), “time” : 1, “d1” : “値”, “d2” : “値”, ...}
        ]
    }

時刻はsntpでネットから取得しますが、これも6回に1回、Wi-Fiに接続した時だけおこないます。ESP8266はdeep sleepから復帰する時にリセットがかかり、RTCメモリーというエリア以外のデーターはdeep sleepの前後で引き継げません。そこで、1、2号機はsntpで得た時刻をリアルタイムクロック(RTC)モジュールに保持し、Wi-Fiに接続しない回はRTCモジュールから測定時刻を取得しました。3号機ではESP8266のdeep sleep時間を調べ、時刻をプログラムで管理することでRTCモジュールの使用をやめることができました。この件は「ESP8266で300秒deepSleepしたら実際に何秒眠るのか調べた」に書きました。

3号機では、RTCモジュールを使わないことで生まれたスペースに照度センサーとADコンバーターを搭載しました。ADコンバーターのMCP3002がSPI通信でしかアクセスできないため、それまでI2C通信でアクセスしていたBME280もSPI通信でアクセスするように変更しました。この件は「温度・湿度・気圧センサーBME280をSPI通信でアクセスする」に書きました。

1号機と3号機を比較した写真がこちらです。

3号機の回路図はこちらになります。

MCP3002は10ビットのADコンバーターで、3.3vで駆動しているので、1ビットの分解能は3.2mvになります。フォトトランジスターNJL7502Lのデーターシートには負荷抵抗を変えた時の出力電圧の特性があります。グラフが2つあり、一つが「White LED」、もう一つが「Light Source A」と書かれています。この「Light Source A」の定義が見つけられなかったのですが、自然光だとすると、負荷抵抗1kΩの場合は5Luxぐらいで3.2mvになるので、5Luxぐらい測定できることになりそうです。明るい方は4,000〜5,000Luxでサチりそうです。実際にはモニターを取り付ける位置やケースによる減光などの影響を受けますが、非常におおざっぱに言えば、一桁Luxから4,000〜5,000Luxまで測定できそうです。

プログラムはGithubに公開しました。

https://github.com/TakehikoShimojima/SimpleWeatherStation

1、2号機から送られるデーターは温度、湿度、気圧と電源電圧の四つです。3号機のデーターはこれに照度が追加されます。AmbientはMongoDBというNon SQLのデーターベースを使っているため、データーベースの再構成などをしなくても、同じチャネルで途中からデーターの種類を増やすことができます。試行錯誤が必要な、プロトタイプ段階で使うIoTクラウドサービスとしては便利な機能だと思います。

3号機は2017年1月15日に自宅のベランダに設置しました。データーはこちらのチャネルで公開しています。

ベランダ環境モニター@世田谷桜丘