介绍
基于离线版的Arduino 小白的 DIY 空气质量检测仪(1~5),这里将扩展实现一个 WIFI 联网版的 DIY 空气质量检测仪。
- Arduino Nano 开发板作为传感器数据采集端,仓库在这里:
arduino-air-monitor - ESP8266 NodeMcu 开发板作为数据中转端,仓库在这里:arduino-air-monitor-transfer
- Linux Alpine + NodeJS 服务端作为数据接收、存储、分析端
接线图
主要就是在原来的接线基础上,增加了 ESP8266 开发板用作数据中转。
当然,这里有点“大材小用”了,其实可以使用其它更小ESP系列开发板,在这里,买了哪个就用哪个了,还带一个显示屏,方便一些。
串口通讯 - 单向
本章主要是解决 Arduino Nano 和 ESP8266 NodeMcu 两个开发板的通讯,基于 SoftwareSerial RX TX,本示例只需要实现 Arduino Nano 的 TX 到 ESP8266 NodeMcu 的 RX 即可。
本示例 Arduino Nano 使用它的 D11 作为 TX 引脚,而 ESP8266 NodeMcu 使用它的 D1 作为 RX 引脚,接一根线作为单向通讯线即可。
因此,下面将
在 arduino-air-monitor 中新增 tx.h 实现数据发送逻辑;
在 arduino-air-monitor-transfer 中新增 rx.h 实现数据接收逻辑。
数据帧定义
// 起始符 x 2 [2字节] 0XFF、0XFF
// display [1字节] 显示屏是否显示
// hcho [4字节]
// tvoc [4字节]
// co2 [4字节]
// temp [4字节]
// hum [4字节]
// uv [4字节]
// 检验位 [4字节] display ~ uv 的总和
这里传感器的数据都以 float 类型传递,均需要占用 4 个字节。
总得的下来,数据帧总长为 31 个字节。
数据发送
// arduino-air-monitor/tx.h
#include <SoftwareSerial.h>
// 实际可不接此引脚
#define _Pin_RX 10
// 实际只用此引脚
#define _Pin_TX 11
// 起始符
#define _Frame_Start 0XFF
// 数据帧长度:
#define _Frame_Len 31
namespace Transfer {
SoftwareSerial _serial(_Pin_RX, _Pin_TX);
uint8_t floatSize = sizeof(float); // 4
uint8_t int32Size = sizeof(int32_t); // 4
unsigned char floatBytes[4];
unsigned char int32Bytes[4];
struct _TX {
void init() {
_serial.begin(9600);
}
// display: 是否显示
void send(uint8_t display, float hcho, float tvoc, float co2, float temp, float hum, float uv) {
// 数据帧
byte buffer[_Frame_Len] = {
};
// 下标
uint8_t idx = 0;
// 起始符
buffer[0] = _Frame_Start;
buffer[1] = _Frame_Start;
idx += 2;
// 是否显示
buffer[2] = (unsigned char)display;
idx += 1;
// 4位/指标
memcpy(floatBytes, &hcho, floatSize);
for (uint8_t i