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

运行结果,实际不对。。

相关推荐
信看3 分钟前
SN650-STM32F103C8t6
单片机·嵌入式硬件
xiaoxiaoxiaolll4 分钟前
《自然·通讯》:纳米TiC复合粉末如何赋予3D打印CoCrNi合金超常低温韧性?
学习
2301_797312266 分钟前
学习Java38天
学习
好奇龙猫14 分钟前
【日语学习-日语知识点小记-日本語体系構造-JLPT-N2前期阶段-第一阶段(3):单词语法】
学习
chen_mangoo21 分钟前
HDMI简介
android·linux·驱动开发·单片机·嵌入式硬件
儒雅永缘1 小时前
Solidworks练习39-拉伸、拉伸切
笔记·学习
来两个炸鸡腿1 小时前
【Datawhale组队学习202601】Base-NLP task01 注意力机制与Transformer
学习·自然语言处理·transformer
am心1 小时前
学习笔记-缓存&添加购物车
笔记·学习·缓存
Engineer邓祥浩1 小时前
设计模式学习(10) 23-8 装饰者模式
python·学习·设计模式
Errorbot2 小时前
F570四轴飞行器学习笔记
笔记·学习·无人机