f0c43ff5d5
The BME280 is close to compatible with the existing BMP280 and extends it with support for measuring humidity, so support has been bundled into the bmp280 driver. The example now auto-detects the device and displays the humidity for the BME280. The I2C bus initialization has been moved out of the bmp280 driver to support multiple devices. The check-id and reset logic has been bundled into the driver initialization. It needs to be re-initialized after reset anyway and the chip-id is need to initialize it, just re-initialize to reset. Support has been added for multiple devices. The calibration data storage needs to be managed by the caller rather than static data. The caller can choose the I2C address to allow two BMx280 devices to be used on the same I2C bus. An interface has been added to return the measurement values in an integer fixed float format. The float format interface is still there. All the values are read in one I2C transaction to ensure they are a consistent set. Renamed bmp280_calib_t to bmp280_t, and removed read_register8.
107 lines
2.9 KiB
Markdown
107 lines
2.9 KiB
Markdown
# Driver for BMP280 and BME280 absolute barometric pressure sensors
|
|
|
|
The driver works only with BMP280 and BME280 sensors. For BMP080/BMP180 there's
|
|
a separate driver. Even though BMP280 is a successor of BMP180 they are not
|
|
compatible. They have different registers and different operation modes.
|
|
BMP280 supports two ways of communication: spi and i2c. This driver provides
|
|
only i2c communication.
|
|
The driver is written for [esp-open-rtos](https://github.com/SuperHouse/esp-open-rtos)
|
|
framework and requires [i2c driver](https://github.com/SuperHouse/esp-open-rtos/tree/master/extras/i2c)
|
|
from it.
|
|
|
|
## Features
|
|
|
|
* I2C communication.
|
|
* Forced mode (Similar to BMP180 operation).
|
|
* Normal mode. Continuous measurement.
|
|
* Soft reset.
|
|
|
|
## Usage
|
|
|
|
Connect BMP280 or BME280 module to you ESP8266 module and initialize the I2C SCL and SDA pins:
|
|
|
|
```
|
|
const uint8_t scl_pin = 0;
|
|
const uint8_t sda_pin = 2;
|
|
i2c_init(scl_pin, sda_pin);
|
|
|
|
```
|
|
|
|
Pull up SDO pin of BMP280 in order to have address 0x77 `BMP280_I2C_ADDRESS_1`.
|
|
Or pull down SDO pin for address 0x76 `BMP280_I2C_ADDRESS_0`. Otherwise your
|
|
sensor will not work.
|
|
|
|
The BMP280 or BME280 are auto-detected at initialization based on the chip ID
|
|
and this ID is stored in the device descriptor.
|
|
|
|
BMP280 supports two operation modes.
|
|
|
|
### Forced mode
|
|
|
|
In forced mode, a single measurement is performed according to selected
|
|
configuration. When the measurement is finished, the sensor returns to
|
|
sleep mode and the measurement results can be read.
|
|
|
|
### Normal mode
|
|
|
|
Normal mode continuously cycles between measurement period and standby period,
|
|
whose time is defined by standby_time.
|
|
|
|
## Example
|
|
|
|
### Forced mode
|
|
|
|
```
|
|
bmp280_params_t params;
|
|
float pressure, temperature, humidity;
|
|
|
|
bmp280_init_default_params(¶ms);
|
|
params.mode = BMP280_MODE_FORCED;
|
|
|
|
bmp280_t bmp280_dev;
|
|
bmp280_dev.i2c_addr = BMP280_I2C_ADDRESS_0;
|
|
bmp280_init(&bmp280_dev, ¶ms);
|
|
bool bme280p = bmp280_dev.id == BME280_CHIP_ID;
|
|
|
|
while(1) {
|
|
bmp280_force_measurement(&bmp280_dev));
|
|
// wait for measurement to complete
|
|
while (bmp280_is_measuring(&bmp280_dev)) {};
|
|
|
|
bmp280_read_float(&bmp280_dev, &temperature, &pressure, &humidity);
|
|
printf("Pressure: %.2f Pa, Temperature: %.2f C", pressure, temperature);
|
|
if (bme280p)
|
|
printf(", Humidity: %.2f\n", humidity);
|
|
vTaskDelay(1000 / portTICK_RATE_MS);
|
|
}
|
|
```
|
|
|
|
### Normal mode
|
|
|
|
```
|
|
bmp280_params_t params;
|
|
float pressure, temperature, humidity;
|
|
|
|
bmp280_init_default_params(¶ms);
|
|
|
|
bmp280_t bmp280_dev;
|
|
bmp280_dev.i2c_addr = BMP280_I2C_ADDRESS_0;
|
|
bmp280_init(&bmp280_dev, ¶ms);
|
|
bool bme280p = bmp280_dev.id == BME280_CHIP_ID;
|
|
|
|
while(1) {
|
|
bmp280_read_float(&bmp280_dev, &temperature, &pressure, &humidity);
|
|
printf("Pressure: %.2f Pa, Temperature: %.2f C", pressure, temperature);
|
|
if (bme280p)
|
|
printf(", Humidity: %.2f\n", humidity);
|
|
else
|
|
printf("\n");
|
|
vTaskDelay(1000 / portTICK_RATE_MS);
|
|
}
|
|
```
|
|
|
|
## License
|
|
|
|
The driver is released under MIT license.
|
|
|
|
Copyright (c) 2016 sheinz (https://github.com/sheinz)
|