前记
家里装修快一年多了,到了夏天儿童房开空调后,长期房间密闭,总闻到一股味道,应该是苯之类的可挥发气体超标。于是就有了这个小玩意。
效果演示
在oled屏幕显示
手机上也能查看
指标解释
TVOC(总挥发性有机化合物)的标准范围通常被认为是安全的浓度是在0.6mg/m³以下。
甲醛(HCHO),国家规定的入住标准测量值不超过0.08mg/m³。
室内co2标准一般在500到700PPM左右。在大自然环境里,空气中二氧化碳的正常含量是0.04%(400PPM),在大城市里有时候达到500PPM。而室内没有人的情况下,二氧化碳浓度一般在500到700PPM左右
所需硬件
esp8266开发板
jw01空气质量传感
oled显示屏
接线图
注意观察线的颜色,可以对应上
代码
#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(); // 确保指令发送完毕
}