BME280にアクセスするためのライブラリ

Revision:
3:df1107ddf502
Parent:
2:42725d11023b
Child:
4:4c4e3ec9a2c4
--- a/BME280.cpp	Tue Jul 10 07:59:58 2018 +0000
+++ b/BME280.cpp	Tue Jul 10 08:57:26 2018 +0000
@@ -2,67 +2,95 @@
 #include "BME280.h"
 #include "i2c_general_io.h"
 
-BME280::BME280(PinName sda, PinName scl)
+//コンストラクタ1
+BME280::BME280(PinName sda, PinName scl, 
+    char mode,
+    char press_sample,
+    char temp_sample,
+    char hum_sample,
+    char filter,
+    char stanby)
     :
     i2c_p(new GEN_I2C(sda, scl)), 
     sensor(*i2c_p)
 {
+    _mode         = mode;
+    _press_sample = press_sample;
+    _temp_sample  = temp_sample;
+    _hum_sample   = hum_sample;
+    _filter       = filter;
+    _stanby       = stanby;
     init();
 }
 
-BME280::BME280(GEN_I2C &i2c_obj)
+//コンストラクタ2
+BME280::BME280(GEN_I2C &i2c_obj,
+    char mode,
+    char press_sample,
+    char temp_sample,
+    char hum_sample,
+    char filter,
+    char stanby)
     :
     i2c_p(NULL), 
     sensor(i2c_obj)
 {
+    _mode         = mode;
+    _press_sample = press_sample;
+    _temp_sample  = temp_sample;
+    _hum_sample   = hum_sample;
+    _filter       = filter;
+    _stanby       = stanby;
     init();
 }
 
+//デストラクタ
 BME280::~BME280()
 {
     if (NULL != i2c_p)
         delete  i2c_p;
 }
 
-
+//センサーからデータ読み取り
 void BME280::read_sensor(void){
         char sensor_raw_data[8];
         long signed int T,P,H;         //ADC読み込み後温度,気圧,湿度の生データ
         long signed int T_cor;         //温度の補正データ
         long unsigned int P_cor,H_cor;   //気圧,湿度の補正データ
 
+
         //読み込み
-        set_force_mode();                   //測定開始
-        while(BMP280_STATUS_IS_MEASURING);       //測定待ち
-        sensor.read_reg(BME280_add, BMP280_PRESS_MSB, sensor_raw_data, 8); //PRESS_MSBレジスタから8バイト読み込み
+        
+        //ノーマルモードでないとき
+        if( _mode != BME280_NORMAL_MODE ){      
+            set_force_mode();                   //強制モードで測定開始
+            while(BME280_STATUS_IS_MEASURING);  //測定待ち
+        }
+
+        sensor.read_reg(BME280_add, BME280_PRESS_MSB, sensor_raw_data, 8); //PRESS_MSBレジスタから8バイト読み込み
+
+        //ビットシフトしてデータを結合
         T = sensor_raw_data[3] << 12 | sensor_raw_data[4] << 4 | sensor_raw_data[5] >> 4 ;
         P = sensor_raw_data[0] << 12 | sensor_raw_data[1] << 4 | sensor_raw_data[2] >> 4 ;
         H = sensor_raw_data[6] <<  8 | sensor_raw_data[7];
 
+
         //補正
         T_cor = BME280_compensate_T_int32(T);
         P_cor = BME280_compensate_P_int64(P);        
         H_cor = BME280_compensate_H_int32(H);
-        
-        temp  = T_cor / 100.0;
-        press = P_cor / 256.0;
-        hum   = H_cor / 1024.0;
-}
+
 
-bool BME280::data_is_ready(void){
-    return !BMP280_STATUS_IS_MEASURING;
+        //不動小数点数に直す        
+        press = P_cor / 256.0;      //単位Pa
+        temp  = T_cor / 100.0;      //単位℃
+        hum   = H_cor / 1024.0;     //単位%
+
 }
 
-void BME280::set_sleep_mode(void){
-    sensor.write_reg(BME280_add, BMP280_CTRL_MEAS, (meas_reg_value&0xFC) | BMP280_SLEEP_MODE );
-}
-
-void BME280::set_force_mode(void){
-    sensor.write_reg(BME280_add, BMP280_CTRL_MEAS, (meas_reg_value&0xFC) | BMP280_FORCE_MODE );
-}
-
-void BME280::set_normal_mode(void){
-    sensor.write_reg(BME280_add, BMP280_CTRL_MEAS, (meas_reg_value&0xFC) | BMP280_NORMAL_MODE );
+//強制測定モードをセットする関数。
+inline void BME280::set_force_mode(void){
+    sensor.write_reg(BME280_add, BME280_CTRL_MEAS, (_press_sample & 0x1C) | (_temp_sample & 0xE0) | BME280_FORCE_MODE );
 }
 
 
@@ -116,27 +144,36 @@
 }
 //補正関数終わり
 
+//初期化関数
 void BME280::init(void){
-    char calib[32] = {0};
-    char reg_data;
-    sensor.write_reg(BME280_add, BMP280_RESET_REG, BMP280_RESET_VALUE);
+
+    char calib[32] = {0};   //補正係数読み取り用
+    char reg_data;          //レジスタ読み取り用
 
-    reg_data = sensor.read_reg(BME280_add,BMP280_ID);  //ID読み込み
-    if(reg_data != BMP280_ID_VALUE){               //ID不一致エラー
+    //リセット
+    sensor.write_reg(BME280_add, BME280_RESET_REG, BME280_RESET_VALUE);
+    
+    //ID読み込み
+    reg_data = sensor.read_reg(BME280_add,BME280_ID);  
+    if(reg_data != BME280_ID_VALUE){               //ID不一致エラー
         printf("error\n");
         while(1);
     }
-    while(BMP280_STATUS_IS_COPYING);       //不揮発メモリのデータのレジスタコピー待ち
+
+    //不揮発メモリのデータのレジスタコピー待ち    
+    while(BME280_STATUS_IS_COPYING);
 
     //ADC補償式用定数読み込み
-    sensor.read_reg(BME280_add, BMP280_CALIB00, &(calib[0]), 24);
-    sensor.read_reg(BME280_add, BMP280_CALIB25, &(calib[24]), 1);
-    sensor.read_reg(BME280_add, BMP280_CALIB26, &(calib[25]), 7);
+    sensor.read_reg(BME280_add, BME280_CALIB00, &(calib[0]), 24);
+    sensor.read_reg(BME280_add, BME280_CALIB25, &(calib[24]), 1);
+    sensor.read_reg(BME280_add, BME280_CALIB26, &(calib[25]), 7);
 
+    //ビットシフトして対応する変数に格納(温度補正係数)
     dig_T1 = calib[ 0] | (calib[ 1] << 8);
     dig_T2 = calib[ 2] | (calib[ 3] << 8);
     dig_T3 = calib[ 4] | (calib[ 5] << 8);
 
+    //ビットシフトして対応する変数に格納(気圧補正係数)
     dig_P1 = calib[ 6] | (calib[ 7] << 8);
     dig_P2 = calib[ 8] | (calib[ 9] << 8);
     dig_P3 = calib[10] | (calib[11] << 8);
@@ -147,18 +184,18 @@
     dig_P8 = calib[20] | (calib[21] << 8);
     dig_P9 = calib[22] | (calib[23] << 8);
 
+    //ビットシフトして対応する変数に格納(湿度補正係数)
     dig_H1 = calib[24];
     dig_H2 = calib[25] | (calib[26] << 8);
     dig_H3 = calib[27];
     dig_H4 = (calib[28]<<4) | (calib[29] & 0x0F);
     dig_H5 = ((calib[29]>>4) & 0x0F) | (calib[30] << 4);
     dig_H6 = calib[31];
-    //ADC補償式用定数読み込みEND
 
     //センサ設定
-    sensor.write_reg(BME280_add, BMP280_CTRL_HUM , hum_reg_value);
-    sensor.write_reg(BME280_add, BMP280_CTRL_MEAS, meas_reg_value);
-    sensor.write_reg(BME280_add, BMP280_CONFIG   , config_reg_value);
+    sensor.write_reg(BME280_add, BME280_CTRL_HUM , (_hum_sample & 0x07) );
+    sensor.write_reg(BME280_add, BME280_CTRL_MEAS, (_press_sample & 0x1C) | (_temp_sample & 0xE0) | (_mode & 0x03) );
+    sensor.write_reg(BME280_add, BME280_CONFIG   , (_stanby & 0xE0) | (_filter & 0x1C) );
 
 }