ESP32 の Wi-Fi のみ OFF および温度・湿度・気圧センサー BME280 の再調整など

ESP32 ( ESP-WROOM-32 )
2018/06/28以降、大幅更新された Arduino – ESP32 で、I2Cインターフェースの Wireライブラリが一新され、ほぼ I2Cトラブルが解消されました。
マルチタスクを使う場合、Wire関数を同じタスク内に収めること、などの注意点があります。
以下の記事を参照してください。
Arduino – ESP32 大幅更新( 2018/06/28以降 )と I2C 不具合解決、その他気付いたこと
(2018/07/07)
その他、以下の記事も合わせてご覧ください。
BME280 を M5Stack で使って再びハマったこと、BOSCH 純正ドライバの使用について
(2018/06/22)

 

こんばんは。

今回は、ESP32 ( ESP-WROOM-32 ) の Wi-Fi 機能を OFF にして消費電力を押さえたり、温度・湿度・気圧センサー BME280 の再調整をしたりしてみた、というご報告です。
因みに、Arduino core for the ESP32 を使った場合です。

まず、ESP32 のスリープモードやパワー制御モードについてですが、Deep-Sleep についてはサンプルスケッチがありますが、ESP32 データシートにあるような Modem-Sleep を使う例がありません。
要するに、Wi-Fi 機能だけ OFF にする方法です。

Web から記事やデータを取得する場合、Wi-Fiルーターとアクセスするには短くても数分毎で良いのですが、デフォルト設定ではその間ずっと Wi-Fi が ON になっています。
すると、ESP-WROOM-32 モジュール基板の裏側が特に熱くなるんですよね。
この放熱は厄介です。

私のように、有機EL ( OLED ) ディスプレイに常時文字スクロールさせる場合、Webにアクセスしていない間は Wi-Fi を OFF にしたいのです。
でも、その方法が今まで分からなかったのですが、今回はやっとその方法を見つけました。

それと、I2C通信の温度・湿度・気圧センサー BME280 を ESP32 のシングルタスクで動かした場合と、マルチタスクで動かした場合では、特に湿度の誤差が大きかったんです。
マルチタスクで動かした場合は、湿度が +10 %以上で表示されてしまいます。
この原因はしばらく謎だったのですが、今回は +3%くらいまで追い込むことができました。

それに、BME280 データシートの日本語翻訳を見つけました。
以下の O-Family さんの電子工作系ブログにありました。

http://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/BME280/BME280test.html

私は何度も BOSCH 社の BME280 最新版データシートを見たのですが、コピー制限がかけられていて、テキストをコピペして Google 翻訳にかけられません。
英語は何となく文面の全体像が分かって、ある程度のパラメーターを読むくらいの最低限の英語は分かるのですが、基本的に苦手です。
それに、いろいろ忙しくて時間が無いので、Google 翻訳にかけた方が圧倒的に早く理解できます。

学生時代ならば、英語を自力で訳しながら工作を進めていった方が良いに決まっていますが、社会人で電子工作とは程遠い本業に就いていると、そんな時間はありません。
ですから、翻訳できずに困っていたんです。

でも、この日本語訳は、何と、O-Familyさん個人で作成されたそうです。
これ、よく見ると、細部まで日本語化されていて、BME280 の仕様が手に取るように分かります。
もちろん、非公式ですので自己責任でご覧ください。
ホントに素晴らしいですね。
こういうものを公開して下さる方がいらっしゃるからこそ、私のような素人電子工作家がこういう難解なデバイスを扱うことが可能になるんですね。
改めて、感謝感謝です!
m(_ _)m

これのおかげで、推奨設定を把握することができて、どうすれば適正な値になるかということが少し分かって来ました。
そして、ESP32 の Wi-Fi のみを OFF にすることによって、BME280 への熱の影響を減らすことができました。

というわけで、自分なりに見つけた方法を紹介します。
因みに、ここで記載していることは、私の趣味と独学でやった実験で、自己満足的なことを書いています。
他の方の環境で動くかどうかは分かりません。

ただ、もし、誤り等がありましたらコメント投稿していただけると助かります。

スポンサーリンク

ESP32 ( ESP-WROOM-32 ) の Wi-Fi のみを ON-OFF する方法

Arduino – ESP32 で WiFiClientSecure ライブラリを使う場合、つまり、SSLサイトから記事をGETする場合は、WiFi OFF にすると heap memory が食い尽くされる現象が出ています。
以下の記事を合わせて参照してください。
ESP32 および M5Stack で数時間後に Web 記事取得失敗する問題について
(2018/09/25)

 

動作確認した Arduino core for the ESP32 のバージョンは以下の 2018/02/05 です。

Commits on Feb 5, 2018

このバージョンは、SPIFFS 不具合がありますので注意です。
詳しくは以下の記事を参照してください。

ESP32 ( ESP-WROOM-32 ) 自分的 トラブルシューティング まとめ

では、Wi-Fi のみを ON-OFFする方法ですが、要するに、ESP32 のデータシートにあるような、Modem-Sleep のようなものです。

Modem-Sleep って、意外とネットで情報が出ていないんですよね。
結構悩みました。

でも、実際に探ってみると、結果は意外と簡単でした。

ON にする方法は今まで通り、WiFi.begin クラスや、wifiMulti.run() を使えばルーター(アクセスポイント)に接続します。

問題はOFFにする方法です。
これは、WiFi.h または WiFiMulti.h をインクルードした上で、以下の関数を使います。

WiFi.disconnect(true);

引数に true を入れると、ESP32 の Wi-Fi機能のみが OFF になります。
false を入れると、Wi-Fi機能はON のままですが、アクセスポイントに接続しなくなります。

これは、例えば、
WiFi.begin( ssid, password );
でルーターに接続し、HTTP GET で Web から記事やデータを取得し終わったら、
WiFi.disconnect(true);
で WiFi を OFF にして、ディスプレイ表示させます。

再び、記事を取得する時間になったら、
WiFi.begin( ssid, password );
で接続すれば良いわけです。

この関数を使う場合には注意が必要です。

WiFi.disconnect();

という形で引数を入れないと、false が自動入力されるので、アクセスポイントに繋がりません。
false を使う用途としては、WiFiScanライブラリを使って、周辺のアクセスポイントをスキャンするような場合です。
スキャンだけして、アクセスポイントに接続しないという使い方です。

これはArduino – ESP32 の古いバージョンではうまく動かないかもしれません。
その他、この関数で不具合が出るという情報がありますが、今のところ、2018/02/05バージョンでは問題ありませんでした。

今、作成中なのですが、以前の記事で作成した デュアルOLED ディスプレイ表示を更に発展させて、BME280センサー値も表示させたもので、下図の様にそれぞれ簡易USBテスターで電流値を表示させてみました。
この USB テスターは中国製ですが、電流値はある程度正確だということは調査済みです。
USBテスターについては以下の記事を参照してみてください。
USB Safety Tester をレビューしてみた

まずは、Wi-Fi ON のままの場合です。

この写真では 0.23 A (=230mA) と表示されていますが、0.16~0.27 A まで変動しています。
ESPr Developer 32 ( ESP-WROOM-32 開発ボード )の裏側が特に熱くなります。

では、Wi-Fi を OFF にした場合はこんな感じになります。

この写真では 0.10 A (=100mA) と表示されていますが、0.08A~0.16A まで変動しています。

以上から概ね約100mA くらい消費電力を節約できたようです。
基板の裏側も、ほんのり暖かいくらいで、それほど熱くならないので、とっても Good! です。

もちろん、Webから記事を取得するほんの数秒だけは、Wi-Fi が ON になりますが、一瞬熱くなるくらいで全く問題ありません。

今まで、BME280 などの温度・湿度・気圧センサーを使う場合、ESP32 ( ESP-WROOM-32 )に近づけてしまうと、温度上昇が半端無くて、あまり使えなかったのですが、これくらいの温度であれば、それほど離さずとも測定できそうです。

また、Deep-Sleep を使ってしまうと、文字をスクロールできませんので、やっぱりある程度 CPUを動かすためには Wi-Fi のみ OFF というのが良いですね。
文字も動かさないのであれば、Deep-Sleep を使えば良いと思います。
因みに、私はまだ Deep-Sleep は試していないので良く分かりません。
詳しくはネットで調べてみて下さい。

【補足】
この記事を投稿してすぐ、ツイッターで情報をいただきました。
WiFi.mode(WIFI_OFF);
という方法がありました。
私も試してみたところ、
WiFi.disconnect(true);
と同じように使うことができました。
WiFi.moce(WIFI_STA);
を入れなくても、WiFiに繋がり、消費電力も抑えられました。
情報いただき、ありがとうございました。
m(_ _)m

次のページでは、BME280 の設定を説明します。

コメント

タイトルとURLをコピーしました