BME280にアクセスするためのライブラリ
Diff: BME280.cpp
- 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) ); }