BOSCH製 BME280 ドライバ設定について
以前のこちらの記事で紹介した BOSCHドライバの使い方は、ノーマルモードでしたが、今回、それほど頻繁に計測するわけでもないので、私の自作ライブラリでは、Force モード限定にしました。
BME280データシートによると、Force モードの場合、1回測定後、スリープモードに移り、データレジスタから値を読み込みます。
M5Stack 測定の場合で室内測定限定ならば、Forceモードで良いと思います。
そして、BME280 データシートの最後の方の、
Measurement time and current calcuration
という項目で書かれているように、モードやフィルタの設定による最低測定間隔時間を計算できます。
私なりに計算したところによると、屋内測定推奨設定の場合の Forceモードは、
880ms以上
でした。
今回の私の作ったスケッチでは、最低 3000ms なので、問題無いと思われます。
コンパイル書き込み実行
では、前々項のスケッチをコンパイル書き込み実行させてみてください。
ただし、以下の注意事項があります。
display_bme680_i2c.h: fatal error: bme680.h: No such file or directory
が出る場合、インストールした私の自作ライブラリのSensorフォルダの中の以下の2つのファイルを削除してみてください。
Windows 10 の場合、以下のパスになります。
C:\Users\__user_name__\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor
削除するファイルは以下の2つです。
display_bme680_i2c.h
display_bme680_i2c.cpp
(2018/09/24)
ただし、ここで注意!
Arduino IDE の「ツール」メニュー、「Core Debug Level」を「Verbose」にして、シリアルモニターで確認していると、原因不明の再起動してしまうことがあります。
今のところ原因不明ですが、Arduino – ESP32 のエラーログ出力に不具合がある模様で、「Core Debug Level」を「なし」にすると正常に動作します。
消費電力について
今回のスケッチで、電力を大幅に消費するところは、WiFi アクセスポイント接続時です。
先に紹介したスケッチの、WiFi アクセスポイント接続から、WIFI_OFF までの流れは以下の通りです。
1.begin でアクセスポイント接続開始
2.NTPサーバーから現在時刻取得
3.Yahoo! RSS Japan サイトから天気予報取得
4.Yahoo! RSS Japan サイトからニュース記事取得
5.Ambient へ BME280 センサーデータ送信
6.WIFI_OFF
この WIFI_OFF ですが、6/28~7/09 までの Arduino – ESP32 では、WiFi.beginで再接続できませんでした。
これが、2018/07/10に Arduino – ESP32 で再接続できるように修正されました。
それにより、WIFI_OFF にすると、以前と同じように電力を抑えることができるようになりました。
今回のこのスケッチでは、常時 CPUフル稼働で、LCDディスプレイフル点灯ですので、あまり省電力化できたとは言えませんが、WIFI_OFF 後は下図の様に 140mA 程に落ち着きます。
(以下の画像のUSBテスターはこちらの記事で紹介しています)
setSleep という関数を使うという方法がありますが、実際試した結果、アクセスポイント接続時の消費電力抑えられますが、アクセスポイントが見つからない場合は急に 200mA まで跳ね上がります。
恐らく、常にアクセスポイントをScan しているからだと思います。
2018/06/24 までの Arduino – ESP32 では、こちらの記事の動画にあるように、WIFI_OFF にしても、同じような症状が出ました。
それが、最新版では、アクセスポイントが見つからなくても確実に WiFi関連機能が OFF になって、省電力化できているようです。
これだけディスプレイやmicro SD カードがフル稼働して、BME280も駆動している中で 140mA まで抑えられたのは、なかなか良いのではないかと勝手に思っています。
以下の記事も合わせて参照してください。
ESP32 および M5Stack で数時間後に Web 記事取得失敗する問題について
(2018/09/25時点)
操作方法
ボタンスイッチで、下図の様に切り替えられます。
ボタンA
瞬時押しと長押しで、グラフの最大値最小値を切り替えます。
これは、先に紹介したスケッチに予め入力してある値です。
ボタンB
押すごとに、Ambient へのデータ送信ON、OFFを切り替えます。
ONにすると、WiFiアクセスポイントへ再接続する時間で送信します。
Web記事を取得して WIFI_OFF にする時間間隔を約3分間に設定しているので、その時に Ambient へデータを送信します。
もっと短い間隔で送信したい場合は、WIFI を常時接続にして送るなどの方法がありますが、消費電力が大きいので、3分以上がベストかと思います。
ボタンC
押すごとに、センサー値取得時間間隔を変更できます。
あくまで、M5Stack のディスプレイ表示だけの時間間隔の変更です。
Ambient への送信間隔とは関係ありません。
設定は以下のようになります。
3秒毎(デフォルト)
↓
6秒毎
↓
12秒毎
↓
36秒毎
↓
1分12秒毎
↓
4分48秒毎
これは、ディスプレイの画素数で割り振った結果、こういう時間間隔設定になってしまいました。
この時間間隔はライブラリ内で定義されているので、基本的に変更できません。
セットした時間間隔を自動計算して、下方の横軸の目盛り数値も変化します。
Ambient の測定結果
上記のように、M5Stack の Bボタンを押して、Ambient 送信有効にすると、クラウドサービスの Ambient にセンサーデータが保存されます。
Ambient ページで作成したチャンネルID を開くと、下図の様に既にグラフ化されているのが分かると思います。
時刻は M5Stack からは送信しておらず、センサー値だけ送信しています。
ということは、時刻は Ambient側で自動記録されているということです。
これは有難いし、スバラシイですね。
そして、スゴイのは、上図にあるように、データダウンロードの所をクリックすると、パソコンにテキスト形式の CSVデータをダウンロードすることができます。
それをテキストエディタで見てみると、こんな感じです。
もう、至れり尽くせりですね。
自分が欲しいと思ったデータ全てが簡単に取得できます。
以前、こちらの記事で、自分で micro SD カードに CSV 出力させて、エクセルでグラフ化してみていましたが、それがアホらしいくらいに簡単です。
これは、アマチュア電子工作家にとっては本当に有難いサービスだと思います。
とにかく、超お勧めですよ!
Wi-Fi アクセスポイントの再接続、Web記事の再接続について
M5Stack 測定中に、アクセスポイント(ルーター)の電源を切ってみたり、再びONにしてみたりすると、再接続できることが分かると思います。
ただ、私が実験した限りにおいては、USBハブを使ったり、粗悪で長いUSBケーブルなどを使ったりして電源を供給していると、再接続が上手くいかないことがありました。
恐らく、WiFi起動時に多量の電流を必要とするので、その電圧降下でWiFiが起動し切れていないと想像しました。
ですから、再接続が上手くいかない場合はパソコン直のUSB3.0ポートからできるだけ良質で短いUSBケーブルで接続してみてください。
また、丸1日動作させていて、深夜2:00~朝6:00 頃までは Yahoo! Japan RSS サイトへの再接続ができなくなる現象がありました。
これは Yahoo サーバー側の問題なのかは分かりません。
再接続できなくなった場合は、M5Stack の電源を切って、再度ONにしてみてください。
因みに、M5Stack の電源をOFFにしたり、ルーターの電源をOFFにしたりしても、再度電源をONにした時にアクセスポイントに再接続できれば、Ambient へのデータ送信は問題無くできます。
以上、再接続についてはまだ不明なところがありますので、いろいろこれから実験していこうと思っています。
編集後記
いかがでしたでしょうか。
6/28頃から最新版 Arduino – ESP32 の不具合に出くわして、自分のプログラムが悪いかもしれないと思い、2週間もの間いろいろ試行錯誤していましたが、7/10日の更新で、今までの不具合が嘘のように全て解消されて、この2週間は何だったのか・・・、と気が抜けてしまいました。
今回の教訓は、今までのスケッチが最新版 Arduino -ESP32 でうまく動かなくても、
「慌てず、深く追求せず、安定するまで気長に待つ」
ということが一番良いと思いました。
そのおかげで、ESP32 マイコンというものの特徴がだんだん分かって来て、とても勉強になりました。
今回の M5Stack BME280 測定器もかなり安定して動作できるようになりました。
マルチタスクで、ここまで正確なセンサー測定ができるようになって、しかもニュースや天気予報が見られるとなると、楽しくなってきますね。
これからいろいろな応用的な電子工作やプログラミングができそうな気がしています。
今回はここまでです。
ではまた・・・。
コメント
mgo−tecさん、
1週間ほど福岡の方に行ってまして、ご無沙汰しておりました。
その間に、またさらに素晴しい秀作スケッチが出来上がっており、遅ればせながら模写させて頂きました。
当初、必要なライブラリー類を更新した後、試しに現状のままのArduino core for ESP32でインストールしてみたら、やはりコンパイルエラーが出たので、この機会に最新版に更新しました。
その後は、一発Noエラーでコンパイルは完了しました。
寧ろ意外な所でハマってしまったのが、Ambientの初期登録で、認証メールがgmailのフィルタに引っかかり迷惑メールフォルダに入っていたのに当初気づかなかったことと、ライトキーに誤ってユーザーキーを書き込んでいたこと位ですかね…
しかし、確かにこのAmbientクラウドは非常に便利で他にも色々と活用ができそうですね?
本題のスケッチの方ですが、接続状況がWifiとAmbientが追加されてさらに細かく表示がされ、下半分にグラフが表示される様になったので、Yahooニュースのスクロール文字が小さくなって老眼の身にはちょっと辛くはなりましたが、必要十分な情報が盛り沢山でとてもいいですね。。。
(将来的にグラフのオン/オフ切り替えもできたらベターですね?)
当方のBME280基板は、目下ブレッドボードで外付けにしていますが、この半分位の大きさの安価なI2C専用基板がある様なので、手に入れたらPROTO基板の空いたスペースに実装してみようと思っています。
(M5stackの内部環境モニターとなってしまいますが…)
尚、数時間ほど連続動作させてみましたが、特に接続エラーを起こすことも無く、センサのデータ取得も途切れることはありませんでした。
また、消費電流は5.14Vで130mA位でしたので、増強したLipo電池で半日位は持ちそうです。。。
H.Wさん
いつも試していただいて、ありがとうございます。
m(_ _)m
今回は、かなり力をいれてプログラミングをしてみました。
自分なりに納得できる仕上がりになりました。
でも、おっしゃる通り、私も老眼でニュースや時刻を読み取るのは少々辛いです。
そうすると、もっと大きいディスプレイが欲しくなりますね。
とりあえず、ディスプレイに全部盛り込んでみたかっただけのお遊びです。
Ambient設定については私も迷惑フォルダに入っていました。
これ、皆さん悩んでいる方も多いかもしれませんね。
Twitter でツイートしておきます。
最新版 Arduino – ESP32 は、消費電力も前よりも少なくなり、安定感が増しましたね。
ますます進化していて有難い限りです。
なんとか台風の季節前に M5Stack とセンサ連携が形になりました。
これからは威力を発揮しそうです。
H.Wです。
その後の状況ですが、Webゲットが一度出来なくなると所定時間(ディフォルトで3分)経っても再接続ができない状態が継続します…
(但し、リセットすると直ぐに正常接続します。)
尚、該当箇所を適宜Wifimultiに変更してみましたが、シリアルモニターでも「…..」が継続表示されて接続できない状態となりました…?
ところで、7/25発売のInterface9月号ではESP32が特集されますね? 既にAmazonで予約済ですが、
事前の目次情報を見るとInterfaceなので当然と言えば当然ですが、かなり突っ込んだ解説がされているようで今から楽しみです。
>第1部 新定番IoTマイコンESP32登場
>第2部 大人気のIoTプロトタイピング・デバイスM5Stack
>第3部 IoTマイコンESP32徹底研究
>第4部 ESP32 IoT実験室
M5stackについても詳細な事例が取り上げられているようなので期待してます。
(mgo-techさんも何か記事を投稿されているのでしょうか?)
H.Wさん
いつもご報告ありがとうございます。
実は、私も同じ症状が出ました。
以前に比べれば、最新版の Web get できなくなることは少なくなりましたが、やはり一度接続できなくなると、二度と繋がらなくなりますね。
これは謎です。
WiFi_OFF にしていることに何か原因があると思います。
電力食ってもよければ、
WiFi.mode(WIFI_OFF);
などを外して、常時接続してみてください。
それでも再接続できなければ、原因は私には分かりません。
Arduino-ESP32 が更新されるのを待つしか無いと思います。
Interface のESP32特集については存じております。
私も買おうと思っています。
因みに、Interfaceさんからは私のような素人にはお呼びがかからないと思います。
ですから投稿していません。
でも、内容は楽しみですね。
期待しちゃいます。
「ArduinoIDE」超初心者です、以下について教えてください。
1.「M5Stack」用にスケッチを検証・コンパイルすると、既定のライブラリが探せないためコンパイルできません。(探せるものもあるようです)
尚、ファイルは既定の場所にあり壊れてはいないようです。
何処かに、「path」の設定などが有るのでしょうか。
2.同名のホルダー及びライブラリが複数存在しますが、何処かにまとめた方がいいのでしょうか、
また空のホルダーもありますが、削除した方がいいのでしょうか。
よろしくお願いいたします。
kuroさん
記事をご覧いただき、ありがとうございます。
まず、Arduino core for the ESP32 は、2018/07/25くらいから、Stable版というものができました。
それは、ボードマネージャでインストールします。
以下の記事をご覧ください。
Arduino core for the ESP32 のインストール方法
もし、古い Arduino – ESP32 と、Stable版が二重インストールされているとうまく動作しないかも知れませんので、古いものは esp32 フォルダごと削除してください。
私は、現在、Stable版を使っています。
次に、私の自作ライブラリは、古いものはフォルダごと削除してください。
念のため、バックアップ取っておいた方が良いと思います。
名前が重複しているものは古い方を削除してください。
私の自作ライブラリは頻繁にアップデートしていますので、新しいものを使う場合は、古いものを必ず削除してから、再インストールしてください。
ただし、私のスケッチの古いものは、古いライブラリでないと動作しないものもあります。
そういうものがありましたら、ご連絡いただければ、対処方法をお教えします。
とりあえず、それでも動かない場合、エラーメッセージを貼り付けてコメント頂ければと思います。
宜しくお願いします。
mgo-tecさん、回答ありがとうございました。
全てのファイルを削除し、再インストールしましたが次のエラーが出るので取りあえずリネームして行いました。(どのようにすればいいのか分からないので)
・「WiFi.h」、「SD.h」に対して複数のライブラリが見つかりました
その後も、下記のようなエラーが出ます。
どうすればいいのか分かりません、対処方法をご教授願います。(長くてすいません)
「エラー内容」
Arduino:1.8.6 (Windows), ボード:”M5Stack-Core-ESP32, QIO, 80MHz, Default, 115200, None”
libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c15initBme280ForceEiij+0x1c): undefined reference to `bme280_init’
libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c15initBme280ForceEiij+0x20): undefined reference to `bme280_set_sensor_settings’
libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c15initBme280ForceEiij+0x24): undefined reference to `bme280_set_sensor_mode’
libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o:(.literal._ZN17mgo_tec_esp32_bv116DisplayBme280I2c7getDataEv+0x8): undefined reference to `bme280_get_sensor_data’
libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o: In function `mgo_tec_esp32_bv1::DisplayBme280I2c::initBme280Force(int, int, unsigned int)’:
C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_init’
C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_set_sensor_settings’
C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_set_sensor_mode’
libraries\ESP32_mgo_tec-master\ESP32_mgo_tec_bV1\Sensor\display_bme280_i2c.cpp.o: In function `mgo_tec_esp32_bv1::DisplayBme280I2c::getData()’:
C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_get_sensor_data’
C:\Users\・・・\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor/display_bme280_i2c.cpp:600: undefined reference to `bme280_set_sensor_mode’
collect2.exe: error: ld returned 1 exit status
exit status 1
ボードM5Stack-Core-ESP32に対するコンパイル時にエラーが発生しました。
「ファイル」メニューの「環境設定」から「より詳細な情報を表示する:コンパイル」を有効にするとより詳しい情報が表示されます。
kuroさん
エラーメッセージ送って頂きありがとうございます。
まず、基本的にライブラリ名のリネームはしなくても良いです。
「WiFi.h」、「SD.h」に対して複数のライブラリが見つかりました
というメッセージが出る場合は、ライブラリが正しくインストールされていないか、プログラムの誤りが原因です。
正しくインストールされていれば、このエラーは出なくなります。
ただ、Arduino標準ライブラリや、Arduino-ESP32ライブラリ以外で、同じ名前のライブラリがあれば、その場合はエラーが出るかもしれません。
Arduino標準ライブラリと、Arduino core for the ESP32 のライブラリに限っては、同じライブラリ名があっても、正しくインストールされていればエラーは出ないようになっています。
このエラーメッセージを見る限り、BOSCH純正ドライバライブラリがインストールされていないように見受けられます。
まず、BOSCH純正ドライバライブラリが正しくインストールされているか、ご確認ください。
この記事の2ページ目のところに、
「BOSCH製 BME280 ドライバを Arduino IDE にインストールしておく」
という項目があります。
インストールしたら、必ず FLOAT を有効にしてください。
これでもうまく動作しない場合は、またご連絡ください。
mgo-tecさん、回答ありがとうございました。
再インスト後のスケッチは、「M5Stack と BME680 でガス報知器(アラーム)および気圧・温湿度グラフで「熱中症」警告表示器を作ってみた」の記事のセンサー部分を「BME680 ⇒ BME280」に変更しただけだったので対応していなかったようです。
次の部分をコメントアウトしたら無事に検証できました。
・75行目:bme_disp.initBme680Force( sda, scl, 100000, 28 ); //I2C周波数100kHz,
・95行目:bme_disp.getData();
お手数をおかけしました。
ありがとうございました。
kuroさん
とりあえず、動いて良かったのですが、私は BME680 用のスケッチを BME280 で動くようには設計しておりません。
BOSCH純正ドライバライブラリの BME680 用と BME280 用では構造が全く異なりますので、どこかしら不具合があると思われます。
その辺はご理解のほどよろしくお願いいたします。。