36 #include <i2c/smbus.h>
88 static int32_t bme280_compensate_temperature_fine(
int sensor_identifier,
89 int32_t temperature_raw);
98 static int32_t bme280_compensate_temperature(
int sensor_identifier,
99 int32_t temperature_raw);
109 static uint32_t bme280_compensate_pressure(
int sensor_identifier,
110 int32_t pressure_raw,
111 int32_t temperature_raw);
121 static uint32_t bme280_compensate_humidity(
int sensor_identifier,
122 int32_t humidity_raw,
123 int32_t temperature_raw);
149 "BME280 I2C bus not initialized properly; %d message: %s", errno,
156 uint8_t device_address = (uint8_t)sensor_identifier;
160 errno, strerror(errno));
167 sensor_id, errno, strerror(errno));
174 "BME280 reading calibration failed; %d message: %s", errno,
182 "BME280 setting configuration failed; %d message: %s", errno,
191 (void)sensor_identifier;
200 uint8_t device_address = (uint8_t)sensor_identifier;
204 errno, strerror(errno));
211 int data_size = i2c_smbus_read_i2c_block_data(
215 errno, strerror(errno));
220 int32_t pressure_raw = (((int32_t)
data[0]) << 12) |
221 (((int32_t)
data[1]) << 4) |
222 (((int32_t)
data[2]) & 0x0f);
223 int32_t temperature_raw = (((int32_t)
data[3]) << 12) |
224 (((int32_t)
data[4]) << 4) |
225 (((int32_t)
data[5]) & 0x0f);
226 int32_t humidity_raw = (((int32_t)
data[6]) << 8) | ((int32_t)
data[7]);
229 bme280_compensate_temperature(sensor_identifier, temperature_raw);
231 sensor_identifier, humidity_raw, temperature_raw);
233 sensor_identifier, pressure_raw, temperature_raw);
261 if (read_result < 0) {
263 "BME280 I2C error reading ID of sensor; %d message: %s", errno,
280 "BME280 reading calibration block 1 failed; %d message: %s",
281 errno, strerror(errno));
286 ((uint16_t)
data[1] << 8) | ((uint16_t)
data[0]);
288 ((int16_t)
data[3] << 8) | ((int16_t)
data[2]);
290 ((int16_t)
data[5] << 8) | ((int16_t)
data[4]);
293 ((uint16_t)
data[7] << 8) | ((uint16_t)
data[6]);
295 ((int16_t)
data[9] << 8) | ((int16_t)
data[8]);
297 ((int16_t)
data[11] << 8) | ((int16_t)
data[10]);
299 ((int16_t)
data[13] << 8) | ((int16_t)
data[12]);
301 ((int16_t)
data[15] << 8) | ((int16_t)
data[14]);
303 ((int16_t)
data[17] << 8) | ((int16_t)
data[16]);
305 ((int16_t)
data[19] << 8) | ((int16_t)
data[18]);
307 ((int16_t)
data[21] << 8) | ((int16_t)
data[20]);
309 ((int16_t)
data[23] << 8) | ((int16_t)
data[22]);
319 "BME280 reading calibration block 2 failed; %d message: %s",
320 errno, strerror(errno));
325 ((int16_t)
data[1] << 8) | ((int16_t)
data[0]);
328 ((int16_t)
data[3] << 4) | ((int16_t)
data[4] & 0x0f);
330 ((int16_t)
data[5] << 4) | ((int16_t)
data[4] >> 4);
337 (void)sensor_identifier;
348 "BME280 setting config register failed; %d message: %s", errno,
359 "BME280 setting humidity control register failed; %d message: %s",
360 errno, strerror(errno));
371 "BME280 setting measure control register failed; %d message: %s",
372 errno, strerror(errno));
380 unsigned int index = 0;
390 static int32_t bme280_compensate_temperature_fine(
int sensor_identifier,
391 int32_t temperature_raw) {
394 int32_t var1, var2, temperature_fine;
395 var1 = ((((temperature_raw >> 3) -
399 var2 = (((((temperature_raw >> 4) -
401 ((temperature_raw >> 4) -
406 temperature_fine = var1 + var2;
408 return temperature_fine;
411 static int32_t bme280_compensate_temperature(
int sensor_identifier,
412 int32_t temperature_raw) {
413 int32_t temperature_fine =
414 bme280_compensate_temperature_fine(sensor_identifier, temperature_raw);
415 int32_t temperature = (temperature_fine * 50 + 1280) >> 8;
419 static uint32_t bme280_compensate_pressure(
int sensor_identifier,
420 int32_t pressure_raw,
421 int32_t temperature_raw) {
423 int64_t var1, var2, pressure;
425 int64_t temperature_fine =
426 bme280_compensate_temperature_fine(sensor_identifier, temperature_raw);
427 var1 = temperature_fine - 128000;
433 var1 = (((((int64_t)1) << 47) + var1) *
439 pressure = 1048576 - pressure_raw;
440 pressure = (((pressure << 31) - var2) * 3125) / var1;
445 pressure = ((pressure + var1 + var2) >> 8) +
454 int64_t pressure_rescaled = (1000 * pressure) >> 8;
455 return (uint32_t)pressure_rescaled;
458 static uint32_t bme280_compensate_humidity(
int sensor_identifier,
459 int32_t humidity_raw,
460 int32_t temperature_raw) {
463 int32_t temperature_fine =
464 bme280_compensate_temperature_fine(sensor_identifier, temperature_raw);
466 int32_t humidity = (temperature_fine - ((int32_t)76800));
468 ((((humidity_raw << 14) -
477 ((int32_t)32768))) >>
479 ((int32_t)2097152)) *
483 humidity = (humidity - (((((humidity >> 15) * (humidity >> 15)) >> 7) *
488 }
else if (humidity > 419430400) {
489 humidity = 419430400;
497 uint32_t humidity_rescaled = (((uint64_t)10000 * humidity) >> 22);
498 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)