BME280压力和温湿度传感器的工作原理

步骤1:bme280探索
电子行业已使用bme280传感器(具有温度,气压和湿度的环境传感器)加快了竞争步伐!该传感器非常适合各种天气/环境传感,甚至可以在i2c中使用。
此精密传感器bme280是用于测量湿度(精度为±3%),气压为±1的最佳传感解决方案。 hpa绝对精度,温度精度为±1.0°c。由于压力会随高度变化,因此压力测量值非常好,因此您也可以将其用作高度计,精度为±1米或更高!温度传感器经过优化,可实现最低噪声和高分辨率,可用于温度补偿压力传感器,也可用于估算环境温度。 bme280的测量可以由用户执行,也可以定期进行。
数据表:单击以预览或下载bme280传感器的数据表。
步骤2:硬件需求列表
我们完全使用了dcube store parts,因为它们易于使用,并且所有与厘米网格完全匹配的东西确实可以使我们前进。您可以根据需要使用任何东西,但接线图将假定您正在使用这些零件。
bme280传感器i²c微型模块
i²c粒子光子防护罩
粒子光子
i²c电缆
电源适配器
步骤3:接口连接
接口部分基本上说明了传感器与粒子光子之间所需的接线。在任何系统上为所需的输出工作时,确保正确的连接是基本必要。因此,必要的连接如下:
bme280将在i2c上运行。这是示例接线图,演示了如何连接传感器的每个接口。开箱即用,该电路板已配置为i2c接口,因此,如果您不确定,我们建议使用此接口。您只需要四根电线! vcc,gnd,scl和sda引脚仅需要四个连接,它们通过i2c电缆连接。这些连接如上图所示。
步骤4:温度,压力和湿度监控代码
我们将在此处使用干净的代码版本来运行它。
在将传感器模块与arduino结合使用时,我们包含了application.h和spark_wiring_i2c.h库。 “ application.h”和spark_wiring_i2c.h库包含促进传感器与粒子之间的i2c通信的功能。
点击此处打开用于设备监控的网页
上传代码添加到您的开发板上,它应该开始工作了!所有数据都可以在网页上获得,如图所示。
代码如下:
// distributed with a free-will license.
// use it any way you want, profit or free, provided it fits in the licenses of its associated works.
// bme280
// this code is designed to work with the bme280_i2cs i2c mini module available from controleverything.com.
#include
#include
// bme280 i2c address is 0x76(108)
#define addr 0x76
double ctemp = 0, ftemp = 0, pressure = 0, humidity = 0;
void setup()
{
// set variable
particle.variable(“i2cdevice”, “bme280”);
article.variable(“ctemp”, ctemp);
particle.variable(“ftemp”, ftemp);
particle.variable(“pressure”, pressure);
particle.variable(“humidity”, humidity);
// initialise i2c communication as master
wire.begin();
// initialise serial communication, set baud rate = 9600
serial.begin(9600);
delay(300);
}
void loop()
{
unsigned int b1[24];
unsigned int data[8];
int dig_h1 = 0;
for(int i = 0; i 《 24; i++)
{
// start i2c transmission
wire.begintransmission(addr);
// select data register
wire.write((136+i));
// stop i2c transmission
wire.endtransmission();
// request 1 byte of data
wire.requestfrom(addr, 1);
// read 24 bytes of data
if(wire.available() == 1)
{
b1[i] = wire.read();
}
}
// convert the data
// temp coefficents
int dig_t1 = (b1[0] & 0xff) + ((b1[1] & 0xff) * 256);
int dig_t2 = b1[2] + (b1[3] * 256);
int dig_t3 = b1[4] + (b1[5] * 256);
// pressure coefficents
int dig_p1 = (b1[6] & 0xff) + ((b1[7] & 0xff ) * 256);
int dig_p2 = b1[8] + (b1[9] * 256);
int dig_p3 = b1[10] + (b1[11] * 256);
int dig_p4 = b1[12] + (b1[13] * 256);
int dig_p5 = b1[14] + (b1[15] * 256);
int dig_p6 = b1[16] + (b1[17] * 256);
int dig_p7 = b1[18] + (b1[19] * 256);
int dig_p8 = b1[20] + (b1[21] * 256);
int dig_p9 = b1[22] + (b1[23] * 256);
for(int i = 0; i 《 7; i++)
{
// start i2c transmission
wire.begintransmission(addr);
// select data register
wire.write((225+i));
// stop i2c transmission
wire.endtransmission();
// request 1 byte of data
wire.requestfrom(addr, 1);
// read 7 bytes of data
if(wire.available() == 1)
{
b1[i] = wire.read();
}
}
// convert the data
// humidity coefficents
int dig_h2 = b1[0] + (b1[1] * 256);
int dig_h3 = b1[2] & 0xff ;
int dig_h4 = (b1[3] * 16) + (b1[4] & 0xf);
int dig_h5 = (b1[4] / 16) + (b1[5] * 16);
int dig_h6 = b1[6];
// start i2c transmission
wire.begintransmission(addr);
// select data register
wire.write(161);
// stop i2c transmission
wire.endtransmission();
// request 1 byte of data
wire.requestfrom(addr, 1);
// read 1 byte of data
if(wire.available() == 1)
{
dig_h1 = wire.read();
}
// start i2c transmission
wire.begintransmission(addr);
// select control humidity register
wire.write(0xf2);
// humidity over sampling rate = 1
wire.write(0x01);
// stop i2c transmission
wire.endtransmission();
// start i2c transmission
wire.begintransmission(addr);
// select control measurement register
wire.write(0xf4);
// normal mode, temp and pressure over sampling rate = 1
wire.write(0x27);
// stop i2c transmission
wire.endtransmission();
// start i2c transmission
wire.begintransmission(addr);
// select config register
wire.write(0xf5);
// stand_by time = 1000ms
wire.write(0xa0);
// stop i2c transmission
wire.endtransmission();
for(int i = 0; i 《 8; i++)
{
// start i2c transmission
wire.begintransmission(addr);
// select data register
wire.write((247+i));
// stop i2c transmission
wire.endtransmission();
// request 1 byte of data
wire.requestfrom(addr, 1);
// read 8 bytes of data
if(wire.available() == 1)
{
data[i] = wire.read();
}
}
// convert pressure and temperature data to 19-bits
long adc_p = (((long)(data[0] & 0xff) * 65536) + ((long)(data[1] & 0xff) * 256) + (long)(data[2] & 0xf0)) / 16;
long adc_t = (((long)(data[3] & 0xff) * 65536) + ((long)(data[4] & 0xff) * 256) + (long)(data[5] & 0xf0)) / 16;
// convert the humidity data long adc_h = ((long)(data[6] & 0xff) * 256 + (long)(data[7] & 0xff));
// temperature offset calculations
double var1 = (((double)adc_t) / 16384.0 - ((double)dig_t1) / 1024.0) * ((double)dig_t2);
double var2 = ((((double)adc_t) / 131072.0 - ((double)dig_t1) / 8192.0) * (((double)adc_t)/131072.0 - ((double)dig_t1)/8192.0)) * ((double)dig_t3);
double t_fine = (long)(var1 + var2);
double ctemp = (var1 + var2) / 5120.0;
double ftemp = ctemp * 1.8 + 32;
// pressure offset calculations
var1 = ((double)t_fine / 2.0) - 64000.0;
var2 = var1 * var1 * ((double)dig_p6) / 32768.0;
var2 = var2 + var1 * ((double)dig_p5) * 2.0;
var2 = (var2 / 4.0) + (((double)dig_p4) * 65536.0);
var1 = (((double) dig_p3) * var1 * var1 / 524288.0 + ((double) dig_p2) * var1) / 524288.0;
var1 = (1.0 + var1 / 32768.0) * ((double)dig_p1);
double p = 1048576.0 - (double)adc_p;
p = (p - (var2 / 4096.0)) * 6250.0 / var1;
var1 = ((double) dig_p9) * p * p / 2147483648.0;
var2 = p * ((double) dig_p8) / 32768.0;
double pressure = (p + (var1 + var2 + ((double)dig_p7)) / 16.0) / 100 ;
// humidity offset calculations
double var_h = (((double)t_fine) - 76800.0);
var_h = (adc_h - (dig_h4 * 64.0 + dig_h5 / 16384.0 * var_h)) * (dig_h2 / 65536.0 * (1.0 + dig_h6 / 67108864.0 * var_h * (1.0 + dig_h3 / 67108864.0 * var_h)));
double humidity = var_h * (1.0 - dig_h1 * var_h / 524288.0);
if(humidity 》 100.0)
{
humidity = 100.0;
}
else if(humidity 《 0.0)
{
humidity = 0.0;
}
// output data to dashboard
particle.publish(“temperature in celsius : ”, string(ctemp));
particle.publish(“temperature in fahrenheit : ”, string(ftemp));
particle.publish(“pressure : ”, string(pressure));
particle.publish(“relative humidity : ”, string(humidity));
delay(1000);
}
步骤5:应用程序:
bme280温度,压力和相对湿度传感器具有多种工业应用,例如温度监控,计算机外围热保护,工业压力监控。我们还将这种传感器应用于气象站应用程序以及温室监控系统中。
其他应用程序可能包括:
情境感知,例如皮肤检测,房间变化检测。
体能监测/健康-有关干燥或高温的警告。
测量风量和空气流量。
家庭自动化控制。
控制供暖,通风和空调(hvac)。
物联网。
gps增强功能(例如,首次定位时间的改进,航位推测,斜率检测)。
室内导航(更改楼层检测,电梯检测)。
户外导航,休闲和体育应用。
天气预报。
垂直速度指示(上升/下降速度)。

LTCC技术在SIP领域的应用
美国对英国5G计划加大施压
2023氢能源基础建设及氢燃料电池核心技术峰会即将于11月在上海嘉定召开
一份优秀电气图纸设计的三个要点
选择PCB组装制造商的一些参考点
BME280压力和温湿度传感器的工作原理
二阶RC低通滤波器设计方案
欧洲科学家团队宣布研发一种磁驱动的新型高速软体机器人
ST推出全新2-Kbit非接触式门票IC SRi2K
关于CC1310通信远距离能力测试
随着5G商用进程不断提速 无疑将是新一轮换机周期的驱动力
每日一课 | 智慧灯杆新型通信技术-5G网络技术-大规模阵列天线技术
RFID等物联网技术,赋能自行车智能化
如何用测电压法判断遥控器好坏
华为智慧服务所构建的五大核心能力是行业用户所急需的
实现推广华为鸿蒙系统,无需禁用安卓系统
数控灯光的短距离无线通信系统方案
电路中干接点和湿接点是什么原理?
山西移动携手华为推出“安全专网”
苹果13大概什么时候出