lora sensnode
Dependencies: libmDot mbed-rtos mbed
Fork of mDot_LoRa_Sensornode by
app/BME280.cpp@1:e67174cc4953, 2016-08-10 (annotated)
- Committer:
- socie123
- Date:
- Wed Aug 10 12:54:10 2016 +0000
- Revision:
- 1:e67174cc4953
- Parent:
- 0:f2815503561f
lora sensnode
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mitea1 | 0:f2815503561f | 1 | /* |
mitea1 | 0:f2815503561f | 2 | * BME280.cpp |
mitea1 | 0:f2815503561f | 3 | * |
mitea1 | 0:f2815503561f | 4 | * Created on: 18.05.2016 |
mitea1 | 0:f2815503561f | 5 | * Author: Adrian |
mitea1 | 0:f2815503561f | 6 | */ |
mitea1 | 0:f2815503561f | 7 | |
mitea1 | 0:f2815503561f | 8 | #include "BME280.h" |
mitea1 | 0:f2815503561f | 9 | |
mitea1 | 0:f2815503561f | 10 | BME280::BME280(I2C_RT* i2c){ |
mitea1 | 0:f2815503561f | 11 | setI2C(i2c); |
mitea1 | 0:f2815503561f | 12 | this->config = new BME280Config(); |
mitea1 | 0:f2815503561f | 13 | } |
mitea1 | 0:f2815503561f | 14 | |
mitea1 | 0:f2815503561f | 15 | BME280::~BME280() { |
mitea1 | 0:f2815503561f | 16 | // TODO Auto-generated destructor stub |
mitea1 | 0:f2815503561f | 17 | } |
mitea1 | 0:f2815503561f | 18 | |
mitea1 | 0:f2815503561f | 19 | void BME280::init(BME280_MODE desiredMode){ |
mitea1 | 0:f2815503561f | 20 | |
mitea1 | 0:f2815503561f | 21 | config->build(desiredMode); |
mitea1 | 0:f2815503561f | 22 | |
mitea1 | 0:f2815503561f | 23 | setOversamplingHumidity(config->getOversamplingHumidity()); |
mitea1 | 0:f2815503561f | 24 | setOversamplingTemperature(config->getOversamplingTemperature()); |
mitea1 | 0:f2815503561f | 25 | setOversamplingPressure(config->getOversamplingPressure()); |
mitea1 | 0:f2815503561f | 26 | setMode(config->getMode()); |
mitea1 | 0:f2815503561f | 27 | |
mitea1 | 0:f2815503561f | 28 | getTrimValuesHumidity(); |
mitea1 | 0:f2815503561f | 29 | getTrimValuesPressure(); |
mitea1 | 0:f2815503561f | 30 | getTrimValuesTemperature(); |
mitea1 | 0:f2815503561f | 31 | } |
mitea1 | 0:f2815503561f | 32 | |
mitea1 | 0:f2815503561f | 33 | void BME280::setI2C(I2C_RT* i2c_rt){ |
mitea1 | 0:f2815503561f | 34 | this->i2c = i2c_rt; |
mitea1 | 0:f2815503561f | 35 | } |
mitea1 | 0:f2815503561f | 36 | |
mitea1 | 0:f2815503561f | 37 | uint32_t BME280::getHumidity(){ |
mitea1 | 0:f2815503561f | 38 | |
mitea1 | 0:f2815503561f | 39 | // Data Containers |
mitea1 | 0:f2815503561f | 40 | uint8_t msbRegisterData[1]; |
mitea1 | 0:f2815503561f | 41 | uint8_t lsbRegisterData[1]; |
mitea1 | 0:f2815503561f | 42 | |
mitea1 | 0:f2815503561f | 43 | i2c->read_RT( |
mitea1 | 0:f2815503561f | 44 | BME280_SENSOR_ADDRESS,BME280_SENSOR_HUM_MSB,false,msbRegisterData,1); |
mitea1 | 0:f2815503561f | 45 | i2c->read_RT( |
mitea1 | 0:f2815503561f | 46 | BME280_SENSOR_ADDRESS,BME280_SENSOR_HUM_LSB,false,lsbRegisterData,1); |
mitea1 | 0:f2815503561f | 47 | |
mitea1 | 0:f2815503561f | 48 | int32_t temp_fine = getTemperature(); |
mitea1 | 0:f2815503561f | 49 | |
mitea1 | 0:f2815503561f | 50 | int32_t humRaw = (int32_t) (msbRegisterData[0]<<8|lsbRegisterData[0]); |
mitea1 | 0:f2815503561f | 51 | uint32_t hum_fine = this->compensateHumidity(humRaw,temp_fine); |
mitea1 | 0:f2815503561f | 52 | |
mitea1 | 0:f2815503561f | 53 | return hum_fine; |
mitea1 | 0:f2815503561f | 54 | |
mitea1 | 0:f2815503561f | 55 | } |
mitea1 | 0:f2815503561f | 56 | |
mitea1 | 0:f2815503561f | 57 | float BME280::getHumidityFloat(){ |
mitea1 | 0:f2815503561f | 58 | return (float) getHumidity()/ 1024; |
mitea1 | 0:f2815503561f | 59 | } |
mitea1 | 0:f2815503561f | 60 | |
mitea1 | 0:f2815503561f | 61 | uint32_t BME280::getPressure(){ |
mitea1 | 0:f2815503561f | 62 | |
mitea1 | 0:f2815503561f | 63 | // Data Containers |
mitea1 | 0:f2815503561f | 64 | uint8_t msbRegisterData[1]; |
mitea1 | 0:f2815503561f | 65 | uint8_t lsbRegisterData[1]; |
mitea1 | 0:f2815503561f | 66 | uint8_t xlsbRegisterData[1]; |
mitea1 | 0:f2815503561f | 67 | |
mitea1 | 0:f2815503561f | 68 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_PRESS_MSB,false,msbRegisterData,1); |
mitea1 | 0:f2815503561f | 69 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_PRESS_LSB,false,lsbRegisterData,1); |
mitea1 | 0:f2815503561f | 70 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_PRESS_XLSB,false,xlsbRegisterData, 1); |
mitea1 | 0:f2815503561f | 71 | |
mitea1 | 0:f2815503561f | 72 | int32_t temp_fine = getTemperature(); |
mitea1 | 0:f2815503561f | 73 | |
mitea1 | 0:f2815503561f | 74 | int32_t pressRaw = (int32_t) (msbRegisterData[0]<<12|lsbRegisterData[0]<<4|lsbRegisterData[0]); |
mitea1 | 0:f2815503561f | 75 | uint32_t press_fine = compensatePressure(pressRaw,temp_fine); |
mitea1 | 0:f2815503561f | 76 | |
mitea1 | 0:f2815503561f | 77 | return press_fine; |
mitea1 | 0:f2815503561f | 78 | } |
mitea1 | 0:f2815503561f | 79 | |
mitea1 | 0:f2815503561f | 80 | float BME280::getPressureFloat(){ |
mitea1 | 0:f2815503561f | 81 | return (float)getPressure()/256; |
mitea1 | 0:f2815503561f | 82 | } |
mitea1 | 0:f2815503561f | 83 | |
mitea1 | 0:f2815503561f | 84 | int32_t BME280::getTemperature(){ |
mitea1 | 0:f2815503561f | 85 | uint8_t msbRegisterData[1]; |
mitea1 | 0:f2815503561f | 86 | uint8_t lsbRegisterData[1]; |
mitea1 | 0:f2815503561f | 87 | uint8_t xlsbRegisterData[1]; |
mitea1 | 0:f2815503561f | 88 | |
mitea1 | 0:f2815503561f | 89 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_TEMP_MSB, |
mitea1 | 0:f2815503561f | 90 | false,msbRegisterData,1); |
mitea1 | 0:f2815503561f | 91 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_TEMP_LSB, |
mitea1 | 0:f2815503561f | 92 | false,lsbRegisterData,1); |
mitea1 | 0:f2815503561f | 93 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_TEMP_XLSB, |
mitea1 | 0:f2815503561f | 94 | false,xlsbRegisterData,1); |
mitea1 | 0:f2815503561f | 95 | |
mitea1 | 0:f2815503561f | 96 | int32_t tempRaw = (int32_t) (msbRegisterData[0]<<12|lsbRegisterData[0]<<4|xlsbRegisterData[0]); |
mitea1 | 0:f2815503561f | 97 | int32_t tempFine = compensateTemperature(tempRaw); |
mitea1 | 0:f2815503561f | 98 | |
mitea1 | 0:f2815503561f | 99 | return tempFine; |
mitea1 | 0:f2815503561f | 100 | } |
mitea1 | 0:f2815503561f | 101 | |
mitea1 | 0:f2815503561f | 102 | float BME280::getTemperatureFloat(){ |
mitea1 | 0:f2815503561f | 103 | int32_t temperature = this->getTemperature(); |
mitea1 | 0:f2815503561f | 104 | |
mitea1 | 0:f2815503561f | 105 | return (float)(temperature)/100; |
mitea1 | 0:f2815503561f | 106 | } |
mitea1 | 0:f2815503561f | 107 | |
mitea1 | 0:f2815503561f | 108 | void BME280::getTrimValuesHumidity(){ |
mitea1 | 0:f2815503561f | 109 | // Data Container for Trim Values Humidity |
mitea1 | 0:f2815503561f | 110 | uint8_t digH1Raw[1]; |
mitea1 | 0:f2815503561f | 111 | uint8_t digH2Raw[2]; |
mitea1 | 0:f2815503561f | 112 | uint8_t digH3Raw[1]; |
mitea1 | 0:f2815503561f | 113 | uint8_t digH4Raw[2]; |
mitea1 | 0:f2815503561f | 114 | uint8_t digH5Raw[2]; |
mitea1 | 0:f2815503561f | 115 | uint8_t digH6Raw[1]; |
mitea1 | 0:f2815503561f | 116 | |
mitea1 | 0:f2815503561f | 117 | // Get the Trim parameters for the exact calculation of the Humidity |
mitea1 | 0:f2815503561f | 118 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digH1_LSB,0,&digH1Raw[0],1); |
mitea1 | 0:f2815503561f | 119 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digH2_LSB,0,&digH2Raw[0],1); |
mitea1 | 0:f2815503561f | 120 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digH2_MSB,0,&digH2Raw[1],1); |
mitea1 | 0:f2815503561f | 121 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digH3_LSB,0,&digH3Raw[0],1); |
mitea1 | 0:f2815503561f | 122 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digH4_LSB,0,&digH4Raw[0],1); |
mitea1 | 0:f2815503561f | 123 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digH4_MSB,0,&digH4Raw[1],1); |
mitea1 | 0:f2815503561f | 124 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digH5_LSB,0,&digH5Raw[0],1); |
mitea1 | 0:f2815503561f | 125 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digH5_MSB,0,&digH5Raw[1],1); |
mitea1 | 0:f2815503561f | 126 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digH6_LSB,0,&digH6Raw[0],1); |
mitea1 | 0:f2815503561f | 127 | |
mitea1 | 0:f2815503561f | 128 | // Convert data into values |
mitea1 | 0:f2815503561f | 129 | digH1=digH1Raw[0]; |
mitea1 | 0:f2815503561f | 130 | digH2=(digH2Raw[1]<<8)|digH2Raw[0]; |
mitea1 | 0:f2815503561f | 131 | digH3=digH3Raw[0]; |
mitea1 | 0:f2815503561f | 132 | digH4=(digH4Raw[1]<<4)|(digH4Raw[0] & 0x0F); |
mitea1 | 0:f2815503561f | 133 | digH5=(4>>(digH5Raw[1] & 0xF0))|(digH5Raw[0]<<4); |
mitea1 | 0:f2815503561f | 134 | digH6=digH6Raw[0]; |
mitea1 | 0:f2815503561f | 135 | } |
mitea1 | 0:f2815503561f | 136 | |
mitea1 | 0:f2815503561f | 137 | void BME280::getTrimValuesPressure(){ |
mitea1 | 0:f2815503561f | 138 | // Data Container for Trim Values Pressure |
mitea1 | 0:f2815503561f | 139 | uint8_t digP1Raw[2]; |
mitea1 | 0:f2815503561f | 140 | uint8_t digP2Raw[2]; |
mitea1 | 0:f2815503561f | 141 | uint8_t digP3Raw[2]; |
mitea1 | 0:f2815503561f | 142 | uint8_t digP4Raw[2]; |
mitea1 | 0:f2815503561f | 143 | uint8_t digP5Raw[2]; |
mitea1 | 0:f2815503561f | 144 | uint8_t digP6Raw[2]; |
mitea1 | 0:f2815503561f | 145 | uint8_t digP7Raw[2]; |
mitea1 | 0:f2815503561f | 146 | uint8_t digP8Raw[2]; |
mitea1 | 0:f2815503561f | 147 | uint8_t digP9Raw[2]; |
mitea1 | 0:f2815503561f | 148 | |
mitea1 | 0:f2815503561f | 149 | // Get the Trim parameters for the exact calculation of the Pressure |
mitea1 | 0:f2815503561f | 150 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP1_LSB,0,&digP1Raw[0],1); |
mitea1 | 0:f2815503561f | 151 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP1_MSB,0,&digP1Raw[1],1); |
mitea1 | 0:f2815503561f | 152 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP2_LSB,0,&digP2Raw[0],1); |
mitea1 | 0:f2815503561f | 153 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP2_MSB,0,&digP2Raw[1],1); |
mitea1 | 0:f2815503561f | 154 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP3_LSB,0,&digP3Raw[0],1); |
mitea1 | 0:f2815503561f | 155 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP3_MSB,0,&digP3Raw[1],1); |
mitea1 | 0:f2815503561f | 156 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP4_LSB,0,&digP4Raw[0],1); |
mitea1 | 0:f2815503561f | 157 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP4_MSB,0,&digP4Raw[1],1); |
mitea1 | 0:f2815503561f | 158 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP5_LSB,0,&digP5Raw[0],1); |
mitea1 | 0:f2815503561f | 159 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP5_MSB,0,&digP5Raw[1],1); |
mitea1 | 0:f2815503561f | 160 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP6_LSB,0,&digP6Raw[0],1); |
mitea1 | 0:f2815503561f | 161 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP6_MSB,0,&digP6Raw[1],1); |
mitea1 | 0:f2815503561f | 162 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP7_LSB,0,&digP7Raw[0],1); |
mitea1 | 0:f2815503561f | 163 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP7_MSB,0,&digP7Raw[1],1); |
mitea1 | 0:f2815503561f | 164 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP8_LSB,0,&digP8Raw[0],1); |
mitea1 | 0:f2815503561f | 165 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP8_MSB,0,&digP8Raw[1],1); |
mitea1 | 0:f2815503561f | 166 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP9_LSB,0,&digP9Raw[0],1); |
mitea1 | 0:f2815503561f | 167 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digP9_MSB,0,&digP9Raw[1],1); |
mitea1 | 0:f2815503561f | 168 | |
mitea1 | 0:f2815503561f | 169 | // Convert data into values |
mitea1 | 0:f2815503561f | 170 | digP1=(digP1Raw[1]<<8)|digP1Raw[0]; |
mitea1 | 0:f2815503561f | 171 | digP2=(digP2Raw[1]<<8)|digP2Raw[0]; |
mitea1 | 0:f2815503561f | 172 | digP3=(digP3Raw[1]<<8)|digP3Raw[0]; |
mitea1 | 0:f2815503561f | 173 | digP4=(digP4Raw[1]<<8)|digP4Raw[0]; |
mitea1 | 0:f2815503561f | 174 | digP5=(digP5Raw[1]<<8)|digP5Raw[0]; |
mitea1 | 0:f2815503561f | 175 | digP6=(digP6Raw[1]<<8)|digP6Raw[0]; |
mitea1 | 0:f2815503561f | 176 | digP7=(digP7Raw[1]<<8)|digP7Raw[0]; |
mitea1 | 0:f2815503561f | 177 | digP8=(digP8Raw[1]<<8)|digP8Raw[0]; |
mitea1 | 0:f2815503561f | 178 | digP9=(digP9Raw[1]<<8)|digP9Raw[0]; |
mitea1 | 0:f2815503561f | 179 | } |
mitea1 | 0:f2815503561f | 180 | |
mitea1 | 0:f2815503561f | 181 | void BME280::getTrimValuesTemperature(){ |
mitea1 | 0:f2815503561f | 182 | // Data Container for Trim Values Temperature |
mitea1 | 0:f2815503561f | 183 | uint8_t digT1Raw[2]; |
mitea1 | 0:f2815503561f | 184 | uint8_t digT2Raw[2]; |
mitea1 | 0:f2815503561f | 185 | uint8_t digT3Raw[2]; |
mitea1 | 0:f2815503561f | 186 | |
mitea1 | 0:f2815503561f | 187 | // Get the Trim parameters for the exact calculation of the Temperature |
mitea1 | 0:f2815503561f | 188 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digT1_LSB,0,&digT1Raw[0],1); |
mitea1 | 0:f2815503561f | 189 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digT1_MSB,0,&digT1Raw[1],1); |
mitea1 | 0:f2815503561f | 190 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digT2_LSB,0,&digT2Raw[0],1); |
mitea1 | 0:f2815503561f | 191 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digT2_MSB,0,&digT2Raw[1],1); |
mitea1 | 0:f2815503561f | 192 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digT3_LSB,0,&digT3Raw[0],1); |
mitea1 | 0:f2815503561f | 193 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_digT3_MSB,0,&digT3Raw[1],1); |
mitea1 | 0:f2815503561f | 194 | |
mitea1 | 0:f2815503561f | 195 | // Convert data into values |
mitea1 | 0:f2815503561f | 196 | digT1=(digT1Raw[1]<<8)|digT1Raw[0]; |
mitea1 | 0:f2815503561f | 197 | digT2=(digT2Raw[1]<<8)|digT2Raw[0]; |
mitea1 | 0:f2815503561f | 198 | digT3=(digT3Raw[1]<<8)|digT3Raw[0]; |
mitea1 | 0:f2815503561f | 199 | |
mitea1 | 0:f2815503561f | 200 | } |
mitea1 | 0:f2815503561f | 201 | |
mitea1 | 0:f2815503561f | 202 | void BME280::setWeatherMonitoringMode(){ |
mitea1 | 0:f2815503561f | 203 | uint8_t configuration_1 = BME280_WHEAT_OVRS_T_P; |
mitea1 | 0:f2815503561f | 204 | uint8_t configuration_2 = BME280_WHEAT_OVRS_H; |
mitea1 | 0:f2815503561f | 205 | |
mitea1 | 0:f2815503561f | 206 | i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_HUM,false,&configuration_2,1); |
mitea1 | 0:f2815503561f | 207 | i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false,&configuration_1,1); |
mitea1 | 0:f2815503561f | 208 | |
mitea1 | 0:f2815503561f | 209 | } |
mitea1 | 0:f2815503561f | 210 | |
mitea1 | 0:f2815503561f | 211 | void BME280::setOversamplingTemperature(uint8_t oversamplingTemperature){ |
mitea1 | 0:f2815503561f | 212 | uint8_t oldRegisterValue; |
mitea1 | 0:f2815503561f | 213 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false, |
mitea1 | 0:f2815503561f | 214 | &oldRegisterValue,1); |
mitea1 | 0:f2815503561f | 215 | |
mitea1 | 0:f2815503561f | 216 | uint8_t registerValue = (oversamplingTemperature << 5) | oldRegisterValue; |
mitea1 | 0:f2815503561f | 217 | i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false, |
mitea1 | 0:f2815503561f | 218 | ®isterValue,1); |
mitea1 | 0:f2815503561f | 219 | } |
mitea1 | 0:f2815503561f | 220 | |
mitea1 | 0:f2815503561f | 221 | void BME280::setOversamplingPressure(uint8_t oversamplingPressure){ |
mitea1 | 0:f2815503561f | 222 | uint8_t oldRegisterValue; |
mitea1 | 0:f2815503561f | 223 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false, |
mitea1 | 0:f2815503561f | 224 | &oldRegisterValue,1); |
mitea1 | 0:f2815503561f | 225 | |
mitea1 | 0:f2815503561f | 226 | uint8_t registerValue = (oversamplingPressure << 2) | oldRegisterValue; |
mitea1 | 0:f2815503561f | 227 | i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false, |
mitea1 | 0:f2815503561f | 228 | ®isterValue,1); |
mitea1 | 0:f2815503561f | 229 | } |
mitea1 | 0:f2815503561f | 230 | |
mitea1 | 0:f2815503561f | 231 | void BME280::setOversamplingHumidity(uint8_t oversamplingHumdity){ |
mitea1 | 0:f2815503561f | 232 | uint8_t oldRegisterValue; |
mitea1 | 0:f2815503561f | 233 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_HUM,false, |
mitea1 | 0:f2815503561f | 234 | &oldRegisterValue,1); |
mitea1 | 0:f2815503561f | 235 | |
mitea1 | 0:f2815503561f | 236 | uint8_t newRegisterValue = oversamplingHumdity|oldRegisterValue; |
mitea1 | 0:f2815503561f | 237 | i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_HUM,false, |
mitea1 | 0:f2815503561f | 238 | &newRegisterValue,1); |
mitea1 | 0:f2815503561f | 239 | } |
mitea1 | 0:f2815503561f | 240 | |
mitea1 | 0:f2815503561f | 241 | void BME280::setMode(uint8_t mode){ |
mitea1 | 0:f2815503561f | 242 | uint8_t oldRegisterValue; |
mitea1 | 0:f2815503561f | 243 | i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false, |
mitea1 | 0:f2815503561f | 244 | &oldRegisterValue,1); |
mitea1 | 0:f2815503561f | 245 | |
mitea1 | 0:f2815503561f | 246 | uint8_t registerValue = mode | oldRegisterValue; |
mitea1 | 0:f2815503561f | 247 | i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false, |
mitea1 | 0:f2815503561f | 248 | ®isterValue,1); |
mitea1 | 0:f2815503561f | 249 | } |
mitea1 | 0:f2815503561f | 250 | |
mitea1 | 0:f2815503561f | 251 | int32_t BME280::compensateHumidity(int32_t adc_H,int32_t temp_fine) |
mitea1 | 0:f2815503561f | 252 | { |
mitea1 | 0:f2815503561f | 253 | int32_t v_x1_u32r; |
mitea1 | 0:f2815503561f | 254 | |
mitea1 | 0:f2815503561f | 255 | v_x1_u32r = temp_fine - ((int32_t)76800); |
mitea1 | 0:f2815503561f | 256 | |
mitea1 | 0:f2815503561f | 257 | v_x1_u32r = (((((adc_H << 14) - (((int32_t)digH4) << 20) - (((int32_t)digH5) * v_x1_u32r)) + |
mitea1 | 0:f2815503561f | 258 | ((int32_t)16384)) >> 15) * (((((((v_x1_u32r * ((int32_t)digH6)) >> 10) * (((v_x1_u32r * |
mitea1 | 0:f2815503561f | 259 | ((int32_t)digH3)) >> 11) + ((int32_t)32768))) >> 10) + ((int32_t)2097152)) * |
mitea1 | 0:f2815503561f | 260 | ((int32_t)digH2) + 8192) >> 14)); |
mitea1 | 0:f2815503561f | 261 | |
mitea1 | 0:f2815503561f | 262 | v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((int32_t)digH1)) >> 4)); |
mitea1 | 0:f2815503561f | 263 | v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r); |
mitea1 | 0:f2815503561f | 264 | v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r); |
mitea1 | 0:f2815503561f | 265 | |
mitea1 | 0:f2815503561f | 266 | return (int32_t)(v_x1_u32r>>12); |
mitea1 | 0:f2815503561f | 267 | } |
mitea1 | 0:f2815503561f | 268 | |
mitea1 | 0:f2815503561f | 269 | int64_t BME280::compensatePressure(int32_t adc_P, int32_t temp_fine) |
mitea1 | 0:f2815503561f | 270 | { |
mitea1 | 0:f2815503561f | 271 | int64_t var1, var2, p; |
mitea1 | 0:f2815503561f | 272 | var1 = ((int64_t)temp_fine) - 128000; |
mitea1 | 0:f2815503561f | 273 | var2 = var1 * var1 * (int64_t)digP6; |
mitea1 | 0:f2815503561f | 274 | var2 = var2 + ((var1*(int64_t)digP5)<<17); |
mitea1 | 0:f2815503561f | 275 | var2 = var2 + (((int64_t)digP4)<<35); |
mitea1 | 0:f2815503561f | 276 | var1 = ((var1 * var1 * (int64_t)digP3)>>8) + ((var1 * (int64_t)digP2)<<12); |
mitea1 | 0:f2815503561f | 277 | var1 = (((((int64_t)1)<<47)+var1))*((int64_t)digP1)>>33; |
mitea1 | 0:f2815503561f | 278 | if (var1 == 0) |
mitea1 | 0:f2815503561f | 279 | { |
mitea1 | 0:f2815503561f | 280 | return 0; // avoid exception caused by division by zero |
mitea1 | 0:f2815503561f | 281 | } |
mitea1 | 0:f2815503561f | 282 | p = ((int64_t)1048576)-adc_P; |
mitea1 | 0:f2815503561f | 283 | p = (((p<<31)-var2)*((int64_t)3125))/var1; |
mitea1 | 0:f2815503561f | 284 | var1 = (((int64_t)digP9) * (p>>13) * (p>>13)) >> 25; |
mitea1 | 0:f2815503561f | 285 | var2 = (((int64_t)digP8) * p) >> 19; |
mitea1 | 0:f2815503561f | 286 | p = ((p + var1 + var2) >> 8) + (((int64_t)digP7)<<4); |
mitea1 | 0:f2815503561f | 287 | return (int32_t)p; |
mitea1 | 0:f2815503561f | 288 | } |
mitea1 | 0:f2815503561f | 289 | |
mitea1 | 0:f2815503561f | 290 | int32_t BME280::compensateTemperature(int32_t adc_T) |
mitea1 | 0:f2815503561f | 291 | { |
mitea1 | 0:f2815503561f | 292 | int32_t var1, var2, T; |
mitea1 | 0:f2815503561f | 293 | var1 = ((((adc_T>>3) - ((int32_t)digT1<<1))) * ((int32_t)digT2)) >> 11; |
mitea1 | 0:f2815503561f | 294 | var2 = (((((adc_T>>4) - ((int32_t)digT1)) * ((adc_T>>4) - ((int32_t)digT1))) >> 12) * |
mitea1 | 0:f2815503561f | 295 | ((int32_t)digT3)) >> 14; |
mitea1 | 0:f2815503561f | 296 | int32_t t_fine = var1 + var2; |
mitea1 | 0:f2815503561f | 297 | T = (t_fine * 5 + 128) >> 8; |
mitea1 | 0:f2815503561f | 298 | return T; |
mitea1 | 0:f2815503561f | 299 | } |