项目简介
本项目是基于RA4M2完成了环境监控网关设备,传感器HS3003采集温湿度,ISL29035采集环境光照强度,MQ5采集环境可燃气体浓度;温湿度,光照强度,可燃气体浓度通过wifi模块周期性上传到Onenet物联网平台;OLED提供显示功能,能够显示时间,温湿度以及wifi,蓝牙,云平台的连接状态;触摸按钮可以用来切换显示界面;该作品提供了台灯控制功能,可以通过蓝牙以及wifi控制台灯亮度以及开关。
更新说明
本来上周(2023/2/26)已经完成了大部分功能,但是比赛延迟了一周,所以又完善了一些功能,完善的功能如下:
- 增加了可燃气体检测功能;
- 增加了台灯控制功能;
- 增加了台灯亮度以及可燃气体浓度上传OneNet;
- 增加了蓝牙控制台灯功能;
- 增加了OneNet下发命令控制台灯功能
- 增加了bootloader功能(完成上位机以及下位机功能,但是bootloader跳转到application存在问题,还在排查)
- 优化了WIFI AT命令的超时机制,让WIFI AT控制响应速度更快,不用再每个命令都等待timeout之后才退出执行下一个命令,并且优化了识别逻辑,更加简洁
项目说明
使用模块以及设备
调试环境
开发环境:windows10;
IDE:MDK5.34;
RASC:V4.0.0;
调试器:ST-LINK V2;
外扩模块
- OLED: 显示信息
- HS3003:温湿度信息获取
- ISL29035:光照度模块
- DA14531:蓝牙模块 - 蓝牙控制台灯亮度
- DS16200:WIFI模块 - 同步本地时间以及连接onenet物联网平台,上传环境数据以及控制台灯亮灭
- MQ5:可燃气体浓度传感器
- L298电机驱动模块:用来控制台灯,让台灯和设备的供电电源隔开
板载资料使用
- LED3: GPIO驱动,周期性闪烁
- LED2:PWM3驱动,项目中未使用,用于调试
- LED1(P405): PWM1驱动,连接台灯引脚,可以通过触摸按钮TS2以及实体按钮SW1和SW2控制亮度,同时可以通过物联网以及蓝牙控控制
- TS1:触摸按钮,控制OLED切换显示界面
- TS2:触摸按钮,用于控制台灯的亮度
- SW1:实体按钮,用于确定台灯亮度减小,按下TS2之后台灯光亮度减弱,直到0
- SW2:实体按钮,用于确定台灯亮度增大,按下TS2之后台灯亮度增大,直到100%
- RTC:实时时钟,WIFI模块获取的网络时间会同步到RTC
- 定时器:用来监控WIFI模块AT命令超时以及控制LED1周期性闪烁
- 串口9:与电脑通信串口,打印调试信息
- 串口0:串口用于wifi AT命令使用
- 串口4:串口蓝牙透传通信
- 外部中断(P008):用来监控蓝牙模块连接状态
- ADC0 CH0(P000): 采集MQ5可燃气体传感器的浓度
软件资料使用
软件使用了FreeRTOS作为实时嵌入式系统,多个线程结合使用。
- os_init_thread:初始化线程,初始化板载资源以及公共资源,初始化完成之后关闭该线程
- key_thread:实体按钮以及触摸按钮周期性采样任务
- display_thread:显示控制任务,用来控制OLED屏显示
- bt_thread:蓝牙控制线程,未使用
- wifi_thread:wifi控制线程,用来控制单片机与wifi模块的AT命令通信,以及发送数据到OneNet,同时从OneNet接收命令
- sensor_thread:传感器线程,用来周期性采集HS3003,ISL29035以及MQ5采样数据
- mutex_sci3_i2c_Mutex: 互斥量,用来解决同一个IIC总线上两个设备同时访问IIC总线时的冲突问题
- wifi_mutex_Mutex:互斥量,用来解决wifi模块通信期间的冲突
- event_group_0_Event_Group:事件组,用来处理任务键的同步,即所有任务都要等待初始化任务完成初始化才会开始运行
资源使用情况如下:
硬件架构图
硬件架构图实现如下:
软件实现逻辑
- 上电之后,做系统初始化,在初始化线程中作外设模块以及内部设备的初始化,初始化完成之后各个线程开始运行,初始化线程终止;
- 按键线程启动,周期性检测按键以及触摸按钮按下状态;
- 蓝牙线程启动,检测蓝牙命令并做出响应,主要是检测台灯控制命令;
- wifi控制线程启动,初始化wifi模块 -> 发送控制命令 -> 连接路由器 -> 获取网络时间并更新到RTC -> 获取传感器数据并传递给Onenet物联网平台 -> 接收物联网平台发送的数据,并解析控制台灯亮度;
- 显示线程启动:显示启动界面 -> 1s后进入主界面,OLED显示wifi连接状态,蓝牙连接状态,IOT云平台连接状态,温湿度信息,时间,日期,星期等信息 -> 此时按下TS1进入传感器数据显示界面 -> 显示温湿度,可燃气体浓度,环境光强度等信息 -> 再次按下TS1退回主界面;
- 传感器线程启动,周期性采集各个传感器的数据;
- 上述步骤2~6同步进行;
下面是控制逻辑:
- 按下SW2之后,之后一直按着触摸按钮TS21,LED1以及台灯会由暗到明增加亮度,直到最亮100%;
- 按下SW1之后,之后一直按着触摸按钮TS1,LED1以及台灯会由明到暗减小亮度,直到不亮;
- 蓝牙连接之后,OLED主界面的蓝牙图标不会再闪烁,连接断开或者未连接,主界面的蓝牙图标闪烁;
- wifi连接到路由器之后,主界面的WIFI图标不会再闪烁,连接断开或者未连接,主界面wifi图标闪烁;
- 成功连接到onenet云平台之后,主界面的IoT图标不会再闪烁,连接断开或者未连接,主界面IoT图标闪烁;
- 当连接了OneNet之后,oneNet下发台灯亮度命令,台灯亮度会变化;
- 蓝牙连接之后,蓝牙发送台灯亮度控制命令,台灯亮度会变化。
下面介绍一些重点内容:
启动界面
上电之后的显示界面,会在此界面停留一秒钟。
主显示界面
温湿度显示界面
主界面按下TS1切换到该界面;再次按下TS1退回主界面。
-
显示温度(摄氏度);
-
显示湿度(百分比);
-
显示环境光亮度(Lux);
-
显示可燃气体浓度(ppm)
蓝牙控制界面
-
蓝牙发送【Lamp:台灯亮度】就可以控制台灯了,例如发送【Lamp:80】,台灯就会按照80%的占空比的PWM驱动。
-
蓝牙发送命令给网关,网关识别成功并执行命令之后返回【Success】,识别失败返回【Fail】
云平台介绍
平台选择
阿里云物联网平台:
本来打算使用阿里云物联网平台的,但是在实际操作过程中,阿里云的Client ID很长,而且有','在ClientID中,DA16200会将逗号识别为一个参数,会一直反馈ERROR -3,表示参数过多,加了转义字符以及双引号都一直解决不了这个问题,遂放弃。
腾讯云物联网平台:
与阿里云有一样的问题,但是不是clientId,而是其他参数,会导致返回ERROR -4的故障,表示参数错误,一直解决不了,遂放弃。
onenet中移物联网平台:
onenet提供了多种协议连接方式,本来想使用MQTT协议的,onenet的MQTT参数比较简单,DA16200配置MQTT的相关参数是没有问题的,但是设置完成之后还是不能正常通信,一直打不开客户端,折腾了很长时按都打不开客户端,解决不了,遂放弃。
最后本来都打算放弃云平台的连接了,使用本地连接,但是看到了onenet还有一个tcp透传,想着试一下,结果还成功了,所以本项目使用了TCP透传与onenet平台连接。
云平台连接
云平台的连接过程还是一波三折,TCP透传需要使用lua脚本来解析单片机发送给云平台的数据,但是本人从来没有使用过lua脚本,所以这个解析脚本尝试了很久才成功,主要是将接收到设备的数据解析为想要的数据由云平台显示。
我设计了一个数据显示的格式:
T+$温度+H+$湿度+L+$光照强度+M+$可燃气体浓度+P+$台灯亮度
举例,如果上传的温度为35.2度,湿度为56.2%,光照强度为123Lux,可燃气体浓度3000ppm,台灯亮度为65%,为则数据格式应该为:
T35.2H56.2L123M3000P65
OneNet收到上述数据之后会进行解析之后,分别显示在不同的数据流中。
网关没5s发送一次数据给OneNet平台。
云平台收到了数据之后会反馈一个字符串"received",设备(RA4M2)可以由此知道数据有没有发送成功。
Lua脚本就会解析这个格式的数据,然后分析显示到Temp,Humi,Lux的数据流中。
- Lua代码在本文附件中提供,以及gitee也可以获取。
下面是设备加载的Lua脚本:
下面是云平台接收的数据:
下面是调试信息,通过串口打印,可以看到发送给oneNet的数据以及OneNet反馈的数据:
下面是云平台下发的控制命令:
命令格式是【Lamp:台灯亮度】,比如【Lamp:80】表示设置台灯亮度为80%
Bootloader制作
Bootloader使用串口实现,目的是通过板载USB串口UART9来实现软件的在线更新,扩展目标是实现WIFI更新固件(时间关系,未实现),目前实现了上位机软件,支持hex数据的下发,网关RA4M2 bootloader实现了对收到的hex数据接收并解析,并将收到的数据写到对应的flash地址,但是从bootloader跳转到用户app没有实验成功,还没找到问题原因。
地址划分:
- 用户应用程序的地址应该从0x20000开始
- bootloader地址区域为0x0~0x1FFFF。
目前实现功能如下:
- 上位机下载软件,支持选择hex文件,以及解析hex数据,使用串口下载hex数据,支持串口波特率可配,每次下载完成之后会接收下位机的反馈,用于检查数据是否被下位机成功接收并且下位机收到的数据是否正确完整;
- 实现下位机bootloader软件串口数据接收,识别hex数据包,并解析hex文件,计算校验和,并将hex数据写到对应的地址区域;
- 完成flash代码的写入,但是跳转部分存在问题,跳转之后软件启动不了,没找到问题原因,还需后期再查。
目前先记录完成的功能。
上位机
上位机使用的是python开发,加载hex文件并通过串口下发,可以通过控制台查看发送以及反馈信息用于debug数据。
上位机会显示下载进度
下位机功能:
下位机上电之后LED1 100ms闪烁一次连续闪烁一秒钟,表示进入了bootloader,之后会检测到application是有效,如果有效就跳转到app,无效就等待上位机发送hex文件,hex文件接收完成之后就跳转到app。
如果上电的时候按下SW1或者SW2,表示不进入app,在app有效的情况下可以停留在bootloader中,持续按下SW1或者SW2直到LED1闪烁完成。
bootloader实现流程:
bug记录:
如下图,hex文件可以通过上位机下载到下位机的flash中,但是下载之后跳转到app中之后不能正常运行app的代码,我将下载到flash中的代码反读取过,并与原始hex文件做了对比,下载写入到falsh中的数据和原始hex文件是一致的,该问题还需后期排查。
总结
本次比赛学习到了很多东西,对云平台的连接有了更深入的了解,同时对RA4M2单片机的内核以及控制有了充足的认知,RA4M2上手快速,对新手很友好,可以用来开发强大功能的设计作品。瑞萨官方提供的传感器使用起来也很方便,能够快速上手,但是DA16200使用起来有些问题,对于同一个命令,有时候执行正常,有时候却返回ERROR信息,CAN模块没有使用成功,可能是打开方式不对,时间关系没在深究了,后期在验证原因。
感谢电子发烧友以及瑞萨提供的机会。
项目演示
全家福
演示视频放到了bilibili:
附件
网关工程:
*附件:99_ra4m2_gateway_Prj.7z
ONENET TCP透传Lua脚本:
*附件:OneNet TCP透传Lua脚本.7z
Bootloader上位机以及工程:
(注:实现了上下位机通信以及下位机flash写入,但是从bootloader跳转到application没成功)
*附件:bootloader上位机以及工程.7z
以下是参加活动发帖分享记录
下面是参加RA4M2使用活动的分享:
【瑞萨RA4系列开发板体验】1. 新建工程+按键控制LED
【瑞萨RA4系列开发板体验】2. KEIL环境搭建+STLINK调试+FreeRTOS使用
【瑞萨RA4系列开发板体验】3. KEIL下UART实现printf与scanf重定向
【瑞萨RA4系列开发板体验】4. PWM驱动LED
【瑞萨RA4系列开发板体验】5. 硬件IIC驱动OLED显示汉字
【瑞萨RA4系列开发板体验】6. ADC测量摇杆模块偏移量
【瑞萨RA4系列开发板体验】7. 用DAC输出正弦波以及余弦波
【瑞萨RA4系列开发板体验】8. 超声波测距模块在RA4M2上的应用
【瑞萨RA4系列开发板体验】9. 用两路DAC在示波器上显示一个爱心
RA4M2挑战赛分享:
【RA4M2设计挑战赛】1. RASC配置FreeRTOS
【RA4M2设计挑战赛】2. 硬件IIC读取HS3003的温湿度数据
【RA4M2设计挑战赛】3. 硬件IIC读取ISL29035采集光照强度
【RA4M2设计挑战赛】4. DA14531蓝牙模块使用
【RA4M2设计挑战赛】5. DA16200 wifi模块操作
【RA4M2设计挑战赛】6. DA16200 wifi使用TCP透传连接OneNet