You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.0 KiB
109 lines
3.0 KiB
2 years ago
|
# 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 bus = 0;
|
||
|
const uint8_t scl_pin = 0;
|
||
|
const uint8_t sda_pin = 2;
|
||
|
i2c_init(bus, scl_pin, sda_pin, I2C_FREQ_100K);
|
||
|
|
||
|
```
|
||
|
|
||
|
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_PERIOD_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_PERIOD_MS);
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## License
|
||
|
|
||
|
The driver is released under MIT license.
|
||
|
|
||
|
Copyright (c) 2016 sheinz (https://github.com/sheinz)
|