1.实现的功能
本项目使用Wio Terminal 连接 VEML6070(紫外线传感器),SGP30 (二氧化碳(CO2)和挥发性有机化合物(VOC)传感器),DHT11(温湿度传感器),读取数据并在LCD屏幕上实时更新。
2. 各功能对应的主要代码片段 和 功能展示与说明
2.1 紫外线传感器 VEML6070
如下图所示,太阳光的紫外波段仍可依据波长继续细分为UVA,UVB,UVC。其中UVA的波长范围为320nm-400nm。
根据数据手册,此传感器对于355nm即UVA波段的紫外线最敏感。所以此传感器适用于监测UVA紫外线强度的应用场景。
使用CAN 总线接口与Wio Terminal 相连。Wio Terminal 的左侧Grove接口支持CAN协议。CAN总线支持多个设备同时连接通信,只要地址不同,因此使用扩展板将两个传感器连接在左侧接口即可。
代码(读取并显示UV强度部分):
#include <Wire.h>
#include "Adafruit_VEML6070.h"
Adafruit_VEML6070 uv = Adafruit_VEML6070();
uv.begin(VEML6070_1_T);
void loop() {
Serial.print("UV light level: "); Serial.println(uv.readUV());
//tft.fillScreen(TFT_BLACK); //Red background
tft.drawString("UV Light Level:", 0, 0);
tft.fillRect(0,40 , 100, 40,TFT_BLACK );
tft.drawString(String(uv.readUV()), 3, 40);
delay(1000);
}
2.2 VCO传感器 SGP30
同样使用CAN 总线接口与Wio Terminal 相连。测试 TVOC 和 eCO2 含量数据。
TVOC的主要成分是烃类、卤代烃、氧烃和氮烃,它包括:苯系物、有机氯化物、氟里昂系列、有机酮、胺、醇、醚、酯、酸和石油烃化合物等(引自知乎,原文链接)。
传感器的官方介绍如下:
GP30 是一个数字化多像素气体传感器,专为轻松集成到空气净化器、按需新风控制和物联网应用中而设计。SGP30 设计用于智能家居、家电和物联网应用,它提供两个经过校准的空气质量信号和湿度补偿功能。Sensirion 还通过 SGPC3 为移动应用提供低功率的可靠气体传感解决方案。
SGP30 可提供有关空气质量的更详尽指数。针对现实生活环境中的污染气体,该传感器具有无与伦比的可靠性,可以实现独一无二的长期稳定性和低漂移。
网址 SGP30 传感器介绍页
这段代码包含自动校准的过程,每秒需要运行一次测量,实现对传感器的校准。此外由于传感器需要湿度补偿,引入DHT11 对温湿度进行测量,实时补偿测量数据。
#include <Wire.h>
#include "Adafruit_SGP30.h"
Adafruit_SGP30 sgp;
int counter = 0;
void loop() {
if (! sgp.IAQmeasure()) {
Serial.println("Measurement failed");
return;
}
Serial.print("TVOC "); Serial.print(sgp.TVOC); Serial.print(" ppb\t");
Serial.print("eCO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm");
if (! sgp.IAQmeasureRaw()) {
Serial.println("Raw Measurement failed");
return;
}
Serial.print("Raw H2 "); Serial.print(sgp.rawH2); Serial.print(" \t");
Serial.print("Raw Ethanol "); Serial.print(sgp.rawEthanol); Serial.println("");
delay(1000);
counter++;
if (counter == 30) {
counter = 0;
uint16_t TVOC_base, eCO2_base;
if (! sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) {
Serial.println("Failed to get baseline readings");
return;
}
Serial.print("****Baseline values: eCO2: 0x"); Serial.print(eCO2_base, HEX);
Serial.print(" & TVOC: 0x"); Serial.println(TVOC_base, HEX);
}
}
2.3 温湿度传感器 DHT11
最简单的部分了,直接导入库,读取温度、湿度数据就行了。
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN A2
DHT11.read(DHT11PIN);
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
Serial.print("Temperature (oC): ");
Serial.println((float)DHT11.temperature, 2);
2.4 LCD 显示
Wio Terminal 的官方wiki,介绍了显示屏的使用方法。显示屏介绍
安装 Adafruit Zero DMA 库之后即可使用。 Adafruit 简直无所不包,本项目的两个传感器都使用对应的已经封装好的库,直接调用即可。
显示字符串的代码
#include"TFT_eSPI.h"
TFT_eSPI tft;
void setup() {
tft.begin();
tft.setRotation(3);
tft.fillScreen(TFT_RED); //Red background
tft.setTextColor(TFT_BLACK); //sets the text colour to black
tft.setTextSize(1); //sets the size of text
tft.drawString("Hello world!", 0, 0); //prints strings from (0, 0)
tft.setTextSize(2);
tft.drawString("Hello world!", 0, 10);
}
void loop() {}
还需要对显示数据进行刷新,通过绘制黑色方块的方法对旧数据显示区域进行覆盖,然后再显示新数据,类似黑板,要显示新内容,需要用黑板擦先把黑板变成黑色的板,然后再书写新内容,实现刷新。
tft.drawString("TVOC ", 0, 80);
tft.fillRect(120,80 , 60, 40,TFT_BLACK );
tft.drawString(String(sgp.TVOC), 120, 80);
tft.drawString(" ppb/t", 180, 80);
这段代码里还有坐标的概念需要说明,官方wiki,LCD坐标介绍
2.5 效果展示
如图所示,紫外线传感器、总可挥发性气体和等效二氧化碳传感器、温湿度传感器的数据在屏幕上汇总显示。
这部分展示主要放在已经上传的视频中,把温湿度传感器放到窗边可以看到温度急剧下降。
展示UV传感器的数据变化主要通过调整台灯的亮度和冷暖来实现,如图所示,UV强度为62,相对于刚才测试温湿度传感器的时候的6相比已经是10倍的辐射强度了。
为了测试TVOC和等效二氧化碳传感器,首先对室内通风后的情况进行了检测,TVOC此时仅为122 ppb/t 。接下来准备了面团,由于酵母菌无氧呼吸情况下会产生酒精和二氧化碳,这些产物刚好可以用来测试SGP30. 可以看到靠近面团后,传感器回传数据已经爆表。
3.对本活动的心得体会
这个活动很有意义,能够让大家在休息时间做个小玩具,以后一直插电可以放在家里随时监测空气质量。
5.可编译下载的代码
将所有功能集合在一起并实现显示的代码已经上传到附件中。