649|2

143

帖子

4

TA的资源

一粒金砂(高级)

楼主
 

【得捷电子Follow me第2期】任务5:通过网络控制WS2812B [复制链接]

  本帖最后由 Tristan_C 于 2023-9-2 23:42 编辑

本次进行任务5,通过网络控制WS2812B,也就是结合123,在手机上通过网络控制板载Neopixel LED的显示和颜色切换,屏幕同步显示状态。

其实题目已经给了提示,是结合任务123,那么网络的功能,屏幕的显示包括中文,以及WS2812B也都已经支持,本次只需要增加远程控制功能,并将控制的LED结果在显示屏上做个显示。考虑物联网设备的操作操作方便性和合理性,决定采用mqtt,参考官方的mqtt demo操作例程,可以实现手机的mqtt客户端发布控制灯颜色(包括关闭),开发板订阅等控制主题,即可控制灯的开关和颜色变化。另外开发板也可发布消息,手机mqtt客户端订阅消息,从而开发板可以给手机发送消息。

首先在任务123的基础上,增加下面两个库,作为mqtt操作的基础。

其中在example里面也有非常丰富的mqtt例程。

除了上述两个主要相关的之外,本次主要用到的库如下

完成之后,按照前面几个任务套路,先打印任务并开始wifi连接

这里进行了连接失败的处理,也就是失败时候延时复位主控。

然后就是RGB LED的初始化配置

显示屏初始化

接下来定义mqtt客户端的两个函数,一个是connected连接上函数接口,一个是message接收消息处理函数接口,收发时以3字节的LED三色RGB为payload

其中,connected函数接口中,进行消息的订阅。而消息接收函数接口中,则进行数据的解析,并决定LED的亮灭以及颜色,同时在显示屏上显示,另外还通过publish发布了一个结果OK给另一端。

然后进行mqtt客户端的初始化并尝试建立连接,需要注意,本次测试没用使用username和password。

然后就是主循环进程了,在其中主要进行了异常判断和解决,以及循环获取mqtt客户端数据

保存代码启动运行。

此后我们首先要进行mqtt broker的服务器部署,这里选用emqx。

在设备启动之后打印如下信息表明设备连接mqtt broker成功,并等待订阅消息来临。

设备端开发板显示屏信息如下

此时在emqx的dashbord中的连接中就能看到对应的设备了,下图中圈起来的设备。

在手机端(iPhone)下载如下软件

进行如下broke信息配置之后点击连接

连接上之后,在 Subscribe选项卡中填写订阅的主题,并点击Subscribe进行订阅

接下来在Publish选项卡中填写发布的主题

然后就可以在app上进行下行发布消息控制LED的亮灭和颜色了

此时在emqx的dashboard中可以看到发布和订阅的主题如下

控制LED亮红色

控制亮绿色

控制亮蓝色

熄灭LED,也就是将颜色设置为0

 

每次设备收到之后,都会通过publish发布消息,此时手机端的APP就可以收到OK的消息了

 

在Mu Edit的REPL打印中也能看到对应的信息

 

代码如下

import time
import ssl
import os
from random import randint
import microcontroller
import socketpool
import wifi
import board
import neopixel
import displayio
import terminalio
import adafruit_minimqtt.adafruit_minimqtt as MQTT
from adafruit_io.adafruit_io import IO_MQTT
from adafruit_display_text import bitmap_label, label
from adafruit_bitmap_font  import bitmap_font


print("Flow Me Task 5:Control the LED through the network")

# WiFi
try:
    print("ESP32 connecting to %s" % os.getenv("WIFI_SSID"))
    wifi.radio.connect(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"))
    print(f"ESP32 connected to {os.getenv('WIFI_SSID')}")
    print(f"My MAC address: {[hex(i) for i in wifi.radio.mac_address]}")
    print(f"My IP address: {wifi.radio.ipv4_address}")
# Wi-Fi connectivity fails with error messages, not specific errors, so this except is broad.
except Exception as e:  # pylint: disable=broad-except
    print("Failed to connect to WiFi. Error:", e, "\nBoard will hard reset in 30 seconds.")
    time.sleep(30)
    microcontroller.reset()

#  NeoPixel
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
pixel.brightness = 0.3

display = board.DISPLAY
board.DISPLAY.brightness = 0.35
board.DISPLAY.rotation = 0

group = displayio.Group()
weather_color=0x00FF00

font = bitmap_font.load_font("lib\wenquanyi_9pt.pcf")
text_area = label.Label(font, text="等待接收\nNeoPixel 订阅...", color=weather_color)
text_area.x = 2
text_area.y = 30
text_area.line_spacing = 0.8
text_area.scale = 2

group.append(text_area)
display.show(group)

def connected(client):
    print("连上 MQTT Broker!  等待接收...")
    # 订阅 "neopixel"
    client.subscribe("neopixel")

def message(client, feed_id, payload):
    print("Feed {0} received new value: {1}".format(feed_id, payload))
    if feed_id == "neopixel":
        if(int(payload[1:], 16) == 0):
            text_area.text = "灯状态:关\n\n灯颜色:{0}".format(payload)
        else:
            text_area.text = "灯状态: 开\n\n灯颜色:{0}".format(payload)
        pixel.fill(int(payload[1:], 16))

    io.publish(mqtt_topic, 'OK!')


pool = socketpool.SocketPool(wifi.radio)

mqtt_topic = "test/topic"

# 初始化mqtt客户端
mqtt_client = MQTT.MQTT(
    broker="替换成对应的mqtt broker的ip即可",
    port=1883,
    socket_pool=pool,
)

# 这里直接使用io mqtt
io = IO_MQTT(mqtt_client)

# Set up the callback methods above
io.on_connect = connected
io.on_message = message

io.connect()

while True:
    try:
        if not mqtt_client.is_connected:
            print("Connecting to MQTT Broker...")
            io.connect()

        # 查询客户端数据.
        io.loop()

    except Exception as e:
        print("Failed to get or send data, or connect. Error:", e,
              "\nBoard will hard reset in 30 seconds.")
        time.sleep(30)
        microcontroller.reset()

 

最新回复

  本次进行任务5,通过网络控制WS2812B,也就是结合123,在手机上通过网络控制板载Neopixel LED的显示和颜色切换,屏幕同步显示状态。 这APP是自己写的吗?   详情 回复 发表于 2023-9-4 18:26
点赞 关注
 
 

回复
举报

6973

帖子

11

TA的资源

版主

沙发
 

 

本次进行任务5,通过网络控制WS2812B,也就是结合123,在手机上通过网络控制板载Neopixel LED的显示和颜色切换,屏幕同步显示状态。

这APP是自己写的吗?

点评

不是的,是手机上的一个测试app,可以下载到的,挺多的这种app,类似于串口调试助手,只不过它这个app是基于mqtt client的  详情 回复 发表于 2023-9-4 19:35
 
 
 

回复

143

帖子

4

TA的资源

一粒金砂(高级)

板凳
 
lugl4313820 发表于 2023-9-4 18:26   本次进行任务5,通过网络控制WS2812B,也就是结合123,在手机上通过网络控 ...

不是的,是手机上的一个测试app,可以下载到的,挺多的这种app,类似于串口调试助手,只不过它这个app是基于mqtt client的

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表