【平头哥RVB2601创意应用开发】环境监测终端08-作品提交
[复制链接]
基于CH2601的分布式环境监测终端
作者:sipower
随着工业发展,环境问题日益严重,除了常规的治理方法,对环境的实时监测也是管理环境的一种必要手段。本创意作品采用RVB2601开发板实现环境监测的物联网终端,在道路、小区、公园等公共场所多点布置该终端,可形成分布式监测网络,通过WiFi将检测结果上传云服务器,可以供环境部门进行大数据统计,为环境治理提供助力。
本作品采用RVB2601开发板自带的麦克风采集噪音数据,经过量化转化为实时噪音水平。通过串口外接了一个温湿度采集模块,可以实时读取温湿度数据。采集到的数据均可在OLED屏幕上显示,并且设计了一个横向动态指示条,可以直观显示噪音的实时数据。通过板载WiFi模块连接阿里云物联网,实现web端实时查看监测数据。特别的设计一个指示灯端口,可以通过云端控制其开关。在实际应用中,可以将本模块安装于现有路灯中,通过指示灯端口控制路灯开关,实现云端智能控制。
图1、作品照片
该终端整个系统框图如下,基础功能包括:噪音采集,温湿度采集,OLED显示结果,WiFi上传和下载,云端管理,远程灯光开关。预留扩展功能包括:光照度检测,空气质量检测,卫星定位数据解析。
图2、系统框图
本作品目前已经实现的功能主要包含:噪音采集,温湿度采集,OLED显示,云端连接,web界面监控。下面分别详细介绍。
1、噪音采集
噪音采集使用RVB2601开发板自带的麦克风采集周围的声音,记录单位时间内的最大值,经过量化的数据用以表示环境噪音水平。
硬件原理方面,RVB2601 通过 I2S 和 I2C 总线连接 ES7210 ADC 芯片,实现硅麦的音频信号采样。采用I2C接口完成ES7210的配置,采用I2S接口读取ES7210的转换数据。
图3、噪音采集电路
软件驱动设计使用了CODEC编解码库,主要使用AD的输入通道。在官方例程ch2601_ft_demo基础上,截取其中录音部分代码。因为本次应用只需要声音幅值,对其代码大幅删减改造,将缓存缩小,只保留一个采样周期就行,每次采样完成,计算这个周期内的音频数据最大值,这个结果就作为要输出的实时音量数据。此数据还需要经过校准量化成最终的分贝值,比较遗憾的是没有借到分贝仪,没有实现最终的数据量化,只能简单除以一个系数,展示一下效果。从串口输出采集到的噪音值如下图。
图4、串口输出音量
2、温湿度采集
本次使用的RVB2601开发板不带温湿度传感器,要想获得这两个参数,需要外接检测模块。检察了一下手头的资源,发现以前评测《安信可UWB室内定位模组》攒下的模块可以通过串口输出温湿度数据,软件接口也比较简单,就选定了此模块作为数据源。
图5、UWB模块
从CH2601的GPIO复用关系表格中可以看到,几乎每一个IO口都用上了,仔细研究OLED程序发现驱动代码并没有使用SPI接口,而是直接用IO模拟的SPI总线,这就给了我机会,可以用其他IO口替换掉被占用的串口引脚。考虑到我这个作品基本不用RGB三色灯,决定把这个灯的其中两个IO口转给OLED,这样就能空出UART1的收发引脚了。
图6、改造后原理图
在软件设计方面,首先是更改OLED的驱动程序,重新设置引脚定义,代码更改后重新编译下载,程序直接就好使,没有遇到任何问题。然后是编写UART1驱动程序。中间遇到诸多问题,最终使用HAL库的中断收数超时机制实现了预期的目标。
3、OLED显示
RVB2601开发板内置了一款分辨率为128*64的单色OLED显示屏,并且基于此平台移植完成了开源的LVGL GUI库。此前并没有使用过LVGL GUI库,这次现学现用,正好尝试一下。
首先设计界面草稿。我计划在屏幕上显示5行信息。第一行,标题,直接使用标签显示即可。第二行,温度,左边字段不需要更新,右边字段需要定时刷新,也全部使用标签显示。第三行和第四行分别是湿度和噪音水平,和温度显示采用一样方法。第五行计划做一个指示条,用来动态指示噪音的实时幅度,这样查看起来比较直观。
图7、界面草稿
实际设计的时候遇到各种问题。首先是如何显示中文,经查询得知要自己制作内置字库并添加,看了几个教程,很繁琐的样子,为了加快速度,决定跳过这个中文显示,改用英文也是一样。
下一个问题是默认使用的英文字体是“LV_FONT_MONTSERRAT_14”比较大,如果显示5行看着太挤了,通过更改配置项使用“LV_FONT_MONTSERRAT_12”字体相对好一点。我还试了改成更小的字体,有点惨不忍睹,都不能分辨了,有点像电影里的火星文。
做标题显示的时候,看到LVGL支持滚动显示,为了体现咱的学习成果,把原计划的两个单词的标题改成了一句话,让它在最上面滚动显示,展示更多信息。
在设置温度显示的时候,需要显示浮点数,我按照常规的方式写代码发现不能正常显示,然后查阅资料发现应该是为了提高效率,默认设置成了不支持浮点模式。本来想查手册改成支持浮点模式,后面看到有人采用了更妙的方法解决了。就是先将浮点数格式化成字符串,然后再以字符串显示就没问题了,我按照此方法操作,顺利解决此问题。
最后一个要实现的是噪音指示条。经过反复查阅手册,最终确定使用进度条“LV_BAR”控件设计。直接按照手册简单例程搞上去后,发现两端都是圆角,不是我喜欢了类型。然后一通大搜索,被我找到了解决方案,经过我反复修改和调试,终于把界面框架搭建出来。
图8、显示效果图
4、云端连接
RVB2601开发板内置了联盛德公司⾼性能&安全的 WiFi4 芯⽚ W800,W800 通过 SPI ⼝与 CH2601 连接。W800 已经默认烧录基于 AT 的 WiFi 透传固件,支持阿里云平台,开发者可基于 AT ⽹络指令,快速实现物联网的应⽤场景。
首先是阿里云物联网平台的准备工作。登陆阿里云IoT Studio平台,地址如下。
https://account.aliyun.com/login/login.htm?qrCodeFirst=false&oauth_callback=https%3A%2F%2Fstudio.iot.aliyun.com%2Fproject%2Fa123jX2VXQqAfhnk%2Fdevices%2Fa1iO8mTqhOz%2Fdev_001%2F1
在主页中点击“产品”一栏,进入产品列表,然后点击“创建产品”,录入自己想要的信息,点击最下面的确认,产品就创建完成。进入产品管理界面,添加产品属性,其中标识符是单片机和阿里云通讯的重要握手信息,最好设成简明好记的,编程时方便调试。我的产品主要是温度、湿度、噪声水平三个参数的采集,和一个指示灯的设置,共有四个属性。这些参数的数据类型和数据定义也要和单片机程序里面的一致。产品设置好后,添加设备。完成后在设备信息界面可以查看相关的证书密钥,如下图,这个回头用于单片机和阿里云连接用。
图9、设备信息
至此阿里云端的设置就完成了。可以通过不同的界面查看各种配置,多熟悉一下就能熟练使用,整个操作界面还是很友好的。
然后是单片机程序编写。我是在ch2601_webplayer_demo 示例⼯程基础上进行的更改。通过在w800_api.c ⽂件⾥添加连接云平台的控制函数,接收数据的回调函数可以实现物联网连接和数据收发。具体的可以参考附件中的代码,此处不再赘述。在此处特别说明一下,由于云端传回的信息是JSON格式,需要在工程中添加cJSON库进行解码。下图是连接阿里云成功,从云端看到数据更新了。
图10、云端连接成功
5、web界面监控
为了展示环境监测的效果,我在阿里云IoT Studio平台设计一个web应用,将温度、湿度、噪声水平用仪表盘和折线图展示。为指示灯设计一个按钮和状态指示器,可以在云端控制其开关。
具体开发过程如下。登陆阿里云IoT Studio平台,地址如下。
https://account.aliyun.com/login/login.htm?qrCodeFirst=false&oauth_callback=https%3A%2F%2Fstudio.iot.aliyun.com%2Fproject%2Fa123jX2VXQqAfhnk%2Fdevices%2Fa1iO8mTqhOz%2Fdev_001%2F1
在主页中点击“新建web应用”,在弹出对话框中填入需要的信息,点击最下面的确认按钮创建应用。应用创建完成后进入编辑界面,具体各部分功能如图所示,根据自己需要进行页面设计。
图11、页面设计
如果不太熟悉这个设计规则,官方也有详细的指导教程,见如下链接。
https://help.aliyun.com/document_detail/141613.html
根据需要添加组件,可以手工填入每个组件的坐标和大小,让排列更整齐。我为温度、湿度、噪声水平设置了仪表盘来显示实时数据,设置了折线图展示最近一个小时的数据变化。设置了一个按钮来控制指示灯开关,并用一个图标显示指示灯的状态。
图12、设置好的界面
接下来为每个组件配置数据源。以温度仪表盘为例,选中它,然后点击右边配置数据源,在弹出的对话框中依次选择目标产品,设备,属性,就能把组件和具体设备参数关联起来。在配置过程中,可以随时点击右上角的预览按钮,查看设计效果。配置完所有组件后,就可以选择发布了。我的这个应用页面效果如下图,各个参数均展示出来了。
图13、页面效果图
如果有多台监测终端,可以把这一页编成一组,然后把各组并列展示,就是分布式监测系统了。
链接如下:
https://download.eeworld.com.cn/detail/sipower/623518
本次作品在设计过程中展示了多个不同成果的视频,分别如下链接。
1、炫彩呼吸灯的效果
https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/userFiles/3890563388320980992/1649070469990/f4ee2f8055053c901c341b0b137ae8ee.mp4
2、云端控制开发板的LED灯开关
https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/userFiles/3890563388320980992/1649159094646/6492d5b42765f70bb8422b9e510771c8.mp4
3、界面动态显示效果
https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/userFiles/3890563388320980992/1649592613590/6fc5b63d2371cd9ad821bc7efc3eb63d.mp4
4、音乐光条效果
https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/userFiles/3890563388320980992/1650183724917/398df15910dd3e353262460f73a36173.mp4
5、在LVGL中显示音量变化
https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/userFiles/3890563388320980992/1650183742370/83e0fe35d8b0d7b46ca455feaa5f3993.mp4
6、温湿度的数据采集并显示
https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/userFiles/3890563388320980992/1650647426254/1c18d9ea0e2063c1da4d5ff9fb17f08e.mp4
7、完成的作品展示
https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/userFiles/3890563388320980992/1650900845446/8f34e6a49992ecda1979a2433c647019.mp4
这个作品大概用了一个月的业余时间设计完成。感谢平头哥提供的开发板和热心的技术支持,感谢EEWORLD提供展示的平台。通过本次作品设计,我学习了RISC-V的相关知识,感受到了国产芯片和开发平台的进步,相信总有一天,我们终将让国产芯片在世界各个地方发挥其不可替代的作用。
设计过程中,同时在平头哥和EEWorld发帖分享经验总结,链接汇总如下:
环境监测终端01-开箱及设计炫彩呼吸灯
https://occ.t-head.cn/community/post/detail?id=4031491954960900096
https://bbs.eeworld.com.cn/thread-1198865-1-1.html
环境监测终端02-连接阿里云控制LED灯
https://occ.t-head.cn/community/post/detail?id=4031864498838708224
https://bbs.eeworld.com.cn/thread-1198899-1-1.html
环境监测终端03-使用LVGL设计界面
https://occ.t-head.cn/community/post/detail?id=4033682146182443008
https://bbs.eeworld.com.cn/thread-1199385-1-1.html
环境监测终端04-声音采集和动感光条显示
https://occ.t-head.cn/community/post/detail?id=4036161692982980608
https://bbs.eeworld.com.cn/thread-1200134-1-1.html
环境监测终端05-温湿度采集和显示
https://occ.t-head.cn/community/post/detail?id=4038106809214054400
https://bbs.eeworld.com.cn/thread-1200906-1-1.html
环境监测终端06-将数据同步到阿里云
https://occ.t-head.cn/community/post/detail?id=4038813387730259968
https://bbs.eeworld.com.cn/thread-1201066-1-1.html
环境监测终端07-web应用设计
https://occ.t-head.cn/community/post/detail?id=4039168982010368000
https://bbs.eeworld.com.cn/thread-1201211-1-1.html
在此处分享一些设计过程中的一些经验总结,希望对大家有帮助。
1、代码容量不够问题
当我把lvgl库和wifi库同时加入工程后,编译会提示编译完的代码超范围,意味着用户代码空间不够了。我仔细研究了flash默认配置,发现总共512KB的容量,只给了用户程序分配了256KB,剩下还有好多留给升级缓存了。在我这个作品中,没有计划做OTA升级,因此完全可以把用户空间扩大。具体操作如下图。
图14、修改分区表
打开config.yaml分区表文件,将prim用户空间扩大,具体扩大到多少根据自己需要改,别超出flash有效范围就行。我这改到384KB。misc为升级缓存空间,起始地址也要注意修改成对应的新地址。改完注意保存。打开gcc_flash.ld文件,将flash长度修改成和config.yaml一样的,保存。这两个文件改完后,我们就有更多空间存代码了。
2、CDK中不能查看函数定义问题
在CDK中,右键函数,选择“goto declaration”可以查看函数定义。若点击后无法跳转,一般情况下是没有自动对工程进行解析,可以手动进行:
点击菜单栏 Project -> parse all project,等待Project View中的进度条结束,再次通过“goto declaration”功能,然后即可正常进行函数的查看。
3、获得平头哥官方提供的cJSON库的方式
连接物联网时,由于云端传回的信息是JSON格式,需要用到cJSON库进行解码。我推荐一个很容易获得平头哥官方提供的cJSON库的方式。在CDK欢迎页面,第一个实例是《WiFi智能灯控》例程,把它下载下来,不用编译,你会发现在“__workspace_pack__”这个文件夹下就有了cJSON库了。然后在库管理里面将cJSON库添加到工程中即可。
4、在LVGL中显示浮点数
在设置温度显示的时候,需要显示浮点数,我按照常规的方式写代码发现不能正常显示,然后查阅资料发现应该是为了提高效率,平头哥移植的LVGL默认设置成了不支持浮点模式。本来想查手册改成支持浮点模式,后面看到有人采用了更妙的方法解决了。就是先将浮点数格式化成字符串,然后再以字符串显示就没问题了,我按照此方法操作,顺利解决此问题。
5、注意在编辑上报字符串中”\”的数量。
在编辑cJSON字符串时,其中有一个消息是这样的:
snprintf(msg_buf,80,"{\\\"temp\\\":%.1f,\\\"humi\\\":%.1f,\\\"noise\\\":%d,\\\"led\\\":%d}",res_data.temp,res_data.humi,res_data.noise,res_data.led);
我开始没注意,少敲了一个,导致数据上传出错,查找了好长时间才发现。
环境监测终端_作品提交.docx
(1.84 MB, 下载次数: 4)
|