BME280をI2CとSPIで使用するためのライブラリ。

Dependents:   BNO055_BME280_ Yabusame2_gyro GRhanawaizman

Committer:
Yajirushi
Date:
Tue Nov 29 02:58:53 2016 +0000
Revision:
0:2baa0f77d4d2
FISRT COMMIT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yajirushi 0:2baa0f77d4d2 1 #include "BME280.h"
Yajirushi 0:2baa0f77d4d2 2
Yajirushi 0:2baa0f77d4d2 3 //ショートカット
Yajirushi 0:2baa0f77d4d2 4 #define CS_ACTIVE cs->write(0)
Yajirushi 0:2baa0f77d4d2 5 #define CS_INACTIVE cs->write(1)
Yajirushi 0:2baa0f77d4d2 6
Yajirushi 0:2baa0f77d4d2 7 BME280_CTRL::BME280_CTRL(){
Yajirushi 0:2baa0f77d4d2 8 interface_mode = 0;
Yajirushi 0:2baa0f77d4d2 9 }
Yajirushi 0:2baa0f77d4d2 10
Yajirushi 0:2baa0f77d4d2 11 BME280_CTRL::~BME280_CTRL(){}
Yajirushi 0:2baa0f77d4d2 12
Yajirushi 0:2baa0f77d4d2 13 char BME280_CTRL::getInterfaceMode(){
Yajirushi 0:2baa0f77d4d2 14 return interface_mode;
Yajirushi 0:2baa0f77d4d2 15 }
Yajirushi 0:2baa0f77d4d2 16
Yajirushi 0:2baa0f77d4d2 17 void BME280_CTRL::init(){}
Yajirushi 0:2baa0f77d4d2 18 char BME280_CTRL::rr(char regAddr){return 0x00;}
Yajirushi 0:2baa0f77d4d2 19 char BME280_CTRL::rrc(char startRegAddr, char *receiveBytes, char length){return 0x00;}
Yajirushi 0:2baa0f77d4d2 20 char BME280_CTRL::wr(char regAddr, char wBytes){return 0x00;}
Yajirushi 0:2baa0f77d4d2 21
Yajirushi 0:2baa0f77d4d2 22
Yajirushi 0:2baa0f77d4d2 23
Yajirushi 0:2baa0f77d4d2 24
Yajirushi 0:2baa0f77d4d2 25
Yajirushi 0:2baa0f77d4d2 26
Yajirushi 0:2baa0f77d4d2 27
Yajirushi 0:2baa0f77d4d2 28
Yajirushi 0:2baa0f77d4d2 29
Yajirushi 0:2baa0f77d4d2 30
Yajirushi 0:2baa0f77d4d2 31
Yajirushi 0:2baa0f77d4d2 32
Yajirushi 0:2baa0f77d4d2 33
Yajirushi 0:2baa0f77d4d2 34
Yajirushi 0:2baa0f77d4d2 35
Yajirushi 0:2baa0f77d4d2 36
Yajirushi 0:2baa0f77d4d2 37 BME280_SPI_CTRL::BME280_SPI_CTRL(SPI* si, DigitalOut* spi_cs, unsigned int speedHz){
Yajirushi 0:2baa0f77d4d2 38 iface = si;
Yajirushi 0:2baa0f77d4d2 39 cs = spi_cs;
Yajirushi 0:2baa0f77d4d2 40 speed = speedHz;
Yajirushi 0:2baa0f77d4d2 41 interface_mode = 1;
Yajirushi 0:2baa0f77d4d2 42 }
Yajirushi 0:2baa0f77d4d2 43
Yajirushi 0:2baa0f77d4d2 44 BME280_SPI_CTRL::~BME280_SPI_CTRL(){
Yajirushi 0:2baa0f77d4d2 45 delete iface;
Yajirushi 0:2baa0f77d4d2 46 delete cs;
Yajirushi 0:2baa0f77d4d2 47 }
Yajirushi 0:2baa0f77d4d2 48
Yajirushi 0:2baa0f77d4d2 49 void BME280_SPI_CTRL::init(){
Yajirushi 0:2baa0f77d4d2 50 CS_INACTIVE;
Yajirushi 0:2baa0f77d4d2 51
Yajirushi 0:2baa0f77d4d2 52 iface->format(8, 3);
Yajirushi 0:2baa0f77d4d2 53 iface->frequency(speed);
Yajirushi 0:2baa0f77d4d2 54 wait_ms(5);
Yajirushi 0:2baa0f77d4d2 55 }
Yajirushi 0:2baa0f77d4d2 56
Yajirushi 0:2baa0f77d4d2 57 char BME280_SPI_CTRL::rr(char regAddr){
Yajirushi 0:2baa0f77d4d2 58 char ret = 0xFF;
Yajirushi 0:2baa0f77d4d2 59
Yajirushi 0:2baa0f77d4d2 60 //CS立ち下げ
Yajirushi 0:2baa0f77d4d2 61 CS_ACTIVE;
Yajirushi 0:2baa0f77d4d2 62
Yajirushi 0:2baa0f77d4d2 63 //読み取りモードでレジスタ指定
Yajirushi 0:2baa0f77d4d2 64 iface->write(0x80 | (regAddr & 0x7F));
Yajirushi 0:2baa0f77d4d2 65
Yajirushi 0:2baa0f77d4d2 66 //返答のためダミー送信
Yajirushi 0:2baa0f77d4d2 67 ret = iface->write(0x00);
Yajirushi 0:2baa0f77d4d2 68
Yajirushi 0:2baa0f77d4d2 69 //CS立ち上げ
Yajirushi 0:2baa0f77d4d2 70 CS_INACTIVE;
Yajirushi 0:2baa0f77d4d2 71
Yajirushi 0:2baa0f77d4d2 72 return ret;
Yajirushi 0:2baa0f77d4d2 73 }
Yajirushi 0:2baa0f77d4d2 74
Yajirushi 0:2baa0f77d4d2 75 char BME280_SPI_CTRL::rrc(char startRegAddr, char *receiveBytes, char length){
Yajirushi 0:2baa0f77d4d2 76 //最大連続読み取りは42byteまで
Yajirushi 0:2baa0f77d4d2 77 if(length < 0 || length > 42) return -1;
Yajirushi 0:2baa0f77d4d2 78
Yajirushi 0:2baa0f77d4d2 79 //CS立ち下げ
Yajirushi 0:2baa0f77d4d2 80 CS_ACTIVE;
Yajirushi 0:2baa0f77d4d2 81
Yajirushi 0:2baa0f77d4d2 82 //読み取りモードでレジスタ指定
Yajirushi 0:2baa0f77d4d2 83 iface->write(0x80 | (startRegAddr & 0x7F));
Yajirushi 0:2baa0f77d4d2 84
Yajirushi 0:2baa0f77d4d2 85 //返答のためlengthの数だけダミー送信
Yajirushi 0:2baa0f77d4d2 86 for(int i=0; i<length; i++){
Yajirushi 0:2baa0f77d4d2 87 receiveBytes[i] = iface->write(0x00);
Yajirushi 0:2baa0f77d4d2 88 }
Yajirushi 0:2baa0f77d4d2 89
Yajirushi 0:2baa0f77d4d2 90 //CS立ち上げ
Yajirushi 0:2baa0f77d4d2 91 CS_INACTIVE;
Yajirushi 0:2baa0f77d4d2 92
Yajirushi 0:2baa0f77d4d2 93 return 1;
Yajirushi 0:2baa0f77d4d2 94 }
Yajirushi 0:2baa0f77d4d2 95
Yajirushi 0:2baa0f77d4d2 96 char BME280_SPI_CTRL::wr(char regAddr, char wBytes){
Yajirushi 0:2baa0f77d4d2 97 char ret = 0xFF;
Yajirushi 0:2baa0f77d4d2 98
Yajirushi 0:2baa0f77d4d2 99 //CS立ち下げ
Yajirushi 0:2baa0f77d4d2 100 CS_ACTIVE;
Yajirushi 0:2baa0f77d4d2 101
Yajirushi 0:2baa0f77d4d2 102 //書き込みモードでレジスタ指定
Yajirushi 0:2baa0f77d4d2 103 iface->write(regAddr & 0x7F);
Yajirushi 0:2baa0f77d4d2 104
Yajirushi 0:2baa0f77d4d2 105 //値を書き込み
Yajirushi 0:2baa0f77d4d2 106 ret = iface->write(wBytes);
Yajirushi 0:2baa0f77d4d2 107
Yajirushi 0:2baa0f77d4d2 108 //CS立ち上げ
Yajirushi 0:2baa0f77d4d2 109 CS_INACTIVE;
Yajirushi 0:2baa0f77d4d2 110
Yajirushi 0:2baa0f77d4d2 111 //3-WIRE SPI判定
Yajirushi 0:2baa0f77d4d2 112 if(regAddr == BME280R_CONFIG){
Yajirushi 0:2baa0f77d4d2 113 interface_mode = (wBytes & 0x01)? 2 : 1;
Yajirushi 0:2baa0f77d4d2 114 }
Yajirushi 0:2baa0f77d4d2 115
Yajirushi 0:2baa0f77d4d2 116 return ret;
Yajirushi 0:2baa0f77d4d2 117 }
Yajirushi 0:2baa0f77d4d2 118
Yajirushi 0:2baa0f77d4d2 119
Yajirushi 0:2baa0f77d4d2 120
Yajirushi 0:2baa0f77d4d2 121
Yajirushi 0:2baa0f77d4d2 122
Yajirushi 0:2baa0f77d4d2 123
Yajirushi 0:2baa0f77d4d2 124
Yajirushi 0:2baa0f77d4d2 125
Yajirushi 0:2baa0f77d4d2 126
Yajirushi 0:2baa0f77d4d2 127
Yajirushi 0:2baa0f77d4d2 128
Yajirushi 0:2baa0f77d4d2 129
Yajirushi 0:2baa0f77d4d2 130
Yajirushi 0:2baa0f77d4d2 131
Yajirushi 0:2baa0f77d4d2 132
Yajirushi 0:2baa0f77d4d2 133
Yajirushi 0:2baa0f77d4d2 134 BME280_I2C_CTRL::BME280_I2C_CTRL(I2C* iic, char addr, unsigned int freq){
Yajirushi 0:2baa0f77d4d2 135 iface = iic;
Yajirushi 0:2baa0f77d4d2 136 i2c_writeAddr = addr << 1;
Yajirushi 0:2baa0f77d4d2 137 i2c_readAddr = i2c_writeAddr + 1;
Yajirushi 0:2baa0f77d4d2 138 i2c_freq = freq;
Yajirushi 0:2baa0f77d4d2 139 }
Yajirushi 0:2baa0f77d4d2 140
Yajirushi 0:2baa0f77d4d2 141 BME280_I2C_CTRL::~BME280_I2C_CTRL(){
Yajirushi 0:2baa0f77d4d2 142 delete iface;
Yajirushi 0:2baa0f77d4d2 143 }
Yajirushi 0:2baa0f77d4d2 144
Yajirushi 0:2baa0f77d4d2 145 void BME280_I2C_CTRL::init(){
Yajirushi 0:2baa0f77d4d2 146 iface->frequency(i2c_freq);
Yajirushi 0:2baa0f77d4d2 147 wait_ms(5);
Yajirushi 0:2baa0f77d4d2 148 }
Yajirushi 0:2baa0f77d4d2 149
Yajirushi 0:2baa0f77d4d2 150 char BME280_I2C_CTRL::rr(char regAddr){
Yajirushi 0:2baa0f77d4d2 151 char ary[2];
Yajirushi 0:2baa0f77d4d2 152
Yajirushi 0:2baa0f77d4d2 153 ary[0] = regAddr;
Yajirushi 0:2baa0f77d4d2 154 ary[1] = 0x00;
Yajirushi 0:2baa0f77d4d2 155
Yajirushi 0:2baa0f77d4d2 156 iface->write(i2c_writeAddr, ary, 1);
Yajirushi 0:2baa0f77d4d2 157 iface->read(i2c_readAddr, ary, 1);
Yajirushi 0:2baa0f77d4d2 158
Yajirushi 0:2baa0f77d4d2 159 return ary[0];
Yajirushi 0:2baa0f77d4d2 160 }
Yajirushi 0:2baa0f77d4d2 161
Yajirushi 0:2baa0f77d4d2 162 char BME280_I2C_CTRL::rrc(char startRegAddr, char *receiveBytes, char length){
Yajirushi 0:2baa0f77d4d2 163 //最大連続読み取りは42byteまで
Yajirushi 0:2baa0f77d4d2 164 if(length < 0 || length > 42) return -1;
Yajirushi 0:2baa0f77d4d2 165
Yajirushi 0:2baa0f77d4d2 166 char ary[2];
Yajirushi 0:2baa0f77d4d2 167
Yajirushi 0:2baa0f77d4d2 168 ary[0] = startRegAddr;
Yajirushi 0:2baa0f77d4d2 169 ary[1] = 0x00;
Yajirushi 0:2baa0f77d4d2 170
Yajirushi 0:2baa0f77d4d2 171 iface->write(i2c_writeAddr, ary, 1);
Yajirushi 0:2baa0f77d4d2 172 iface->read(i2c_readAddr, receiveBytes, length);
Yajirushi 0:2baa0f77d4d2 173
Yajirushi 0:2baa0f77d4d2 174 return 1;
Yajirushi 0:2baa0f77d4d2 175 }
Yajirushi 0:2baa0f77d4d2 176
Yajirushi 0:2baa0f77d4d2 177 char BME280_I2C_CTRL::wr(char regAddr, char wBytes){
Yajirushi 0:2baa0f77d4d2 178 char ary[2];
Yajirushi 0:2baa0f77d4d2 179
Yajirushi 0:2baa0f77d4d2 180 ary[0] = regAddr;
Yajirushi 0:2baa0f77d4d2 181 ary[1] = wBytes;
Yajirushi 0:2baa0f77d4d2 182
Yajirushi 0:2baa0f77d4d2 183 iface->write(i2c_writeAddr, ary, 2);
Yajirushi 0:2baa0f77d4d2 184
Yajirushi 0:2baa0f77d4d2 185 return 1;
Yajirushi 0:2baa0f77d4d2 186 }
Yajirushi 0:2baa0f77d4d2 187
Yajirushi 0:2baa0f77d4d2 188
Yajirushi 0:2baa0f77d4d2 189
Yajirushi 0:2baa0f77d4d2 190
Yajirushi 0:2baa0f77d4d2 191
Yajirushi 0:2baa0f77d4d2 192
Yajirushi 0:2baa0f77d4d2 193
Yajirushi 0:2baa0f77d4d2 194
Yajirushi 0:2baa0f77d4d2 195
Yajirushi 0:2baa0f77d4d2 196
Yajirushi 0:2baa0f77d4d2 197
Yajirushi 0:2baa0f77d4d2 198
Yajirushi 0:2baa0f77d4d2 199
Yajirushi 0:2baa0f77d4d2 200
Yajirushi 0:2baa0f77d4d2 201
Yajirushi 0:2baa0f77d4d2 202
Yajirushi 0:2baa0f77d4d2 203
Yajirushi 0:2baa0f77d4d2 204 BOARDC_BME280::BOARDC_BME280(PinName mosi, PinName miso, PinName sck, PinName scs, unsigned int spdHz){
Yajirushi 0:2baa0f77d4d2 205 ctrl = new BME280_SPI_CTRL(new SPI(mosi, miso, sck), new DigitalOut(scs), spdHz);
Yajirushi 0:2baa0f77d4d2 206 }
Yajirushi 0:2baa0f77d4d2 207
Yajirushi 0:2baa0f77d4d2 208 BOARDC_BME280::BOARDC_BME280(SPI* spi, PinName scs, unsigned int spdHz){
Yajirushi 0:2baa0f77d4d2 209 ctrl = new BME280_SPI_CTRL(spi, new DigitalOut(scs), spdHz);
Yajirushi 0:2baa0f77d4d2 210 }
Yajirushi 0:2baa0f77d4d2 211
Yajirushi 0:2baa0f77d4d2 212 BOARDC_BME280::BOARDC_BME280(SPI* spi, DigitalOut* spi_cs, unsigned int spdHz){
Yajirushi 0:2baa0f77d4d2 213 ctrl = new BME280_SPI_CTRL(spi, spi_cs, spdHz);
Yajirushi 0:2baa0f77d4d2 214 }
Yajirushi 0:2baa0f77d4d2 215
Yajirushi 0:2baa0f77d4d2 216 BOARDC_BME280::BOARDC_BME280(PinName sda, PinName scl, char addr, unsigned int freq){
Yajirushi 0:2baa0f77d4d2 217 ctrl = new BME280_I2C_CTRL(new I2C(sda, scl), addr, freq);
Yajirushi 0:2baa0f77d4d2 218 }
Yajirushi 0:2baa0f77d4d2 219
Yajirushi 0:2baa0f77d4d2 220 BOARDC_BME280::BOARDC_BME280(I2C* iic, char addr, unsigned int freq){
Yajirushi 0:2baa0f77d4d2 221 ctrl = new BME280_I2C_CTRL(iic, addr, freq);
Yajirushi 0:2baa0f77d4d2 222 }
Yajirushi 0:2baa0f77d4d2 223
Yajirushi 0:2baa0f77d4d2 224 void BOARDC_BME280::initialize(bool initIface){
Yajirushi 0:2baa0f77d4d2 225 if(initIface){
Yajirushi 0:2baa0f77d4d2 226 ctrl->init();
Yajirushi 0:2baa0f77d4d2 227 }
Yajirushi 0:2baa0f77d4d2 228
Yajirushi 0:2baa0f77d4d2 229 //設定書き込み(必ずCTRL_HUM→CTRL_MEAS→CONFIGの順に設定)
Yajirushi 0:2baa0f77d4d2 230 ctrl->wr(BME280R_CTRL_HUM, 0x01); //湿度:オーバーサンプリングx1
Yajirushi 0:2baa0f77d4d2 231 ctrl->wr(BME280R_CTRL_MEAS, 0x27); //温度:オーバーサンプリングx1,気圧:オーバーサンプリングx1,ノーマルモード
Yajirushi 0:2baa0f77d4d2 232 ctrl->wr(BME280R_CONFIG, 0xD4); //データ抽出可能時間1000ms,フィルターサンプリングx4
Yajirushi 0:2baa0f77d4d2 233
Yajirushi 0:2baa0f77d4d2 234 //3-WIRE SPI使用時(BME280R_CONFIGに設定する値の最下位ビットを1にすると3-WIRE SPIモード)
Yajirushi 0:2baa0f77d4d2 235 //ctrl->wr(BME280R_CONFIG, 0xD5);
Yajirushi 0:2baa0f77d4d2 236
Yajirushi 0:2baa0f77d4d2 237 //データがレジスタにコピーされるまで待つ
Yajirushi 0:2baa0f77d4d2 238 while(!isReady()) wait_ms(500);
Yajirushi 0:2baa0f77d4d2 239
Yajirushi 0:2baa0f77d4d2 240 //補正データ更新
Yajirushi 0:2baa0f77d4d2 241 updateCalib();
Yajirushi 0:2baa0f77d4d2 242 }
Yajirushi 0:2baa0f77d4d2 243
Yajirushi 0:2baa0f77d4d2 244 char BOARDC_BME280::getInterfaceMode(){
Yajirushi 0:2baa0f77d4d2 245 return ctrl->getInterfaceMode();
Yajirushi 0:2baa0f77d4d2 246 }
Yajirushi 0:2baa0f77d4d2 247
Yajirushi 0:2baa0f77d4d2 248 char BOARDC_BME280::getChipID(){
Yajirushi 0:2baa0f77d4d2 249 return ctrl->rr(BME280R_ID);
Yajirushi 0:2baa0f77d4d2 250 }
Yajirushi 0:2baa0f77d4d2 251
Yajirushi 0:2baa0f77d4d2 252 void BOARDC_BME280::reset(){
Yajirushi 0:2baa0f77d4d2 253 ctrl->wr(BME280R_RESET, 0xB6);
Yajirushi 0:2baa0f77d4d2 254 wait_ms(1500);
Yajirushi 0:2baa0f77d4d2 255 initialize();
Yajirushi 0:2baa0f77d4d2 256 }
Yajirushi 0:2baa0f77d4d2 257
Yajirushi 0:2baa0f77d4d2 258 char BOARDC_BME280::getCTRL_humidity(){
Yajirushi 0:2baa0f77d4d2 259 return ctrl->rr(BME280R_CTRL_HUM);
Yajirushi 0:2baa0f77d4d2 260 }
Yajirushi 0:2baa0f77d4d2 261
Yajirushi 0:2baa0f77d4d2 262 void BOARDC_BME280::setCTRL_humidity(char regVal){
Yajirushi 0:2baa0f77d4d2 263 char meas = ctrl->rr(BME280R_CTRL_MEAS);
Yajirushi 0:2baa0f77d4d2 264 char config = ctrl->rr(BME280R_CONFIG);
Yajirushi 0:2baa0f77d4d2 265
Yajirushi 0:2baa0f77d4d2 266 //必ずCTRL_HUM>CTRL_MEAS>CONFIGの順番
Yajirushi 0:2baa0f77d4d2 267 ctrl->wr(BME280R_CTRL_HUM, regVal & 0x07);
Yajirushi 0:2baa0f77d4d2 268 ctrl->wr(BME280R_CTRL_MEAS, meas);
Yajirushi 0:2baa0f77d4d2 269 ctrl->wr(BME280R_CONFIG, config & 0xFD);
Yajirushi 0:2baa0f77d4d2 270 }
Yajirushi 0:2baa0f77d4d2 271
Yajirushi 0:2baa0f77d4d2 272 char BOARDC_BME280::getCTRL_measuring(){
Yajirushi 0:2baa0f77d4d2 273 return ctrl->rr(BME280R_CTRL_MEAS);
Yajirushi 0:2baa0f77d4d2 274 }
Yajirushi 0:2baa0f77d4d2 275
Yajirushi 0:2baa0f77d4d2 276 void BOARDC_BME280::setCTRL_measuring(char regVal){
Yajirushi 0:2baa0f77d4d2 277 char hum = ctrl->rr(BME280R_CTRL_HUM);
Yajirushi 0:2baa0f77d4d2 278 char config = ctrl->rr(BME280R_CONFIG);
Yajirushi 0:2baa0f77d4d2 279
Yajirushi 0:2baa0f77d4d2 280 //必ずCTRL_HUM>CTRL_MEAS>CONFIGの順番
Yajirushi 0:2baa0f77d4d2 281 ctrl->wr(BME280R_CTRL_HUM, hum & 0x07);
Yajirushi 0:2baa0f77d4d2 282 ctrl->wr(BME280R_CTRL_MEAS, regVal);
Yajirushi 0:2baa0f77d4d2 283 ctrl->wr(BME280R_CONFIG, config & 0xFD);
Yajirushi 0:2baa0f77d4d2 284 }
Yajirushi 0:2baa0f77d4d2 285
Yajirushi 0:2baa0f77d4d2 286 unsigned int BOARDC_BME280::getOverSample_P(){
Yajirushi 0:2baa0f77d4d2 287 char val = (ctrl->rr(BME280R_CTRL_MEAS) >> 2) & 0x07;
Yajirushi 0:2baa0f77d4d2 288
Yajirushi 0:2baa0f77d4d2 289 switch(val){
Yajirushi 0:2baa0f77d4d2 290 case 0:
Yajirushi 0:2baa0f77d4d2 291 return 0;
Yajirushi 0:2baa0f77d4d2 292 case 1:
Yajirushi 0:2baa0f77d4d2 293 return 1;
Yajirushi 0:2baa0f77d4d2 294 case 2:
Yajirushi 0:2baa0f77d4d2 295 return 2;
Yajirushi 0:2baa0f77d4d2 296 case 3:
Yajirushi 0:2baa0f77d4d2 297 return 4;
Yajirushi 0:2baa0f77d4d2 298 case 4:
Yajirushi 0:2baa0f77d4d2 299 return 8;
Yajirushi 0:2baa0f77d4d2 300 case 5:
Yajirushi 0:2baa0f77d4d2 301 return 16;
Yajirushi 0:2baa0f77d4d2 302 default:
Yajirushi 0:2baa0f77d4d2 303 return 16;
Yajirushi 0:2baa0f77d4d2 304 }
Yajirushi 0:2baa0f77d4d2 305 }
Yajirushi 0:2baa0f77d4d2 306
Yajirushi 0:2baa0f77d4d2 307 unsigned int BOARDC_BME280::getOverSample_T(){
Yajirushi 0:2baa0f77d4d2 308 char val = (ctrl->rr(BME280R_CTRL_MEAS) >> 5) & 0x07;
Yajirushi 0:2baa0f77d4d2 309
Yajirushi 0:2baa0f77d4d2 310 switch(val){
Yajirushi 0:2baa0f77d4d2 311 case 0:
Yajirushi 0:2baa0f77d4d2 312 return 0;
Yajirushi 0:2baa0f77d4d2 313 case 1:
Yajirushi 0:2baa0f77d4d2 314 return 1;
Yajirushi 0:2baa0f77d4d2 315 case 2:
Yajirushi 0:2baa0f77d4d2 316 return 2;
Yajirushi 0:2baa0f77d4d2 317 case 3:
Yajirushi 0:2baa0f77d4d2 318 return 4;
Yajirushi 0:2baa0f77d4d2 319 case 4:
Yajirushi 0:2baa0f77d4d2 320 return 8;
Yajirushi 0:2baa0f77d4d2 321 case 5:
Yajirushi 0:2baa0f77d4d2 322 return 16;
Yajirushi 0:2baa0f77d4d2 323 default:
Yajirushi 0:2baa0f77d4d2 324 return 16;
Yajirushi 0:2baa0f77d4d2 325 }
Yajirushi 0:2baa0f77d4d2 326 }
Yajirushi 0:2baa0f77d4d2 327
Yajirushi 0:2baa0f77d4d2 328 unsigned int BOARDC_BME280::getOverSample_H(){
Yajirushi 0:2baa0f77d4d2 329 char val = ctrl->rr(BME280R_CTRL_HUM) & 0x07;
Yajirushi 0:2baa0f77d4d2 330
Yajirushi 0:2baa0f77d4d2 331 switch(val){
Yajirushi 0:2baa0f77d4d2 332 case 0:
Yajirushi 0:2baa0f77d4d2 333 return 0;
Yajirushi 0:2baa0f77d4d2 334 case 1:
Yajirushi 0:2baa0f77d4d2 335 return 1;
Yajirushi 0:2baa0f77d4d2 336 case 2:
Yajirushi 0:2baa0f77d4d2 337 return 2;
Yajirushi 0:2baa0f77d4d2 338 case 3:
Yajirushi 0:2baa0f77d4d2 339 return 4;
Yajirushi 0:2baa0f77d4d2 340 case 4:
Yajirushi 0:2baa0f77d4d2 341 return 8;
Yajirushi 0:2baa0f77d4d2 342 case 5:
Yajirushi 0:2baa0f77d4d2 343 return 16;
Yajirushi 0:2baa0f77d4d2 344 default:
Yajirushi 0:2baa0f77d4d2 345 return 16;
Yajirushi 0:2baa0f77d4d2 346 }
Yajirushi 0:2baa0f77d4d2 347 }
Yajirushi 0:2baa0f77d4d2 348
Yajirushi 0:2baa0f77d4d2 349 void BOARDC_BME280::setOverSample_P(unsigned int oversampling){
Yajirushi 0:2baa0f77d4d2 350 char hum = ctrl->rr(BME280R_CTRL_HUM);
Yajirushi 0:2baa0f77d4d2 351 char meas = ctrl->rr(BME280R_CTRL_MEAS);
Yajirushi 0:2baa0f77d4d2 352 char config = ctrl->rr(BME280R_CONFIG);
Yajirushi 0:2baa0f77d4d2 353
Yajirushi 0:2baa0f77d4d2 354 char ovs = 0;
Yajirushi 0:2baa0f77d4d2 355 switch(oversampling){
Yajirushi 0:2baa0f77d4d2 356 case 0:
Yajirushi 0:2baa0f77d4d2 357 ovs = 0;
Yajirushi 0:2baa0f77d4d2 358 break;
Yajirushi 0:2baa0f77d4d2 359 case 1:
Yajirushi 0:2baa0f77d4d2 360 ovs = 1;
Yajirushi 0:2baa0f77d4d2 361 break;
Yajirushi 0:2baa0f77d4d2 362 case 2:
Yajirushi 0:2baa0f77d4d2 363 ovs = 2;
Yajirushi 0:2baa0f77d4d2 364 break;
Yajirushi 0:2baa0f77d4d2 365 case 4:
Yajirushi 0:2baa0f77d4d2 366 ovs = 3;
Yajirushi 0:2baa0f77d4d2 367 break;
Yajirushi 0:2baa0f77d4d2 368 case 8:
Yajirushi 0:2baa0f77d4d2 369 ovs = 4;
Yajirushi 0:2baa0f77d4d2 370 break;
Yajirushi 0:2baa0f77d4d2 371 case 16:
Yajirushi 0:2baa0f77d4d2 372 ovs = 5;
Yajirushi 0:2baa0f77d4d2 373 break;
Yajirushi 0:2baa0f77d4d2 374 default:
Yajirushi 0:2baa0f77d4d2 375 ovs = 0;
Yajirushi 0:2baa0f77d4d2 376 }
Yajirushi 0:2baa0f77d4d2 377
Yajirushi 0:2baa0f77d4d2 378 meas = (meas & 0xE3) | (ovs << 2);
Yajirushi 0:2baa0f77d4d2 379
Yajirushi 0:2baa0f77d4d2 380 //必ずCTRL_HUM>CTRL_MEAS>CONFIGの順番
Yajirushi 0:2baa0f77d4d2 381 ctrl->wr(BME280R_CTRL_HUM, hum & 0x07);
Yajirushi 0:2baa0f77d4d2 382 ctrl->wr(BME280R_CTRL_MEAS, meas);
Yajirushi 0:2baa0f77d4d2 383 ctrl->wr(BME280R_CONFIG, config & 0xFD);
Yajirushi 0:2baa0f77d4d2 384 }
Yajirushi 0:2baa0f77d4d2 385
Yajirushi 0:2baa0f77d4d2 386 void BOARDC_BME280::setOverSample_T(unsigned int oversampling){
Yajirushi 0:2baa0f77d4d2 387 char hum = ctrl->rr(BME280R_CTRL_HUM);
Yajirushi 0:2baa0f77d4d2 388 char meas = ctrl->rr(BME280R_CTRL_MEAS);
Yajirushi 0:2baa0f77d4d2 389 char config = ctrl->rr(BME280R_CONFIG);
Yajirushi 0:2baa0f77d4d2 390
Yajirushi 0:2baa0f77d4d2 391 char ovs = 0;
Yajirushi 0:2baa0f77d4d2 392 switch(oversampling){
Yajirushi 0:2baa0f77d4d2 393 case 0:
Yajirushi 0:2baa0f77d4d2 394 ovs = 0;
Yajirushi 0:2baa0f77d4d2 395 break;
Yajirushi 0:2baa0f77d4d2 396 case 1:
Yajirushi 0:2baa0f77d4d2 397 ovs = 1;
Yajirushi 0:2baa0f77d4d2 398 break;
Yajirushi 0:2baa0f77d4d2 399 case 2:
Yajirushi 0:2baa0f77d4d2 400 ovs = 2;
Yajirushi 0:2baa0f77d4d2 401 break;
Yajirushi 0:2baa0f77d4d2 402 case 4:
Yajirushi 0:2baa0f77d4d2 403 ovs = 3;
Yajirushi 0:2baa0f77d4d2 404 break;
Yajirushi 0:2baa0f77d4d2 405 case 8:
Yajirushi 0:2baa0f77d4d2 406 ovs = 4;
Yajirushi 0:2baa0f77d4d2 407 break;
Yajirushi 0:2baa0f77d4d2 408 case 16:
Yajirushi 0:2baa0f77d4d2 409 ovs = 5;
Yajirushi 0:2baa0f77d4d2 410 break;
Yajirushi 0:2baa0f77d4d2 411 default:
Yajirushi 0:2baa0f77d4d2 412 ovs = 0;
Yajirushi 0:2baa0f77d4d2 413 }
Yajirushi 0:2baa0f77d4d2 414
Yajirushi 0:2baa0f77d4d2 415 meas = (meas & 0x1F) | (ovs << 5);
Yajirushi 0:2baa0f77d4d2 416
Yajirushi 0:2baa0f77d4d2 417 //必ずCTRL_HUM>CTRL_MEAS>CONFIGの順番
Yajirushi 0:2baa0f77d4d2 418 ctrl->wr(BME280R_CTRL_HUM, hum & 0x07);
Yajirushi 0:2baa0f77d4d2 419 ctrl->wr(BME280R_CTRL_MEAS, meas);
Yajirushi 0:2baa0f77d4d2 420 ctrl->wr(BME280R_CONFIG, config & 0xFD);
Yajirushi 0:2baa0f77d4d2 421 }
Yajirushi 0:2baa0f77d4d2 422
Yajirushi 0:2baa0f77d4d2 423 void BOARDC_BME280::setOverSample_H(unsigned int oversampling){
Yajirushi 0:2baa0f77d4d2 424 char meas = ctrl->rr(BME280R_CTRL_MEAS);
Yajirushi 0:2baa0f77d4d2 425 char config = ctrl->rr(BME280R_CONFIG);
Yajirushi 0:2baa0f77d4d2 426
Yajirushi 0:2baa0f77d4d2 427 char ovs = 0;
Yajirushi 0:2baa0f77d4d2 428 switch(oversampling){
Yajirushi 0:2baa0f77d4d2 429 case 0:
Yajirushi 0:2baa0f77d4d2 430 ovs = 0;
Yajirushi 0:2baa0f77d4d2 431 break;
Yajirushi 0:2baa0f77d4d2 432 case 1:
Yajirushi 0:2baa0f77d4d2 433 ovs = 1;
Yajirushi 0:2baa0f77d4d2 434 break;
Yajirushi 0:2baa0f77d4d2 435 case 2:
Yajirushi 0:2baa0f77d4d2 436 ovs = 2;
Yajirushi 0:2baa0f77d4d2 437 break;
Yajirushi 0:2baa0f77d4d2 438 case 4:
Yajirushi 0:2baa0f77d4d2 439 ovs = 3;
Yajirushi 0:2baa0f77d4d2 440 break;
Yajirushi 0:2baa0f77d4d2 441 case 8:
Yajirushi 0:2baa0f77d4d2 442 ovs = 4;
Yajirushi 0:2baa0f77d4d2 443 break;
Yajirushi 0:2baa0f77d4d2 444 case 16:
Yajirushi 0:2baa0f77d4d2 445 ovs = 5;
Yajirushi 0:2baa0f77d4d2 446 break;
Yajirushi 0:2baa0f77d4d2 447 default:
Yajirushi 0:2baa0f77d4d2 448 ovs = 0;
Yajirushi 0:2baa0f77d4d2 449 }
Yajirushi 0:2baa0f77d4d2 450
Yajirushi 0:2baa0f77d4d2 451 //必ずCTRL_HUM>CTRL_MEAS>CONFIGの順番
Yajirushi 0:2baa0f77d4d2 452 ctrl->wr(BME280R_CTRL_HUM, ovs);
Yajirushi 0:2baa0f77d4d2 453 ctrl->wr(BME280R_CTRL_MEAS, meas);
Yajirushi 0:2baa0f77d4d2 454 ctrl->wr(BME280R_CONFIG, config & 0xFD);
Yajirushi 0:2baa0f77d4d2 455 }
Yajirushi 0:2baa0f77d4d2 456
Yajirushi 0:2baa0f77d4d2 457 char BOARDC_BME280::getConfig(){
Yajirushi 0:2baa0f77d4d2 458 return ctrl->rr(BME280R_CONFIG);
Yajirushi 0:2baa0f77d4d2 459 }
Yajirushi 0:2baa0f77d4d2 460
Yajirushi 0:2baa0f77d4d2 461 void BOARDC_BME280::setConfig(char regVal){
Yajirushi 0:2baa0f77d4d2 462 char hum = ctrl->rr(BME280R_CTRL_HUM);
Yajirushi 0:2baa0f77d4d2 463 char meas = ctrl->rr(BME280R_CTRL_MEAS);
Yajirushi 0:2baa0f77d4d2 464
Yajirushi 0:2baa0f77d4d2 465 //必ずCTRL_HUM>CTRL_MEAS>CONFIGの順番
Yajirushi 0:2baa0f77d4d2 466 ctrl->wr(BME280R_CTRL_HUM, hum & 0x07);
Yajirushi 0:2baa0f77d4d2 467 ctrl->wr(BME280R_CTRL_MEAS, meas);
Yajirushi 0:2baa0f77d4d2 468 ctrl->wr(BME280R_CONFIG, regVal & 0xFD);
Yajirushi 0:2baa0f77d4d2 469 }
Yajirushi 0:2baa0f77d4d2 470
Yajirushi 0:2baa0f77d4d2 471 char BOARDC_BME280::getStatus(){
Yajirushi 0:2baa0f77d4d2 472 return ctrl->rr(BME280R_STATUS);
Yajirushi 0:2baa0f77d4d2 473 }
Yajirushi 0:2baa0f77d4d2 474
Yajirushi 0:2baa0f77d4d2 475 bool BOARDC_BME280::isReady(){
Yajirushi 0:2baa0f77d4d2 476 return (ctrl->rr(BME280R_STATUS) == 0x00);
Yajirushi 0:2baa0f77d4d2 477 }
Yajirushi 0:2baa0f77d4d2 478
Yajirushi 0:2baa0f77d4d2 479 char BOARDC_BME280::getMode(){
Yajirushi 0:2baa0f77d4d2 480 return ctrl->rr(BME280R_CTRL_MEAS) & 0x03;
Yajirushi 0:2baa0f77d4d2 481 }
Yajirushi 0:2baa0f77d4d2 482
Yajirushi 0:2baa0f77d4d2 483 void BOARDC_BME280::updateCalib(){
Yajirushi 0:2baa0f77d4d2 484 char ary[33];
Yajirushi 0:2baa0f77d4d2 485 memset(ary, 0, 33);
Yajirushi 0:2baa0f77d4d2 486
Yajirushi 0:2baa0f77d4d2 487 //26byte+7byte連続読み取り
Yajirushi 0:2baa0f77d4d2 488 //使用されないものはそのまま捨てる
Yajirushi 0:2baa0f77d4d2 489 ctrl->rrc(BME280R_CALIB00, ary, 26);
Yajirushi 0:2baa0f77d4d2 490 ctrl->rrc(BME280R_CALIB26, ary + 26, 7);
Yajirushi 0:2baa0f77d4d2 491
Yajirushi 0:2baa0f77d4d2 492 T1 = (ary[1] << 8) | ary[0];
Yajirushi 0:2baa0f77d4d2 493 T2 = (ary[3] << 8) | ary[2];
Yajirushi 0:2baa0f77d4d2 494 T3 = (ary[5] << 8) | ary[4];
Yajirushi 0:2baa0f77d4d2 495
Yajirushi 0:2baa0f77d4d2 496 P1 = (ary[7] << 8) | ary[6];
Yajirushi 0:2baa0f77d4d2 497 P2 = (ary[9] << 8) | ary[8];
Yajirushi 0:2baa0f77d4d2 498 P3 = (ary[11] << 8) | ary[10];
Yajirushi 0:2baa0f77d4d2 499 P4 = (ary[13] << 8) | ary[12];
Yajirushi 0:2baa0f77d4d2 500 P5 = (ary[15] << 8) | ary[14];
Yajirushi 0:2baa0f77d4d2 501 P6 = (ary[17] << 8) | ary[16];
Yajirushi 0:2baa0f77d4d2 502 P7 = (ary[19] << 8) | ary[18];
Yajirushi 0:2baa0f77d4d2 503 P8 = (ary[21] << 8) | ary[20];
Yajirushi 0:2baa0f77d4d2 504 P9 = (ary[23] << 8) | ary[22];
Yajirushi 0:2baa0f77d4d2 505
Yajirushi 0:2baa0f77d4d2 506 H1 = ary[25];
Yajirushi 0:2baa0f77d4d2 507 H2 = (ary[27] << 8) | ary[26];
Yajirushi 0:2baa0f77d4d2 508 H3 = ary[28];
Yajirushi 0:2baa0f77d4d2 509 H4 = (ary[30] & 0x0F) | (ary[29] << 4); //順番注意
Yajirushi 0:2baa0f77d4d2 510 H5 = (ary[31] << 4) | (ary[30] >> 4);
Yajirushi 0:2baa0f77d4d2 511 H6 = ary[32];
Yajirushi 0:2baa0f77d4d2 512 }
Yajirushi 0:2baa0f77d4d2 513
Yajirushi 0:2baa0f77d4d2 514 void BOARDC_BME280::updateCalibT(){
Yajirushi 0:2baa0f77d4d2 515 char ary[6];
Yajirushi 0:2baa0f77d4d2 516 memset(ary, 0, 6);
Yajirushi 0:2baa0f77d4d2 517
Yajirushi 0:2baa0f77d4d2 518 //6byte連続読み取り
Yajirushi 0:2baa0f77d4d2 519 ctrl->rrc(BME280R_CALIB00, ary, 6);
Yajirushi 0:2baa0f77d4d2 520
Yajirushi 0:2baa0f77d4d2 521 T1 = (ary[1] << 8) | ary[0];
Yajirushi 0:2baa0f77d4d2 522 T2 = (ary[3] << 8) | ary[2];
Yajirushi 0:2baa0f77d4d2 523 T3 = (ary[5] << 8) | ary[4];
Yajirushi 0:2baa0f77d4d2 524 }
Yajirushi 0:2baa0f77d4d2 525
Yajirushi 0:2baa0f77d4d2 526 void BOARDC_BME280::updateCalibP(){
Yajirushi 0:2baa0f77d4d2 527 char ary[18];
Yajirushi 0:2baa0f77d4d2 528 memset(ary, 0, 18);
Yajirushi 0:2baa0f77d4d2 529
Yajirushi 0:2baa0f77d4d2 530 //18byte連続読み取り
Yajirushi 0:2baa0f77d4d2 531 ctrl->rrc(BME280R_CALIB06, ary, 18);
Yajirushi 0:2baa0f77d4d2 532
Yajirushi 0:2baa0f77d4d2 533 P1 = (ary[1] << 8) | ary[0];
Yajirushi 0:2baa0f77d4d2 534 P2 = (ary[3] << 8) | ary[2];
Yajirushi 0:2baa0f77d4d2 535 P3 = (ary[5] << 8) | ary[4];
Yajirushi 0:2baa0f77d4d2 536 P4 = (ary[7] << 8) | ary[6];
Yajirushi 0:2baa0f77d4d2 537 P5 = (ary[9] << 8) | ary[8];
Yajirushi 0:2baa0f77d4d2 538 P6 = (ary[11] << 8) | ary[10];
Yajirushi 0:2baa0f77d4d2 539 P7 = (ary[13] << 8) | ary[12];
Yajirushi 0:2baa0f77d4d2 540 P8 = (ary[15] << 8) | ary[14];
Yajirushi 0:2baa0f77d4d2 541 P9 = (ary[17] << 8) | ary[16];
Yajirushi 0:2baa0f77d4d2 542 }
Yajirushi 0:2baa0f77d4d2 543
Yajirushi 0:2baa0f77d4d2 544 void BOARDC_BME280::updateCalibH(){
Yajirushi 0:2baa0f77d4d2 545 char ary[7];
Yajirushi 0:2baa0f77d4d2 546 memset(ary, 0, 7);
Yajirushi 0:2baa0f77d4d2 547
Yajirushi 0:2baa0f77d4d2 548 //7byte連続読み取り
Yajirushi 0:2baa0f77d4d2 549 ctrl->rrc(BME280R_CALIB26, ary, 7);
Yajirushi 0:2baa0f77d4d2 550
Yajirushi 0:2baa0f77d4d2 551 H1 = ctrl->rr(BME280R_CALIB25);
Yajirushi 0:2baa0f77d4d2 552 H2 = (ary[1] << 8) | ary[0];
Yajirushi 0:2baa0f77d4d2 553 H3 = ary[2];
Yajirushi 0:2baa0f77d4d2 554 H4 = (ary[4] & 0x0F) | (ary[3] << 4); //順番注意
Yajirushi 0:2baa0f77d4d2 555 H5 = (ary[5] << 4) | (ary[4] >> 4);
Yajirushi 0:2baa0f77d4d2 556 H6 = ary[6];
Yajirushi 0:2baa0f77d4d2 557 }
Yajirushi 0:2baa0f77d4d2 558
Yajirushi 0:2baa0f77d4d2 559 float BOARDC_BME280::getTemp(unsigned int mode){
Yajirushi 0:2baa0f77d4d2 560 switch(mode){
Yajirushi 0:2baa0f77d4d2 561 case 0:
Yajirushi 0:2baa0f77d4d2 562 return getTemp_Celsius();
Yajirushi 0:2baa0f77d4d2 563 case 1:
Yajirushi 0:2baa0f77d4d2 564 return getTemp_Fahrenheit();
Yajirushi 0:2baa0f77d4d2 565 case 2:
Yajirushi 0:2baa0f77d4d2 566 return getTemp_Kelvin();
Yajirushi 0:2baa0f77d4d2 567 default:
Yajirushi 0:2baa0f77d4d2 568 return getTemp_Celsius();
Yajirushi 0:2baa0f77d4d2 569 }
Yajirushi 0:2baa0f77d4d2 570 }
Yajirushi 0:2baa0f77d4d2 571
Yajirushi 0:2baa0f77d4d2 572 float BOARDC_BME280::getTemp_Celsius(){
Yajirushi 0:2baa0f77d4d2 573 char ary[3];
Yajirushi 0:2baa0f77d4d2 574 memset(ary, 0, 3);
Yajirushi 0:2baa0f77d4d2 575
Yajirushi 0:2baa0f77d4d2 576 //3byte連続読み取り
Yajirushi 0:2baa0f77d4d2 577 ctrl->rrc(BME280R_TEMP_MSB, ary, 3);
Yajirushi 0:2baa0f77d4d2 578 signed int adc_T = (ary[0] << 12) | (ary[1] << 4) | (ary[2] >> 4);
Yajirushi 0:2baa0f77d4d2 579
Yajirushi 0:2baa0f77d4d2 580 //Compensation formulas(データシートより)
Yajirushi 0:2baa0f77d4d2 581 signed int var1, var2, T;
Yajirushi 0:2baa0f77d4d2 582 var1 = ((((adc_T >> 3) - ((signed int)T1 << 1))) * ((signed int)T2)) >> 11;
Yajirushi 0:2baa0f77d4d2 583 var2 = (((((adc_T >> 4) - ((signed int)T1)) * ((adc_T >> 4) - ((signed int)T1))) >> 12) * ((signed int)T3)) >> 14;
Yajirushi 0:2baa0f77d4d2 584 t_fine = var1 + var2;
Yajirushi 0:2baa0f77d4d2 585 T = (t_fine * 5 + 128) >> 8;
Yajirushi 0:2baa0f77d4d2 586
Yajirushi 0:2baa0f77d4d2 587 return (((float)T) / 100.0f);
Yajirushi 0:2baa0f77d4d2 588 }
Yajirushi 0:2baa0f77d4d2 589
Yajirushi 0:2baa0f77d4d2 590 float BOARDC_BME280::getTemp_Fahrenheit(){
Yajirushi 0:2baa0f77d4d2 591 return ((getTemp_Celsius() * 9.0f) / 5.0f) + 32.0f;
Yajirushi 0:2baa0f77d4d2 592 }
Yajirushi 0:2baa0f77d4d2 593
Yajirushi 0:2baa0f77d4d2 594 float BOARDC_BME280::getTemp_Kelvin(){
Yajirushi 0:2baa0f77d4d2 595 return getTemp_Celsius() + 273.15f;
Yajirushi 0:2baa0f77d4d2 596 }
Yajirushi 0:2baa0f77d4d2 597
Yajirushi 0:2baa0f77d4d2 598 float BOARDC_BME280::getPress(unsigned int mode){
Yajirushi 0:2baa0f77d4d2 599 switch(mode){
Yajirushi 0:2baa0f77d4d2 600 case 0:
Yajirushi 0:2baa0f77d4d2 601 return getPress_Pascal();
Yajirushi 0:2baa0f77d4d2 602 case 1:
Yajirushi 0:2baa0f77d4d2 603 return getPress_hPa();
Yajirushi 0:2baa0f77d4d2 604 case 2:
Yajirushi 0:2baa0f77d4d2 605 return getPress_psi();
Yajirushi 0:2baa0f77d4d2 606 default:
Yajirushi 0:2baa0f77d4d2 607 return getPress_hPa();
Yajirushi 0:2baa0f77d4d2 608 }
Yajirushi 0:2baa0f77d4d2 609 }
Yajirushi 0:2baa0f77d4d2 610
Yajirushi 0:2baa0f77d4d2 611 float BOARDC_BME280::getPress_Pascal(){
Yajirushi 0:2baa0f77d4d2 612 char ary[3];
Yajirushi 0:2baa0f77d4d2 613 memset(ary, 0, 3);
Yajirushi 0:2baa0f77d4d2 614
Yajirushi 0:2baa0f77d4d2 615 //3byte連続読み取り
Yajirushi 0:2baa0f77d4d2 616 ctrl->rrc(BME280R_PRESS_MSB, ary, 3);
Yajirushi 0:2baa0f77d4d2 617 signed int adc_P = (ary[0] << 12) | (ary[1] << 4) | (ary[2] >> 4);
Yajirushi 0:2baa0f77d4d2 618
Yajirushi 0:2baa0f77d4d2 619 //Compensation formulas(データシートより)
Yajirushi 0:2baa0f77d4d2 620 signed int var1, var2;
Yajirushi 0:2baa0f77d4d2 621 unsigned int p;
Yajirushi 0:2baa0f77d4d2 622 var1 = (((signed int)t_fine) >> 1) - (signed int)64000;
Yajirushi 0:2baa0f77d4d2 623 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11 ) * ((signed int)P6);
Yajirushi 0:2baa0f77d4d2 624 var2 = var2 + ((var1 * ((signed int)P5)) << 1);
Yajirushi 0:2baa0f77d4d2 625 var2 = (var2 >> 2)+(((signed int)P4) << 16);
Yajirushi 0:2baa0f77d4d2 626 var1 = (((P3 * (((var1 >> 2) * (var1 >> 2)) >> 13 )) >> 3) + ((((signed int)P2) * var1) >> 1)) >> 18;
Yajirushi 0:2baa0f77d4d2 627 var1 =((((32768 + var1)) * ((signed int)P1)) >> 15);
Yajirushi 0:2baa0f77d4d2 628 if (var1 == 0){
Yajirushi 0:2baa0f77d4d2 629 return 0; // avoid exception caused by division by zero
Yajirushi 0:2baa0f77d4d2 630 }
Yajirushi 0:2baa0f77d4d2 631 p = (((unsigned int)(((signed int)1048576) - adc_P) - (var2 >> 12))) * 3125;
Yajirushi 0:2baa0f77d4d2 632 if (p < 0x80000000){
Yajirushi 0:2baa0f77d4d2 633 p = (p << 1) / ((unsigned int)var1);
Yajirushi 0:2baa0f77d4d2 634 }else{
Yajirushi 0:2baa0f77d4d2 635 p = (p / (unsigned int)var1) * 2;
Yajirushi 0:2baa0f77d4d2 636 }
Yajirushi 0:2baa0f77d4d2 637 var1 = (((signed int)P9) * ((signed int)(((p >> 3) * (p >> 3)) >> 13))) >> 12;
Yajirushi 0:2baa0f77d4d2 638 var2 = (((signed int)(p >> 2)) * ((signed int)P8)) >> 13;
Yajirushi 0:2baa0f77d4d2 639 p = (unsigned int)((signed int)p + ((var1 + var2 + P7) >> 4));
Yajirushi 0:2baa0f77d4d2 640
Yajirushi 0:2baa0f77d4d2 641 return (float)(p * 1.0f);
Yajirushi 0:2baa0f77d4d2 642 }
Yajirushi 0:2baa0f77d4d2 643
Yajirushi 0:2baa0f77d4d2 644 float BOARDC_BME280::getPress_hPa(){
Yajirushi 0:2baa0f77d4d2 645 return getPress_Pascal() / 100.0f;
Yajirushi 0:2baa0f77d4d2 646 }
Yajirushi 0:2baa0f77d4d2 647
Yajirushi 0:2baa0f77d4d2 648 float BOARDC_BME280::getPress_psi(){
Yajirushi 0:2baa0f77d4d2 649 return getPress_Pascal() / 6894.757293168;
Yajirushi 0:2baa0f77d4d2 650 }
Yajirushi 0:2baa0f77d4d2 651
Yajirushi 0:2baa0f77d4d2 652 float BOARDC_BME280::getHum(){
Yajirushi 0:2baa0f77d4d2 653 char ary[2];
Yajirushi 0:2baa0f77d4d2 654 memset(ary, 0, 2);
Yajirushi 0:2baa0f77d4d2 655
Yajirushi 0:2baa0f77d4d2 656 //2byte連続読み取り
Yajirushi 0:2baa0f77d4d2 657 ctrl->rrc(BME280R_HUM_MSB, ary, 2);
Yajirushi 0:2baa0f77d4d2 658 signed int adc_H = (ary[0] << 8) | ary[1];
Yajirushi 0:2baa0f77d4d2 659
Yajirushi 0:2baa0f77d4d2 660 //Compensation formulas(データシートより)
Yajirushi 0:2baa0f77d4d2 661 signed int v_x1_u32r;
Yajirushi 0:2baa0f77d4d2 662 v_x1_u32r = (t_fine - ((signed int)76800));
Yajirushi 0:2baa0f77d4d2 663 v_x1_u32r =
Yajirushi 0:2baa0f77d4d2 664 (((((adc_H << 14) - (((signed int)H4) << 20) - (((signed int)H5) * v_x1_u32r)) +
Yajirushi 0:2baa0f77d4d2 665 ((signed int)16384)) >> 15) * (((((((v_x1_u32r * ((signed int)H6)) >> 10) * (((v_x1_u32r *
Yajirushi 0:2baa0f77d4d2 666 ((signed int)H3)) >> 11) + ((signed int)32768))) >> 10) + ((signed int)2097152)) *
Yajirushi 0:2baa0f77d4d2 667 ((signed int)H2) + 8192) >> 14));
Yajirushi 0:2baa0f77d4d2 668 v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((signed int)H1)) >> 4));
Yajirushi 0:2baa0f77d4d2 669 v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r);
Yajirushi 0:2baa0f77d4d2 670 v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);
Yajirushi 0:2baa0f77d4d2 671
Yajirushi 0:2baa0f77d4d2 672 return (float)(((unsigned int)(v_x1_u32r >> 12)) / 1024.0f);
Yajirushi 0:2baa0f77d4d2 673 }
Yajirushi 0:2baa0f77d4d2 674
Yajirushi 0:2baa0f77d4d2 675 double BOARDC_BME280::getPress64(unsigned int mode){
Yajirushi 0:2baa0f77d4d2 676 switch(mode){
Yajirushi 0:2baa0f77d4d2 677 case 0:
Yajirushi 0:2baa0f77d4d2 678 return getPress64_Pascal();
Yajirushi 0:2baa0f77d4d2 679 case 1:
Yajirushi 0:2baa0f77d4d2 680 return getPress64_hPa();
Yajirushi 0:2baa0f77d4d2 681 case 2:
Yajirushi 0:2baa0f77d4d2 682 return getPress64_psi();
Yajirushi 0:2baa0f77d4d2 683 default:
Yajirushi 0:2baa0f77d4d2 684 return getPress64_hPa();
Yajirushi 0:2baa0f77d4d2 685 }
Yajirushi 0:2baa0f77d4d2 686 }
Yajirushi 0:2baa0f77d4d2 687
Yajirushi 0:2baa0f77d4d2 688 double BOARDC_BME280::getPress64_Pascal(){
Yajirushi 0:2baa0f77d4d2 689 char ary[3];
Yajirushi 0:2baa0f77d4d2 690 memset(ary, 0, 3);
Yajirushi 0:2baa0f77d4d2 691
Yajirushi 0:2baa0f77d4d2 692 //3byte連続読み取り
Yajirushi 0:2baa0f77d4d2 693 ctrl->rrc(BME280R_PRESS_MSB, ary, 3);
Yajirushi 0:2baa0f77d4d2 694 signed int adc_P = (ary[0] << 16) | (ary[1] << 8) | ary[2];
Yajirushi 0:2baa0f77d4d2 695
Yajirushi 0:2baa0f77d4d2 696 //倍精度での算出(データシートより)
Yajirushi 0:2baa0f77d4d2 697 signed long long var1, var2, p;
Yajirushi 0:2baa0f77d4d2 698 var1 = ((signed long long)t_fine) - 128000;
Yajirushi 0:2baa0f77d4d2 699 var2 = var1 * var1 * (signed long long)P6;
Yajirushi 0:2baa0f77d4d2 700 var2 = var2 + ((var1 * (signed long long)P5) << 17);
Yajirushi 0:2baa0f77d4d2 701 var2 = var2 + (((signed long long)P4)<<35);
Yajirushi 0:2baa0f77d4d2 702 var1 = ((var1 * var1 * (signed long long)P3) >> 8) + ((var1 * (signed long long)P2) << 12);
Yajirushi 0:2baa0f77d4d2 703 var1 = (((((signed long long)1) << 47) + var1)) * ((signed long long)P1) >> 33;
Yajirushi 0:2baa0f77d4d2 704 if (var1 == 0){
Yajirushi 0:2baa0f77d4d2 705 return 0; // avoid exception caused by division by zero
Yajirushi 0:2baa0f77d4d2 706 }
Yajirushi 0:2baa0f77d4d2 707 p = 1048576 - adc_P;
Yajirushi 0:2baa0f77d4d2 708 p = (((p<<31) - var2) * 3125) / var1;
Yajirushi 0:2baa0f77d4d2 709 var1 = (((signed long long)P9) * (p >> 13) * (p >> 13)) >> 25;
Yajirushi 0:2baa0f77d4d2 710 var2 = (((signed long long)P8) * p) >> 19;
Yajirushi 0:2baa0f77d4d2 711 p = ((p + var1 + var2) >> 8) + (((signed long long)P7) << 4);
Yajirushi 0:2baa0f77d4d2 712
Yajirushi 0:2baa0f77d4d2 713 return (double)((unsigned int)p / 256.0);
Yajirushi 0:2baa0f77d4d2 714 }
Yajirushi 0:2baa0f77d4d2 715
Yajirushi 0:2baa0f77d4d2 716 double BOARDC_BME280::getPress64_hPa(){
Yajirushi 0:2baa0f77d4d2 717 return getPress64_Pascal() / 100.0;
Yajirushi 0:2baa0f77d4d2 718 }
Yajirushi 0:2baa0f77d4d2 719
Yajirushi 0:2baa0f77d4d2 720 double BOARDC_BME280::getPress64_psi(){
Yajirushi 0:2baa0f77d4d2 721 return getPress64_Pascal() / 6894.757293168;
Yajirushi 0:2baa0f77d4d2 722 }