100 | | |
101 | | |
| 100 | [[Image(s-BME280_12.jpg)]] |
| 101 | |
| 102 | === サンプルスケッチ === |
| 103 | {{{ |
| 104 | #include <Wire.h> |
| 105 | |
| 106 | #define BME280_ADDRESS 0x76 |
| 107 | unsigned long int hum_raw,temp_raw,pres_raw; |
| 108 | signed long int t_fine; |
| 109 | |
| 110 | uint16_t dig_T1; |
| 111 | int16_t dig_T2; |
| 112 | int16_t dig_T3; |
| 113 | uint16_t dig_P1; |
| 114 | int16_t dig_P2; |
| 115 | int16_t dig_P3; |
| 116 | int16_t dig_P4; |
| 117 | int16_t dig_P5; |
| 118 | int16_t dig_P6; |
| 119 | int16_t dig_P7; |
| 120 | int16_t dig_P8; |
| 121 | int16_t dig_P9; |
| 122 | int8_t dig_H1; |
| 123 | int16_t dig_H2; |
| 124 | int8_t dig_H3; |
| 125 | int16_t dig_H4; |
| 126 | int16_t dig_H5; |
| 127 | int8_t dig_H6; |
| 128 | |
| 129 | void setup() |
| 130 | { |
| 131 | uint8_t osrs_t = 1; //Temperature oversampling x 1 |
| 132 | uint8_t osrs_p = 1; //Pressure oversampling x 1 |
| 133 | uint8_t osrs_h = 1; //Humidity oversampling x 1 |
| 134 | uint8_t mode = 3; //Normal mode |
| 135 | uint8_t t_sb = 5; //Tstandby 1000ms |
| 136 | uint8_t filter = 0; //Filter off |
| 137 | uint8_t spi3w_en = 0; //3-wire SPI Disable |
| 138 | |
| 139 | uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; |
| 140 | uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en; |
| 141 | uint8_t ctrl_hum_reg = osrs_h; |
| 142 | |
| 143 | Serial.begin(9600); |
| 144 | Wire.begin(); |
| 145 | |
| 146 | writeReg(0xF2,ctrl_hum_reg); |
| 147 | writeReg(0xF4,ctrl_meas_reg); |
| 148 | writeReg(0xF5,config_reg); |
| 149 | readTrim(); // |
| 150 | } |
| 151 | |
| 152 | |
| 153 | void loop() |
| 154 | { |
| 155 | double temp_act = 0.0, press_act = 0.0,hum_act=0.0; |
| 156 | signed long int temp_cal; |
| 157 | unsigned long int press_cal,hum_cal; |
| 158 | |
| 159 | readData(); |
| 160 | |
| 161 | temp_cal = calibration_T(temp_raw); |
| 162 | press_cal = calibration_P(pres_raw); |
| 163 | hum_cal = calibration_H(hum_raw); |
| 164 | temp_act = (double)temp_cal / 100.0; |
| 165 | press_act = (double)press_cal / 100.0; |
| 166 | hum_act = (double)hum_cal / 1024.0; |
| 167 | Serial.print("TEMP : "); |
| 168 | Serial.print(temp_act); |
| 169 | Serial.print(" DegC PRESS : "); |
| 170 | Serial.print(press_act); |
| 171 | Serial.print(" hPa HUM : "); |
| 172 | Serial.print(hum_act); |
| 173 | Serial.println(" %"); |
| 174 | |
| 175 | delay(1000); |
| 176 | } |
| 177 | void readTrim() |
| 178 | { |
| 179 | uint8_t data[33],i=0; |
| 180 | Wire.beginTransmission(BME280_ADDRESS); |
| 181 | Wire.write(0x88); |
| 182 | Wire.endTransmission(); |
| 183 | Wire.requestFrom(BME280_ADDRESS,25); |
| 184 | while(Wire.available()){ |
| 185 | data[i] = Wire.read(); |
| 186 | i++; |
| 187 | } |
| 188 | Wire.beginTransmission(BME280_ADDRESS); |
| 189 | Wire.write(0xE1); |
| 190 | Wire.endTransmission(); |
| 191 | Wire.requestFrom(BME280_ADDRESS,8); |
| 192 | while(Wire.available()){ |
| 193 | data[i] = Wire.read(); |
| 194 | i++; |
| 195 | } |
| 196 | dig_T1 = (data[1] << 8) | data[0]; |
| 197 | dig_T2 = (data[3] << 8) | data[2]; |
| 198 | dig_T3 = (data[5] << 8) | data[4]; |
| 199 | dig_P1 = (data[7] << 8) | data[6]; |
| 200 | dig_P2 = (data[9] << 8) | data[8]; |
| 201 | dig_P3 = (data[11]<< 8) | data[10]; |
| 202 | dig_P4 = (data[13]<< 8) | data[12]; |
| 203 | dig_P5 = (data[15]<< 8) | data[14]; |
| 204 | dig_P6 = (data[17]<< 8) | data[16]; |
| 205 | dig_P7 = (data[19]<< 8) | data[18]; |
| 206 | dig_P8 = (data[21]<< 8) | data[20]; |
| 207 | dig_P9 = (data[23]<< 8) | data[22]; |
| 208 | dig_H1 = data[24]; |
| 209 | dig_H2 = (data[26]<< 8) | data[25]; |
| 210 | dig_H3 = data[27]; |
| 211 | dig_H4 = (data[28]<< 4) | (0x0F & data[29]); |
| 212 | dig_H5 = (data[31] << 4) | ((data[30] >> 4) & 0x0F); |
| 213 | dig_H6 = data[32]; |
| 214 | } |
| 215 | void writeReg(uint8_t reg_address, uint8_t data) |
| 216 | { |
| 217 | Wire.beginTransmission(BME280_ADDRESS); |
| 218 | Wire.write(reg_address); |
| 219 | Wire.write(data); |
| 220 | Wire.endTransmission(); |
| 221 | } |
| 222 | |
| 223 | |
| 224 | void readData() |
| 225 | { |
| 226 | int i = 0; |
| 227 | uint32_t data[8]; |
| 228 | Wire.beginTransmission(BME280_ADDRESS); |
| 229 | Wire.write(0xF7); |
| 230 | Wire.endTransmission(); |
| 231 | Wire.requestFrom(BME280_ADDRESS,8); |
| 232 | while(Wire.available()){ |
| 233 | data[i] = Wire.read(); |
| 234 | i++; |
| 235 | } |
| 236 | pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4); |
| 237 | temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4); |
| 238 | hum_raw = (data[6] << 8) | data[7]; |
| 239 | } |
| 240 | |
| 241 | |
| 242 | signed long int calibration_T(signed long int adc_T) |
| 243 | { |
| 244 | |
| 245 | signed long int var1, var2, T; |
| 246 | var1 = ((((adc_T >> 3) - ((signed long int)dig_T1<<1))) * ((signed long int)dig_T2)) >> 11; |
| 247 | var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T>>4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14; |
| 248 | |
| 249 | t_fine = var1 + var2; |
| 250 | T = (t_fine * 5 + 128) >> 8; |
| 251 | return T; |
| 252 | } |
| 253 | |
| 254 | unsigned long int calibration_P(signed long int adc_P) |
| 255 | { |
| 256 | signed long int var1, var2; |
| 257 | unsigned long int P; |
| 258 | var1 = (((signed long int)t_fine)>>1) - (signed long int)64000; |
| 259 | var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6); |
| 260 | var2 = var2 + ((var1*((signed long int)dig_P5))<<1); |
| 261 | var2 = (var2>>2)+(((signed long int)dig_P4)<<16); |
| 262 | var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18; |
| 263 | var1 = ((((32768+var1))*((signed long int)dig_P1))>>15); |
| 264 | if (var1 == 0) |
| 265 | { |
| 266 | return 0; |
| 267 | } |
| 268 | P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125; |
| 269 | if(P<0x80000000) |
| 270 | { |
| 271 | P = (P << 1) / ((unsigned long int) var1); |
| 272 | } |
| 273 | else |
| 274 | { |
| 275 | P = (P / (unsigned long int)var1) * 2; |
| 276 | } |
| 277 | var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12; |
| 278 | var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13; |
| 279 | P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4)); |
| 280 | return P; |
| 281 | } |
| 282 | |
| 283 | unsigned long int calibration_H(signed long int adc_H) |
| 284 | { |
| 285 | signed long int v_x1; |
| 286 | |
| 287 | v_x1 = (t_fine - ((signed long int)76800)); |
| 288 | v_x1 = (((((adc_H << 14) -(((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) + |
| 289 | ((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) * |
| 290 | (((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) * |
| 291 | ((signed long int) dig_H2) + 8192) >> 14)); |
| 292 | v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4)); |
| 293 | v_x1 = (v_x1 < 0 ? 0 : v_x1); |
| 294 | v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1); |
| 295 | return (unsigned long int)(v_x1 >> 12); |
| 296 | } |
| 297 | |
| 298 | }}} |
| 299 | |
| 300 | |