# RA4M2_Gateway **Repository Path**: hehung/ra4-m2_-gateway ## Basic Information - **Project Name**: RA4M2_Gateway - **Description**: 本项目是基于RA4M2完成了环境监控网关设备,传感器HS3003采集温湿度,ISL29035采集环境光照强度,温湿度以及光照强度通过wifi模块周期性上传到Onenet物联网平台;OLED提供显示功能,能够显示时间,温湿度以及wifi,蓝牙,云平台的连接状态;触摸按钮可以用来切换显示界面;蓝牙模块与手机蓝牙通信,可以通过手机发送指令控制LED亮灭。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-02-26 - **Last Updated**: 2023-08-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 目录说明 - Onenet TCP透传Lua解析脚本: ONENET平台TCP透传的数据解析脚本,结合工程使用 - bootloader上位机以及工程:bootloader的代码以及上位机(存在bug,bootloader跳转application存在问题) - images:readme.md文件中所需图片 - ra4m2_gateway_prj:RA4M2环境检测网关工程 # 项目简介 本项目是基于RA4M2完成了环境监控网关设备,传感器HS3003采集温湿度,ISL29035采集环境光照强度,MQ5采集环境可燃气体浓度;温湿度,光照强度,可燃气体浓度通过wifi模块周期性上传到Onenet物联网平台;OLED提供显示功能,能够显示时间,温湿度以及wifi,蓝牙,云平台的连接状态;触摸按钮可以用来切换显示界面;该作品提供了台灯控制功能,可以通过蓝牙以及wifi控制台灯亮度以及开关。 # 项目说明 ## 使用模块以及设备 ### 调试环境 开发环境: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:事件组,用来处理任务键的同步,即所有任务都要等待初始化任务完成初始化才会开始运行 资源使用情况如下: ![](./images/04.jpg) ## 硬件架构图 硬件架构图实现如下: ![](./images/03.jpg) ## 软件实现逻辑 1. 上电之后,做系统初始化,在初始化线程中作外设模块以及内部设备的初始化,初始化完成之后各个线程开始运行,初始化线程终止; 2. 按键线程启动,周期性检测按键以及触摸按钮按下状态; 3. 蓝牙线程启动,检测蓝牙命令并做出响应,主要是检测台灯控制命令; 4. wifi控制线程启动,初始化wifi模块 -> 发送控制命令 -> 连接路由器 -> 获取网络时间并更新到RTC -> 获取传感器数据并传递给Onenet物联网平台 -> 接收物联网平台发送的数据,并解析控制台灯亮度; 5. 显示线程启动:显示启动界面 -> 1s后进入主界面,OLED显示wifi连接状态,蓝牙连接状态,IOT云平台连接状态,温湿度信息,时间,日期,星期等信息 -> 此时按下TS1进入传感器数据显示界面 -> 显示温湿度,可燃气体浓度,环境光强度等信息 -> 再次按下TS1退回主界面; 6. 传感器线程启动,周期性采集各个传感器的数据; 7. 上述步骤2~6同步进行; 下面是控制逻辑: 8. 按下SW2之后,之后一直按着触摸按钮TS21,LED1以及台灯会由暗到明增加亮度,直到最亮100%; 9. 按下SW1之后,之后一直按着触摸按钮TS1,LED1以及台灯会由明到暗减小亮度,直到不亮; 10. 蓝牙连接之后,OLED主界面的蓝牙图标不会再闪烁,连接断开或者未连接,主界面的蓝牙图标闪烁; 11. wifi连接到路由器之后,主界面的WIFI图标不会再闪烁,连接断开或者未连接,主界面wifi图标闪烁; 12. 成功连接到onenet云平台之后,主界面的IoT图标不会再闪烁,连接断开或者未连接,主界面IoT图标闪烁; 13. 当连接了OneNet之后,oneNet下发台灯亮度命令,台灯亮度会变化; 14. 蓝牙连接之后,蓝牙发送台灯亮度控制命令,台灯亮度会变化。 下面介绍一些重点内容: ### 启动界面 上电之后的显示界面,会在此界面停留一秒钟。 ![](./images/06.jpg) ### 主显示界面 - 左上角显示wifi,蓝牙,云平台的连接状态,未连接时,闪烁;连接成功,常亮; - 右上角显示温度,湿度信息,周期性切换显示; - 正中间显示时间; - 左下角显示日期,年和月日,周期性切换显示; - 右下角显示星期。 ![](./images/07.jpg) ### 温湿度显示界面 主界面按下TS1切换到该界面;再次按下TS1退回主界面。 - 显示温度(摄氏度); - 显示湿度(百分比); - 显示环境光亮度(Lux); - 显示可燃气体浓度(ppm) ![](./images/05.jpg) ### 蓝牙控制界面 - 蓝牙发送【Lamp:台灯亮度】就可以控制台灯了,例如发送【Lamp:80】,台灯就会按照80%的占空比的PWM驱动。 - 蓝牙发送命令给网关,网关识别成功并执行命令之后返回【Success】,识别失败返回【Fail】 ![](./images/09.jpg) ## 云平台介绍 ### 平台选择 阿里云物联网平台: 本来打算使用阿里云物联网平台的,但是在实际操作过程中,阿里云的Client ID很长,而且有','在ClientID中,DA16200会将逗号识别为一个参数,会一直反馈ERROR -3,表示参数过多,加了转义字符以及双引号都一直解决不了这个问题,遂放弃。 腾讯云物联网平台: 与阿里云有一样的问题,但是不是clientId,而是其他参数,会导致返回ERROR -4的故障,表示参数错误,一直解决不了,遂放弃。 onenet中移物联网平台: onenet提供了多种协议连接方式,本来想使用MQTT协议的,onenet的MQTT参数比较简单,DA16200配置MQTT的相关参数是没有问题的,但是设置完成之后还是不能正常通信,一直打不开客户端,折腾了很长时按都打不开客户端,解决不了,遂放弃。 最后本来都打算放弃云平台的连接了,使用本地连接,但是看到了onenet还有一个tcp透传,想着试一下,结果还成功了,所以本项目使用了TCP透传与onenet平台连接。 ### 云平台连接 云平台的连接过程还是一波三折,TCP透传需要使用lua脚本来解析单片机发送给云平台的数据,但是本人从来没有使用过lua脚本,所以这个解析脚本尝试了很久才成功,主要是将接收到设备的数据解析为想要的数据由云平台显示。 我设计了一个数据显示的格式: ```C 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脚本: ![](./images/01.jpg) 下面是云平台接收的数据: ![](./images/00.jpg) 下面是调试信息,通过串口打印,可以看到发送给oneNet的数据以及OneNet反馈的数据: ![](./images/02.jpg) 下面是云平台下发的控制命令: 命令格式是【Lamp:台灯亮度】,比如【Lamp:80】表示设置台灯亮度为80% ![](./images/10.jpg) # Bootloader制作 > Bootloader使用串口实现,目的是通过板载USB串口UART9来实现软件的在线更新,扩展目标是实现WIFI更新固件(时间关系,未实现),目前实现了上位机软件,支持hex数据的下发,网关RA4M2 bootloader实现了对收到的hex数据接收并解析,并将收到的数据写到对应的flash地址,但是从bootloader跳转到用户app没有实验成功,还没找到问题原因。 用户应用程序的地址应该从0x20000开始,bootloader使用的地址区域为0x0~0x1FFFF。 目前实现功能如下: 1. 上位机下载软件,支持选择hex文件,以及使用串口下载,支持串口波特率可配; 2. 实现下位机bootloader软件串口数据接收,,并解析hex文件,将hex文件信息写到对应的地址区域; 3. 完成flash代码的写入,但是跳转部分存在问题,跳转之后软件启动不了,没找到问题原因,还需后期再查。 目前先记录完成的功能。 ## 上位机 上位机使用的是python开发,加载hex文件并通过串口下发。 ![](./images/11.jpg) 下位机功能: 下位机上电之后LED会闪烁一秒钟,表示进入了bootloader,如果检测到application是有效的就跳转到app,无效就等待上位机发送hex文件,hex文件接收到了之后就跳转到app。 如下图,我已经将下载到flash中的代码反读取过了,与下载的代码一致。 ![](./images/12.jpg) 在已经存在app的情况下,如果想进入bootloader,则在上电的时候按下并保持SW1或者SW2直到LED1闪烁完成,则不会进入用户程序,停留在bootloader,可以再次下载了。 ## 总结 本次比赛学习到了很多东西,对云平台的连接有了更深入的了解,同时对RA4M2单片机的内核以及控制有了充足的认知,RA4M2上手快速,对新手很友好,可以用来开发强大功能的设计作品。瑞萨官方提供的传感器使用起来也很方便,能够快速上手,但是DA16200使用起来有些问题,对于同一个命令,有时候执行正常,有时候却返回ERROR信息,CAN模块没有使用成功,可能是打开方式不对,时间关系没在深究了,后期在验证原因。 感谢电子发烧友以及瑞萨提供的机会。 # 项目演示 全家福 ![](./images/08.jpg) 演示视频放到了bilibili:[https://www.bilibili.com/video/BV1LT411e71K/](https://www.bilibili.com/video/BV1LT411e71K/)