0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:wv 2019-10-25 10:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

步骤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增强功能(例如,首次定位时间的改进,航位推测,斜率检测)。

室内导航(更改楼层检测,电梯检测)。

户外导航,休闲和体育应用。

天气预报。

垂直速度指示(上升/下降速度)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2577

    文章

    55499

    浏览量

    793897
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    HDC2010:低功耗温湿度数字传感器的卓越之选

    HDC2010:低功耗温湿度数字传感器的卓越之选 在电子设备的设计中,温湿度传感器是不可或缺的一部分,它广泛应用于各种环境监测和控制场景。今天,我们就来深入了解一下德州仪器(TI)的
    的头像 发表于 02-12 11:25 481次阅读

    HDC2080数字传感器:高精度、低功耗的温湿度监测解决方案

    HDC2080数字传感器:高精度、低功耗的温湿度监测解决方案 在电子设计领域,温湿度监测是许多应用场景中的关键需求。无论是智能家居、工业控制还是气象监测,都需要可靠、精确的温湿度
    的头像 发表于 02-12 09:40 476次阅读

    HDC2021高精度温湿度传感器:特性、应用与设计要点

    HDC2021高精度温湿度传感器:特性、应用与设计要点 引言 在电子设备的设计中,温湿度传感器扮演着至关重要的角色。HDC2021作为一款高精度、低功耗的
    的头像 发表于 02-11 16:00 285次阅读

    HDC3120高精度温湿度传感器:设计与应用全解析

    )的HDC3120高精度模拟温湿度传感器,它以其卓越的性能和广泛的适用性,成为众多工程师的首选。 文件下载: hdc3120.pdf 1. 产品特性概览 1.1 高精度测量 HDC3120在温湿度测量方面表现出色。相对
    的头像 发表于 02-11 09:25 647次阅读

    2025温湿度变送器选购指南与传感器应用方案解析

    温湿度变送器作为环境监测和工业控制领域的重要设备,广泛应用于农业、医疗、工业制造、物联网等众多行业。2025年,伴随着传感器技术的进一步发展,温湿度变送器的性能不断提升,市场需求也持续增长。本文将基于权威数据平台的市场分析,详细
    的头像 发表于 02-01 10:44 1050次阅读

    燃气表需要一颗温湿度传感器推荐啥?

    嘿,朋友们,今天有个挺有意思的选型问题想和大家聊聊。有客户来问:“燃气表里需要一颗温湿度传感器,温度精度要求0.2℃,湿度精度要±2%RH,有合适的型号推荐吗?”首先,咱们一起来琢磨下这个需求
    的头像 发表于 01-28 12:05 339次阅读
    燃气表需要一颗<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>推荐啥?

    应用于智能门锁的温湿度传感器解决方案

    智能传感器已广泛应用于我们生活的方方面面,从智能开关(86盒)、电子温湿度计到智能窗帘盒、烟感等,无处不在。其中,温湿度传感器芯片凭借其高
    的头像 发表于 11-28 15:03 450次阅读

    温湿度传感器HTU31D在温湿度中的应用优势

    温湿度控制是一种用于监测和调节环境温度与湿度的设备,广泛应用于农业、仓储、工业生产、家庭等多个领域。其主要功能是维持特定环境条件,以确保产品质量和舒适的居住环境。 温湿度控制
    的头像 发表于 11-06 14:38 447次阅读
    <b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>HTU31D在<b class='flag-5'>温湿度</b>控<b class='flag-5'>器</b>中的应用优势

    中科银河芯GXHT30C温湿度传感器的核心亮点

    在工业控制、智能家居、医疗设备等领域,温湿度数据的精准采集是保障设备稳定运行、提升用户体验的关键。而一款性能卓越、适配性强的温湿度传感器,正是实现这一目标的核心组件。
    的头像 发表于 11-05 17:54 1699次阅读

    【上海晶珩睿莓1开发板试用体验】6、I2C通信-读取BME280温湿度气压数据

    BME280简介 BME280连接睿莓1 将BME280模块的SDA接PIN3,SCL接PIN5,VCC接3V3,GND接GND 使用命令 i2cdetect -y 1 该命令查看在I2C1上
    发表于 08-20 08:56

    中科银河芯GXHT30温湿度传感器的卓越性能

    在工业自动化、智能家居、医疗设备等领域,温湿度数据的精准采集直接影响系统性能与决策质量。传统传感器往往面临精度不足、稳定性差、适配性有限等痛点,而中科银河芯推出的 GXHT30 温湿度传感器
    的头像 发表于 08-08 17:09 2795次阅读

    什么是温湿度传感器的水合?

    温湿度传感器需要进行水合处理(Hydration),主要是为了优化传感器的性能、稳定性和长期可靠性。以下是具体原因和作用的详细解释:1.稳定湿度敏感材料电容式
    的头像 发表于 07-11 12:10 1270次阅读
    什么是<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>的水合?

    一款适用于粉尘、易结露等恶劣环境温湿度监控中的温湿度传感芯片

    温湿度监控系统在恶劣环境中通过传感器实时监测温湿度参数,当达到预设阈值时自动触发预警或调节机制,确保环境状态维持在安全范围内。
    的头像 发表于 07-09 09:41 875次阅读
    一款适用于粉尘、易结露等恶劣环境<b class='flag-5'>温湿度</b>监控中的<b class='flag-5'>温湿度</b><b class='flag-5'>传感</b>芯片

    【BPI-CanMV-K230D-Zero开发板体验】04 I2C读取BME280温湿度气压数据

    1 前言 本次实验的主要目标是通过 I2C 接口读取 BME280 传感器的数据,并进行温度、气压、湿度的补偿处理,最后打印出人类可读的环境信息。 2 API讲解 2.1 machine.I2C
    发表于 07-02 21:29

    常见的温湿度传感器类型?

    温湿度传感器是一种用于测量环境温度和湿度的设备,广泛应用于工业、农业、气象等领域。以下是几种常见的温湿度传感器类型及其优缺点: 电容式
    发表于 06-24 09:24