PIC16F1705とBME280による温湿度気圧計【20250810デバッグ報告追記】
写真1.ブレッドボードに組んだ温湿度気圧計
PIC16F1705で温湿度気圧センサBME280モジュールを駆動し、LCD(AQM0802)に表示する。
【デバッグ報告】20250810追記
昨年から今年2025年8月にかけて、2名の方より湿度測定時の不具合のコメントをしただきました。ありがとうございました。
当初、センサーそのものの不具合を疑っていましたが、コードを見直したところ、バグがありましたので、次の通り報告します。
修正箇所は次の通りです。main.cの、
//I2Cデバイス(BME280)からデータを読み込む
void i2c1_read(void){
この関数の最後の行について
【不具合のあった元のコード】
hum_raw = (data[6] << 8) | data[7];
【修正後】
hum_raw = ((uint32_t)data[6] << 8) | data[7];
これで高湿度時に湿度0%になる不具合が解消すると思います。
これは8bitデータをシフトしてunsigned long型の変数に代入する箇所なのですが、桁あふれをしないようにuint32_tでキャストするということです。
問題箇所の上の行では、pres_rawとtemp_rawを同じようにキャストしているので、なぜ問題となったhum_rawだけキャストし忘れたのか、今となっては謎です。思い込みによって発見が遅れてしまいました。たいへん申し訳ないm(_ _)m
さて、ついでなので回路の問題点が一箇所あったのを発見したので、これも書いておきます。
図A.修正回路図
元の回路では、MOSFET Q1のゲートはマイコンのRC4ポートからR2を介して駆動されていますが、この場合、RC4が不定(ハイインピーダンス)になったときにQ1が完全にOFFできず、リーク電流が流れることがあります。なので、R6(100kΩ)を追加して、不定状態の対策とします。
【これよりもとの本文】
今回はPICマイコンの開発環境MPLAB X IDEでMCC(Microchip Code Configurator)を使って、温湿度気圧センサBME280をI2Cで駆動して、測定した温湿度気圧をI2CのLCDパネルに表示する温湿度気圧計の試作をした。
PICマイコンのレジスタ設定等をGUIで行えるMCCを使う練習をするのが今回の主な目的だ。
これまで、PICの開発はMCCを使わずにやっていたが、最近のPICマイコンは機能が増え、レジスタ設定が非常に複雑になってきたため、手作業でレジスタ設定を行うことが困難になり始めていた。
Microchip側としてもそのあたりを考慮して、GUIで簡単にレジスタ設定ができるMCCをリリースした。
MCCを使うと、レジスタ設定は非常に簡単に行えるようになるが、その反面レジスタ分類ごとにファイルが生成されるため、慣れないとどこで何を設定しているのかがわかりにくく、全体として見通しが悪くなる。そのためいままで敬遠してきたが、今回使ってみて、慣れてくるととても便利だということがわかった。
【温湿度気圧計仕様】
今回試作した温湿度気圧計の仕様と開発環境は次のとおり。
PICマイコン PIC16F1705-I/P
温湿度気圧センサ BME280(I2C)
LCD AQM0802(I2C)
開発環境 MPLAB X IDE v5.35
XC8 v2.31
MCC v4.0.2 ※
測定間隔 270.6秒
電源電圧 2.6~4.2V
消費電流 0.2~0.25mA
※MCCはMPLAB X IDEにプラグインとしてインストールする。
【回路】
図1.回路図
図1に今回製作した回路図を示す。
温湿度気圧センサBME280は、3.3VLDOを搭載したモジュールを使用した。(写真2)
写真2.BME280モジュール
amazonやaliexpressなどで購入可能。
表示用LCDは秋月のAQM0802を使用した。これは安価でコンパクトなので、実験によく使用する。
ただ、電源電圧が変わると表示のコントラストが変わってしまう。そのため、今回はPICマイコンのA/Dコンバータ(ADC)で電池電圧をモニタし、電圧が3.5V以下に下がるとLCDコントラストを濃くするように調整している。
ADCには電池電圧を100kΩx2で分圧して入力しているが、ここで電流を消費しないように、測定時のみMOSFET AO3406で抵抗分圧をONしている。
主要部品の動作電圧範囲は、
PIC1705 2.3~5.5V
BME280 1.71~3.6V(LDOなしのBME280単体)
AQM0802 2.7~5.5V
となっており、BME280モジュールは3.3VLDO搭載なので、リチウムポリマ電池(最大4.2V)をそのまま使用した。
BME280とAQM0802はI2Cインタフェイスなので、SCLとSDAにプルアップ抵抗が必要だが、今回はBME280モジュールとAQM0802内部にそれぞれ10kΩが搭載されており、合成でそれぞれ5kΩのプルアップ抵抗になっている。
【ソフトウェア】
今回のソースファイルをプロジェクトホルダごとアーカイブしてこの記事の末尾にリンクしておく。
PICマイコンは、測定、表示が済むとSLEEPに入り、WDT(ウォッチドッグタイマ)によってSLEEPから目覚めて測定表示、再びSLEEP、を繰り返す。測定時は目印として一瞬LEDを点灯する。
WDTの最大時間は、MCCでポストスケーラーを最大値の8388608に設定したとき270.6秒となる。つまり、4分30秒に一度測定、表示更新をする。
WDTでSLEEPから目覚めたときは、SLEEPの直後の命令から復帰する。リセットではないので注意が必要だ。
LCDのコントラストが電池電圧によって変わってしまい、電圧が3Vを切るとほとんど見えなくなってしまうため、ADCで電池電圧をモニタし、3.5Vを堺にコントラスト設定を変えている。これはmain.cで電圧低下フラグBattLowを立ててi2c_lcd.cの113行目からの記述で行っている。
【動作】
SLEEP状態での消費電流はおよそ0.2mAで、測定時には瞬間的に1mA程度(LED点灯含む)となる。平均電流はおおむね0.2~0.25mA程度。
400mAhのリチウムポリマ電池での実動作では72日程度の動作を確認した。
SLEEP状態での消費電流は、BME280モジュールに搭載されたLDOのIqが大きいのではないかと思っていたが、実際に確認してみるとIqでの消費はきわめて小さく、LCD(AQM0802)の消費電流が支配的だった。
【ソース】
ダウンロード - 20220214bmeaqm_1705adc_000ok.x.zip
そういうわけでMCCはとても便利なので、どんどん使いましょう(^-^)
MCCの使い方は、トランジスタ技術2021年9月号別冊付録「PIC開発マニュアル2021」を参考にしました。
| 固定リンク | 0
コメント
こんにちは
面白そうな記事でしたので作ってみました。
仕様は少し違って、USB5Vで動かしております。
23年7月に製作して約一年正常に動作しておりましたが、最近湿度表示が 0% になる事が度々発生してます。決まって朝方に発生しております。
センサーの故障かと思い再購入して交換しましたが症状は同じでした。
発生時は湿度が高い場合に起きているように思われます。
プログラムの転記ミス等も調べましたがなさそうです。
何か考えられる原因等があればご教授頂ければ幸いです。
投稿: 吉田春夫 | 2024年9月21日 (土) 12時00分
吉田さん
こんにちは。
最初のうちは正常に動いていたものが、最近になって湿度のみが0になることがあるとのこと、
当方ではそのような現象は見たことがありません。
まず考えられるのは、温度気圧は正常に出力されているとすれば、BME280のインタフェイスは正常に機能しているということ、
また湿度の検出値が100%を越えてオーバーフローするようなことは、プログラム上100越えを100としているので
考えにくいです。
BME280の類似デバイスで湿度が搭載されていないBMP280というデバイスを使った場合は湿度が常に0になるので、
現象としては同じなのですが、従来正常に湿度が表示されていたとすればBMP280ではなくBME280ですね。
そうするとあとはBME280内の湿度センサのみが故障しているというケースが考えられますが、
これも、デバイスを交換したのに症状が同じということは、BME280の故障は考えにくいですね。
あとは考えられるとしたら、USB5Vを電源として使用されているとのことですが、
BME280は3.3Vのデバイスですので、レギュレータが内蔵されていないタイプのBME280を5Vで使用すると、定格外ですので故障する可能性があります。
考えられるのはこんなところですが、いかがでしょうか……?
投稿: DJ HIGO | 2024年9月21日 (土) 15時32分
コメントありがとうございます
BME280は秋月電子でキット(コネクタのみ後加工)購入しております。
電源はレギュレータで3.3VにてPICとセンサーを駆動しております。LCDは5v動作の2004の為i2cの回路にレベルコンバータを組んであります。
なので電源オーバーでの故障は考えにくいと思うのですが、、、
なお、異常値表示は継続でなく、湿度が75%程度まで下がると正常値を表示します。オーバーフローと0以下を強制的に修正している様なのでこれも考えにくいですよね。
私の知識ではここまでで諦めるしかない様です。
ありがとうございました。
また記事を楽しみにしております。
ご活躍をお祈りいたします。
投稿: 吉田春夫 | 2024年9月22日 (日) 21時13分
吉田さん
当方で製作した構成とは違っているのですね。もし原因を究明するということですと、当方で試作したものとまったく同じ構成で試していただいて同じ症状が出るか、またそこからひとつずつ変えていったときに、症状が出るのかなどを見ていただくより他にないように思います。
ちなみに、BME280のデータ取り込みおよび処理は、ESP32によるWIFI対応のものでも同一のコードであり、こちらも湿度に関する不具合は出ていませんので、ソフトが原因の可能性は低いと思います。もし何かわかりましたらまたお教えください。
投稿: DJ HIGO | 2024年9月23日 (月) 07時50分
DJ HIGO様
いつも大変興味深い記事を有難うございます。
早速ですが、昨年の吉田様のコメントと関係がありそうな現象ですが
湿度が79%を超えると0%の表示になります。湿度が下がると70%代に
戻るのですが、何かアドバイスを頂けないでしょうか?
過去の記事を蒸し返すようで恐縮ですが、何卒よろしくお願いします。
投稿: Toshi | 2025年8月 9日 (土) 17時33分
Toshiさん、こんばんは。
以前の吉田さんと似た現象が出ているとのこと、ご報告ありがとうございます。
残念ながら当方としては吉田さんに回答を差し上げたあとも、それといった原因や解決策がありません。ですので、吉田さんと同じ回答しかできないのですが、温度、気圧が正常で、湿度にのみ不具合が出ていることから、I2Cの通信は正常に行われていると考えられるので、通信の不具合はないとして、そうするとデータ処理に問題があるか内部のセンサの不具合か、ということになります。
データ処理については、仮に100%を超えた場合は100になるので、0にはなりません。そうするとやはり内部のセンサそのものになにか問題が出ているように思えます。
たとえば高湿時に湿度センサに結露が生じていて、そこに汚れなどが付着して異常な状態になっているという可能性があります。これはホコリや風雨にさらされるような環境で長時間使用した場合に起こりやすいかもしれません。
ドライヤーなどで一時的に温めて、結露を飛ばしたら改善しないか?というご提案ができます。
当方としては、オリジナルの回路はもう手元になく、いまは後継のESP32バージョンとして数年使っていますが、ご指摘のような現象は出ていないのです。
これといった回答ができずもどかしいのですが……
投稿: DJ HIGO | 2025年8月 9日 (土) 20時56分
DJ HIGO様
お手数をお掛けしました、了解しました。
今後のご活躍を期待しております。有難うございました。
投稿: Toshi | 2025年8月10日 (日) 05時36分
吉田さん、Toshiさんへ追加情報です。ソースプログラムのmain.cのI2C読込み関数
void i2c1_read(void)
の最終行、
hum_raw = (data[6] << 8) | data[7];
ここをpres,tempと同じく明示的にキャストしておくことで、ひょっとしたら改善するかもしれません。次の通り変更してみてください。
hum_raw = ((uint32_t)data[6] << 8) | data[7];
投稿: DJ HIGO | 2025年8月10日 (日) 07時51分
DJ HIGO様
ご連絡ありがとうございました。早速、アドバイスに従って
書き換えましたところ、正常な表示になりました。
今、簡易加湿をおこない現在94%の表示が出ております。
大変ご面倒なことをお願いして申し訳ありませんでした。
今後ともよろしくお願いいたします。
取急ぎご報告まで。
投稿: Toshi | 2025年8月10日 (日) 10時40分
DJHIGO様
追加情報有難うございます。
コードの変更によって症状が改善されましたことをご報告いたします。
今後のご活躍をお祈り申しげます
投稿: 吉田 | 2025年9月10日 (水) 12時46分