AE-BME280のXC8用制御関数を作ってみる
実験で使用した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が接続されています。
(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
実験用デモファイル
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整数
(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整数
追記 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レジスタ値
戻値:無
「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レジスタ値
戻値:無