步驟1:BME280探索
電子行業(yè)已使用BME280傳感器(具有溫度,氣壓和濕度的環(huán)境傳感器)加快了競(jìng)爭(zhēng)步伐!該傳感器非常適合各種天氣/環(huán)境傳感,甚至可以在I2C中使用。
此精密傳感器BME280是用于測(cè)量濕度(精度為±3%),氣壓為±1的最佳傳感解決方案。 hPa絕對(duì)精度,溫度精度為±1.0°C。由于壓力會(huì)隨高度變化,因此壓力測(cè)量值非常好,因此您也可以將其用作高度計(jì),精度為±1米或更高!溫度傳感器經(jīng)過(guò)優(yōu)化,可實(shí)現(xiàn)最低噪聲和高分辨率,可用于溫度補(bǔ)償壓力傳感器,也可用于估算環(huán)境溫度。 BME280的測(cè)量可以由用戶執(zhí)行,也可以定期進(jìn)行。
數(shù)據(jù)表:?jiǎn)螕粢灶A(yù)覽或下載BME280傳感器的數(shù)據(jù)表。
步驟2:硬件需求列表
我們完全使用了Dcube Store Parts,因?yàn)樗鼈円子谑褂茫⑶宜信c厘米網(wǎng)格完全匹配的東西確實(shí)可以使我們前進(jìn)。您可以根據(jù)需要使用任何東西,但接線圖將假定您正在使用這些零件。
BME280傳感器I2C微型模塊
I2C粒子光子防護(hù)罩
粒子光子
I2C電纜
電源適配器
步驟3:接口連接
接口部分基本上說(shuō)明了傳感器與粒子光子之間所需的接線。在任何系統(tǒng)上為所需的輸出工作時(shí),確保正確的連接是基本必要。因此,必要的連接如下:
BME280將在I2C上運(yùn)行。這是示例接線圖,演示了如何連接傳感器的每個(gè)接口。開箱即用,該電路板已配置為I2C接口,因此,如果您不確定,我們建議使用此接口。您只需要四根電線! Vcc,Gnd,SCL和SDA引腳僅需要四個(gè)連接,它們通過(guò)I2C電纜連接。這些連接如上圖所示。
步驟4:溫度,壓力和濕度監(jiān)控代碼
我們將在此處使用干凈的代碼版本來(lái)運(yùn)行它。
在將傳感器模塊與Arduino結(jié)合使用時(shí),我們包含了application.h和spark_wiring_i2c.h庫(kù)。 “ application.h”和spark_wiring_i2c.h庫(kù)包含促進(jìn)傳感器與粒子之間的i2c通信的功能。
點(diǎn)擊此處打開用于設(shè)備監(jiān)控的網(wǎng)頁(yè)
上傳代碼添加到您的開發(fā)板上,它應(yīng)該開始工作了!所有數(shù)據(jù)都可以在網(wǎng)頁(yè)上獲得,如圖所示。
代碼如下:
// 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
// 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:應(yīng)用程序:
BME280溫度,壓力和相對(duì)濕度傳感器具有多種工業(yè)應(yīng)用,例如溫度監(jiān)控,計(jì)算機(jī)外圍熱保護(hù),工業(yè)壓力監(jiān)控。我們還將這種傳感器應(yīng)用于氣象站應(yīng)用程序以及溫室監(jiān)控系統(tǒng)中。
其他應(yīng)用程序可能包括:
情境感知,例如皮膚檢測(cè),房間變化檢測(cè)。
體能監(jiān)測(cè)/健康-有關(guān)干燥或高溫的警告。
測(cè)量風(fēng)量和空氣流量。
家庭自動(dòng)化控制。
控制供暖,通風(fēng)和空調(diào)(HVAC)。
GPS增強(qiáng)功能(例如,首次定位時(shí)間的改進(jìn),航位推測(cè),斜率檢測(cè))。
室內(nèi)導(dǎo)航(更改樓層檢測(cè),電梯檢測(cè))。
戶外導(dǎo)航,休閑和體育應(yīng)用。
天氣預(yù)報(bào)。
垂直速度指示(上升/下降速度)。
-
傳感器
+關(guān)注
關(guān)注
2548文章
50704瀏覽量
752084
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論