【XR806开发板试用】+ 通过网络控制led并上报按键状态

2023-12-15 11:09:12

通过网络控制led并上报按键状态

本次做一个手机通过mqtt服务器控制板子上的LED亮灭,板子也可以将按钮状态变化通过mqtt服务器上报给手机的功能
硬件上,从原理图看,LED接到了PA21,高电平点亮。
在这里插入图片描述

按键则时接到了PA11,并接了一个上拉电阻。
在这里插入图片描述

因此,设计上就可以通过按键上升沿中断,作为按键按下一次的事件,然后本地取反一次LED灯,并publish灯的状态给手机端,同时,会subscribe订阅灯的状态,接收手机端publish过来的LED控制数据。而手机端则可以publish控制数据,其中0作为关灯,发送1作为开灯,同时也subscribe订阅板子publish上来的LED状态数据。
Mqtt的服务器使用自行搭建的emqx broker
在这里插入图片描述

下面就开始整代码。首先拷贝mqtt demo代码默认配置
cp project/demo/hello_demo/gcc/defconfig .config
然后先make build_clean将之前的代码清掉
然后使用vim打开mqtt的main.c代码

先定义LED和key的io引脚
在这里插入图片描述

再进行引脚的初始化,初始化中进行了LED亮灭2次闪烁,表示初始化成功。定义按键引脚为上升沿中断,中断中取反LED的亮灭状态,并更新led_state的值。
在这里插入图片描述

然后在main函数中调用初始化。
在这里插入图片描述

下面进行mqtt服务器相关参数的配置,如下,这里定义了两个topic,分别是MQTT_DEMO_TOPIC和MQTT_DEMO_PUB_TOPIC,前者订阅LED的状态,以控制LED的亮灭,后者则可上报按钮状态。HOST_NAME为mqtt服务器主机的ip地址或者域名

在这里插入图片描述

初始化 mqtt
在这里插入图片描述

Mqtt连接
在这里插入图片描述

订阅以及订阅的消息回调,其中在消息回调中,判断接收到的消息是字符0还是字符1,并进行响应的LED亮灭操作。

发布则是进行对应主题的发布操作
在这里插入图片描述

接下去就是mqtt主处理功能函数,其中主要是维持mqtt连接,并根据本地的按键控制的LED状态是否改变,决定是否publish上报改状态
在这里插入图片描述

最后就是主函数初始化硬件、功能和网络,并启动mqtt主进程了。

编译,下载运行
在这里插入图片描述

使用mobaxterm打开端口终端,可以看到如下打印信息
在这里插入图片描述

Wlan的wifi ssid和password是通过命令行command line的方式进行配置的

在这里插入图片描述

我们需要使用的主要是上面的三条,分别是
配置ssid:net ap set ssid ssid_example
配置password:net ap set psk psk_example
使能启动连接:net ap enable
连接wifi并成功连接mqtt服务器

此时mqtt broker服务器上也就能看到开发板设备连接上了

在这里插入图片描述

打开手机的MQTTool工具app(iPhone)
点击connect
在这里插入图片描述

就可以在emqx上看到对应的手机设备连接了

在这里插入图片描述

App切换到subscribe选项卡,输入 KEY/STATE 订阅主题,并点击Subscribe订阅该主题
在这里插入图片描述

轻按开发板上的按钮,可以看到板载的LED亮灭切换

在这里插入图片描述

在这里插入图片描述

同时串口终端中输出对应的信息
在这里插入图片描述

而在手机端的app上,切换到subscr选项卡,就可以看到每按一次按键,开发板publish发不上来的消息了
在这里插入图片描述

再切换到Publish选项卡,输入 LED/STATE 内容作为publish发布的主题
此时在Message框中输入1,并点击publish,就可以看到灯亮起

在这里插入图片描述

在这里插入图片描述

而输入0并点击publish发布,则看到灯灭

在这里插入图片描述

同时,开发板在收到上述的两次publish主题消息之后,还会在串口终端上打印如下内容。
在这里插入图片描述

在emqx上可以看到完整的主题
在这里插入图片描述

以及订阅方了
在这里插入图片描述

至此,小制作实现了LED和按钮的功能,并通过mqtt,实现手机与板子之间的状态上报和控制信息下行。

文章来源:https://blog.csdn.net/weixin_47569031/article/details/135009625
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。