【摘要】介绍本次开发项目的主要功能及实现方法:GIGA R1 WIFI开发板通过采集模块获取室内环境数据,并通过PC端或移动端的网页UI界面对室内环境数据进行监测、控制等;
一、硬件介绍
1、产品特点
Arduino GIGA R1 WiFi 开发板,提供76个GPIO引脚(其中12个为模拟端口、12个PWM、4个串行端口、3个I2C、2个SPI、1个FDCAN、1个SAI);
采用双核STM32H747XI微控制器(480MHz的Cortex-M7内核和240 MHz的Cortex-M4内核);
配备2MB闪存、1MB内存,以及6MB外部闪存和8MB SDRAM;
通过板载Murata 1DX模块实现WiFi和低功耗蓝牙连接;
还有输入/输出3.5mm音频插孔、JTAG连接器、20Pin的Arducam相机连接器等;


主要特性
微控制器:STMicro STM32H747XI Cortex-M7@480 MHz + M4 @ 240 MHz MCU(2MB 双组闪存、1MB RAM)
内存:8MB SDRAM
存储:16MB QSPI NOR 闪存
无线功能:2.4GHz WiFi 802.11b/g/n和蓝牙 5.1 BR/EDR/LE(Murata 1DX 模块)
接口
显示屏:20pin接口
摄像头:20pin Arducam摄像头接口
USB1x USB Type-C 端口用于编程和 HID1x USB 2.0 主机 Type-A 端口
音频:3.5 毫米音频插孔
调试:JTAG 连接器
电源:通过VIN引脚提供6 ~ 24V输入
VRT(为RTC供电)和 OFF(关闭电路板电源)引脚
复位按钮、BOOT0按钮、RGB_LED、电源LED
安全功能:Microchip ATECC608A
每个 I/O 引脚 8mA
二、功能实现
1、硬件介绍
GIGA R1 WiFi 上的无线功能(2.4GHz Wi-Fi / 蓝牙)模块是 LBEE5KL1DX-883,芯片为Infineon(CYW4343W),该模块需使用外部天线;
主要原理图
2、多功能环境采集模块
采集模块为Arduino Nicla Sense ME,主控为nRF52832 (64 MHz) ,配备了Bosch Sensortec的具有高线性、高精度,可探测气压、湿度、和温度的 BME688 四合一气体传感器,可检测挥发性有机化合物 (VOC) 等;
特性
引脚图
系统框图
3、功能效果
功能效果:开发板与采集模块通过串口连接,开发板通过WIFI连接局域网内的IP地址,并通过网页UI界面来无线监测 / 控制当前室内的相关环境数据;
主要功能如下:
室内环境信息采集:通过采集模块获取室内环境信息(温湿度、气压、CO2、IAQ、VOC等),然后将数据通过串口传输至开发板上;
数据监测 / 控制:将获取到的相关数据处理后,并通过板载的WIFI功能,在网页UI界面上对相关数据进行监测 / 控制等;
主要分为以下三大部分:数据采集、UI界面显示、数据交互;
3.1、数据采集
GIGA R1 WIFI开发板,通过串口功能接收采集模块传输采集到的室内环境信息(温湿度、气压、CO2、IAQ、VOC);
采集模块将每秒采集到的数据,通过串口TX传输到连接的开发板串口RX上;
接收到的数据格式如下:Temp:22.26, Hum:68, Press:101275等,用于后续UI界面数据等显示;
3.2、UI界面显示
整体UI界面效果图如下:
可使用移动端 / PC端进行访问及控制;
移动端UI界面:
PC端UI界面:
3.3、数据交互
以下主要介绍环境数据监控、历史环境数据变化趋势图等功能;
3.3.1、环境数据监控
主要分为两大功能:监测、控制
监测:显示当前实时的环境数据;
以温度为例:
左侧依次为当前监测项的名称【温度】、数值【23.0°C】、数值百分比UI进度条【0~100%】;
(其中下方的IAQ、CO2、TVOV的数值下方还会显示当前监测值的状态【优秀】)
右侧为当前监测项对应的UI图标;
控制:对监测项数据进行监测控制;
(温度、湿度、大气压力均可自定义设置不同的监测阈值,当数值超过设定的阈值时,将会显示警报状态,直至小于设定阈值)
数据监测控制:点击温度、湿度、气压卡片即可设置监测阈值;
(温度、湿度、大气压力均可自定义设置不同的监测阈值,当数值超过设定的阈值时,将会显示警报状态,直至小于设定阈值)
数据状态显示:空气质量指数(IAQ)、二氧化碳含量、挥发性有机物(VOC)会根据不同的标准范围值,显示不同的UI效果状态【良好 / 一般 / 较差】等;
范围值标准主要如下:
3.3.2、环境数据变化趋势图
整体数据曲线变化显示
指定数据(温度)曲线变化显示
3.4、实物效果
引脚连接
实物搭建效果图
主要运行流程图
三、代码编写
1、采集模块
采集模块通过UART功能(TX),每秒发送采集到的相关数据到连接的GIGA R1 WIFI设备上
采集到的数据 示例:
主要相关代码
#include "Nicla_System.h" #include "Arduino_BHY2.h" // 传感器对象初始化 Sensor temperature(SENSOR_ID_TEMP); Sensor humidity(SENSOR_ID_HUM); Sensor pressure(SENSOR_ID_BARO); Sensor gas(SENSOR_ID_GAS); SensorBSEC bsec(SENSOR_ID_BSEC); unsigned long lastPrintTime = 0; const unsigned long printInterval = 1000; // 1000ms void setup() { Serial.begin(115200); Serial1.begin(115200); while (!Serial1); nicla::begin(); if (!BHY2.begin()) { Serial.println("初始化失败"); while (1); } // 启动传感器 temperature.begin(); humidity.begin(); pressure.begin(); bsec.begin(); } void loop() { BHY2.update(); // 每秒输出数据 if (millis() - lastPrintTime >= printInterval) { lastPrintTime = millis(); Serial1.print("Temp: "); Serial1.println(temperature.value()); // ℃ Serial1.print("Hum: "); Serial1.println((int)humidity.value()); // % Serial1.print("Press: "); Serial1.println((int)pressure.value()); // pa Serial1.print("IAQ: "); Serial1.println(bsec.iaq()); Serial1.print("CO2: "); Serial1.println(bsec.co2_eq()); // ppm Serial1.print("VOC: "); Serial1.println(bsec.b_voc_eq()); //mg/m3 } }
2、GIGA R1 WIFI部分
串口打印当前的IP地址
主要相关代码
#define MY_SSID "WIFI名称" #define MY_PASS "WIFI密码" #include "web_ui.h" // 网页UI界面 const char* ssid = MY_SSID; const char* pass = MY_PASS; WiFiServer server(80); // 传感器数值 float Temp = 0.0f, Press = 0.0f, VOC = 0.0f; int Hum = 0, IAQ = 0, CO2 = 0; float Temp_last = 0.0f, Press_last = 0.0f, VOC_last = 0.0f; int Hum_last = 0, IAQ_last = 0, CO2_last = 0; // 传感器数据获取 void getData() { while (Serial1.available()) { String input = Serial1.readStringUntil('\n'); input.trim(); if (input.length() == 0) continue; if (input.startsWith("Temp:")) { float value = input.substring(5).toFloat(); if (value != 0) { Temp = value; Temp_last = value; } } else if (input.startsWith("Hum:")) { int value = input.substring(4).toInt(); if (value != 0) { Hum = value; Hum_last = value; } } else if (input.startsWith("Press:")) { float pa = input.substring(6).toFloat(); float kpa = pa / 1000.0f; if (pa != 0) { Press = kpa; Press_last = kpa; } } else if (input.startsWith("IAQ:")) { int value = input.substring(4).toInt(); if (value != 0) { IAQ = value; IAQ_last = value; } } else if (input.startsWith("CO2:")) { int value = input.substring(4).toInt(); if (value != 0) { CO2 = value; CO2_last = value; } } else if (input.startsWith("VOC:")) { float value = input.substring(4).toFloat(); if (value != 0) { VOC = value; VOC_last = value; } } } if (Temp == 0) Temp = Temp_last; if (Hum == 0) Hum = Hum_last; if (Press == 0) Press = Press_last; if (IAQ == 0) IAQ = IAQ_last; if (CO2 == 0) CO2 = CO2_last; if (VOC == 0) VOC = VOC_last; } static void reqHeaders(WiFiClient& client) { while (client.connected()) { String line = client.readStringUntil('\n'); if (line == "\r" || line.length() == 0) break; } } void sendHeader200(WiFiClient& client, const char* contentType) { client.println("HTTP/1.1 200 OK"); client.println("Connection: close"); client.println("Cache-Control: no-store"); client.println("Access-Control-Allow-Origin: *"); client.print("Content-Type: "); client.println(contentType); client.println(); } void setup() { Serial.begin(115200); Serial1.begin(115200); // 接收数据 // 连接 WIFI WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(3000); Serial.print("."); } Serial.println(); // 打印当前IP地址 server.begin(); Serial.print("IP: "); Serial.println(WiFi.localIP()); } void loop() { getData(); // 服务器连接 WiFiClient client = server.available(); if (!client) return; // HTTP请求 String reqLine = client.readStringUntil('\n'); reqLine.trim(); reqHeaders(client); String path = "/"; if (reqLine.startsWith("GET ")) { int sp1 = reqLine.indexOf(' '); int sp2 = reqLine.indexOf(' ', sp1 + 1); if (sp1 >= 0 && sp2 > sp1) path = reqLine.substring(sp1 + 1, sp2); } // 发送页面内容 / json数据 if (path == "/") { sendIndex(client); } else if (path == "/data") { //json数据路径 String json = "{"; json += "\"temperature\":" + String(Temp, 1) + ","; json += "\"humidity\":" + String(Hum) + ","; json += "\"pressure\":" + String(Press, 2) + ","; json += "\"iaq\":" + String(IAQ) + ","; json += "\"co2\":" + String(CO2) + ","; json += "\"voc\":" + String(VOC, 2); json += "}"; sendHeader200(client, "application/json; charset=utf-8"); client.print(json); } delay(1); client.stop(); // 释放 }
网页UI界面: web_ui.h 相关代码
四、程序烧录
1、连接USB数据线至开发板;
2、选择端口号对应的开发板;
3、点击 上传 烧录程序到开发板上;
五、效果演示
通过采集模块获取室内环境数据(温湿度、气压、CO2、IAQ、VOC),并在网页UI界面上对相关数据进行监测 / 控制等;
六、总结
在本次开发中,采集模块与GIGA R1 WIFI开发板采用UART方式进行通信,并通过PC端或移动端的网页UI界面进行监测、控制等;
不过GIGA R1 WIFI具有双核STM32H747XI微控制器,以及无线模块支持蓝牙功能,后续或许可以通过M4核的蓝牙功能进行数据传输,然后再通过M7核进行数据界面UI显示等;
这样就可以将采集模块置于任何地方(单独供电 / 相互独立),只要在蓝牙范围内就可以采集指定地方的环境数据了,然后再通过手机端进行远程的数据查看 / 控制等;


























我要赚赏金
