ESP8266 SGP30气体传感器采集推送到ThingsPanel1.0.0
发布日期:
这个教程的目的是通过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的定义是:除了一氧化碳,二氧化碳,碳酸,金属碳化物,碳酸盐以及碳酸铵外,任何参与大气中光化学反应的含碳化合物。