esp8266空气质量检测

102 阅读3分钟

前记

家里装修快一年多了,到了夏天儿童房开空调后,长期房间密闭,总闻到一股味道,应该是苯之类的可挥发气体超标。于是就有了这个小玩意。

7b599e1a18d24fbaddd4c15843652ca.jpg

效果演示

在oled屏幕显示

image.png

手机上也能查看

b263667396bc0ad56136a7edda3fa2a.jpg

指标解释

TVOC(总挥发性有机化合物)的标准范围通常被认为是安全的浓度是在0.6mg/m³以下。

甲醛(HCHO),国家规定的入住标准测量值不超过0.08mg/m³。

室内co2标准一般在500到700PPM左右。在大自然环境里,空气中二氧化碳的正常含量是0.04%(400PPM),在大城市里有时候达到500PPM。而室内没有人的情况下,二氧化碳浓度一般在500到700PPM左右

所需硬件

esp8266开发板

jw01空气质量传感

oled显示屏

接线图

注意观察线的颜色,可以对应上

image.png

image.png

image.png

代码

#include <SoftwareSerial.h>
#include <U8g2lib.h>
#include <String.h>
 
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define OLED_ADDRESS 0x3C
#define D1 5
#define D2 4

#include <Blinker.h>
//点灯科技上申请账号
char auth[] = "95ae135865756";
char ssid[] = "你家的wifi";
char pswd[] = "你家wifi密码";

// 定义软件串口的RX和TX引脚
const int rxPin = 14; // 这个引脚需要连接到传感器的TX
const int txPin = 2; // 这个引脚需要连接到传感器的RX
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display

// 设置软件串口
SoftwareSerial mySerial(rxPin, txPin);

// 读取命令, 这需要替换成正确的指令
const byte readCommand[] = {0xFF, 0x01, 0x86}; // 读取指令
BlinkerNumber TVOC("tvoc");
BlinkerNumber CH2O("ch2o");
BlinkerNumber CO2("co2");
float tvoc;
float ch2o ;
int co2 ;

void setup() {
   
 u8g2.begin();
  u8g2.enableUTF8Print();

    #if defined(BLINKER_PRINT)
        BLINKER_DEBUG.stream(BLINKER_PRINT);
    #endif
    
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd); 

  // 初始化串口
  Serial.begin(9600);
  while (!Serial) {
    ; // 等待串口连接。
  }

  // 启动传感器串口
  mySerial.begin(9600);
  Serial.println("Sensor started in query mode");
      Blinker.attachDataStorage(dataStorage);
Blinker.attachHeartbeat(heartbeat); 

  // 发送读取指令
  sendReadCommand();

}
void heartbeat(){
  TVOC.print(tvoc);
       CH2O.print(ch2o);
        CO2.print(co2);
        // 清空显示屏
  u8g2.clearBuffer();
 
  // 设置显示文本
  // u8g2_font.c 中搜索u8g2_font_ 可以看到很多字体
  //u8g2.setFont(u8g2_font_6x12_tf);
  u8g2.setFont(u8g2_font_10x20_t_arabic);
  u8g2.setCursor(0, 15);
  u8g2.print("AIR QUALITY");
 u8g2.setCursor(0, 30);
  u8g2.print("TVOC: "+String(tvoc)+"mg/m3");
 u8g2.setCursor(0, 45);
  u8g2.print("CH2O: "+String(ch2o)+"mg/m3");

  u8g2.setCursor(0, 60);
  u8g2.print("CO2: "+String(co2)+"ppm");
  // 发送显示数据到显示屏
  u8g2.sendBuffer();
 
}
void dataStorage(){
    
      
  Blinker.dataStorage("tvoca", tvoc); //数据组件名,数据值
    Blinker.dataStorage("ch2oa", ch2o); //数据组件名,数据值
      Blinker.dataStorage("co2a", co2); //数据组件名,数据值
}
void loop() {
  // 检查是否有足够数据可读
  if (mySerial.available() >= 9) {
    // 读取一个数据包
    uint8_t packet[9];
    for (int i = 0; i < 9; i++) {
      packet[i] = mySerial.read();
    }
    
    // 计算污染气体浓度值
        tvoc = (packet[2] * 256 + packet[3]) * 0.01;
      ch2o = (packet[4] * 256 + packet[5]) * 0.01;
      co2 = packet[6] * 256 + packet[7];

    // 打印结果
    Serial.print("TVOC: ");
    Serial.print(tvoc);
    
   
    Serial.println(" mg/m3");

    Serial.print("CH2O: ");
    Serial.print(ch2o);
   
    
    Serial.println(" mg/m3");

    Serial.print("CO2: ");
    Serial.print(co2);
   
      
    Serial.println(" PPM");
    BLINKER_LOG("Blinker readString: ","aaa");
heartbeat();
    // 等待一段时间后再发送读取指令
    delay(2000);
    sendReadCommand();
Serial.println("BRINK...");
     Blinker.run();
  }
}

void sendReadCommand() {
  // 发送读取指令
  mySerial.write(readCommand, sizeof(readCommand));
  mySerial.flush(); // 确保指令发送完毕
}