A multifunctional and modular Firmware for Multitech's mDot based on ARM mBed provides a widerange of functionality for several Sensors such as MAX44009, BME280, MPU9250, SI1143 and uBlox. It allows you to quickly build a Sensornode that measures specific data with its sensors and sends it via LoRaWAN.

Dependencies:   mDot_LoRa_Sensornode_Flowmeter_impl mbed-rtos mbed

LoRa-Sensornode Firmware for Multitech mDot

A multifunctional and modular Firmware for Multitech's mDot which provides a widerange of functionality for several Sensors. It allows you to quickly build a Sensornode that measures specific data with its sensors and sends it via LoRaWAN.

/media/uploads/mitea1/logo-lora-600x370.png /media/uploads/mitea1/mt_mdot_family_642px.png

Supported Sensors

Idea

The Firmware has some predefined Application Modes running different Tasks(Measurements). Each mode can be used in a different Scenario. Application_Modes define which sensors are used, how often they aquire data and how often the data has to be sent via LoRa. Lets say you just want to measure the Light then you choose an Application_Mode (or define one) that only runs TaskLight for light measurement. As a standard all measurements are taken every second and sent via LoRa but you can change that interval depending on your usage Scenario

Committer:
mitea1
Date:
Fri Nov 02 17:01:02 2018 +0000
Revision:
10:4051c38bf73f
Parent:
7:87cbeafdba06
wtf

Who changed what in which revision?

UserRevisionLine numberNew 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 7:87cbeafdba06 23 setOversamplingHumidity();
mitea1 7:87cbeafdba06 24 setOversamplingTemperature();
mitea1 7:87cbeafdba06 25 setOversamplingPressure();
mitea1 7:87cbeafdba06 26 setMode();
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 7:87cbeafdba06 211 void BME280::setOversamplingTemperature(){
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 7:87cbeafdba06 216 uint8_t oversamplingTemperature = config->getOversamplingTemperature();
mitea1 0:f2815503561f 217 uint8_t registerValue = (oversamplingTemperature << 5) | oldRegisterValue;
mitea1 0:f2815503561f 218 i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false,
mitea1 0:f2815503561f 219 &registerValue,1);
mitea1 0:f2815503561f 220 }
mitea1 0:f2815503561f 221
mitea1 7:87cbeafdba06 222 void BME280::setOversamplingPressure(){
mitea1 0:f2815503561f 223 uint8_t oldRegisterValue;
mitea1 0:f2815503561f 224 i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false,
mitea1 0:f2815503561f 225 &oldRegisterValue,1);
mitea1 0:f2815503561f 226
mitea1 7:87cbeafdba06 227 uint8_t oversamplingPressure = config->getOversamplingPressure();
mitea1 0:f2815503561f 228 uint8_t registerValue = (oversamplingPressure << 2) | oldRegisterValue;
mitea1 0:f2815503561f 229 i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false,
mitea1 0:f2815503561f 230 &registerValue,1);
mitea1 0:f2815503561f 231 }
mitea1 0:f2815503561f 232
mitea1 7:87cbeafdba06 233 void BME280::setOversamplingHumidity(){
mitea1 0:f2815503561f 234 uint8_t oldRegisterValue;
mitea1 0:f2815503561f 235 i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_HUM,false,
mitea1 0:f2815503561f 236 &oldRegisterValue,1);
mitea1 0:f2815503561f 237
mitea1 7:87cbeafdba06 238 uint8_t oversamplingHumidity = config->getOversamplingHumidity();
mitea1 7:87cbeafdba06 239 uint8_t newRegisterValue = oversamplingHumidity|oldRegisterValue;
mitea1 0:f2815503561f 240 i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_HUM,false,
mitea1 0:f2815503561f 241 &newRegisterValue,1);
mitea1 0:f2815503561f 242 }
mitea1 0:f2815503561f 243
mitea1 7:87cbeafdba06 244 void BME280::setMode(){
mitea1 0:f2815503561f 245 uint8_t oldRegisterValue;
mitea1 0:f2815503561f 246 i2c->read_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false,
mitea1 0:f2815503561f 247 &oldRegisterValue,1);
mitea1 0:f2815503561f 248
mitea1 7:87cbeafdba06 249 uint8_t mode = config->getMode();
mitea1 0:f2815503561f 250 uint8_t registerValue = mode | oldRegisterValue;
mitea1 0:f2815503561f 251 i2c->write_RT(BME280_SENSOR_ADDRESS,BME280_SENSOR_CTRL_MEAS,false,
mitea1 0:f2815503561f 252 &registerValue,1);
mitea1 0:f2815503561f 253 }
mitea1 0:f2815503561f 254
mitea1 0:f2815503561f 255 int32_t BME280::compensateHumidity(int32_t adc_H,int32_t temp_fine)
mitea1 0:f2815503561f 256 {
mitea1 0:f2815503561f 257 int32_t v_x1_u32r;
mitea1 0:f2815503561f 258
mitea1 0:f2815503561f 259 v_x1_u32r = temp_fine - ((int32_t)76800);
mitea1 0:f2815503561f 260
mitea1 0:f2815503561f 261 v_x1_u32r = (((((adc_H << 14) - (((int32_t)digH4) << 20) - (((int32_t)digH5) * v_x1_u32r)) +
mitea1 0:f2815503561f 262 ((int32_t)16384)) >> 15) * (((((((v_x1_u32r * ((int32_t)digH6)) >> 10) * (((v_x1_u32r *
mitea1 0:f2815503561f 263 ((int32_t)digH3)) >> 11) + ((int32_t)32768))) >> 10) + ((int32_t)2097152)) *
mitea1 0:f2815503561f 264 ((int32_t)digH2) + 8192) >> 14));
mitea1 0:f2815503561f 265
mitea1 0:f2815503561f 266 v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((int32_t)digH1)) >> 4));
mitea1 0:f2815503561f 267 v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r);
mitea1 0:f2815503561f 268 v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);
mitea1 0:f2815503561f 269
mitea1 0:f2815503561f 270 return (int32_t)(v_x1_u32r>>12);
mitea1 0:f2815503561f 271 }
mitea1 0:f2815503561f 272
mitea1 0:f2815503561f 273 int64_t BME280::compensatePressure(int32_t adc_P, int32_t temp_fine)
mitea1 0:f2815503561f 274 {
mitea1 0:f2815503561f 275 int64_t var1, var2, p;
mitea1 0:f2815503561f 276 var1 = ((int64_t)temp_fine) - 128000;
mitea1 0:f2815503561f 277 var2 = var1 * var1 * (int64_t)digP6;
mitea1 0:f2815503561f 278 var2 = var2 + ((var1*(int64_t)digP5)<<17);
mitea1 0:f2815503561f 279 var2 = var2 + (((int64_t)digP4)<<35);
mitea1 0:f2815503561f 280 var1 = ((var1 * var1 * (int64_t)digP3)>>8) + ((var1 * (int64_t)digP2)<<12);
mitea1 0:f2815503561f 281 var1 = (((((int64_t)1)<<47)+var1))*((int64_t)digP1)>>33;
mitea1 0:f2815503561f 282 if (var1 == 0)
mitea1 0:f2815503561f 283 {
mitea1 0:f2815503561f 284 return 0; // avoid exception caused by division by zero
mitea1 0:f2815503561f 285 }
mitea1 0:f2815503561f 286 p = ((int64_t)1048576)-adc_P;
mitea1 0:f2815503561f 287 p = (((p<<31)-var2)*((int64_t)3125))/var1;
mitea1 0:f2815503561f 288 var1 = (((int64_t)digP9) * (p>>13) * (p>>13)) >> 25;
mitea1 0:f2815503561f 289 var2 = (((int64_t)digP8) * p) >> 19;
mitea1 0:f2815503561f 290 p = ((p + var1 + var2) >> 8) + (((int64_t)digP7)<<4);
mitea1 0:f2815503561f 291 return (int32_t)p;
mitea1 0:f2815503561f 292 }
mitea1 0:f2815503561f 293
mitea1 0:f2815503561f 294 int32_t BME280::compensateTemperature(int32_t adc_T)
mitea1 0:f2815503561f 295 {
mitea1 0:f2815503561f 296 int32_t var1, var2, T;
mitea1 0:f2815503561f 297 var1 = ((((adc_T>>3) - ((int32_t)digT1<<1))) * ((int32_t)digT2)) >> 11;
mitea1 0:f2815503561f 298 var2 = (((((adc_T>>4) - ((int32_t)digT1)) * ((adc_T>>4) - ((int32_t)digT1))) >> 12) *
mitea1 0:f2815503561f 299 ((int32_t)digT3)) >> 14;
mitea1 0:f2815503561f 300 int32_t t_fine = var1 + var2;
mitea1 0:f2815503561f 301 T = (t_fine * 5 + 128) >> 8;
mitea1 0:f2815503561f 302 return T;
mitea1 0:f2815503561f 303 }