Funpack3-5
——板卡三 任务二:分布式家居监测系统
一、项目介绍
本项目依托于Funpack3-5活动,使用嵌入式板卡-服务器-客户端三方配合的模式,实现了基于局域网通信的分布式家居监测系统。用户可以随时随地使用客户端或网页查看当前室内的温度、湿度、气压及加速度信息。
项目内容:
1、驱动X-Nucleo-IKS4A1传感器板卡。
2、多传感器融合计算环境参数。
3、同步信息至服务器及客户端。
应用场景
本项目为一分布式家居监测系统的简单样例。项目基于WiFi通信,相比蓝牙通信等,具有抗干扰能力更强,通信距离更远,无需额外安装网关等优点。本项目使用的传感器板卡X-Nucleo-IKS4A1同时具有多个温湿度、气压、磁场以及加速度传感器。本系统除可以多传感器融合修正,得到更精准的温湿度及气压测量结果外。磁场和加速度传感器让其具有测量磁场变化以及加速度变化的能力。因而,采取一定防护措施后,其还可以用于分布式的地震测量、管道防盗挖及超高层楼宇的环境与振动监测。
二、总体架构
图2 总体结构图
系统的总体结构如图2所示。板卡通过网络连接至Arduino Cloud,向服务器双向传输数据。用户可以通过手机App或者通过网页,接收并查看Arduino Cloud服务器分发的数据。
三、受控端软件
在上手UNO板卡时,意外发现Arduino Cloud这一软件,尝试使用后发现其开发简单,无需本地编辑。虽然编译时间极长,但瑕不掩瑜。同时,ST官方也给出了IKS4A1的Arduino程序。因而,本项目采用Arduino Cloud开发。
3.1 配置Arduino UNO R4固件
在使用Arduino Cloud开发之前,首先需要为UNO R4定制固件,以连接到Cloud。这部分比较简单,绝大部分可以根据Cloud的指示自行完成,Arduino 官方的板卡可以自动识别。注意,电脑需要安装一软件以访问本地端口。
初始化后,添加本地WiFi网络,使板卡从网络连接至Cloud。需要注意的是,UNO R4使用的WIFI模块为ESP32-S3,该模块为WIFI4协议,仅支持2.4G频段,可能不支持部分WIFI6及以上网络。作者使用华为路由器,需开启WIFI5备用网络,板卡方可正常连接。
同时,需要配置Cloud Variables,这是会网络同步的变量。根据需求,也可以连接至Google Home等智能家居系统,亦或基于Webhook发送信息。
然后,可以在sketch页面编写程序,在Metadata页面设定一些宏定义参数等。免费订阅仅能通过数据线下载程序,付费订阅可以通过WiFi更新固件。
最后,可以在DashBoard页面图形化编辑一些控件来更直观的显示数据。或者在setup页面也能查看各远端变量当前数值及更新时间。
3.2 软件架构
图 3.2
软件流程图如图3.2所示。系统上电后首先初始化串口;然后初始化传感器,其中包括初始化I2C端口,启动各传感器,使能各传感器;然后初始化网络通信,主要是连接Arduino Cloud。然后进入主循环,首先读取各传感器数据,然后对各传感器数据进行线性滤波,最后向Arduino Cloud更新数据。
3.3 软件实现
以下代码为初始化代码,得益于Arduino框架下优异的兼容性,传感器调用驱动开始和使能即可,其余则是串口、I2C等外设以及Arduino Cloud初始化。
void setup() {
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
DEV_I2C.begin();
AccGyr.begin();
AccGyr.Enable_X();
AccGyr.Enable_G();
AccGyr2.begin();
AccGyr2.Enable_X();
AccGyr2.Enable_G();
Acc3.begin();
Acc3.Enable_X();
Mag.begin();
Mag.Enable();
PressTemp.begin();
PressTemp.Enable();
Temp3.begin();
Temp3.Enable();
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
/*
The following function allows you to obtain more information
related to the state of network and IoT Cloud connection and errors
the higher number the more granular information you’ll get.
The default is 0 (only errors).
Maximum is 4
*/
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}
以下这部分代码是主循环,实现了传感器读值,部分参数进行了线性滤波,以及云端数据更新,云端数据更新依赖于Arduino Cloud官方API。
void loop() {
ArduinoCloud.update();
// Your code here
// Read humidity and temperature.
HumTemp.GetHumidity(&hum_sht40);
HumTemp.GetTemperature(&temp_sht40);
// Read pressure and temperature.
PressTemp.GetPressure(&pressure_lps22);
PressTemp.GetTemperature(&temp_lps22);
temp=0.5*temp_lps22+0.5*temp_sht40;
AccGyr.Get_X_Axes(acc1);
AccGyr2.Get_X_Axes(acc2);
Acc3.Get_X_Axes(acc3);
acc=(sqrt(sq(acc1[0])+sq(acc1[1])+sq(acc1[2]))+sqrt(sq(acc2[0])+sq(acc2[1])+sq(acc2[2]))+sqrt(sq(acc3[0])+sq(acc3[1])+sq(acc3[2])))/3-1005.5;
ac=sqrt(sq((acc1[0]+acc2[0]+acc3[0])/3)+sq((acc1[1]+acc2[1]+acc3[1])/3)+sq((acc1[2]+acc2[2]+acc3[2])/3))-1005;
}
四、最终效果
具体效果请参考视频,此处放出客户端截图。
五、展望
由于作者并不从事地震监测、管道安防及环境监测等相关行业,此处仅能展示传感器经过一定处理后的数据。如果结合地震的震动模型、挖机等的震动模型亦或暴雨来临前气压的下降模型等,相信本项目能在多种专业场景下发光发热。