87static int32_t bme280_compensate_temperature_fine(
int sensor_identifier,
88 int32_t temperature_raw);
97static int32_t bme280_compensate_temperature(
int sensor_identifier,
98 int32_t temperature_raw);
108static uint32_t bme280_compensate_pressure(
int sensor_identifier,
109 int32_t pressure_raw,
110 int32_t temperature_raw);
120static uint32_t bme280_compensate_humidity(
int sensor_identifier,
121 int32_t humidity_raw,
122 int32_t temperature_raw);
148 "BME280 I2C bus not initialized properly; %d message: %s", errno,
155 uint8_t device_address = (uint8_t)sensor_identifier;
159 errno, strerror(errno));
166 sensor_id, errno, strerror(errno));
173 "BME280 reading calibration failed; %d message: %s", errno,
181 "BME280 setting configuration failed; %d message: %s", errno,
190 (void)sensor_identifier;
199 uint8_t device_address = (uint8_t)sensor_identifier;
203 errno, strerror(errno));
210 int data_size = i2c_smbus_read_i2c_block_data(
214 errno, strerror(errno));
219 int32_t pressure_raw = (((int32_t)
data[0]) << 12) |
220 (((int32_t)
data[1]) << 4) |
221 (((int32_t)
data[2]) & 0x0f);
222 int32_t temperature_raw = (((int32_t)
data[3]) << 12) |
223 (((int32_t)
data[4]) << 4) |
224 (((int32_t)
data[5]) & 0x0f);
225 int32_t humidity_raw = (((int32_t)
data[6]) << 8) | ((int32_t)
data[7]);
228 bme280_compensate_temperature(sensor_identifier, temperature_raw);
230 sensor_identifier, humidity_raw, temperature_raw);
232 sensor_identifier, pressure_raw, temperature_raw);
260 if (read_result < 0) {
262 "BME280 I2C error reading ID of sensor; %d message: %s", errno,
279 "BME280 reading calibration block 1 failed; %d message: %s",
280 errno, strerror(errno));
285 ((uint16_t)
data[1] << 8) | ((uint16_t)
data[0]);
287 ((int16_t)
data[3] << 8) | ((int16_t)
data[2]);
289 ((int16_t)
data[5] << 8) | ((int16_t)
data[4]);
292 ((uint16_t)
data[7] << 8) | ((uint16_t)
data[6]);
294 ((int16_t)
data[9] << 8) | ((int16_t)
data[8]);
296 ((int16_t)
data[11] << 8) | ((int16_t)
data[10]);
298 ((int16_t)
data[13] << 8) | ((int16_t)
data[12]);
300 ((int16_t)
data[15] << 8) | ((int16_t)
data[14]);
302 ((int16_t)
data[17] << 8) | ((int16_t)
data[16]);
304 ((int16_t)
data[19] << 8) | ((int16_t)
data[18]);
306 ((int16_t)
data[21] << 8) | ((int16_t)
data[20]);
308 ((int16_t)
data[23] << 8) | ((int16_t)
data[22]);
318 "BME280 reading calibration block 2 failed; %d message: %s",
319 errno, strerror(errno));
324 ((int16_t)
data[1] << 8) | ((int16_t)
data[0]);
327 ((int16_t)
data[3] << 4) | ((int16_t)
data[4] & 0x0f);
329 ((int16_t)
data[5] << 4) | ((int16_t)
data[4] >> 4);
336 (void)sensor_identifier;
347 "BME280 setting config register failed; %d message: %s", errno,
358 "BME280 setting humidity control register failed; %d message: %s",
359 errno, strerror(errno));
370 "BME280 setting measure control register failed; %d message: %s",
371 errno, strerror(errno));
379 unsigned int index = 0;
389static int32_t bme280_compensate_temperature_fine(
int sensor_identifier,
390 int32_t temperature_raw) {
393 int32_t var1, var2, temperature_fine;
394 var1 = ((((temperature_raw >> 3) -
398 var2 = (((((temperature_raw >> 4) -
400 ((temperature_raw >> 4) -
405 temperature_fine = var1 + var2;
407 return temperature_fine;
410static int32_t bme280_compensate_temperature(
int sensor_identifier,
411 int32_t temperature_raw) {
412 int32_t temperature_fine =
413 bme280_compensate_temperature_fine(sensor_identifier, temperature_raw);
414 int32_t temperature = (temperature_fine * 50 + 1280) >> 8;
418static uint32_t bme280_compensate_pressure(
int sensor_identifier,
419 int32_t pressure_raw,
420 int32_t temperature_raw) {
422 int64_t var1, var2, pressure;
424 int64_t temperature_fine =
425 bme280_compensate_temperature_fine(sensor_identifier, temperature_raw);
426 var1 = temperature_fine - 128000;
432 var1 = (((((int64_t)1) << 47) + var1) *
438 pressure = 1048576 - pressure_raw;
439 pressure = (((pressure << 31) - var2) * 3125) / var1;
444 pressure = ((pressure + var1 + var2) >> 8) +
453 int64_t pressure_rescaled = (1000 * pressure) >> 8;
454 return (uint32_t)pressure_rescaled;
457static uint32_t bme280_compensate_humidity(
int sensor_identifier,
458 int32_t humidity_raw,
459 int32_t temperature_raw) {
462 int32_t temperature_fine =
463 bme280_compensate_temperature_fine(sensor_identifier, temperature_raw);
465 int32_t humidity = (temperature_fine - ((int32_t)76800));
467 ((((humidity_raw << 14) -
476 ((int32_t)32768))) >>
478 ((int32_t)2097152)) *
482 humidity = (humidity - (((((humidity >> 15) * (humidity >> 15)) >> 7) *
487 }
else if (humidity > 419430400) {
488 humidity = 419430400;
496 uint32_t humidity_rescaled = (((uint64_t)10000 * humidity) >> 22);
497 return humidity_rescaled;
int32_t bme280_humidity[sizeof(bme280_sensors)]
const int bme280_sensors[]
int bme280_init(int sensor_identifier)
int32_t bme280_get_value(int sensor_identifier, int channel)
int32_t bme280_temperature[sizeof(bme280_sensors)]
int bme280_get_index(int sensor_identifier)
int32_t bme280_pressure[sizeof(bme280_sensors)]
int bme280_read_calibration(int sensor_identifier)
int bme280_read(int sensor_identifier)
int bme280_set_parameters(int sensor_identifier)
void bme280_deinit(int sensor_identifier)
#define BME280_REG_CONTROL_MEASURE
#define BME280_CALIBRATION_BLOCK1_SIZE
#define BME280_OVERSAMPLE_PRESSURE_1
#define BME280_REG_CALIBRATION_BLOCK1
#define BME280_CHANNEL_TEMPERATURE
#define BME280_STANDBY_DURATION_250
#define BME280_OVERSAMPLE_HUMIDITY_1
#define BME280_DATA_BLOCK_SIZE
#define BME280_REG_CONFIG
#define BME280_CHANNEL_PRESSURE
#define BME280_REG_CALIBRATION_BLOCK2
#define BME280_MODE_NORMAL
#define BME280_REG_CONTROL_HUMIDITY
#define BME280_REG_PRESSURE_MSB
#define BME280_I2C_ADDRESSES
#define BME280_CALIBRATION_BLOCK2_SIZE
#define BME280_FILTER_OFF
#define BME280_OVERSAMPLE_TEMPERATURE_1
#define BME280_CHANNEL_HUMIDITY
rl_calibration_t data
The actual calibration data.
int rl_log(rl_log_level_t log_level, char const *const format,...)
int sensor_bus
I2C sensor bus identifier for communication.
int sensors_get_bus(void)
int sensors_init_comm(uint8_t device_address)