ESP32 マルチタスクの場合、 BME280 I2C クロック設定見直し
マルチタスクを使う場合、Wire関数を同じタスク内に収めること、などの注意点があります。
以下の記事を参照してください。
Arduino – ESP32 大幅更新( 2018/06/28以降 )と I2C 不具合解決、その他気付いたこと
(2018/07/07)
その他、以下の記事も合わせてご覧ください。
BME280 を M5Stack で使って再びハマったこと、BOSCH 純正ドライバの使用について
(2018/06/22)
ESP32 がシングルタスク動作の場合、BME280 は今まで400kHz の I2C 通信で動かしていて、特に問題無かったのですが、2018/02/05版 Arduino – ESP32 のマルチタスクで動かすと、ACK 読み込みタイムアウトエラーがシリアルモニタに表示されるようになりました。
最初は Arduino – ESP32 のバグかと思ったのですが、そういえば、以前、以下の記事の実験をした時、GPIO から出したパルス波がマルチタスクだと乱れることを経験しました。
ESP32 の GPIO から 疑似的に 日本標準電波 JJY を出してみる実験、第1弾
ESP32 がシングルタスクだと安定したパルス波を出すことができるんですが、マルチタスクだと波形が乱れるようです。
それを考えると、I2C クロック周波数を下げれば読み込みやすいのではないかと、安易に考えて実験してみました。
100kHz ではまだエラーが出たので、30kHz まで落としてみたら、ようやく ACK read TimeOUt エラーが無くなりました。
I2Cのプルアップ抵抗や接触不良も考えましたが、どうやらマルチタスクの場合はクロック周波数を落とすことが正解ではないか思われます。
こんなに落としていいのかなと思いましたが、ちゃんと動作しているので、個人的にヨシとします。
安易な考えですので、間違えていたらコメント等でご連絡ください。
BME280 自作ライブラリ見直し
BME280 のデータシートを読み返すと、正確に動作させるためには、BOSCH 純正のドライバープログラムを使えと書いてあります。
https://github.com/BoschSensortec/BME280_driver
ただ、これの使い方がイマイチ良く分からないのです。
そこで、私の場合、以下の記事で紹介した自作のライブラリを使っています。
ESP32 用 BME280 ( 温度 湿度 気圧センサー ) ライブラリを作ってみた
これは、スイッチサイエンスさんの以下の記事のスケッチを基に改良させていただきました。
http://trac.switch-science.com/wiki/BME280
データシートによれば、純正ドライバープログラムを使えず、止むを得ない場合は、データシートに書いてある計算式を使えとあります。
スイッチサイエンスさんのサンプルスケッチではそれを使っていました。
今回はそのプログラムを見直し、ver 1.1 から 1.2 にアップデートしました。
ESP32 は double型が使える為、その関数を追加しました。
https://github.com/mgo-tec/ESP32_BME280_I2C
そして、以前は温度・湿度・気圧データを別々に取得していましたが、データシートによれば、気圧・温度・湿度データは一気に取得した方が、計算は速いと書いてありました。
実際、計算式を組んでみると、温度、湿度をそれぞれ一回一回関数を呼び出すよりも、一気にセンサー値を読み込んだ方が効率が良いことが分かりました。
ということで、Read_All という関数で、温度・湿度・気圧を一気に読み込むことにしました。
サンプルスケッチにプログラム例がありますので、試してみて下さい。
因みに、自己流自作なので、動作は保証しません。
いつか、BOSCH純正ドライバプログラムを使えるようにはしたいと思っています。
BME280 スタンバイ時間、フィルター、オーバーサンプリング設定見直し
実は、これも ESP32 のシングルタスクでは問題無かったのですが、マルチタスクだと市販の湿度計よりも +10% で表示されていました。
そこで、今回、上記で紹介した BME280 データシート日本語訳を見直してみて、屋内( Indoor navigation )で測定する際の推奨値に合わせてみました。
もちろん、最新データシートと見比べて、値が違っていないかを確認しました。
屋内用推奨設定
t_sb = 0; //stanby 0.5ms
filter = 4; //IIR filter = 16
osrs_t = 2; //OverSampling Temperature x2
osrs_p = 5; //OverSampling Pressure x16
osrs_h = 1; //OverSampling Humidity x1
Mode = 3; //Normal mode
ここから、湿度の精度をもう少し上げたい場合は、オーバーサンプリング数を増やしてみると良いと思います。
この他の設定例はデータシートを確認してみてください。
スタンバイ時間や、オーバーサンプリングを変えると、市販の湿度計との差が +3% まで追い込むことができました。
ただし、推奨設定では、データ出力レートが1秒間に25回とあって、これは、私の電子工作では速すぎで、逆にACKエラーになってしまいました。
結局、私は3秒毎にデータを取得するようにしました。
それでも誤差が少なくなったので、個人的にヨシとします。
そこで思ったのですが、はたして BME280 の値が正しいのか、それとも、市販の温度湿度計が正しいのか疑問が湧いてきます。
例えば、下図の様に、今の時季、部屋はメチャメチャ乾燥していて、市販の湿度計では17% を示していました。
でも、BME280 では34% を示しています。
これは、BME280 を1時間くらい測定させた後の写真です。
よくよく調べてみると、この EMPEX 温度湿度計 TD-8173 の使用範囲が、湿度20%~80% だったので、その付近になると、極端に誤差が出るということが分かってきました。
また、ネットで調べると、湿度計の校正に飽和塩法というものがありました。
自分でも校正ができそうなので試そうと思ったのですが、塩水が散らばると厄介だったので、下図の様に、ジッパーロック袋に単なる水を浸み込ませたキムワイプをガラス瓶に入れて、測定してみました。
こうすると、袋の中の湿度は高くなるので、安定してイイ感じでした。
これで見ると、BME280 の湿度が +3% くらいに収まっていて、ほぼ市販の湿度計くらいになりました。
これならば、個人的にヨシです。
ただ、体感で明らかに湿度が20%を切っていると思っても、BME280 の湿度は30% を切ってくれません。
この原因は不明です。
湿度計を校正したいならば、飽和塩法などで、しっかり校正した方が良いかもしれませんね。
でも、30% を切る湿度の校正はどうやってやるんだろ・・・?
まとめ
ESP32 ( ESP-WROOM-32 ) のWi-Fi だけを切れば、CPUフル稼働でも消費電力を押さえられ、発熱も抑えられました。
そして、BME280 の測定のクセも何となく分かって来ました。
これで、ESP32 近辺にセンサーを置いても、温度上昇を抑えることができるようになってきました。
これと Deep-Sleep をうまく駆使すれば、電池駆動でいろいろオモシロイものができそうな気がしています。
今回はここまでです。
ではまた・・・。
コメント