BMP280是一款压力传感器,精度高,体积小。绝对精度可以达到0.2hPa,耗电低,只有2.7μA。它的压力范围是300~1100hPa,对应于海拔9000米~500米,工作电压为1.7V~3.6V,可使用I2C、SPI总线通讯。
SCL:I2C/SPI串行时钟线
SDA:I2C的串行数据线
3线SPI串行数据的输入输出端口
4线SPI的串行数据输入端口
CSB:片选引脚。高电平(默认)时,使用I2C通讯接口;低电平时,使用SPI通讯接口
SDO:I2C地址选择位。
4线SPI串行输出端口。
在使用I2C方式下,通过SDO引脚确定器件地址。SDO=0时,从机地址为0x76。SDO=1时,从机地址为0x77。
工作模式分为三种睡眠模式、触发模式和正常模式。
※睡眠模式:可以理解为不工作了
※触发模式:测一次之后传感器进入睡眠状态(目的也是为了节省资源)
内部寄存器设置
使用ESP8266接BMP280模块时,使用I2C方式通讯,BMP280的SDA接ESP8266的GPIO4(D2),BMP280的SCL接ESP8266的GPIO5(D1)。
Arduino的程序代码如下:
#include "DFRobot_BMP280.h" #include "Wire.h" typedef DFRobot_BMP280_IIC BMP; BMP bmp(&Wire, BMP::eSdoLow); // 海平面压力值 #define SEA_LEVEL_PRESSURE 1015.0f // show last sensor operate status void printLastOperateStatus(BMP::eStatus_t eStatus) { switch(eStatus) { case BMP::eStatusOK: Serial.println("everything ok"); break; case BMP::eStatusErr: Serial.println("unknow error"); break; case BMP::eStatusErrDeviceNotDetected: Serial.println("device not detected"); break; case BMP::eStatusErrParameter: Serial.println("parameter error"); break; default: Serial.println("unknow status"); break; } } void setup() { // 初始化串口波特率 Serial.begin(115200); // 初始化BMP280 bmp.reset(); Serial.println("Start test ..."); while(bmp.begin() != BMP::eStatusOK) { Serial.println("bmp faild"); printLastOperateStatus(bmp.lastOperateStatus); delay(2000); } Serial.println("bmp is ok !"); delay(100); } void loop() { // 获取温度 float temp = bmp.getTemperature(); // 获取压力 uint32_t press = bmp.getPressure(); // 计算海平面高度 float alti = bmp.calAltitude(SEA_LEVEL_PRESSURE, press); // 输出结果 Serial.println(); Serial.println("======== start print ========"); Serial.print("temperature (unit Celsius): "); Serial.println(temp); Serial.print("pressure (unit pa): "); Serial.println(press); Serial.print("altitude (unit meter): "); Serial.println(alti); Serial.println("======== end print ========"); delay(1000); }
测试中发现,温度一直慢慢在下降,花了很长时间才保持稳定,不知道是不是器件热特性有关。海拔高度数据倒是挺稳定的。由于本次测试使用Arduino中的库函数,所以代码很简单。后面我会使用51单片制作驱动代码。