BME280をI2CとSPIで使用するためのライブラリ。
Dependents: BNO055_BME280_ Yabusame2_gyro GRhanawaizman
BME280.cpp@0:2baa0f77d4d2, 2016-11-29 (annotated)
- Committer:
- Yajirushi
- Date:
- Tue Nov 29 02:58:53 2016 +0000
- Revision:
- 0:2baa0f77d4d2
FISRT COMMIT
Who changed what in which revision?
User | Revision | Line number | New 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 | } |