大气压计BMP280简介
BMP280是一款博世的气压传感器,主要是测量环境大气压强的,量程是300hPa~1100hPa,这个什么概念,海平面气压,即标准大气压是1013.25hPa,海拔近似0,珠穆朗玛海拔8844米,大气压大约在304hPa,和市面上大气压计差不多,每1hPa换算成垂直高度8.43米,具体海拔和气压的关系图如下:
BMP280传感器从名称上看是停产了的BMP180(End of lifetime)的升级款,对比来看,BMP280在绝对精度上提升大约2~4倍,IO口电压BMP280已覆盖了1.2V的电压,适用性会更好些。
另外看手册BME280和BMP280除了增加检测湿度的功能外,其他操作是一样的,顺便把湿度的一起加上了,做了一个根据ID判断的兼容程序。
而BMP180的驱动相对简单,和BMP085相差不多,但与BME280或BMP280不通用,旧产品。
基础环境
- 硬件是esp8266+BMP280模块,通过I2C连接并通讯, 顺便测试了下BMP180;
- 软件方面是乐鑫带的RTOSv3.2,本次使用案例工程里I2C例程修改的;
- 博世官方的BME280、BMP280、BMP180驱动程序;
由于没有BME280模块测试,只是根据datasheet添加了读取湿度逻辑,没有实际测试,理论上是OK的。
软件原理示意图
- BMP280/BME280的Forced模式逻辑:
- BMP280/BME280的Normal 模式逻辑:
- BMP180的操作流程
数据打印效果
BMP280的打印,内容有识别到的IC型号,参考温度,大气压的数值(hPa):
BME280:
未测
BMP180的数据打印,内容有识别到型号,温度,大气压数值(Pa),已知的当前检验海拔重新校验标准大气压数值,当前参考的海拔高度:
传感器配置参数
- I2C地址用的7位地址0x77,我把SDO上拉了,如果下拉或悬空会是0x76:
#define BMX280_I2C_ADDR 0x77
- 基本我放在了i2c_task_bme280_bmp280_bmp180初始化函数里面,做了一些变量,作为方便可配置.
uint8_t osrs_t = 1; //Temperature oversampling x 1
uint8_t osrs_p = 1; //Pressure oversampling x 1
uint8_t osrs_h = 1; //Humidity oversampling x 1
uint8_t mode = 0; //Sleep mode
uint8_t t_sb = 7; //Tstandby 4000ms
uint8_t filter = 0; //Filter off
uint8_t spi3w_en = 0; //3-wire SPI Disable
- BMP180的配置简单,只要改下模式就可以:
static uint8_t bmp180_mode = BMP180_OSS_1TIMES_RATE;
代码结构
代码分成3部分的文件,主文件、BMXx80驱动文件、标准I2C协议封装文件:
- main.c
- BME280_BMP280_BMP180.c
- BME280_BMP280_BMP180.h
- my_iic.h
- my_iic.c
- main.c:
/* main
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_err.h"
#include "driver/i2c.h"
#include "BME280_BMP280_BMP180.h"
void app_main(void)
{
//start i2c task
xTaskCreate(i2c_task_bme280_bmp280_bmp180, "i2c_task_bme280_bmp280_bmp180", 2048, NULL, 10, NULL);
}
- BME280_BMP280_BMP180.h:
/* BME280 BMP280 BMX180 example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_err.h"
#include "my_iic.h"
#define BMX280_I2C_ADDR 0x77
#define BMP180_CHIP_ID 0x55
#define BMP280_CHIP_ID 0x58
#define BME280_CHIP_ID 0x60
#define BMX280_RESET_VALUE 0xB6
#define BMP280_DIG_AC1_MSB_REG 0xAA
#define BMP280_DIG_T1_LSB_REG 0x88
#define BMP280_DIG_H1_LSB_REG 0xA1
#define BMP280_DIG_H2_LSB_REG 0xE1
#define BMX280_CHIPID_REG 0xD0 /*Chip ID Register */
#define BMX280_RESET_REG 0xE0 /*Softreset Register */
#define BME280_CTRLHUM_REG 0xF2 /*Ctrl Humidity Register */
#define BMX280_STATUS_REG 0xF3 /*Status Register */
#define BMX280_CTRLMEAS_REG