STM32でBME280を使う

投稿者: | 2019/11/03

STM32F103C8T6 Blue pillボードで、BoschのBME280を使って、湿度、気圧、温度センサーを測定し、液晶ディスプレイSC1602に測定値を表示する方法を紹介します。Arduino用ではありません。

Bosch BME280は、小型のセンサーでありながら、湿度、気圧、温度を測定で、マイコンとのI/FもSPIとI2Cが選べます。また、中国AliExpressでは5Vまで使えるようにLDOとI2C の3V-5V変換I/Fがついたボードが300円以下で販売されています。前に紹介したS/W I2Cクラスを使う事にします。こんな感じです。

STM32+SC1602+BME280

SC1602もそうですが、Arduinoでは既にライブラリが公開されており、簡単に使うことができます。でも、私はメーカーの仕様書を読んで、自力で実装する事が一つの楽しみなのです。仕様書を読んでプログラムを書いていると自分の頭のトレーニングにもなり、また、デバイスの設計者の考え方に時々「なるほど!」と感心したり、勉強になります。趣味なので、好きなだけ時間をかける事が出来ますからね。

では、SW_I2Cクラスを継承してBME280クラスを定義します。
レジスタが多いので面倒ですけど。

では、関数の定義です。長いですねぇ。
途中、キャリブレーションデータを使って測定を補正する所があるのですが、理解できなまま仕様書からコピーしました。なんとなく、それらしい値が測定できているみたいなので良いかみたいな。

温度、湿度、気圧の測定値は小数点以下2桁までを整数で扱うため、100倍した値を返すようにしています。
表示するときは、1/100するようにしてください。

BME280::handler()の中でBME280の初期化からパラメータ設定、測定をしています。
各々のシーケンスの後に必要なwait値(1ms単位)を返すようにしていますので、Taskの中でwaitするようにします。もともとFreeRTOSを使わずにHALのみで実装していたのをFreeRTOS対応にしたので、このような格好になってます。

こちらのTaskから測定値をMailQueueでSC1602のタスクに渡しています。
osMailQId SC1602MailHandleは、前回のtask_sc1602.cppで定義しています。

CMSIS-RTOS(FreeRTOSのwrapper)のタスクやパラメータの設定は、STM32CubeIDEのMXで定義するのがおすすめです。

最後まで読んでいただいた貴方に、STM32F103C8T6 Blue Pillボード用でBME280を使って温度、湿度、気圧を測定し、SC1602に表示するプログラムのバイナリオブジェクトを差し上げます。STM32_RTOS_SC1602.elf

I2Cのポートは、SDA: PB8, SCL PB9に設定しています。
PCF8574(スレーブアドレス 0x27)と、BME280(スレーブアドレス 0x76)用です。その他の設定では動作しません。気温がマイナスになると正しく表示しないかもしれません。

また、Arduino用ではありませんので、このバイナリオブジェクトを書き込むとArduino用のブートローダーが消えてしまいます。復元の方法は当方ではサポートできません。動作しない、誤動作する、本記事および関連記事、バイナリオブジェクトを使用して発生したいかなる被害、損失等についても当方は責任を負いません、また、いかなる保証もしません。自己責任でお使いください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください