↑ SO1602とBME280

 当局実験室内での試運転
OLED表示器は文字がくっきり見えます



↑ AE-BME280センサモジュール



実験で使用したPICキットの各モジュール

(1)NO-001:14ピンCPUモジュールおよびPIC16F1705

内蔵MSSPモジュールを使用し、RC0,RC1をI2Cバスとして使用します。
RC0=SCL、RC1=SDAとなります。

DOUBLE=32bitにしたら、8KWの16F1705がまさかのメモリ不足エラー、
よって、デフォルトのDOUBLE=24bitで実験しています。
ちなみにサンプルプログラムに於いて、16F1705の使用メモリは98%です・・・

(2)NO-016:I2Cバス分配モジュール、3.3V変換機能付き
  センサもディスプレイも3.3V仕様なので、このモジュールを使用しました。
  プログラムが出来てしまえば、PICも3.3Vで駆動すれば直接接続できます。

(3)NO-022:LEDモジュール
  無くとも実験は可能ですが、実験中は何かと便利

(4)NO-023:SO1602 16桁2行OLEDモジュール
  しばらく部品箱に転がっていたので、使ってみた

(5)NO-024:AE-BME280環境センサモジュール
  今回のモチーフで、当局の様な素人が手を出すにはちょっと敷居が高かった・・・

PIC16F1705機能設定

・システムクロックは内部発振および4xPLLで32MHZ
・I/Oピンはすべてデジタルで、RC0-1は入力設定
・RA4-5は出力設定とし、LEDモジュール駆動可能です。











← 画像は実験全体を映しています。

右側のライタを接続したCPUモジュール、5V電源が接続されています。
中央にある基板が、I2C分配モジュール(3.3Vレベル変換機能付き)
I2C分配モジュールからSO1602・OLEDとBME280が接続されています。
実験に使用したXC8制御関数群


実験用デモファイル

 16F1705_BME280_01.c

SO1602 OLED制御関数群

 SO1602v1.h

 SO1602v1.c

 MSSP02b.h

 MSSP02b.c




AE-BME280制御関数群

 BME280v1.h

 BME280v1.c

ソースファイル 補足

(1)MSSP・I2Cマスタモード低レベル関数 MSSP0.2b
  今の所は安定してアクセスできるので、使用バージョン変わらず。
  まだまだI2Cバスの仕様を満たしていないのは今まで道理です。

(2)OLEDアクセス関数 SO1602v1
  3.3V I2C接続の有機ELディスプレイ用です。
  見易いAQM1602と言った所です。
  基本的な関数の使用方法はAQM1602v1と同じです。

(3)センサアクセス関数 BME280v1
  レジスタアクセス関数、補正データ読込関数、測定生データ読込関数、
  キャリブレート関数および広域変数定義で構成されています。
  XC8では64bitでの演算はできないので、
  キャリブレーション関数の演算ソースはデータシートの、
  巻末にある「32bit固定小数点での圧力補償」をそのまま利用しています。
  使用DOUBLE変数が24bitなので、これで良いのかちょっと確信がありません
  常識的な環境では、特に異常な測定値は表示されてはいませんが・・・
  16KWのPICだと、DOUBLE=32bitでビルドできますが、
  表示数値に差異無い気がします。

(4)実験用デモファイル 16F1705_BME280_01
  最初の立ち上がり1回のみ補正データにアクセスします。
  その後は約1秒間隔で、
  測定生データにアクセス、
  気圧・温度・相対湿度のデータ補正(キャリブレーション)、
  後は最終演算を行い、OLEDに表示、
  これを延々と繰り返しています。
  ちなみに、センサの内部での計測間隔は約1秒の設定ですが、
  プログラムからのアクセスに同期している訳ではありません。


BME280用XC8制御関数群

詳細はソースファイルを参照してください
ヘッダーファイルの広域変数も確認してください
最終的な計算も必要ですので、サンプルファイルも参照してください

(1) BME280_SET_MODE(void)
   センサの基本的な動作設定を行います。
   この関数の設定は、下記の通り

   1)congigレジスタ 設定値0xA0
     スタンバイ時間(t_sb) 1000ms
     IIRフィルタ OFF
   2)ctrl_measレジスタ 設定値0x27
     温度オーバーサンプリング(osrs_t)= ×1
     圧力オーバーサンプリング(osrs_p)= ×1
     センサ動作モード(mode)= ノーマルモード
   3)ctrl_humレジスタ 設定値0x01
     湿度オーバーサンプリング(osrs_h)= ×1

   引数:無
   戻値:無

(2) BME280_WRTRG(unsigned char 引数1、unsigned char 引数2)
   センサのレジスタにデータを送信します
   引数1:レジスタアドレス
   引数2:書き込みデータ
   戻値:無

(3) unsigned char BME280_RCVRG(unsigned char 引数1)
   センサのレジスタ データを受信します
   引数:レジスタアドレス
   戻値:8bitデータ

(4) BME280_READ_TRIM(void)
   専用の広域変数(dig_xx)に、それぞれのトリミングデータを格納します
   引数:無
   戻値:無

(5) BME280_READ_DATA(void)
   専用の広域変数(pres_raw,temp_raw,hum_raw)にトリミング前の生データ格納
   引数:無
   戻値:無

(6) calibration_T(signed long int 引数)
   温度の補正計算を行います
   戻値は ℃、分解能は0.01℃

   「5123」の戻値は「51.23℃」相当
   引数:温度生データ(temp_raw)
   戻値:符号有32bit整数

(7) calibration_P(signed long int 引数)
   圧力の補正計算を行います
   戻値「963862」は、963862Pa=963.862hPa相当

   引数:圧力生データ(pres_raw)
   戻値:符号無し32bit整数

(8) calibration_H(signed long int 引数)
   相対湿度の補正計算を行います
   「47445」の戻値は、47445 / 1024 = 46.333%RH

   引数:湿度生データ(hum_raw)
   戻値:符号無し32bit整数

AE-BME280制御関数群


 BME280v1a.h

 BME280v1a.c
追記 2019年10月23 BME280関数群の変更について

「BME280v1a」となりました。
せっかくある、オーバーサンプリングとフィルタ機能を使用するようにしました。
また、設定の自由度を向上させました。
キャリブレーション関数等は再度何回か見直しましたが、変更ありません。
また、説明コメントが間違えてましたので、修正しました。
このページ本文前述の関数説明もすでに修正しています。


BME280用XC8制御関数群 「BME280v1a」変更・追加関数


(1) BME280_SET_MODE(void)
   センサの標準的な動作設定を行います。
   この関数の設定は、下記の通りで、データシートの室内推奨品です

   1)congigレジスタ 設定値0x10
     スタンバイ時間(t_sb) 0.5ms
     IIRフィルタ ON 係数16
   2)ctrl_measレジスタ 設定値0x57
     温度オーバーサンプリング(osrs_t)= ×2
     圧力オーバーサンプリング(osrs_p)= ×16
     センサ動作モード(mode)= ノーマルモード
   3)ctrl_humレジスタ 設定値0x01
     湿度オーバーサンプリング(osrs_h)= ×1

   引数:無
   戻値:無


(9) BME280_SET_MINIMUM(void)
   センサの最低限な動作設定を行います。

   1)congigレジスタ 設定値0xF5
     スタンバイ時間(t_sb) 125ms
     IIRフィルタ OFF
   2)ctrl_measレジスタ 設定値0x27
     温度オーバーサンプリング(osrs_t)= ×1
     圧力オーバーサンプリング(osrs_p)= ×1
     センサ動作モード(mode)= ノーマルモード
   3)ctrl_humレジスタ 設定値0x01
     湿度オーバーサンプリング(osrs_h)= ×1

   引数:無
   戻値:無


(10) BME280_SET_MODE_MIDDLE(void)
   センサの動作を下記の中間程度の設定に行います。

   1)congigレジスタ 設定値0x0C
     スタンバイ時間(t_sb) 0.5ms
     IIRフィルタ ON 係数8
   2)ctrl_measレジスタ 設定値0x6F
     温度オーバーサンプリング(osrs_t)= ×4
     圧力オーバーサンプリング(osrs_p)= ×4
     センサ動作モード(mode)= ノーマルモード
   3)ctrl_humレジスタ 設定値0x03
     湿度オーバーサンプリング(osrs_h)= ×4

   引数:無
   戻値:無


(11) BME280_SET_MODE_MAXIMUM(void)
   センサの動作を下記の最大設定に行います。

   1)congigレジスタ 設定値0x10
     スタンバイ時間(t_sb) 0.5ms
     IIRフィルタ ON 係数16
   2)ctrl_measレジスタ 設定値0xB7
     温度オーバーサンプリング(osrs_t)= ×16
     圧力オーバーサンプリング(osrs_p)= ×16
     センサ動作モード(mode)= ノーマルモード
   3)ctrl_humレジスタ 設定値0x05
     湿度オーバーサンプリング(osrs_h)= ×16

   引数:無
   戻値:無

(12) BME280_SET_MODE_FORCED(void)
   強制モードの動作設定を行います。
   本関数を呼び出すと、下記の通りの条件で、1度だけ測定します。
   標準の設定関数より、センサの精度が下がっています。
   測定終了するとスリープモードに入りますがデータの読み込みは可能。
   再度測定するには、その度ごとに本関数を呼び出します。

   1)congigレジスタ 設定値0x00
     IIRフィルタ OFF
   2)ctrl_measレジスタ 設定値0x25
     温度オーバーサンプリング(osrs_t)= ×1
     圧力オーバーサンプリング(osrs_p)= ×1
     センサ動作モード(mode)= 強制モード
   3)ctrl_humレジスタ 設定値0x01
     湿度オーバーサンプリング(osrs_h)= ×1

   引数:無
   戻値:無

(13) BME280_SET_MODE_MANU
   (unsinged char 引数1, unsinged char 引数2, unsigned char 引数3)
   センサの動作設定を指定の通りに行います。

   引数1:configレジスタ値
   引数2:ctrl_humレジスタ値
   引数3:ctrl_measレジスタ値
   戻値:無



戻る  実験・製作の記録TOPへ戻る