这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】+使用BMP280获取温度、大气压(I2C模式)

共4条 1/1 1 跳转至

【换取手持数字示波器】+使用BMP280获取温度、大气压(I2C模式)

专家
2024-05-18 14:37:08   被打赏 40 分(兑奖)     打赏

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。


工作模式分为三种睡眠模式、触发模式和正常模式。

※睡眠模式:可以理解为不工作了

※触发模式:测一次之后传感器进入睡眠状态(目的也是为了节省资源)


内部寄存器设置

3.png


使用ESP8266接BMP280模块时,使用I2C方式通讯,BMP280的SDA接ESP8266的GPIO4(D2),BMP280的SCL接ESP8266的GPIO5(D1)。

4.png

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);
}

5.png

测试中发现,温度一直慢慢在下降,花了很长时间才保持稳定,不知道是不是器件热特性有关。海拔高度数据倒是挺稳定的。由于本次测试使用Arduino中的库函数,所以代码很简单。后面我会使用51单片制作驱动代码。



院士
2024-05-24 17:49:33     打赏
2楼

版主,您直接在STM32H503上面测试呗


专家
2024-05-25 10:31:56     打赏
3楼

在Arduino平台测试最快啊。只是为了测试是不是好用。后面挪到其他平台调试程序,就不用担心模块是坏的,只需要考虑程序上的事情即可。


工程师
2024-05-28 18:20:29     打赏
4楼

666


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]