BMP280学习

1.Forced mode模式,单次采集后进入休眠,适用于低采样率。

2.normal mode模式,持续采集,我们使用这种

采集事件基本都是ms级,所以我们1s更新一次。

温度和压力的计算

复制代码
#include <SPI.h>
//定义数据类型
#define s32_t long signed int
#define u32_t long unsigned int
#define u16_t unsigned short
#define s16_t signed short
// 定义从设备选择引脚
const int chipSelectPin = 10;
//=============定义BMP280寄存器===========///
unsigned int  temp_xlsb;  
unsigned int  temp_lsb;
unsigned int  temp_msb;
unsigned int  press_xlsb;
unsigned int  press_lsb;
unsigned int  press_msb;
u16_t dig_t1_lsb;
u16_t dig_t1_msb;
s16_t dig_t2_lsb;
s16_t dig_t2_msb;
s16_t dig_t3_lsb;
s16_t dig_t3_msb;
u32_t dig_t1;
s32_t dig_t2;
s32_t dig_t3;
s32_t temp;
s32_t temp_comp;
u16_t bmp_status;
byte  addr_temp_xlsb = 0xFC;  
byte  addr_temp_lsb = 0xFB;
byte  addr_temp_msb = 0xFA;
byte  addr_press_xlsb = 0xF9;
byte  addr_press_lsb = 0xF8;
byte  addr_press_msb = 0xF7;
byte  addr_dig_t1_lsb = 0x88;
byte  addr_dig_t1_msb = 0x89;
byte  addr_dig_t2_lsb = 0x8A;
byte  addr_dig_t2_msb = 0x8B;
byte  addr_dig_t3_lsb = 0x8C;
byte  addr_dig_t3_msb = 0x8D;
byte  addr_ctrl = 0xF4;
byte  addr_status = 0xF3;

s32_t t_fine;
void setup() {
  // 初始化串口通信
  Serial.begin(9600);

  // 配置从设备选择引脚
  pinMode(chipSelectPin, OUTPUT);

  // 初始化 SPI
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV8);  // 设置时钟分频,可根据需要调整
  //===============获得BMP280参数==================//
  dig_t1_lsb = readRegister(addr_dig_t1_lsb,2);
  dig_t1_msb = readRegister(addr_dig_t1_msb,2);
  dig_t2_lsb = readRegister(addr_dig_t2_lsb,2);
  dig_t2_msb = readRegister(addr_dig_t2_msb,2);
  dig_t3_lsb = readRegister(addr_dig_t3_lsb,2);
  dig_t3_msb = readRegister(addr_dig_t3_msb,2);
  bmp_status = readRegister(addr_status,1);
  dig_t1 = ((u32_t)dig_t1_msb << 8) | dig_t1_lsb;
  dig_t2 = ((s32_t)dig_t2_msb << 8) | dig_t2_lsb;
  dig_t3 = ((s32_t)dig_t3_msb << 8) | dig_t3_lsb;
 //===============设置BMP280为连续模式==================//
  byte ctrl_status = readRegister(addr_ctrl,1);
  Serial.print("ctrl_status = ");
  Serial.print(ctrl_status, HEX);  
  Serial.print("\n");  
  writeRegister(addr_ctrl,1);
  
  ctrl_status = readRegister(addr_ctrl,1);
  Serial.print("ctrl_status = ");
  Serial.print(ctrl_status, HEX);  
  Serial.print("\n");  
 //===============打印BMP280校准参数==================//
  Serial.print("dig_t1 = ");
  Serial.print(dig_t1, HEX);
  Serial.print("\n");
  Serial.print("dig_t2 = ");
  Serial.print(dig_t2, HEX);
  Serial.print("\n");
  Serial.print("dig_t3 = ");
  Serial.print(dig_t3, HEX);  
  Serial.print("\n");  
  Serial.print("bmp_status = ");
  Serial.print(bmp_status, HEX);  
  Serial.print("\n");  
}

void loop() {
//===============获得全部数据==================//
  temp_xlsb = readRegister(addr_temp_xlsb,1);
  temp_lsb = readRegister(addr_temp_lsb,1);
  temp_msb = readRegister(addr_temp_msb,1);
  press_xlsb = readRegister(addr_press_xlsb,1);
  press_lsb = readRegister(addr_press_lsb,1);
  press_msb = readRegister(addr_press_msb,1);
  Serial.println(addr_temp_xlsb, DEC);
  Serial.println(addr_temp_lsb, DEC);
  Serial.println(addr_temp_msb, DEC);
//================计算温度值==================//  
  temp = (u32_t)temp_msb << 12 || (u32_t)temp_lsb << 4 || (u32_t)temp_xlsb >> 4;
  temp_comp = bmp280_compensate(temp);
//================串口打印温度值==================//  
  Serial.print("Composate Temprature is: ");
  Serial.println(temp_comp, DEC);
  Serial.print("\n");

  // 延时等待
  delay(2000);
}
unsigned int readRegister(byte thisRegister, int bytesToRead) {
  byte inByte = 0;           // incoming byte from the SPI
  unsigned int result = 0;   // result to return
  byte dataToSend = thisRegister;

  digitalWrite(chipSelectPin, LOW);
  // send the device the register you want to read:
  SPI.transfer(dataToSend);
  // send a value of 0 to read the first byte returned:
  result = SPI.transfer(0x00);
  // decrement the number of bytes left to read:
  bytesToRead--;
  // if you still have another byte to read:
  if (bytesToRead > 0) {
    // shift the first byte left, then get the second byte:
    result = result << 8;
    inByte = SPI.transfer(0x00);
    // combine the byte you just got with the previous one:
    result = result | inByte;
    // decrement the number of bytes left to read:
    bytesToRead--;
  }
  // take the chip select high to de-select:
  digitalWrite(chipSelectPin, HIGH);
  // return the result:
  return (result);
}
void writeRegister(byte thisRegister, byte thisValue) {
  
  byte dataToSend = thisRegister;

  // take the chip select low to select the device:
  digitalWrite(chipSelectPin, LOW);

  SPI.transfer(dataToSend); //Send register location
  SPI.transfer(thisValue);  //Send value to record into register
  // take the chip select high to de-select:
  digitalWrite(chipSelectPin, HIGH);
}

s32_t bmp280_compensate(s32_t adc_t)
{
  s32_t var1,var2,t;
  var1 = ((((adc_t>>3) - ((s32_t)dig_t1<<1))) * ((s32_t)dig_t2)) >>11;
  var2 = (((((adc_t>>4) - ((s32_t)dig_t1)) * ((adc_t>>4) - ((s32_t)dig_t1)))>>12) * ((s32_t)dig_t3)) >>14;
  t_fine = var1 + var2;
  t = (t_fine *5 +128) >>8;
  return t;
}

运行结果,实际不对。。

相关推荐
●VON23 分钟前
CANN推理引擎:从云端到边缘的极致加速与部署实战
学习·react native
笔画人生27 分钟前
深度解析 CANN 项目:以 `ops-transformer` 为例探索高性能 AI 算子库
学习·开源
AI视觉网奇1 小时前
3d数字人 ue blender 绑定衣服对齐 2026
学习·ue5
Nan_Shu_6141 小时前
学习: Blender 基础篇
学习·blender
Hello_Embed1 小时前
libmodbus 移植 STM32(USB 串口后端篇)
笔记·stm32·单片机·嵌入式·freertos·libmodbus
奶茶精Gaaa2 小时前
工具分享--json在线转换工具
学习
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][I2C]I2C
linux·笔记·学习
盐焗西兰花2 小时前
鸿蒙学习实战之路-Reader Kit自定义字体最佳实践
学习·华为·harmonyos
近津薪荼3 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
来自晴朗的明天3 小时前
14、光耦隔离电路(EL3H7)
单片机·嵌入式硬件·硬件工程