BME280函数没有使用库,但是获取到了负数。
创始人
2024-12-23 05:00:50
0次

问题出现的根本原因是芯片返回的16位数据未被正确的转换成相应的物理量,导致结果不正确。下面是一份C/C++示例代码,可以通过以下方式解决该问题:

//读取数据
void readBME280()
{
  Wire1.beginTransmission(BME280_address);
  Wire1.write(0xF7);
  Wire1.endTransmission(false);
  Wire1.requestFrom(BME280_address, 8);

  uint8_t rawData[8];
  for (uint8_t i = 0; i < 8; i++)
  {
    rawData[i] = Wire1.read();
  }

  int32_t Digital_Pressure = (rawData[0] << 12) | (rawData[1] << 4) | (rawData[2] >> 4);
  int32_t Digital_Temperature = (rawData[3] << 12) | (rawData[4] << 4) | (rawData[5] >> 4);
  int32_t Digital_Humidity = (rawData[6] << 8) | rawData[7];

  //转换为实际的温度,压力和湿度值
  double Temperature = (double)(int32_t)(Digital_Temperature) / 4096.0;
  double Pressure = (double)(int32_t)(Digital_Pressure) / 4096.0;
  double Humidity = (double)(int32_t)(Digital_Humidity) / 1024.0;

  //输出结果
  Serial.print("Temperature: ");
  Serial.print(Temperature);
  Serial.println(" degrees C ");

  Serial.print("Pressure: ");
  Serial.print(Pressure);
  Serial.println(" Pa ");

  Serial.print("Humidity: ");
  Serial.print(Humidity);
  Serial.println(" %");
}

在代码中,将芯片返回的16位数据通过按位或运算符组合成32位变量,然后将其转换为浮点数表示的实际物理量。这样就可以避免获取到负数的问题了。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...