52 rl_log(
ERROR,
"BME280 I2C bus not initialized properly");
58 uint8_t device_address = (uint8_t)sensor_identifier;
67 rl_log(
ERROR,
"BME280 with wrong sensor ID: %d", sensor_id);
79 rl_log(
ERROR,
"BME280 setting configuraiton failed");
91 (void)sensor_identifier;
105 uint8_t device_address = (uint8_t)sensor_identifier;
115 int data_size = i2c_smbus_read_i2c_block_data(
123 int32_t preasure_raw = (((int32_t)data[0]) << 12) |
124 (((int32_t)data[1]) << 4) |
125 (((int32_t)data[2]) & 0x0f);
126 int32_t temperature_raw = (((int32_t)data[3]) << 12) |
127 (((int32_t)data[4]) << 4) |
128 (((int32_t)data[5]) & 0x0f);
129 int32_t humidity_raw = (((int32_t)data[6]) << 8) | ((int32_t)data[7]);
134 sensor_identifier, humidity_raw, temperature_raw);
136 sensor_identifier, preasure_raw, temperature_raw);
173 int read_result = i2c_smbus_read_byte_data(sensor_bus,
BME280_REG_ID);
175 if (read_result < 0) {
176 rl_log(
ERROR,
"BME280 I2C error reading ID of sensor");
196 rl_log(
ERROR,
"BME280 reading calibration block 1 failed");
201 ((uint16_t)data[1] << 8) | ((uint16_t)data[0]);
203 ((int16_t)data[3] << 8) | ((int16_t)data[2]);
205 ((int16_t)data[5] << 8) | ((int16_t)data[4]);
208 ((uint16_t)data[7] << 8) | ((uint16_t)data[6]);
210 ((int16_t)data[9] << 8) | ((int16_t)data[8]);
212 ((int16_t)data[11] << 8) | ((int16_t)data[10]);
214 ((int16_t)data[13] << 8) | ((int16_t)data[12]);
216 ((int16_t)data[15] << 8) | ((int16_t)data[14]);
218 ((int16_t)data[17] << 8) | ((int16_t)data[16]);
220 ((int16_t)data[19] << 8) | ((int16_t)data[18]);
222 ((int16_t)data[21] << 8) | ((int16_t)data[20]);
224 ((int16_t)data[23] << 8) | ((int16_t)data[22]);
233 rl_log(
ERROR,
"BME280 reading calibration block 2 failed");
238 ((int16_t)data[1] << 8) | ((int16_t)data[0]);
241 ((int16_t)data[3] << 4) | ((int16_t)data[4] & 0x0f);
243 ((int16_t)data[5] << 4) | ((int16_t)data[4] >> 4);
254 (void)sensor_identifier;
264 rl_log(
ERROR,
"BME280 setting config register failed");
272 rl_log(
ERROR,
"BME280 setting humidiy control register failed");
282 rl_log(
ERROR,
"BME280 setting measure control register failed");
295 unsigned int index = 0;
312 int32_t temperature_raw) {
315 int32_t var1, var2, temperature_fine;
316 var1 = ((((temperature_raw >> 3) -
320 var2 = (((((temperature_raw >> 4) -
322 ((temperature_raw >> 4) -
327 temperature_fine = var1 + var2;
329 return temperature_fine;
339 int32_t temperature_raw) {
340 int32_t temperature_fine =
342 int32_t temperature = (temperature_fine * 50 + 1280) >> 8;
354 int32_t temperature_raw) {
356 int64_t var1, var2, preasure;
358 int64_t temperature_fine =
360 var1 = temperature_fine - 128000;
366 var1 = (((((int64_t)1) << 47) + var1) *
372 preasure = 1048576 - preasure_raw;
373 preasure = (((preasure << 31) - var2) * 3125) / var1;
378 preasure = ((preasure + var1 + var2) >> 8) +
387 int64_t preasure_rebased = (1000 * preasure) >> 8;
388 return (uint32_t)preasure_rebased;
399 int32_t temperature_raw) {
402 int32_t temperature_fine =
405 int32_t humidity = (temperature_fine - ((int32_t)76800));
407 ((((humidity_raw << 14) -
416 ((int32_t)32768))) >>
418 ((int32_t)2097152)) *
422 humidity = (humidity - (((((humidity >> 15) * (humidity >> 15)) >> 7) *
427 }
else if (humidity > 419430400) {
428 humidity = 419430400;
436 uint32_t humidity_rebased = (((uint64_t)10000 * humidity) >> 22);
437 return humidity_rebased;
int32_t BME280_preasure[sizeof(BME280_sensors)]
#define BME280_FILTER_OFF
int BME280_read(int sensor_identifier)
int BME280_getIndex(int sensor_identifier)
#define BME280_OVERSAMPLE_PREASURE_1
int BME280_init(int sensor_identifier)
int32_t BME280_compensate_temperature(int sensor_identifier, int32_t temperature_raw)
int32_t BME280_compensate_temperature_fine(int sensor_identifier, int32_t temperature_raw)
uint32_t BME280_compensate_humidity(int sensor_identifier, int32_t humidity_raw, int32_t temperature_raw)
#define BME280_OVERSAMPLE_TEMPERATURE_1
void rl_log(rl_log_type type, const char *format,...)
int32_t BME280_temperature[sizeof(BME280_sensors)]
int Sensors_initSharedComm(uint8_t device_address)
#define BME280_OVERSAMPLE_HUMIDITY_1
#define BME280_REG_CALIBRATION_BLOCK1
#define BME280_DATA_BLOCK_SIZE
int Sensors_getSharedBus(void)
#define BME280_STANDBY_DURATION_250
#define BME280_CHANNEL_TEMPERATURE
#define BME280_REG_CONFIG
#define BME280_REG_CONTROL_MEASURE
#define BME280_I2C_ADDRESSES
#define BME280_REG_CALIBRATION_BLOCK2
#define BME280_REG_PREASURE_MSB
#define BME280_CALIBRATION_BLOCK2_SIZE
#define BME280_CALIBRATION_BLOCK1_SIZE
struct BME280_calibration_t BME280_calibration[sizeof(BME280_sensors)]
int BME280_setParameters(int sensor_identifier)
#define BME280_CHANNEL_HUMIDITY
void BME280_close(int sensor_identifier)
int32_t BME280_humidity[sizeof(BME280_sensors)]
#define BME280_MODE_NORMAL
int BME280_readCalibration(int sensor_identifier)
#define BME280_REG_CONTROL_HUMIDITY
int32_t BME280_getValue(int sensor_identifier, int channel)
const int BME280_sensors[]
uint32_t BME280_compensate_preasure(int sensor_identifier, int32_t preasure_raw, int32_t temperature_raw)
#define BME280_CHANNEL_PREASURE