BME280压力和温湿度传感器的工作原理,bme 2024-04-11 23:43:06 0 0 步骤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增强功能(例如,首次定位时间的改进,航位推测,斜率检测)。 室内导航(更改楼层检测,电梯检测)。 户外导航,休闲和体育应用。 天气预报。 垂直速度指示(上升/下降速度)。 收藏(0)