#include #include #include void BME280_init( void ); void BME280readData( void ); void BME280readTrim( void ); void BME280writeReg( byte reg_address, byte data); signed long int BME280calibration_T( signed long int adc_T ); unsigned long int BME280calibration_P(signed long int adc_P ); unsigned long int BME280calibration_H(signed long int adc_H); typedef unsigned int unit16_t; typedef unsigned long unit32_t; #define BME280_ADRS 0x77 #define TEMP_CALIBRATION 1.5 //気温の較正値 enum { BME280_REGISTER_DIG_T1 = 0x88, BME280_REGISTER_DIG_T2 = 0x8A, BME280_REGISTER_DIG_T3 = 0x8C, BME280_REGISTER_DIG_P1 = 0x8E, BME280_REGISTER_DIG_P2 = 0x90, BME280_REGISTER_DIG_P3 = 0x92, BME280_REGISTER_DIG_P4 = 0x94, BME280_REGISTER_DIG_P5 = 0x96, BME280_REGISTER_DIG_P6 = 0x98, BME280_REGISTER_DIG_P7 = 0x9A, BME280_REGISTER_DIG_P8 = 0x9C, BME280_REGISTER_DIG_P9 = 0x9E, BME280_REGISTER_DIG_H1 = 0xA1, BME280_REGISTER_DIG_H2 = 0xE1, BME280_REGISTER_DIG_H3 = 0xE3, BME280_REGISTER_DIG_H4 = 0xE4, BME280_REGISTER_DIG_H5 = 0xE5, BME280_REGISTER_DIG_H6 = 0xE7, BME280_REGISTER_CHIPID = 0xD0, BME280_REGISTER_VERSION = 0xD1, BME280_REGISTER_SOFTRESET = 0xE0, BME280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0 BME280_REGISTER_CONTROLHUMID = 0xF2, BME280_REGISTER_STATUS = 0XF3, BME280_REGISTER_CONTROL = 0xF4, BME280_REGISTER_CONFIG = 0xF5, BME280_REGISTER_PRESSUREDATA = 0xF7, BME280_REGISTER_TEMPDATA = 0xFA, BME280_REGISTER_HUMIDDATA = 0xFD }; char msg[128]; float gtFdata[ 3 ]; // floatのデータ unsigned long int hum_raw, temp_raw, pres_raw; signed long int tfine; uint16_t dig_T1; int16_t dig_T2; int16_t dig_T3; uint16_t dig_P1; int16_t dig_P2; int16_t dig_P3; int16_t dig_P4; int16_t dig_P5; int16_t dig_P6; int16_t dig_P7; int16_t dig_P8; int16_t dig_P9; int8_t dig_H1; int16_t dig_H2; int8_t dig_H3; int16_t dig_H4; int16_t dig_H5; int8_t dig_H6; void setup() { Serial.begin( 9600 ); // コンソール出力用 // センサの初期化 BME280_init(); } void loop() { double temp_act = 0.0, press_act = 0.0, hum_act = 0.0; signed long int temp_cal; unsigned long int press_cal, hum_cal; char text[2]; int di = 0; BME280readData(); temp_cal = BME280calibration_T(temp_raw); press_cal = BME280calibration_P(pres_raw); hum_cal = BME280calibration_H(hum_raw); gtFdata[ 0 ] = (double)temp_cal / 100.0; gtFdata[ 0 ] -= TEMP_CALIBRATION; //気温の較正を行う gtFdata[ 1 ] = (double)hum_cal / 1024.0; gtFdata[ 2 ] = (double)press_cal / 100.0; sprintf( msg, "%4.1fC, %4.1f%%, %4.1fhPa", gtFdata[ 0 ], gtFdata[ 1 ], gtFdata[ 2 ] ); Serial.println( msg ); delay ( 5000 ); } void BME280_init() { uint8_t osrs_t = 1; //Temperature oversampling x 1 uint8_t osrs_p = 1; //Pressure oversampling x 1 uint8_t osrs_h = 1; //Humidity oversampling x 1 uint8_t mode = 3; //Normal mode uint8_t t_sb = 5; //Tstandby 1000ms uint8_t filter = 0; //Filter off uint8_t spi3w_en = 0; //3-wire SPI Disable uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en; uint8_t ctrl_hum_reg = osrs_h; Wire.begin(); BME280writeReg( BME280_REGISTER_SOFTRESET, 0xB6 ); delay( 300 ); BME280writeReg( BME280_REGISTER_CONTROLHUMID, ctrl_hum_reg); BME280writeReg( BME280_REGISTER_CONTROL, ctrl_meas_reg); BME280writeReg( BME280_REGISTER_CONFIG, config_reg); BME280readTrim(); delay( 100 ); } void BME280readData() { int i = 0; long data[8]; Wire.beginTransmission( BME280_ADRS ); Wire.write( BME280_REGISTER_PRESSUREDATA ); Wire.endTransmission(); Wire.requestFrom( BME280_ADRS, 8 ); while (Wire.available()) { data[ i ] = Wire.read(); i++; } pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4); temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4); hum_raw = (data[6] << 8) | data[7]; } void BME280readTrim() { uint8_t data[32], i = 0; Wire.beginTransmission( BME280_ADRS ); Wire.write( BME280_REGISTER_DIG_T1 ); Wire.endTransmission(); Wire.requestFrom( BME280_ADRS, 24); while (Wire.available()) { data[i] = Wire.read(); i++; } Wire.beginTransmission( BME280_ADRS ); Wire.write( BME280_REGISTER_DIG_H1 ); Wire.endTransmission(); Wire.requestFrom( BME280_ADRS, 1); data[i] = Wire.read(); i++; Wire.beginTransmission( BME280_ADRS ); Wire.write( BME280_REGISTER_CAL26 ); Wire.endTransmission(); Wire.requestFrom( BME280_ADRS, 7); while (Wire.available()) { data[i] = Wire.read(); i++; } dig_T1 = (data[1] << 8) | data[0]; dig_T2 = (data[3] << 8) | data[2]; dig_T3 = (data[5] << 8) | data[4]; dig_P1 = (data[7] << 8) | data[6]; dig_P2 = (data[9] << 8) | data[8]; dig_P3 = (data[11] << 8) | data[10]; dig_P4 = (data[13] << 8) | data[12]; dig_P5 = (data[15] << 8) | data[14]; dig_P6 = (data[17] << 8) | data[16]; dig_P7 = (data[19] << 8) | data[18]; dig_P8 = (data[21] << 8) | data[20]; dig_P9 = (data[23] << 8) | data[22]; dig_H1 = data[24]; dig_H2 = (data[26] << 8) | data[25]; dig_H3 = data[27]; dig_H4 = (data[28] << 4) | (0x0F & data[29]); dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F); dig_H6 = data[31]; } void BME280writeReg( byte reg_address, byte data) { Wire.beginTransmission( BME280_ADRS ); Wire.write( reg_address ); Wire.write( data ); Wire.endTransmission(); } signed long int BME280calibration_T( signed long int adc_T ) { signed long int var1, var2, T; var1 = ((((adc_T >> 3) - ((signed long int)dig_T1 << 1))) * ((signed long int)dig_T2)) >> 11; var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T >> 4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14; tfine = var1 + var2; T = (tfine * 5 + 128) >> 8; return T; } unsigned long int BME280calibration_P(signed long int adc_P) { signed long int var1, var2; unsigned long int P; var1 = (((signed long int)tfine) >> 1) - (signed long int)64000; var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((signed long int)dig_P6); var2 = var2 + ((var1 * ((signed long int)dig_P5)) << 1); var2 = (var2 >> 2) + (((signed long int)dig_P4) << 16); var1 = (((dig_P3 * (((var1 >> 2) * (var1 >> 2)) >> 13)) >> 3) + ((((signed long int)dig_P2) * var1) >> 1)) >> 18; var1 = ((((32768 + var1)) * ((signed long int)dig_P1)) >> 15); if (var1 == 0) { return 0; } P = (((unsigned long int)(((signed long int)1048576) - adc_P) - (var2 >> 12))) * 3125; if (P < 0x80000000) { P = (P << 1) / ((unsigned long int) var1); } else { P = (P / (unsigned long int)var1) * 2; } var1 = (((signed long int)dig_P9) * ((signed long int)(((P >> 3) * (P >> 3)) >> 13))) >> 12; var2 = (((signed long int)(P >> 2)) * ((signed long int)dig_P8)) >> 13; P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4)); return P; } unsigned long int BME280calibration_H(signed long int adc_H) { signed long int v_x1; v_x1 = (tfine - ((signed long int)76800)); v_x1 = (((((adc_H << 14) - (((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) + ((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) * (((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) * ((signed long int) dig_H2) + 8192) >> 14)); v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4)); v_x1 = (v_x1 < 0 ? 0 : v_x1); v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1); return (unsigned long int)(v_x1 >> 12); }