【ESP8266 +SGP30+DHT11温湿度校准】

该代码示例展示了如何利用ESP8266微控制器和DHT11传感器获取温度及湿度数据,并通过SGP30传感器进行TVOC和eCO2浓度测量。通过温湿度补偿,提高气体传感器的测量精度,实现室内空气质量的实时监控。
摘要由CSDN通过智能技术生成

测量空气TVOC浓度、CO2浓度、空气温度和湿度

利用DHT11数据实时给SGP30传感器温湿度补偿

//ESP8266不定义i2c情况下,D1连接SCL,D2连接SDA
//总挥发性有机物tvoc
//eCO2浓度co2

#include <Wire.h>    
#include "Adafruit_SGP30.h"
#include "DHT.h"

#define DHTPIN 2     // 引脚2连接黄色数据线 D4

#define DHTTYPE DHT11   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

Adafruit_SGP30 sgp;

uint32_t getAbsoluteHumidity(float temperature, float humidity) {
  const float absoluteHumidity = 216.7f * ((humidity / 100.0f) * 6.112f * exp((17.62f * temperature) / (243.12f + temperature)) / (273.15f + temperature)); // [g/m^3]
  const uint32_t absoluteHumidityScaled = static_cast<uint32_t>(1000.0f * absoluteHumidity); // [mg/m^3]
  return absoluteHumidityScaled;
}

void setup() {
  Serial.begin(115200);
  dht.begin();
  Serial.println("SGP30 test");

  if (! sgp.begin()) {
    Serial.println("Sensor not found :(");
    while (1);
  }
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  float temperature = t; // [°C]
  float humidity = h; // [%RH]
  sgp.setHumidity(getAbsoluteHumidity(temperature, humidity));

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %");
  Serial.print("\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");

  if (! sgp.IAQmeasure()) {
    Serial.println("Measurement failed");
    return;
  }
  Serial.print("TVOC "); Serial.print(sgp.TVOC); Serial.println(" ppb\t");
  Serial.print("eCO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm");
  Serial.println();
  delay(1000);
}

ESP8266 NodeMCU是一个基于ESP8266 Wi-Fi模块的小型物联网开发板,常用于智能家居、传感器网络等项目。SHT30是一款温度和湿度传感器,SGP30则是一款环境空气质量传感器,ST7789是一块TFT彩色液晶屏,可用于显示测量数据。 要将这些组件连接并编写代码,首先我们需要做的是硬件布局: 1. **连接ESP8266NodeMCU**: - VCC(电源):连接到NodeMCU的3.3V或5V引脚。 - GND(地):连接到NodeMCU的GND引脚。 - TX/RX:将ESP8266的GPIO14(TX)连接到NodeMCU的GPIO0(RX),并将GPIO15(RX)连接到NodeMCU的GPIO2(TX)。 2. **连接SHT30**: - VCC(电源):连接到ESP8266的3.3V或5V引脚。 - GND(地):连接到ESP8266的GND引脚。 - SDA(串行数据):连接到ESP8266的IO口(如D4或D5)。 - SCL(串行时钟):连接到ESP8266的IO口(如D2或D3)。 3. **连接SGP30**: - I2C通信:同样通过SCL和SDA引脚与ESP8266进行I2C通信。 4. **连接ST7789液晶屏**: - VCC:连接到ESP8266的3.3V或5V。 - GND:连接到ESP8266的GND。 - SDA 和 SCL:连接到ESP8266的对应I2C接口。 - RS(数据/命令选择):连接到ESP8266的一个GPIO口,例如D1。 - R/W(读写信号):连接到ESP8266的一个GPIO口,例如D0。 - CE(片选):根据屏的具体型号连接到适当的IO口。 - DC(数据使能):连接到ESP8266的一个GPIO口,例如D2。 编写代码部分,你需要使用相关的库,比如`Adafruit_Sensor`、`Adafruit_SGP30`、`Adafruit_ST7789`来控制各个传感器和屏幕。以下是一个基础的示例流程: ```cpp #include <Wire.h> #include <Adafruit_SHT3x.h> #include <Adafruit_GFX.h> #include <Adafruit_ST7789.h> #include <Adafruit_SGP30.h> Adafruit_SHT30 sht = Adafruit_SHT30(); Adafruit_ST7789 tft = Adafruit_ST7789(/*实例化参数*/); SGP30 sgp; void setup() { Serial.begin(115200); if (!sht.begin()) { Serial.println("Failed to initialize SHT30!"); return; } if (!tft.begin()) { Serial.println("Failed to initialize ST7789!"); return; } sgp.begin(); } void loop() { float temperature, humidity; uint16_t co2, tvoc; // 读取SHT30的温度和湿度 sht.measure(temperature, humidity); // 读取SGP30的CO2和TVOC浓度 co2 = sgp.readCarbonDioxide(); tvoc = sgp.readTVOC(); // 显示在LCD上 tft.clearDisplay(); tft.setTextSize(2); tft.setCursor(0, 0); tft.print("Temperature: "); tft.print(temperature); tft.setCursor(0, 10); tft.print("Humidity: "); tft.print(humidity); tft.setCursor(0, 20); tft.print("CO2: "); tft.print(co2); tft.setCursor(0, 30); tft.print("TVOC: "); tft.print(tvoc); delay(1000); // 更新数据频率 } ``` 记得替换`/*实例化参数*/`为实际初始化ST7789时所需的参数,并检查每个库的文档以确保正确连接和配置。运行程序后,ESP8266会定期从SHT30和SGP30获取数据,并显示在ST7789屏幕上。 相关问题: 1. 如何在代码中处理SHT30的错误响应? 2. 如何优化ST7789屏幕刷新率? 3. 如何通过WiFi将数据上传至云端?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值