ESP8266+BME680+BSEC库+Blynk

    某日,博主望着手中的ESP8266,想让其发挥余热,便想搭建一套家居环境检测系统,在淘宝搜索传感器时,瞥见了本文使用的BME680,它那四合一的标题吸引了我,在深入了解后,明白了其功能强大性,BME680环境传感器是一款由博世推出的四合一MEMS环境传感器,可测量VOC(挥发性有机物)、温度、湿度、气压这四个参数,非常适用于监测空气质量,符合博主预想。

    在购买并使用Adafruit BME680 Library库后,发现只能获取温度、湿度、气压,而空气质量需要搭配Bosch BSEC空气质量算法库后才能输出,通过翻阅资料,终于实现获取温湿度、气压以及空气质量信息(IAQ、CO2 Equivalent、Breath VOC Equivalent),并上传至Blynk显示。

    接下来就跟着博主的教程,进入知识的海洋吧。



 一、项目概括

1.目标   

    采用ESP8266(Node MCU 0.9),搭配BME680传感器使用Bosch BSEC空气质量算法库来获取温湿度、气压以及空气质量信息(IAQ、CO2 Equivalent、Breath VOC Equivalent),并上传至Blynk显示。

2.ESP8266

    采用Node MCU 0.9(ESP-12 Module)

GitHub - esp8266/Arduino: ESP8266 core for Arduinoicon-default.png?t=N7T8https://github.com/esp8266/Arduino

3.所用库

BSEC_Software_Library v1.8.1492icon-default.png?t=N7T8https://github.com/BoschSensortec/BSEC-Arduino-library?tab=readme-ov-file#installation-and-getting-startedblynk-library-master v1.3.2icon-default.png?t=N7T8https://github.com/blynkkk/blynk-library

4.结果

Blynk显示:

​二、BME680介绍及连线

    BME680环境传感器是一款四合一MEMS环境传感器,可测量VOC(挥发性有机物)、温度、湿度、气压这四个参数,非常适用于监测空气质量。采用 I2C接口。本产品集成度高,可同时检测四个环境参数,是气象站、智能家居、物联网、可穿戴等场景的理想选择。 使用本产品,可迅速搭建出一套空气质量检测仪。

产品图片

技术规格
输入电压3.3V-5.5V
工作电流5mA(开启VOC测量后,工作电流为25mA)
通信接口I2C(兼容3.3V/5V)
I2C地址0x76或0x77
预留接口SPI(仅支持3.3V)
温度测量范围-40℃~+85℃
温度测量精度±1.0℃(0~65℃)
湿度测量范围0-100%r.H.
湿度测量精度±3%r.H.(20-80% r.H.,25℃)
气压测量范围300-1100hPa
气压测量精度±0.6hPa(300-1100hPa,0~65℃)
IAQ(室内空气质量)范围0-500(值越大,空气质量越差)
引脚排列
VCC3.3V-5.5V供电
GND接地
SCLI2C-SCL
SPI-SCK
SDAI2C-SDA
SPI-SDI(MOSI)
SDOSPI-SDO(MISO)
CSSPI-片选引脚
I2C连接
BME680ESP8266
SCLD1(GPIO5)
SDAD2(GPIO4)

连接示意

    至此,硬件层面应准备完毕,在了解BME680并正常连接后,将进入Arduino IDE配置工作。


三、Arduino IDE准备工作

   1)安装Arduino IDE,博主使用arduino-1.8.18版本,下载链接如下:

Software | Arduinoicon-default.png?t=N7T8https://www.arduino.cc/en/software   2)安装ESP8266开发板 :

    1.在Arduino IDE中,转到“文件”>“首选项”;

    2.在“附加开发板管理器网址”中输入下图所示地址,然后,单击“好”按钮;

http://arduino.esp8266.com/stable/package_esp8266com_index.json

    3.回到Arduino主页,转到“工具”>“开发板”>“开发板管理器”;

    4.搜索ESP8266,选择版本后点击安装按钮;

        注:博主在该篇教程中选择3.0.0版本

    5.等待下载与安装。

   3)下载完成后,回到Arduino主页,转到“工具”>“开发板”>“ESP8266 Boards(3.0.0)”

   4)选择NodeMCU 0.9(ESP-12 Module)

四、安装BSEC库并配置

   1)安装 BSEC 库

    要从BME680传感器获取IAQ读数,我们将使用BSEC_Software_Library库 。

    BSEC 库的概念是为 BME680 提供更高级别的信号处理和融合,该库从传感器 API 接收补偿后的传感器值,由该库进行处理 BME680 信号并输出数据。

    按照以下步骤在Arduino IDE中安装该库:

    1.打开Arduino IDE,进入“工具”>“管理库”,等待下载库索引及更新;

    2.在“搜索”框中搜索“BSEC Software Library”并选择1.8.1492版本并安装。

    3.等待下载与安装,出现“INSTALLED”。

   2)配置 BSEC 库

        为解决BSEC库编译问题,需要按照GitHub上的 BSEC-Arduino-library 库的安装和入门所示及博主的步骤,修改以下文件:

  • platform.txt
  • eagle.app.v6.common.ld

    1.修改platform.txt

    标准arduino构建器现在在compiler.libraries.ldflags下传递链接器标志。大多数platform.txt文件还没有包含这个新的可选变量。因此,您需要声明此变量的默认值,并将其添加到组合配方的末尾。步骤如下所示:

The standard arduino-builder now passes the linker flags under compiler.libraries.ldflags. Most platform.txt files do not already include this new optional variable. You will hence need to declare this variable's default and add it to the end of the combine recipe. It is recommended to declare it in the following section like below,

a)转到以下文件夹

C:\Users\username\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.0

b)打开文件 platform.txt;

c)定位至95行(以实际为准)或查找以下代码段后,在底部添加红框所示代码;

# This can be overriden in boards.txt
build.extra_flags=-DESP8266

# These can be overridden in platform.local.txt
compiler.c.extra_flags=
compiler.c.elf.extra_flags=
compiler.S.extra_flags=
compiler.cpp.extra_flags=
compiler.ar.extra_flags=
compiler.objcopy.eep.extra_flags=
compiler.elf2hex.extra_flags=
compiler.libraries.ldflags=

d)继续定位至123行(以实际为准)或查找以下代码段

## Combine gc-sections, archives, and objects
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {build.exception_flags} -Wl,-Map "-Wl,{build.path}/{build.project_name}.map" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs} -Wl,--end-group "-L{build.path}"

e)我们需要将这行代码添加到上面的代码{compiler.c.elf.libs}后

{compiler.libraries.ldflags}

或查看博主修改后的代码:

## Combine gc-sections, archives, and objects
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {build.exception_flags} -Wl,-Map "-Wl,{build.path}/{build.project_name}.map" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs}{compiler.libraries.ldflags} -Wl,--end-group "-L{build.path}"

f保存文件

     2.修改eagle.app.v6.common.ld

a)转到以下文件夹

C:\Users\username\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.0\tools\sdk\ld

b)打开文件 eagle.app.v6.common.ld.h;

c)定位至208行(以实际为准)或或查找以下代码段;

    *liblwip.a:(.literal.* .text.*)
    *libmesh.a:(.literal.* .text.*)
    *libnet80211.a:(.literal.* .text.*)
    *libsmartconfig.a:(.literal.* .text.*)
    *libssl.a:(.literal.* .text.*)
    *libupgrade.a:(.literal.* .text.*)
    *libwpa.a:(.literal.* .text.*)
    *libwpa2.a:(.literal.* .text.*)
    *libwps.a:(.literal.* .text.*)

d)我们需要将这行代码添加到上面的代码*libwps.a:(.literal.* .text.*)后

*libalgobsec.a:(.literal.* .text.*)

或查看博主修改后的代码:

    *liblwip.a:(.literal.* .text.*)
    *libmesh.a:(.literal.* .text.*)
    *libnet80211.a:(.literal.* .text.*)
    *libsmartconfig.a:(.literal.* .text.*)
    *libssl.a:(.literal.* .text.*)
    *libupgrade.a:(.literal.* .text.*)
    *libwpa.a:(.literal.* .text.*)
    *libwpa2.a:(.literal.* .text.*)
    *libwps.a:(.literal.* .text.*)
    *libalgobsec.a:(.literal.* .text.*)

f保存文件

注:此处博主参考以下链接内容:

cSolved: BSEC library installation instructions for ESP8266

    至此,BME680库层面应准备完毕,在正确安装BSEC库并按步骤修改文件后,将进入代码调试与功能验证工作。

五、使用示例代码验证BME680

提示:进行此步骤前,请务必按照<四、安装BSEC库并配置>进行预先配置,以免验证或上传程序时出现报错!!

   1)启动或重新启动Arduino IDE; 

   2)打开示例代码,点击“文件”>“示例”>“BSEC Software Liibrary”>“basic”;

   3)在以下代码段,将BME68X_I2C_ADDR_LOW”变更为BME680 I2C 引脚地址

注:博主BME680模块的 I2C 引脚地址为 0x77;

注:BME680传感器的默认 I2C 地址是 0x76,但只需将 SDO 连接到 3.3v 即可将其更改为 0x77。要了解有关 BME680 传感器的更多信息,您可以查看BME680 数据表

  修改前:iaqSensor.begin(BME68X_I2C_ADDR_LOW, Wire);
  修改后:iaqSensor.begin(0X77, Wire);
  注:地址为0X77或0X76

   3)修改完成后,检查所使用的开发板和COM端口是否与实际一致,并点击验证”。

   4)当验证成功,出现“Executable segment sizes:”,即可进行烧录,点击上传”。

   5)当成功上传到您的开发板后,并以 115200 波特率打开串口监视器。

    您应该会在终端上看到先是打印BSEC库版本,其次打印数据标签,最后打印数据。

    1.打印BSEC库版本,并运行传感器检查程序

  output = "\nBSEC library version " + String(iaqSensor.version.major) + "." + String(iaqSensor.version.minor) + "." + String(iaqSensor.version.major_bugfix) + "." + String(iaqSensor.version.minor_bugfix);
  Serial.println(output);
  checkIaqSensorStatus();

    2.打印数据标签

  output = "Timestamp [ms], IAQ, IAQ accuracy, Static IAQ, CO2 equivalent, breath VOC equivalent, raw temp[°C], pressure [hPa], raw relative humidity [%], gas [Ohm], Stab Status, run in status, comp temp[°C], comp humidity [%], gas percentage";
  Serial.println(output);

    3.打印数据(以下为15个数据的获取,打印代码):

  if (iaqSensor.run()) { // If new data is available
    digitalWrite(LED_BUILTIN, LOW);
    output = String(time_trigger);
    output += ", " + String(iaqSensor.iaq);
    output += ", " + String(iaqSensor.iaqAccuracy);
    output += ", " + String(iaqSensor.staticIaq);
    output += ", " + String(iaqSensor.co2Equivalent);
    output += ", " + String(iaqSensor.breathVocEquivalent);
    output += ", " + String(iaqSensor.rawTemperature);
    output += ", " + String(iaqSensor.pressure);
    output += ", " + String(iaqSensor.rawHumidity);
    output += ", " + String(iaqSensor.gasResistance);
    output += ", " + String(iaqSensor.stabStatus);
    output += ", " + String(iaqSensor.runInStatus);
    output += ", " + String(iaqSensor.temperature);
    output += ", " + String(iaqSensor.humidity);
    output += ", " + String(iaqSensor.gasPercentage);
    Serial.println(output);
    digitalWrite(LED_BUILTIN, HIGH);
  }

以下为15个数据的对应关系:

数据介绍
获取代码对应参数说明单位
time_triggerTimestamp [ms]时间戳ms
iaqSensor.iaqIAQ室内空气质量
iaqSensor.iaqAccuracyIAQ accuracyIAQ准确性
iaqSensor.staticIaqStatic IAQ静态IAQ
iaqSensor.co2EquivalentCO2 equivalent二氧化碳当量ppm
iaqSensor.breathVocEquivalentbreath VOC equivalent呼吸VOC当量ppm
iaqSensor.rawTemperatureraw temp[°C]原始温度
iaqSensor.pressurepressure [hPa]压力hPa
iaqSensor.rawHumidityraw relative humidity [%]原始相对湿度%
iaqSensor.gasResistancegas [Ohm]原始气体传感器数据Ohm
iaqSensor.stabStatusStab Status
iaqSensor.runInStatusrun in status
iaqSensor.temperaturecomp temp[°C]补偿温度
iaqSensor.humiditycomp humidity [%]补偿湿度%
iaqSensor.gasPercentagegas percentage

   6)验证成功后,将示例代码另存在您指定的位置,文件名为“basic"。 

    至此,BME680硬件与软件层面都已验证完毕,进入Blynk配置工作。 

六、Blynk 配置

   1)注册Blynk,新建项目

     1.打开Blynk网址(教程使用电脑端注册并配置)

Blynk: a low-code IoT software platform for businesses and developersBuild custom mobile apps and web dashboards with our drag-and-drop app builder. Get a complete, hardware agnostic IoT solution with an integrated back-end infrastructure, private cloud, device management and user management tools. Publish your own app in Appstore / Google Play with our white-label option.icon-default.png?t=N7T8https://blynk.io/     2.点击右上角的“LOG IN”登录或“START FREE”进行注册;

     3.登录后进入主页面,转到“Developer Zone”>“+ New Temolate”,新建项目模板;

    在弹出的页面中,"NAME"输入项目名称,"HARDWARE"选择硬件(ESP8266),"CONNECTION TYPE"选择wifi连接“WiFi”;

     4.进入“BME68X”项目主页面(Home);

      4.在页面右下角的“Firmware configuration”处,将这两行代码妥善保存,以便后续使用;

#define BLYNK_TEMPLATE_ID "TMPL6sD85FUcB"
#define BLYNK_TEMPLATE_NAME "BME68X"

   2)添加设备,获取Auth Token

     1.在“BME68X”项目主页面(Home),点击“Add first Device”,添加设备(ESP8266);

     2.在页面“1 Devices”处查看设备(ESP8266)的Auth Token,可以拖动滚动条,将鼠标放置令牌上点击复制按键,完成Auth Token获取,并妥善保存,以便后续使用;

   3)添加数据流,配置虚拟引脚

     1.在“BME68X”项目主页面(Home),点击“Datastreams”,添加数据流;

     2.在“Datastreams”页面,点击“+ New Datastreams”>“Virtual Pin”,按照下表新建虚拟引脚;

    注:为教程连续性,预先配置数据流所需虚拟引脚,可以在后文的代码中修改!

    注:虚拟引脚的NAME、PIN等皆可自定义,只需代码中的V*与对应的PIN相同即可,但还需注意数据类型(Integer&Double&String)!

    Blynk.virtualWrite(V1, iaqSensor.temperature);            // For Temperature
    Blynk.virtualWrite(V2, iaqSensor.humidity);               // For Humidity
    Blynk.virtualWrite(V3, (iaqSensor.pressure)/1000);        // For Pressure
    Blynk.virtualWrite(V4, iaqSensor.iaq);                    //For Index of Air Quality
    Blynk.virtualWrite(V5, iaqSensor.co2Equivalent);          // For CO2
    Blynk.virtualWrite(V6, iaqSensor.breathVocEquivalent);    // For Breath VoC  
虚拟引脚配置表(为博主配置值,仅供示意)
DataPINNAMEDATA TYPEUNITSMINMAXDECIMALS
TemperatureV1TemperatureDouble045#.##
HumidityV2HumidityDouble%0100#.##
PressureV3PressureDoublehPa8001200#.##
IAQV4IAQDoubleInteger0500/
CO2V5CO2Doubleppm02000#.##
Breath VoCV6Breath VoCDoubleppm05#.##

 Temperature 虚拟引脚配置示意图

    注:若数据在仪表中显示历史情况,请勾选“Enable history data”,启用历史数据! 

   4)添加仪表,配置仪表台

     1.在“BME68X”项目主页面(Home),点击“Web Dashboard”,添加仪表;

     2.在页面左侧的“Widget Box”,鼠标滚动向下,点击“Gauge”并拖动至右侧空白格内,松手完成添加仪表动作;

     3.点击新添加“Gauge”仪表上的“齿轮按钮”,进入仪表配置界面,在“Datastream”处选择仪表对应的数据流,此处以< 3)添加数据流,配置虚拟引脚>中的Temperature(V1)为例;

     4.点击“Save”保存“Gauge”仪表的配置;

     4.点击页面右上角的 “Save And Apply”保存项目的所有设置;

注:以此类推,可添加其它仪表,本文便不一一阐述;

    至此,Blynk都已配置完成,主要完成项目新建,设备添加,获取Auth Token,配置数据流及仪表台,接下来进入BME680数据上传至Blynk的代码编写工作。 

七、BME680数据上传至Blynk 

提示:进行此步骤前,请务必按照<四、安装BSEC库并配置>进行预先配置,<五、使用示例代码验证BME680>进行硬件验证,<六、Blynk 配置>Auth Token获取、数据流配置,以免数据上传Blynk时出现问题!!

   1)安装 Blynk 库

    按照以下步骤在Arduino IDE中安装该库:

    1.打开Arduino IDE,进入“工具”>“管理库”,等待下载库索引及更新;

    2.在“搜索”框中搜索“Blynk”并选择1.3.2版本并安装。

    3.在弹出框中选择“Install all”一起下载“BlynkNcpDriver”。

    4.等待下载与安装,出现“INSTALLED”。

   2)修改 basic.ino 代码

    1.启动或重新启动Arduino IDE;

    2.打开<五、使用示例代码验证BME680>步骤中另存的“basic”文件代码,进行以下改动:

a)我们需要将“Firmware configuration”处这两行定义代码添加代码最前端

b)我们需要添加Blynk所需的库文件

#define BLYNK_TEMPLATE_ID "TMPL6sD85FUcB"
#define BLYNK_TEMPLATE_NAME "BME68X"

#include "bsec.h"
#include <Blynk.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

c)在“//Helper functions declarations”前添加Blynk的Auth Token及数据上传所需的Wifi及密码

如代码所示,博主的Auth Token为“gVrcdB7lYqcH_ObGPqfBUeVlvM9mdn5p”;

如代码所示,博主屋里WiFi名称为“8888”;

如代码所示,博主屋里WiFi密码为“88888888”;

此处,需要各位结合实际情况变更!!

char auth[] = "gVrcdB7lYqcH_ObGPqfBUeVlvM9mdn8p";    // You should get Auth Token in the Blynk App.
char ssid[] = "8888";                                // Your WiFi credentials.
char pass[] = "88888888";

d)在“void setup(void)”函数中,添加Blynk登陆的配置代码“Blynk.begin(auth, ssid, pass)”

void setup(void)
{
  /* Initializes the Serial communication */
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  delay(1000);

e)在“void loop(void)”函数中,添加Blynk启动函数及数据流上传函数 

    Blynk.run(); // Initiates Blynk
    Blynk.virtualWrite(V1, iaqSensor.temperature);            // For Temperature
    Blynk.virtualWrite(V2, iaqSensor.humidity);               // For Humidity
    Blynk.virtualWrite(V3, (iaqSensor.pressure)/1000);        // For Pressure
    Blynk.virtualWrite(V4, iaqSensor.iaq);                    //For Index of Air Quality
    Blynk.virtualWrite(V5, iaqSensor.co2Equivalent);          // For CO2
    Blynk.virtualWrite(V6, iaqSensor.breathVocEquivalent);    // For Breath VoC 

     注:此处对应<六、Blynk 配置>中的<3)添加数据流,配置虚拟引脚>教程!

     注:为保证数据正确在Blynk显示,请检查代码中PIN与您配置的虚拟引脚是否对应!

或查看博主修改后的代码:

     注:若您按照博主教程的虚拟引脚配置表进行数据流配置,就请修改以下信息

  • BLYNK_TEMPLATE_ID
  • BLYNK_TEMPLATE_NAME
  • auth[ ]
  • ssid[ ]
  • pass[ ]
#define BLYNK_TEMPLATE_ID "TMPL6sD85FUcB"
#define BLYNK_TEMPLATE_NAME "BME68X"

#include "bsec.h"
#include <Blynk.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char auth[] = "gVrcdB7lYqcH_ObGPqfBUeVlvM9mdn5p";    // You should get Auth Token in the Blynk App.
char ssid[] = "1203";                                // Your WiFi credentials.
char pass[] = "88888888";
 
// Helper functions declarations
void checkIaqSensorStatus(void);
void errLeds(void);
 
// Create an object of the class Bsec
Bsec iaqSensor;
 
String output;
 
// Entry point for the example
void setup(void)
{
  /* Initializes the Serial communication */
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  delay(1000);
  pinMode(LED_BUILTIN, OUTPUT);
  iaqSensor.begin(0X77, Wire);
  output = "\nBSEC library version " + String(iaqSensor.version.major) + "." + String(iaqSensor.version.minor) + "." + String(iaqSensor.version.major_bugfix) + "." + String(iaqSensor.version.minor_bugfix);
  Serial.println(output);
  checkIaqSensorStatus();

  bsec_virtual_sensor_t sensorList[13] = {
    BSEC_OUTPUT_IAQ,
    BSEC_OUTPUT_STATIC_IAQ,
    BSEC_OUTPUT_CO2_EQUIVALENT,
    BSEC_OUTPUT_BREATH_VOC_EQUIVALENT,
    BSEC_OUTPUT_RAW_TEMPERATURE,
    BSEC_OUTPUT_RAW_PRESSURE,
    BSEC_OUTPUT_RAW_HUMIDITY,
    BSEC_OUTPUT_RAW_GAS,
    BSEC_OUTPUT_STABILIZATION_STATUS,
    BSEC_OUTPUT_RUN_IN_STATUS,
    BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE,
    BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
    BSEC_OUTPUT_GAS_PERCENTAGE
  };

  iaqSensor.updateSubscription(sensorList, 13, BSEC_SAMPLE_RATE_LP);
  checkIaqSensorStatus();

  // Print the header
  output = "Timestamp [ms], IAQ, IAQ accuracy, Static IAQ, CO2 equivalent, breath VOC equivalent, raw temp[°C], pressure [hPa], raw relative humidity [%], gas [Ohm], Stab Status, run in status, comp temp[°C], comp humidity [%], gas percentage";
  Serial.println(output);
}

// Function that is looped forever
void loop(void)
{
  unsigned long time_trigger = millis();
  if (iaqSensor.run()) { // If new data is available
    digitalWrite(LED_BUILTIN, LOW);
    output = String(time_trigger);
    output += ", " + String(iaqSensor.iaq);
    output += ", " + String(iaqSensor.iaqAccuracy);
    output += ", " + String(iaqSensor.staticIaq);
    output += ", " + String(iaqSensor.co2Equivalent);
    output += ", " + String(iaqSensor.breathVocEquivalent);
    output += ", " + String(iaqSensor.rawTemperature);
    output += ", " + String(iaqSensor.pressure);
    output += ", " + String(iaqSensor.rawHumidity);
    output += ", " + String(iaqSensor.gasResistance);
    output += ", " + String(iaqSensor.stabStatus);
    output += ", " + String(iaqSensor.runInStatus);
    output += ", " + String(iaqSensor.temperature);
    output += ", " + String(iaqSensor.humidity);
    output += ", " + String(iaqSensor.gasPercentage);
    Serial.println(output);
    digitalWrite(LED_BUILTIN, HIGH);
    
    Blynk.run(); // Initiates Blynk
    Blynk.virtualWrite(V1, iaqSensor.temperature);            // For Temperature
    Blynk.virtualWrite(V2, iaqSensor.humidity);               // For Humidity
    Blynk.virtualWrite(V3, (iaqSensor.pressure)/1000);        // For Pressure
    Blynk.virtualWrite(V4, iaqSensor.iaq);                    //For Index of Air Quality
    Blynk.virtualWrite(V5, iaqSensor.co2Equivalent);          // For CO2
    Blynk.virtualWrite(V6, iaqSensor.breathVocEquivalent);    // For Breath VoC  
     
  } else {
    checkIaqSensorStatus();
  }
}

// Helper function definitions
void checkIaqSensorStatus(void)
{
  if (iaqSensor.bsecStatus != BSEC_OK) {
    if (iaqSensor.bsecStatus < BSEC_OK) {
      output = "BSEC error code : " + String(iaqSensor.bsecStatus);
      Serial.println(output);
      for (;;)
        errLeds(); /* Halt in case of failure */
    } else {
      output = "BSEC warning code : " + String(iaqSensor.bsecStatus);
      Serial.println(output);
    }
  }

  if (iaqSensor.bme68xStatus != BME68X_OK) {
    if (iaqSensor.bme68xStatus < BME68X_OK) {
      output = "BME68X error code : " + String(iaqSensor.bme68xStatus);
      Serial.println(output);
      for (;;)
        errLeds(); /* Halt in case of failure */
    } else {
      output = "BME68X warning code : " + String(iaqSensor.bme68xStatus);
      Serial.println(output);
    }
  }
}

void errLeds(void)
{
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(100);
  digitalWrite(LED_BUILTIN, LOW);
  delay(100);
}

   3)修改完成后,检查所使用的开发板和COM端口是否与实际一致,并点击验证”; 

   4)当验证成功,出现“Executable segment sizes:”,即可进行烧录,点击“上传”;

   5)当成功上传到您的开发板后,并以 115200 波特率打开串口监视器;

    您应该会在终端上看到先是打印BSEC库版本,其次打印数据标签,最后打印数据。

   6)随后可打开Blynk网站的“Devices”,点击”ESP8266“,查看仪表是否显示数据;

提示:

    当您第一次启动传感器时,建议运行 48 小时后查看数据。


八、结束语

    至此,ESP8266+BME680+BSEC库+Blynk的教程就结束了,我想各位也将数据成功上传至Blynk,该软件功能很多,还有手机端可供远程显示,时刻查看环境温湿度、气压、空气质量,这里大家也可以搜索其它教程或自己摸索尝试,感受科技带给人们的便利以及操作过程中的享受与成就感!

   全文包含代码共15000余字,也包含了博主的心血及时间,博主当初在配置文件时始终搞不清楚也有段时间放弃了,在这段时间我始终放不下心一直在外网查阅资料,最终将步骤写成本教程,希望在未来,该教程能给屏幕前的你来带解决思路及解决步骤,这也是博主所希望的。当然也希望各位针对本教程批评指正,本人虚心接受。

    路漫漫其修远兮,吾将上下而求索。

WYDH

2024.5.4 17:00

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下代码来设置esp32 4G MQTT订阅温度传感器的主题: #include <PubSubClient.h> #include <WiFi.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> // Replace with your network credentials const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // Replace with your MQTT Broker IP address const char* mqtt_server = "your_MQTT_BROKER_IP"; WiFiClient espClient; PubSubClient client(espClient); Adafruit_BME280 bme; void setup() { Serial.begin(115200); delay(100); // Connect to Wi-Fi network with SSID and password Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected!"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); // Connect to MQTT Broker client.setServer(mqtt_server, 1883); while (!client.connected()) { Serial.println("Connecting to MQTT Broker..."); if (client.connect("ESP32Client")) { Serial.println("Connected to MQTT Broker!"); } else { Serial.print("Failed with state "); Serial.print(client.state()); delay(2000); } } // Initialize BME280 sensor if (!bme.begin(0x76)) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } // Subscribe to temperature sensor topic client.subscribe("temperature_sensor"); } void loop() { // Check if MQTT client is connected if (!client.connected()) { reconnect(); } // Read temperature from BME280 sensor float temperature = bme.readTemperature(); // Publish temperature to MQTT Broker char temperature_str[10]; dtostrf(temperature, 4, 2, temperature_str); client.publish("temperature_sensor", temperature_str); // Wait for 5 seconds delay(5000); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attempt to connect if (client.connect("ESP32Client")) { Serial.println("Connected to MQTT Broker!"); // Subscribe to temperature sensor topic client.subscribe("temperature_sensor"); } else { Serial.print("Failed with state "); Serial.print(client.state()); delay(2000); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值