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单片制作驱动代码。
我要赚赏金
