通过网络控制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,实现手机与板子之间的状态上报和控制信息下行。