ESP-WROOM-02とBME680でIOTをしてみた

何年か前にバイク置き場にソーラーパネルで充電し
暗くなった時に人が来るとLEDが光るモノを作りました。

その時に外の気温や気圧をBluetoothで飛ばす様にしていたのですが
すぐに接続が切れるので何年もずーっと放置していました。

今回はESP-WROOM-02を使うことで直接サーバにデータを
送ることができるので作ってみました。

やりたいこと

前はBluetoothだったので、PCなどでデータ取得の必要がありましたが
今回はWifi経由で直接インターネットに接続出来ます。

外の気温、湿度、気圧を数分おきに測定して
Wifiを経由して、サーバに測定データを送信します。

今回もある程度作ったら放置になるので、IOT系のサービスは使わずに
自前のサーバにデータを置きます。

仕様はまだ決まっていませんが、データ受け渡しはGETメソッドの
パラメータで行います。

テストのためデータ受信用のプログラムはphpで作成しました。

今回使用したもの

これとは別途、電池電圧を分圧するための抵抗を使いましたが
主にこの2つです。

ESP-WROOM-02開発ボード

KKHMF ESP-WROOM-02開発ボード 2.4 GHz Wi-Fiモジュール Micro USB

KKHMF ESP-WROOM-02開発ボード 2.4 GHz Wi-Fiモジュール Micro USB

895円(05/23 22:13時点)
Amazonの情報を掲載しています

私はBME680と同時に、秋月電子で購入しました。

開発ボードだと1200円しますが、モジュール単体では250円とかなり安いです。

初めてESP-WROOM-02を使う場合は開発ボードがおすすめです。
ESP-WROOM-02にはモード設定のピンが3ピンあり、
プルアップ抵抗が2つ、プルダウン抵抗が1つ必要です。

設定をすれば、Arduino IDEからスケッチを書き込む事ができますが
ESP-WROOM-02を書き込みモードで起動する必要があります。

書き込みモードにするには、PGM(IO0)ボタンを押した状態で
リセットボタンを押すことで、書き込みモードに移ります。

書き込みが完了すると、
リセットが行われ書き込まれたスケッチが実行されます。

単体で動かすには、プルアップ・プルダウン抵抗3つ
スイッチ2つ、USB-UART変換が必要になります。

開発ボードにはそれらがすべて含まれているので
よく分からない場合や、細かい半田付けが苦手な方は開発ボードを
買った方が安心です。

BME680

1チップで気温、湿度、気圧と空気汚染度を取得できるセンサーです。
空気汚染度は、エタノールなどによく反応します。

BME280、LSP25H、SHT31と比べても大きな誤差はありませんでした。


作ってみた

スケッチはいろいろなスケッチと継ぎ接ぎなので公開はしませんが
気になった所を紹介します。

ESP-WROOM-02でHTTPS通信

bme680test.inoでセンサーのテストを行いOKだったので
次はHTTPS通信をおこないました。

HTTPS通信はこちらを参考にしました。
ESP8266 Arduino CoreでGETアクセス。HTTP/HTTPS&プロクシを使ったHTTP通信

http通信だとうまく行きますが、SSL接続だと接続拒否されてしまいます。
現在サーバはすべてSSL化されているので、このままだと使えません。

サイトによってはフィンガープリントを使えば良いと書かれていますが
SSL証明書は私の環境では月に1回更新されてしまうので、
使えなくなる可能性が高いです。

そこで参考にしたのがこのサイト。
ESP8266+ArduinoでHTTPS接続

BearSSLを使うことで有効期限のあるフィンガープリントを使わずに
SSL接続できます。

ESP-WROOM-02で電圧測定

同時にシャープの埃センサーを購入してあり、
2アナログポートを使い、埃(花粉)と電池電圧を測る予定でした。

購入してから調べたらアナログ1ポートのみでしたので
埃センサーはあきらめ、電池電圧のみに変更しました。

通常マイコンだと3.3Vや5Vなど電源電圧まで印加できますが
最大1Vまでしか印加出来ません。

電池電圧を測定する場合は、分圧抵抗を使い
最大電圧は1V以下になる用にします。

入力はTOUT端子に入力し、
この様なスケッチで電池電圧の測定を行っています。

float bat = 0.0;
bat = system_adc_read();
bat = bat * (120+13.5) / 13.5/ 1024;
bat -=0.25;

分圧抵抗は電池電圧TOUT間を120KΩ、
TOUTとGND間を13.5KΩ(27KΩ並列2本)を使っています。

実際にテスターで計りながら、安定化電源で電圧を変え
少し電圧が低くなる様に校正しました。

省電力

電池で動作させるとなると、どうしても気になるのが消費電力です。
スリーブを使わないと80mAぐらい流れます。
ライトスリープを行っても、電流はさほど変わりませんでした。

また、モジュールも発熱があり、この影響を少なくするため
ESP-WROOM-02とBME680は少し離してあります。

そこでDeep Sleepを使うことでスリーブ時の消費電流を3mAに
することができました。

Deep Sleepを使うには、RSTピンと16番ピンを接続しておく事が必要です。
また、Deep Sleep後はリセットされるので要注意です。

RSTピンと16番ピンは接続されていると、書き込みが出来ないと
書かれているサイトがありましたが、実際には書き込めました。
もしダメならスイッチでも付けようかと思っていたので、長くなっています。

BMEガスの値が0

BME680のガス値は、初回は値が0になっています。
Deep Sleepによって、毎回リセットされるのでずーっと0です。

そこで1度読み込みを行い1秒経ってから再度2度目の読み込みを行います。
2度目にはガスの値もちゃんと入ってます。

ただし、ガスセンサーにはヒーターが使われているみたいなので
温度、湿度は1度目の値を使った方が良いかもしれません。

電圧変換

秋月のESP-WROOM-02開発ボードだと5Vまでですが
5Vのレギュレーターを入れたら動作が不安定になったので
自己責任ですが、電池電圧を直接印加してます。

開発ボードには3.3Vのレギュレーターが搭載されていて
最大12Vまで入力可能、回路図を見ても入力が他に流れていません。

開発ボードの5V0に6V~9Vの電池電圧を入力しても動作しています。

まとめ

現在このように設置してます。
5分に1回測定を行い、この様にデータが送信されます。

  DATE:2020/05/20 05:58:05
  TEMP:16.84
  HUM:73.18
  PRS:1002.53
  GAS:38.21
  BAT:8.14

時刻はサーバ側で入れました。

今後はデータロギングと、グラフ化など作りたいと思います。