BME688环境传感器

简介

BME688环境传感器是一款四合一MEMS环境传感器,可测量VOC(挥发性有机物)、温度、湿度、气压这四个参数,非常适用于监测空气质量。由于采用了MEMS技术,该传感器体积小、功耗低,因此也适用于低功耗场合,如可穿戴设备等。 DFRobot Gravity BME688环境传感器采用Gravity I2C接口,即插即用,连线简单方便;板载电源稳压芯片和电平信号转换芯片,兼容性好,可直接兼容3.3V和5V系统;预留了SPI接口,方便做扩展。Gravity BME688环境传感器在芯片周围的PCB做了镂空处理,避免外围电路元器件发热对芯片本身产生的影响。相较于BME680传感器,BME688升级了温度传感器精度。并且在传感器底部增加了一个“加热层”,并且完全兼容BME680传感器。 以往BME680芯片测量VOC指数是通过芯片底部的一个电阻阻值的变化而进行计算的。但是这个电阻会因为受到温度的变化而产生误差。在BME688中新引入的加热层可以人为改变传感器电阻受到的温度。从而改变传感器对于不同复合型气体的敏感度。可以使产品作为气体分析数据采集源使用。

技术规格

IAQ(室内空气质量)对照表

室内空气质量指数对照表

引脚说明



BME688环境传感器引脚说明

标号 名称 功能描述
+ VCC 3.3~5V
- GND GND
C SCL I2C-SCL
D SDA I2C-SDA

使用教程

本教程将演示如何使用这个传感器模块。 目前,只有FireBeetle ESP8266 WiFi 物联网开发板能读取IAQ数值,其他主控器暂不支持。

准备

硬件

软件

接线图

I2C连接图

请务必注意线序,VCC接电源,GND接地


SPI连接图

请务必注意线序,VCC接3.3V,GND接地



样例代码

请先安装Arduino库文件,点击下载 本样例代码采用I2C接口。SPI接口的样例代码请至库文件中查找DFRobot_BME68x_SPI.ino文件,由于功能一致,不在此展示代码。 为准确测量海拔值,需要进行校准。上传代码前,请将您所在地区的海拔值填入样例代码中的语句中:seaLevel = bme.readSeaLevel(您所在地区的海拔值);

读取数据(无IAQ指数)

程序功能:读取传感器数据,并进行串口打印。(不带IAQ) 通过setGasHeater()函数将加热层设置为320℃,持续100ms。并等待30ms(加热层需要20~30ms才能加热到目标温度)。 并且通过readGasResistance()函数读取气体电阻值。

/*!
 * @file DFRobot_BME68x_I2C.ino
 * @brief connect bme68x I2C interface with your board (please reference board compatibility)
 * @n Temprature, Humidity, pressure, altitude, calibrate altitude and gas resistance data will print on serial window.
 *
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [Frank](jiehan.guo@dfrobot.com)
 * @maintainer [GDuang](yonglei.ren@dfrobot.com)
 * @version  V2.0
 * @date  2024-04-25
 * @url https://github.com/DFRobot/DFRobot_BME68x
 */

#include "DFRobot_BME68x_I2C.h"
#include "Wire.h"

/*use an accurate altitude to calibrate sea level air pressure*/
#define CALIBRATE_PRESSURE

DFRobot_BME68x_I2C bme(0x77);  //0x77 I2C address

float seaLevel; 
void setup()
{
  uint8_t rslt = 1;
  Serial.begin(9600);
  while(!Serial);
  delay(5000);
  Serial.println();
  while(rslt != 0) {
    rslt = bme.begin();
    if(rslt != 0) {
      Serial.println("bme begin failure");
      delay(2000);
    }
  }
  Serial.println("bme begin successful");
  #ifdef CALIBRATE_PRESSURE
  bme.startConvert();
  delay(1000);
  bme.update();
  /*You can use an accurate altitude to calibrate sea level air pressure. 
   *And then use this calibrated sea level pressure as a reference to obtain the calibrated altitude.
   *In this case,525.0m is chendu accurate altitude.
   */
  seaLevel = bme.readSeaLevel(525.0);
  Serial.print("seaLevel :");
  Serial.println(seaLevel);
  #endif

  // At initialization, the default heating layer target temperature is 320 and the duration is 150ms
  bool res = bme.setGasHeater(360, 100);

  Serial.print("Set the target temperature of the heating layer and the heating time: ");
  if(res == true){
    Serial.println("set successful!");
  }else{
    Serial.println("set failure!");
  }
}

void loop()
{
  bme.setGasHeater(320, 100);
  delay(30);
  bme.startConvert();
  delay(1000);
  bme.update();
  Serial.println();
  Serial.print("temperature(C) :");
  Serial.println(bme.readTemperature() / 100, 2);
  Serial.print("pressure(Pa) :");
  Serial.println(bme.readPressure());
  Serial.print("humidity(%rh) :");
  Serial.println(bme.readHumidity() / 1000, 2);
  Serial.print("gas resistance(ohm) :");
  Serial.println(bme.readGasResistance());
  Serial.print("altitude(m) :");
  Serial.println(bme.readAltitude());
  #ifdef CALIBRATE_PRESSURE
  Serial.print("calibrated altitude(m) :");
  Serial.println(bme.readCalibratedAltitude(seaLevel));
  #endif
}

读取数据(带IAQ数值)

程序功能:读取传感器数据,并进行串口打印。(带IAQ) 目前,只有FireBeetle ESP8266 WiFi物联网开发板能读取IAQ数值,其他主控器暂不支持。 对于FireBeetle ESP8266 WiFi物联网开发板,请使用Arduino IDE 1.8版本,并需要将SDK升级至2.3.1及以上。升级方法参考FireBeetle ESP8266维库的第5.2节内容。

/*!
 * @file IAQ_I2C.ino
 * @brief connect bme68x I2C interface with your board (please reference board compatibility)
 * @n Temprature, Humidity, pressure, altitude, calibrated altitude, gas resistance and IAQ data will be printed via serial.
 * @note This demo only support ESP8266 MCU
 *
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [Frank](jiehan.guo@dfrobot.com)
 * @maintainer [GDuang](yonglei.ren@dfrobot.com)
 * @version  V2.0
 * @date  2024-04-25
 * @url https://github.com/DFRobot/DFRobot_BME68x
 */

#include "DFRobot_BME68x_I2C.h"
#include "Wire.h"

/*use an accurate altitude to calibrate sea level air pressure*/
#define CALIBRATE_PRESSURE

DFRobot_BME68x_I2C bme(0x77);  //0x77 I2C address


float seaLevel; 
void setup()
{
  uint8_t       rslt = 1;
  Serial.begin(115200);
  while(!Serial);
  delay(5000);
  Serial.println();
  while(rslt != 0) {
    rslt = bme.begin();
    if(rslt != 0) {
      Serial.println("bme begin failure");
      delay(2000);
    }
  }
  Serial.println("bme begin successful");
  bme.supportIAQ();

  // At initialization, the default heating layer target temperature is 320 and the duration is 150ms
  bool res = bme.setGasHeater(360, 100);

  Serial.print("Set the target temperature of the heating layer and the heating time: ");
  if(res == true){
    Serial.println("set successful!");
  }else{
    Serial.println("set failure!");
  }
}

void loop()
{
  static uint8_t       calibrated = 0;

  #ifdef CALIBRATE_PRESSURE
  if(calibrated == 0) {
    if(bme.iaqUpdate() == 0) {
      /*You can use an accurate altitude to calibrate sea level air pressure. 
       *And then use this calibrated sea level pressure as a reference to obtain the calibrated altitude.
       *In this case,525.0m is chendu accurate altitude.
       */
      seaLevel = bme.readSeaLevel(525.0);
      Serial.print("seaLevel :");
      Serial.println(seaLevel);
      calibrated = 1;
    }
  }
  #else
    calibrated = 1;
  #endif

  if(calibrated) {
    uint8_t rslt = bme.iaqUpdate();
    if(rslt == 0) {
      Serial.println();
      Serial.print("timestamp(ms) :");
      Serial.println(millis());
      Serial.print("temperature(C) :");
      Serial.println(bme.readTemperature(), 2);
      Serial.print("pressure(Pa) :");
      Serial.println(bme.readPressure());
      Serial.print("humidity(%rh) :");
      Serial.println(bme.readHumidity(), 2);
      Serial.print("altitude(m) :");
      Serial.println(bme.readAltitude());
#ifdef CALIBRATE_PRESSURE
      Serial.print("calibrated altitude(m) :");
      Serial.println(bme.readCalibratedAltitude(seaLevel));
#endif
      Serial.print("gas resistance :");
      Serial.println(bme.readGasResistance());
      if(bme.isIAQReady()) {
        Serial.print("IAQ :");
        float iaq = bme.readIAQ();
        Serial.print(iaq);
        if(iaq < 50) Serial.println(" good");
        else if(iaq < 100) Serial.println(" average");
        else if(iaq < 150) Serial.println(" little bad");
        else if(iaq < 200) Serial.println(" bad");
        else if(iaq < 300) Serial.println(" worse");
        else Serial.println(" very bad");
      } else {
        Serial.println("IAQ not ready, please wait about 5 minutes");
        Serial.print("IAQ not ready, You will have to wait ");
        Serial.print((int)(305000-millis())/1000);
        Serial.println(" seconds");
      }
    }
  }
}

结果

无IAQ数据

带IAQ数据

Arduino库函数功能列表

兼容性测试

MCU 测试通过 测试失败 未测试 特别标注
Arduino UNO 不支持IAQ
FireBeetle-ESP32 不支持IAQ
FireBeetle-ESP8266 支持IAQ
Leonardo 不支持IAQ

Mind+ 上传模式编程

  1. 下载及安装软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装
  2. 切换到“上传模式”。 详细教程:Mind+基础wiki教程-上传模式编程流程
  3. “扩展”中选择“主控板”中的“Arduino Uno”。 “扩展”“传感器”中搜索选择“BME680模块”,详细教程:Mind+基础wiki教程-加载扩展库流程
  4. 进行编程,程序如下图:
  5. 菜单“连接设备”,“上传到设备”
  6. 程序上传完毕后,打开串口即可看到数据输出。详细教程:Mind+基础wiki教程-串口打印

Mind+ Python模式编程(行空板)

Mind+Python模式为完整Python编程,因此需要能运行完整Python的主控板,此处以行空板为例说明

连接图

操作步骤

1、下载及安装官网最新软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装

2、切换到“Python模式”。“扩展”中选择“官方库”中的“行空板”和“pinpong库”中的”pinpong初始化“和“BME680环境传感器”。切换模式和加载库的详细操作链接

3、进行编程

4、连接行空板,程序点击运行后,可在终端查看数据。行空板官方文档-行空板快速上手教程 (unihiker.com)

代码编程

以pinpong库为例,行空板官方文档-行空板快速上手教程 (unihiker.com)

#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from pinpong.libs.dfrobot_bme680 import DFRobot_BME680
from pinpong.board import Board
import time


Board().begin()
p_bme680 = DFRobot_BME680()

while True:
    p_bme680.get_sensor_data()
    print((str("温度:") + str(p_bme680.data.temperature)))
    print((str("气压:") + str(p_bme680.data.pressure)))
    print((str("湿度:") + str(p_bme680.data.humidity)))
    print((str("海拔:") + str(p_bme680.data.altitudu)))
    print((str("气体电阻:") + str(p_bme680.data.gas_resistance)))
    print("")
    time.sleep(1)

常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多

DFshopping_car1.png DFRobot商城购买链接