ESP8266 SGP30气体传感器采集推送到ThingsPanel1.0.0

2023-08-13

这个教程的目的是通过ESP8266开发板ESP-12F采集SGP30气体传感器的二氧化碳和TVOC ,并通过MQTT推送到开源物联网平台ThingsPanel。

SGP30 是一个数字化多像表气体传感器平台,专为轻松集成到空气净化器、按需新风控制和物联网应用中而设计。SGP30 设计用于智能家居、家电和物联网应用,它提供两个经过校准的空气质量信号和湿度补偿功能.SGP30 可提供有关空气质量的更详尽指数。针对现实生活环境中的污染气体,该传感器具有无与伦比的可靠性,可以实现独一无的长期稳定性和低漂移

SGP30是一款二氧化碳(CO2)和有机化合物(TVOC)气体传感器模块,它可以通过检测环境中的CO2和TVOC浓度来实现空气质量监测和控制。

SGP30气体传感器



采集监控效果

开发板资料:

https://wiki.diustou.com/cn/ESP8266_Dev_Board

操作步骤

整体有2种操作步骤

  • 预配置型:适合接入大量设备,需要先创建设备功能模板、设备配置模板,再创建设备并选择所创建的设备配置模板
  • 直接接入:直接创建设备,选择不绑定任何设备配置模板。

以上两种方式,在设备代码层面是一致的。


1. 硬件连接:

首先,将SGP30模块与微控制器连接。SGP30模块使用基于I2C协议的通信方式,可以使用以下引脚连接:


- 模块的SDA引脚连接到微控制器的对应SDA引脚。

- 模块的SCL引脚连接到微控制器的对应SCL引脚。

- 模块的VIN引脚连接到微控制器的5V电源引脚。

- 模块的GND引脚连接到微控制器的地线引脚。


如果是NodeMCU开发板,那么接线是:

NodeMCU开发板默认的SDA和SCL引脚是D2(GPIO4)和D1(GPIO5)。

注意代码也要修改:


// 开始I2C通信
  Wire.begin(4, 5);  // SDA, SCL

2.安装Arduino IDE

首先,确保你已经安装了必要的库。你可以使用Arduino IDE的库管理器来安装。你可能需要以下库:

1. Adafruit SGP30 Library

2. Adafruit Unified Sensor Library

3. Pubsubclient

4. ArduinoJson

3.在ThingsPanel平台中创建设备

创建设备时需要选择SGP30气体传感器插件。

4.在Arduino IDE中刷写代码

需要修改Wi-Fi热点名、密码、MQTT用户名。

先点击验证再上传代码。

#include <Wire.h>
#include <Adafruit_SGP30.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <WiFiManager.h>

Adafruit_SGP30 sgp;

// MQTT服务器配置
const char* mqtt_server = "47.115.210.16";
const char* mqtt_user = "69d6a5cc-c88a-1d9a-f78";
const char* mqtt_password = "";  // 密码为空
const char* mqtt_topic = "devices/telemetry";

// 新的MQTT服务器配置
const char* new_mqtt_server = "192.168.31.31";
const char* new_mqtt_user = "junhong";
const char* new_mqtt_password = "thingspanel";
const char* new_mqtt_topic = "tvoc";


WiFiClient espClient;
WiFiClient newEspClient; // 新的WiFiClient实例

PubSubClient client(espClient);
PubSubClient newClient(newEspClient); // 新的MQTT客户端

void setup() {
  Serial.begin(115200);

  // 使用WiFiManager配置WiFi
  WiFiManager wifiManager;
  if (!wifiManager.autoConnect("ESP8266_Config")) {
    Serial.println("Failed to connect and hit timeout");
    delay(3000);
    ESP.restart();
  }

  Serial.println("Connected to WiFi");

  client.setServer(mqtt_server, 1883);
  newClient.setServer(new_mqtt_server, 1883);


  // 开始I2C通信
  Wire.begin(4, 5);  // SDA, SCL
  
  // 检查I2C设备
  Serial.println("扫描I2C设备...");
  byte error, address;
  int nDevices = 0;
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("找到I2C设备地址: ");
      Serial.print(address, HEX);
      Serial.println(" !");
      nDevices++;
    }
  }
  if (nDevices == 0) {
    Serial.println("没有找到I2C设备。");
  } else {
    Serial.println("完成。");
  }

  if (!sgp.begin()){
    Serial.println("传感器不可用!");
    while (1);
  }

  Serial.println("SGP30传感器已就绪!");
}

void loop() {
  if (!client.connected()) {
    reconnectClient();
  }
  client.loop();
  if (!newClient.connected()) {
    reconnectNewClient();
  }
  newClient.loop();

  if (!sgp.IAQmeasure()) {
    Serial.println("测量失败!");
    return;
  }

  Serial.print("eCO2: "); 
  Serial.print(sgp.eCO2); 
  Serial.print(" ppm\t");
  Serial.print("TVOC: "); 
  Serial.print(sgp.TVOC);
  Serial.println(" ppb");

  // 使用ArduinoJson生成MQTT消息
  StaticJsonDocument<100> doc;
  doc["eco2"] = sgp.eCO2;
  doc["tvoc"] = sgp.TVOC;
  char payload[100];
  serializeJson(doc, payload);
  
  client.publish(mqtt_topic, payload); // 发送到原始服务器
  // 在loop()函数中发送到原始服务器的部分,添加打印输出

  bool result = client.publish(mqtt_topic, payload); // 发送到原始服务器并获取结果
  if (result) {
    Serial.println("消息成功发送到原始服务器");
  } else {
    Serial.println("消息发送到原始服务器失败");
  }

  // 使用ArduinoJson生成新的MQTT消息
  StaticJsonDocument<100> new_doc;
  new_doc["eco2"] = sgp.eCO2;
  new_doc["tvoc"] = sgp.TVOC;
  char new_payload[100];
  serializeJson(new_doc, new_payload);

  newClient.publish(new_mqtt_topic, new_payload); // 发送到新服务器

  delay(5000);  // 等待5秒
}


void reconnectClient() {
  // 重连原始MQTT客户端
  while (!client.connected()) {
    Serial.print("尝试MQTT连接 (原始服务器)...");
    if (client.connect("mqtt_a0d65b15-d6b", mqtt_user, mqtt_password)) {
      Serial.println("已连接到原始服务器");
    } else {
      Serial.print("失败, rc=");
      Serial.print(client.state());
      Serial.println(" 5秒后再试");
      delay(5000);
    }
  }
}

void reconnectNewClient() {
  // 重连新的MQTT客户端
  while (!newClient.connected()) {
    Serial.print("尝试MQTT连接 (新服务器)...");
    if (newClient.connect("ESP8266NewClient-tvoc", new_mqtt_user, new_mqtt_password)) {
      Serial.println("已连接到新服务器");
    } else {
      Serial.print("失败, rc=");
      Serial.print(newClient.state());
      Serial.println(" 5秒后再试");
      delay(5000);
    }
  }
}

5.完工

刷写代码完成后,ThingsPanel平台即可收到数据。


——————————

说明:TVOC是“Total Volatile Organic Compounds”的英文缩写,意思是总挥发性有机化合物, TVOC是三种影响室内空气品质污染中影响较为严重的一种。TVOC是指室温下饱和蒸气压超过了133.32Pa的有机物,其沸点在50℃至250℃,在常温下可以蒸发的形式存在于空气中,它的毒性、刺激性、致癌性和特殊的气味性,会影响皮肤和黏膜,对人体产生急性损害。世界卫生组织(WHO)、美国国家科学院/国家研究理事会(NAS/NRC)等机构一直强调TVOC是一类重要的空气污染物。美国环境署(EPA)对VOC的定义是:除了一氧化碳,二氧化碳,碳酸,金属碳化物,碳酸盐以及碳酸铵外,任何参与大气中光化学反应的含碳化合物。

Github
Gitee
微信交流群
QQ交流群
商务咨询
北京极益科技有限公司 版权所有 ICP:京ICP备15045763号-12