STM32CubeMonitor 介绍(三)
例程三:利用公有云平台进行远程数据监控
前面的两个例子,都是在本地电脑上进行监测。
接下来的这个例子,将演示如何利用CubeMonitor的网络节点,将数据转发到远程电脑进行显示。
在这个例子中,我们会用到X-NUCLEO-IKS01A2传感器扩展板,通过MCU读取传感器扩展板上的加速度值和湿度值,并且MCU可以控制开发板上的LED2的状态。然后通过CubeMonitor实时监控传感器值和LED灯的状态,并且将数据上传到公有云平台,并在另一台远程电脑上进行显示。
通过这个例子,我们将学习:
1.仪表盘(Gauge),文字输出(Text),开关(switch)等Dashboard组件的使用。
2.不使用Write Panel节点,如何修改变量值。
3.如何利用网络节点与云端服务器进行通信。
具体来说,MCU端代码需要完成的工作有:
1.配置I2C,通过I2C读取传感器扩展板上的湿度和加速度传感器的值
2.配置PC13为外部中断模式来控制板上的蓝色按键
3.配置PB7为GPIO输出,控制板上的LED2
CubeMonitor端,需要创建两个运行在不同电脑上的流:
•LocalMonitor:运行在本地,从开发板读取数据,通过Dashboard显示,同时通过MQTT协议上传到公有云平台
•RemoteMonitor:运行在远程电脑上,通过MQTT协议接收公有云平台下发的数据,并通过Dashboard展示
使用CubeMX进行以下配置:
•PB7配置为GPIO输出来控制板上的LED2状态
•PC13配置为外部中断模式,检测板上的蓝色按键操作
•初始化I2C1(PB8,PB9),作为MCU与传感器扩展板的通信接口
•添加MEMS插件,使得CubeMX能自动添加传感器驱动代码和初始化代码
在main.c中,手动添加图中的用户代码,完成以下功能:
•初始化传感器模块,并在主循环中读取传感器的值
•检测到按键按下后,在主循环中改变LED2的状态
我们再回到CubeMonitor的设置。首先先来创建LocalMonitor流。新建一个basic流,再在basic流的基础上进行修改。
本例程中要监测的变量有加速度传感器的值,湿度值和LED灯的状态,为了后面处理起来更方便,我们将其分成MotionSensor,EnvSensor和LED_Status三个变量组,采样模式使用direct模式,并按照上图进行配置和连接。
接下来,使用三个processing节点分别对myProbe_in节点接收到的数据进行分类处理。
接收到的加速度传感器值,直接送到chart节点进行显示。湿度值经过“single value”子流程处理成单个的数值后,送到仪表盘节点进行显示。LED灯的状态经过处理后在dashboard用ON/OFF的文字实时显示。
下面我们分别对这三条流进行说明。
Processing节点的输出数据可以直接连接到chart节点显示,所以在MotionSensor这个processing节点中设置它的输出为axes_value.x,axes_value.y,axes_value.z这三个变量,然后将其输出连接点直接连接到chart节点进行显示就可以了。
Processing节点输出的消息是不能直接连接到仪表盘节点进行显示的,所以需要通过“子流程”对processing节点的输出进行修改,让payload仅输出变量的值。如上图,EnvSensor节点的输出先连接到“Hum_value”子流程,在这个节点里对消息进行修改,仅输出湿度值作为payload,再连接到仪表盘节点进行显示。
同样,送往文字框显示的消息也要经过子流程的修改。除此以外,因为LED灯状态这个变量在代码中是通过1和0来表示灯是点亮还是熄灭的,所以经过processing节点和子流程后,输出的消息就是1或者0。但是我们希望最终在文字框显示的是ON或者OFF,所以还需要将数字1和0,转换成字符串ON和OFF。这里我们添加function节点,通过一段简单的javascript代码来完成这个转换工作。function节点的配置见上图。
三组变量的采集和显示部分已经完成,接下来我们要添加流来完成通过Dashboard上的switch开关切换LED状态的功能。
该功能用到了dashboard的switch节点,两个change节点,variables节点,如上图进行连接。
switch节点的作用是在dashboard上添加一个开关,拨动开关可以输出两条不同的消息。在switch节点的编辑界面配置:当开关拨到“on”状态时,输出数字1;当开关拨到“off”状态时,输出数字0,topic字段设置为“write”。
change节点可以设置多条规则,对输入消息的字段进行设定,修改,删除,转移等操作。这里的第一个change节点的作用是将switch节点的topic字段替换成其payload的值。这样替换的目的是为了消息经过下一个variables节点后,还能利用topic字段保留switch节点输出的on/off状态。
接下来的variables节点中,设定要修改的变量名及地址。可以导入可执行文件,从变量列表中选择LED_toggle变量。
经过variables节点后输出的消息payload变成了变量名称,地址,类型和采样参数等内容,但topic字段的内容还没变,保留输入消息中对应的值。这样的消息还不能直接输出到myProbe_Out节点,所以需要用到第二个change节点来对消息做一些调整。
在这个名为”BuildWriteMsg”的change节点中,通过三条规则做了三件事情:
1.将payload.variablelist[0].value的值替换成topic的值,这个值就是switch节点改变状态时输出的数值。
2.再将payload.variablelist[0].value的值转换成字符串。
3.将topic字段改回“write”。
经过这个change节点的处理后,输出的消息就跟write panel节点一样的了,这时就可以直接连接到myProbe_Out节点输出了。
现在已经可以在本地监控程序的运行了,接下来我们还要添加一些网络节点,将数据发送到云端。
在本例程中,我们使用百度云物联网平台进行消息转发,电脑与百度云物联网平台之间通过MQTT协议通信,所以接下来用到的是MQTT节点。
使用了三个MQTT输出节点分别向加速度传感器,湿度和LED灯的状态等三个MQTT主题发布消息。连接方式见上图。在加速度传感器值这一路,添加了一个子流程来过滤数据,仅将其中的x轴加速度通过MQTT节点发送到云端。
使用了一个MQTT输入节点,向云端订阅控制LED灯的主题,来接收云端的LED控制命令,连接方式见上图。MQTT输入节点做为另一个输入源连接到了修改LED_toggle变量值的流,之前的一个输入源是dashboard的switch节点。
在MQTT输出节点配置消息发布的主题,服务器的地址,Client ID和MQTT连接的用户名,密码。用到了多个MQTT节点时,Client ID尽量设置不同。MQTT服务器的地址,用户名和密码以及主题这些信息,在百度云物联网平台创建产品设备后就会获得。百度云物联网平台的操作过程,这里就不做说明了,可以查看百度云物联网平台的说明。
在MQTT输入节点配置消息订阅的主题,服务器的地址,Client ID和MQTT连接的用户名,密码。
LocalMonitor端的流全部编辑完成,整个流的内容见上图。调整Dashboard布局,再部署运行后,就可以在本地监测加速度传感器的值和湿度值,并通过dashboard控制板子上的灯了。
接下来,我们将创建RemoteMonitor。RemoteMonitor中主要实现的是联网功能,即:通过MQTT节点接收云端下发的开发板信息(加速度传感器,湿度和LED灯状态)并在dashboard上显示;将dashboard的switch开关状态发送到云端对应的主题,以控制开发板上的LED灯。整个流的构成也相对简单,使用三个MQTT输入节点,分别订阅加速度传感器,湿度和LED灯的状态等三个主题的消息并连接到对应的dashboard显示节点;一个MQTT输出节点,接收switch节点的输入并向控制LED灯的主题发布控制命令。
上图所示就是整个RemoteMonitor流的内容。湿度值和LED灯的状态这两个数据的显示比较简单,将MQTT输入节点的数据直接连接到仪表图节点和文字显示框节点就可以了。
从MQTT输入节点接收到的加速度值没有时间信息,所以在其后增加了一个change节点,根据chart节点对输入消息的格式要求添加timestamp字段,并删除了无用的qos和retian字段。注意这里使用的是node-red的dashboard组件中的chart节点。
这里的switch节点,我们设置它在切换到on和off的状态时,分别输出数字1和0。switch的输出直接连接到MQTT输出节点,将控制信息发送到云端的对应主题。
MQTT节点的配置方法和前面的一样,这里就不再说明了。
RemoteMonitor端的流全部编辑完成,整个流的内容见上图。在远程电脑上部署运行后,就可以监测开发板上加速度传感器和湿度值,并通过dashboard控制板子上的灯了。
关于CubeMonitor使用的三个例程已经全部介绍完毕,下面是一些在使用STM32CubeMonitor时可能会遇到的问题。
1. 部署运行后,点击START按钮启动采样,但图上的变量都为0,有时甚至会看到一些明显不对的显示值。
出现这种情况,可能有两个原因:ST-LINK连接出问题,这时候在调试窗口会有系统发的出错信息。重新插拔ST-LINK可以解决问题;第二个原因是因为MCU程序发生了变化,但CubeMonitor里的变量列表没有更新。在variables节点中更新变量地址就可以了。
在 https://wiki.st.com/stm32mcu/wiki/STM32CubeMonitor:Troubleshooting 中还有其它一些出错的处理。
2. 一进入调试模式,CubeMonitor就断开。
如果想要在CubeMonitor监测同时进行调试,那么就需要将CubeMonitor和IDE都配置成sharedmode。
• 在CubeMonitor的settings.js文件中将STLinkdriver与debuger的连接方式改为TCP(默认是P2P)
• 在IDE(CubeIDE/IAR/KEIL)中将st-link配置为shared mode(具体操作见上图)
在 https://wiki.st.com/stm32mcu/wiki/STM32CubeMonitor:How_to_configure_shared_mode 有相关介绍。
3. 如何添加外部节点
• 通过菜单下的“manage palette”可以安装导入外部节点
• 如果菜单下没有“manage palette”选择,则需要安装node.js( https://nodejs.org/zh-cn/ )
4. Direct和snapshot模式的区别
• Direct模式下,每次采样由CubeMonitor触发,采样速度在variables节点中设定,一般选择“sequential loop”,可以达到最高速度
• Snapshot模式下,实际的采样频率由用户代码中调用DumpTrace函数的频率决定。Variables节点中的采样频率,设定的是CubeMonitor去读MCU中保存采样数据buffer的频率。
在 https://wiki.st.com/stm32mcu/wiki/STM32CubeMonitor:How_to_modify_frequency_of_acquisition 对此也有介绍。
5. 如何通过平板和手机访问运行在另一电脑上的CubeMonitor
如果这些设备在一个局域网内的话,可以通过浏览器输入运行CubeMonitor的电脑的IP地址加1880端口号进行访问。
• 输入ipaddress:1880 可访问编辑界面
• 输入ipaddress:1880/ui,可访问dashboard