837|2

143

帖子

4

TA的资源

一粒金砂(高级)

楼主
 

【得捷电子Follow me第2期】 任务汇总 [复制链接]

  本帖最后由 Tristan_C 于 2023-10-6 16:11 编辑

综述

之前收到板子之后,陆陆续续已经完成了既定的任务,并发表了个任务相关的帖子,包括:

【得捷电子Follow me第2期】新手任务:环境搭建

【得捷电子Follow me第2期】任务1:控制屏幕显示中文

【得捷电子Follow me第2期】任务2:网络功能使用

【得捷电子Follow me第2期】任务3:控制WS2812B

【得捷电子Follow me第2期】任务4-分任务1:日历&时钟

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

本次根据flow me 2 的提交要求,重新整理了一下,并统一上传了视频和代码

演示视频


 

代码下载链接

代码下载链接:flow me 2 各任务代码及相关任务文档

 

***以下为各项目的具体内容

开发环境搭建

本次flow me打算采用circuit python开发,因此拿到开发板进行开发之前,需要进行软硬件的开发环境准备和搭建

  1. 硬件准备
    首先是硬件,根据官方教程,通过如下链接进入该板子对应的circuit python下载页,当前版本已经更新到8.2.4
    https://circuitpython.org/board/adafruit_feather_esp32s3_tft/
    还可以选择对应的语言,包括了中文。可以根据需要下载。

    下载完成之后可以将板子使用type-c线接入电脑,然后双击两次下图中板子上的Rst按钮,双击的时间间隔不能太短,预计两次按下的间隔在1S左右。

    此时板载RGB等保持绿色,且显示屏显示内容如下,提示拷贝uf2文件进入。

    电脑出现一个盘位,打开可以看到其内包含的当前文件列表,此时下载好的UF2 文件拷入。



    拷入文件之后,板载的RGB等熄灭,显示屏内容变成如下所示。也可见其显示内容有一行为Hello World。

    且上述磁盘将消失,并很快出现一个新的磁盘,叫CIRCUITPY。

    打开可以看到新磁盘的文件列表,其中的code.py就是后续开发的python文件代码所在了,写的代码只要在上面编辑即可。需要用到的库文件都放到lib文件夹中。

    打开code.py内代码吗内容为打印一个 hello world 的简单功能。也就是上面液晶中显示的Hello World

    至此开发板的硬件环境就准备好了。
  2. 软件准备
    接下来就是安装官方推荐的代码编辑器Mu.
    Mu 是一个简单的代码编辑器,它是用 Python 编写的,内置串行控制台,比较方便打印输出调试信息!Mu可以从如下链接下载:
    https://codewith.mu/
    然后按照常规软件安装套路安装即可。
    安装完成打开,此时会提示选择模式,选择CircuitPython即可,当然后续也可以更改。

    然后就是正式打开界面了

    至此,开发环境搭建完成,可以开始开发之旅了。
    三、代码运行
    接下来我们用一段简单的代码来测试一下硬件和软件环境的搭建是否ok。
    首先拷贝如下代码到编辑器中。

    然后点击保存,并选择保存在CIRCUITPY磁盘的code.py文件中。

    当点击保存之后,硬件会自动复位,并重启之后执行新的代码。
    重启之后,板子上的LED等就会500mS翻转一次亮灭状态,且打印的Hello World也没有了,因为新的代码没有print打印内容了,说明软硬件环境搭建成功!

    接下来我们尝试改一下代码,即插入一个print打印内容:Hello CuicuitPython

    点击保存之后,板子上就可以看到打印的这个内容,

    另外,可以点击串口按钮,打开打印串口

    此时就可以看到打印串口中的Hello CuicuitPython内容。

    需要注意的是,设备端,也就是板子不要轻易手动拔出,需要通过系统安全删除操作。另外,也不要轻易按下板子上的复位按键,特别是正在保存代码,否则有可能造成代码丢失等情况发生。
    至此,一切就绪!

任务1:控制屏幕显示中文

  1. 经过开发环境的硬件和软件的搭建,发现Circuit Python的开发还是非常方便的,有比较友好的开发语言,友好的开发工具,以及友好且非常好用的各种外设库。
    Flow me第二期的第一个任务是控制屏幕显示中文,也就是完成屏幕的控制,并且能显示中文。
    在开始进行任务之前,需要从下面链接下载对应版本的库
    https://circuitpython.org/libraries
    本次使用的是8.X版本的,因此下载该版本的Bundle即可。

    在Bundle中查找,可以找到屏幕显示相关的3各demo,前后两个为最基础的功能demo,均可参考。

    以display_text_simpletest.py为例,其代码内容为
    # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
    # SPDX-License-Identifier: MIT
    import board
    import terminalio
    from adafruit_display_text import bitmap_label
    text = "Hello world"
    text_area = bitmap_label.Label(terminalio.FONT, text=text)
    text_area.x = 10
    text_area.y = 10
    board.DISPLAY.show(text_area)
    while True:
        pass
    将其拷贝到代码Mu Edit中,保存,显示屏可显示Hello World
    进一步发现,如果要显示中文,需要合适的中文字库,参考网络资料以及前辈们的参考设计,发现如下字库可以使用:
    链接已隐藏,如需查看请登录或者注册

    将其下载,并拷贝wenquanyi_9pt.pcf到CIRCUITPY磁盘中

    另外,还需要拷贝如下的两个库到lib文件中。

    接下来就是更改代码,首先是添加两个库

    然后进行变量的初始化,并启动显示

    接下去在主循环中,每2秒更新显示内容

    循环显示效果如下:




    完整代码:
    
    import board
    import digitalio
    import time
    import displayio
    
    from adafruit_display_text import label
    from adafruit_bitmap_font  import bitmap_font
    
    led = digitalio.DigitalInOut(board.LED)
    led.direction = digitalio.Direction.OUTPUT
    
    print("Hello CuicuitPython")
    
    
    display = board.DISPLAY
    board.DISPLAY.brightness = 0.5
    board.DISPLAY.rotation = 0
    
    str_disp_0 = "欢迎参加Flow Me\n这是第二期"
    str_disp_1 = "这是任务1:\n控制屏幕显示中文"
    str_disp_2 = "看到中文表示任务完成"
    str_disp_3 = "重新开始显示……"
    
    
    font = bitmap_font.load_font("lib\wenquanyi_9pt.pcf")
    color = 0xFFFFFF
    text_change = 0
    
    
    text_group = displayio.Group()
    text_area = label.Label(font, text=str_disp_0, color=color)
    text_area.x = 2
    text_area.y = 10
    
    #启动屏幕显示
    text_group.append(text_area)
    display.show(text_group)
    
    while True:
        if(led.value == True):
            led.value = False
        else:
            led.value = True
    
        time.sleep(2)
    
        text_change += 1
    
        if (text_change==1):
            text_area.text=str_disp_1
        elif (text_change==2):
            text_area.text=str_disp_2
        elif (text_change==3):
            text_area.text=str_disp_3
            text_change = 0
    

     

任务2:网络功能使用

任务2的内容是网络功能的使用,也就是完成网络功能的使用,能够创建热点和连接到WiFi,鉴于Circuit Python非常丰富的参考,再结合ESP32-S3本身也已经有原生软硬件支持WiFi,因此也是非常容易实现WiFI的AP和Station。

一、WiFi AP热点功能

首先在文件settings.toml中定义WiFi使用到的SSID和Password

如下图定义。

然后在使用是,利用os.getenv接口获取。

具体实现代码如下

import os

import wifi

print("Flow Me Task 2:WiFi AP Mode")

wifi.radio.start_ap(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"))

while True:

    pass

保存运行之后板载显示屏显示信息如下

就可以用电脑扫描到该热点。

此时可以点击链接,输入前述密码建立链接如下。

  1. WiFi Station功能连接到WiFi热点

昨晚了AP的功能,接下来实现任务中作为station链接到别的AP的功能。

完成的目标是能够连接到指定ssid和password的ap,并能通过网络API获取当前时。

首先同样需要在文件settings.toml中定义WiFi使用到的SSID和Password,只不过这次使用的ssid和password是被链接的ap的信息。然后再定义时间戳获取的接口api地址。

使用的地址可以参考如下的获取时间api接口大全

https://blog.csdn.net/qq_41851614/article/details/107169811

这里选择一个苏宁的接口接口地址

http://quan.suning.com/getSysTime.do

该接口返回的时间信息如下图,会比较方便显示,通过json解析即可,在浏览器输入API获得回复如下。

我们将其也加到settings.toml中

而为了能让时间滚动起来,我们加入time,每2秒通过该api请求一次时间

本次需要额外添加的是adafruit_requests

具体代码如下:

import os
import wifi
import ssl
import socketpool
import adafruit_requests
import time

print("Flow Me Task 2:WiFi station Mode(connect to an AP)")

print(f"ESP32 connecting to {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}")


print("Get time from SUNING.")
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())

while True:
    #每2秒获取一次时间
    time.sleep(2)
    response = requests.get(os.getenv("SUNING_TIME_API"))
    print(f"{response.json()['sysTime2']}")

运行效果

 

任务3:控制WS2812B

任务3是控制WS2812B,即使用按键控制板载Neopixel LED的显示和颜色切换。

在本次的硬件上,如下图的硬件,含有一颗RGB的WS2812B灯珠。

以及下图中的两颗按钮,其中左侧是复位按钮,右侧则是boot按钮。在本次就不作为按钮使用。

因为板子上还做了另一个功能,就是触摸按键功能touch。

翻阅文档《adafruit-esp32-s3-tft-feather.pdf》可以找到触摸按钮章节。

从文中可以获知,只要通过touchio.TouchIn()定义好触摸按钮所在引脚,然后通过该引脚的touch value即可获知该触摸引脚是否被按下。

从文中可知,并不是所有引脚都支持,支持的触摸touch引脚如下图。

这里我们就选择D5作为Neopixel LED的打开,D10作为Neopixel LED的关闭按钮,而A5则作为切换几组不同颜色的按钮。

综上所属,我们开始代码设计

首先将如下三个libraries import进来

然后定义硬件的Neopixel LED以及上述的三个控制touch引脚

接下来定义几组颜色,其中1~6为切换显示的颜色,最后一组作为关闭Neopixel LED使用。

然后定义几种状态,包括

color_cnt:用于循环切换颜色

led_state:用于记录当前led亮灭状态

Key_color_state:用于记录当前颜色切换按钮状态

定义一个led打开函数接口,其中将根据led状态,以及当前颜色打开led

然后是熄灭led函数

最后是主函数接口了,根据当前按钮或者led状态等,切换led的亮灭以及颜色切换。

完整代码

import board
import neopixel
import touchio

print("This is the task 3:Control the ws2812B using buttons")

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

key_on          = touchio.TouchIn(board.D5)
key_off         = touchio.TouchIn(board.D10)
key_color       = touchio.TouchIn(board.A5)

color_1         = (200, 0, 0)
color_2         = (0, 200, 0)
color_3         = (0, 0, 200)
color_4         = (111, 111, 0)
color_5         = (0, 111, 111)
color_6         = (111, 0, 111)
color_off       = (0, 0, 0)

color_cnt       = 1
led_state       = 0
key_color_state = 0

def pixel_set_on():
    global led_state
    if led_state == 0:
        print(f"Turn on pixel, color index is {color_cnt}")
        pixel.brightness = 0.1
        if color_cnt == 1:
            pixel.fill(color_1)
        if color_cnt == 2:
            pixel.fill(color_2)
        if color_cnt == 3:
            pixel.fill(color_3)
        if color_cnt == 4:
            pixel.fill(color_4)
        if color_cnt == 5:
            pixel.fill(color_5)
        if color_cnt == 6:
            pixel.fill(color_6)

def pixel_set_off():
    global led_state
    if led_state == 1:
        print("Turn off pixel")
        pixel.fill(color_off)

while True:
    if key_on.value:
        pixel_set_on()
        led_state = 1

    if key_off.value:
        pixel_set_off()
        led_state = 0


    if key_color.value:
        key_color_state = 1
    else:
        if key_color_state == 1:
            key_color_state = 0
            color_cnt += 1
            if color_cnt > 6:
                color_cnt = 1
            print(f"Change color, index is {color_cnt}")
            if led_state == 1:
                if color_cnt == 1:
                    pixel.fill(color_1)
                if color_cnt == 2:
                    pixel.fill(color_2)
                if color_cnt == 3:
                    pixel.fill(color_3)
                if color_cnt == 4:
                    pixel.fill(color_4)
                if color_cnt == 5:
                    pixel.fill(color_5)
                if color_cnt == 6:
                    pixel.fill(color_6)

保存运行,REPL打印任务内容信息,显示屏也一并显示

触摸按钮即可切换led的颜色和亮灭状态了

打开led

切换不同颜色

关闭led

在关闭状态下也可以切换颜色,下次打开是就以新颜色打开了。

 

任务4-分任务1:日历&时钟

本次是完成任务4,这是一个可选任务,我选择了任务1,日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息。另外,利用关照传感器,探测室内的光照度信息,使用I2C接口读取,再利用树莓派pico自身的内部温度传感器,测量室内温度,并通过串口发送给esp32.

首先是互联网功能,该功能在之前的任务中,通过了WiFi实现了,并获得了互联网的时间,因此本任务可以沿用。接下去将一个互联网获取当地天气信息的功能。互联网获取天气的在线网站很多,比如心知天气,中国国家气象局等,都提供了在线获取的api接口,我们就选择中国国家气象局的接口。其接口如下

http://t.weather.sojson.com/api/weather/city/城市编号

其中城市编号以杭州为例,是101210101,将其替换城市编号即可,将其填入浏览器测试如下

返回的json内容部分解析如下,包括了城市、温度、湿度,空气质量等较为详细的信息。

我们将接口定义在settings.toml中,类似获取苏宁的时间

而此处接口的方法,通获取时间一样,使用request的get即可。

为了显示中文的城市、天气等信息,我们还需要用到任务1中的中文显示功能,已经显示屏显示功能,因此本次需要import的内容如下

为了方便使用,可以将获取时间的功能单独做成函数接口,接口返回时间字符串

同样,获取天气也做成单独的函数接口,并解析json的数据,获取需要的内容,如城市、温度和湿度,并组成字符串返回

还有更新显示屏的内容,接口传入内容字符串,然后将字符串更新到显示屏

增加光照的信息,光照信息,我们可以使用ltr329小模块,该小模块使用I2C与主板的ESP32链接,

为了使用,我们还得import相应的lib

然后开启I2C接口

就可以使用对应的方法读取室内光照值了,此处我们返回字符串形式,方便显示

接下来我们还需要利用树莓派的pico,对室内的室温进行测量,并通过串口发送出去,对于树莓派的详细此处不做过多介绍,使用Thonny开发,其具体代码如下

此处我们实现看每2秒采样一次温度,并通过串口发送出去,同时每采样一次,板载的LED闪烁一次

接下来得让主板的esp32接收串口的数据,并在每次串口接收到树莓派pico传来的室内温度之后更新一次天气和时钟,同时刷新液晶显示内容

开机启动打印信息

板载显示屏上更新的显示信息如下

完整代码如下:

import os
import wifi
import ssl
import socketpool
import adafruit_requests
import time
import displayio
import board
import digitalio
import busio

from adafruit_display_text  import label
from adafruit_bitmap_font   import bitmap_font
from adafruit_ltr329_ltr303 import LTR329

print("Flow Me Task 4-1:Weter station & RTC")

updata_cnt    = 0 #用于更新的计数
timestamp_get = 0

display                     = board.DISPLAY
board.DISPLAY.brightness    = 0.5
board.DISPLAY.rotation      = 0
font                        = bitmap_font.load_font("lib\wenquanyi_9pt.pcf")

str_disp_0  = "欢迎参加Flow Me\n这是第二期"
str_disp_1  = "本次任务4-1:\n日历&时钟\n"
str_disp_2  = "通过互联网更新万年历时钟\n并显示当地天气"
color       = 0xFFFFFF

text_group  = displayio.Group()
text_area   = label.Label(font, text=str_disp_0 + str_disp_1 + str_disp_2, color=color)
text_area.x = 0
text_area.y = 10

#启动屏幕显示
text_group.append(text_area)
display.show(text_group)

print(f"ESP32 connecting to {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}")

socket_get      = socketpool.SocketPool(wifi.radio)
requests_get    = adafruit_requests.Session(socket_get, ssl.create_default_context())


light_i2c   = board.I2C()
ltr329      = LTR329(light_i2c)

def request_time():
    print("Get time from SUNING.")
    response_time = requests_get.get(os.getenv("SUNING_TIME_API"))
    time_str = response_time.json()['sysTime2']
    timestamp_get = response_time.json()['sysTime2']
    print(time_str)
    return time_str

def request_weater():
    print("Get weather from China National Meteorological.")
    try:
        response_weather = requests_get.get(os.getenv("HANGZHOU_WEATHER_API"))
    except ConnectionError as e:
        print("Connection Error:", e)
        print("Retrying in 60 seconds")

    weather_all = response_weather.json()

    city_info = weather_all['cityInfo']
    city_str = city_info['city']                            #取城市

    weather_data        = weather_all['data']
    temperature_str     = weather_data['wendu']             #取温度
    humidity_str        = weather_data['shidu']             #取湿度
    weather_data_now    = weather_data['forecast']
    type_str            = weather_data_now[0]['type']       #取天气类型

    weather_str = city_str + " " + temperature_str + "°C " + humidity_str + " " + type_str + "\n"

    print(weather_str)

    return weather_str

def get_light():
    light_str = "光照:" + str(ltr329.visible_plus_ir_light)
    print(light_str)
    return light_str

def updata_display(text_disp):
    text_area = label.Label(font, text=text_disp, scale=2)
    text_area.x = 0
    text_area.y = 10
    board.DISPLAY.show(text_area)

buffer = bytearray()
uart = busio.UART(board.TX, board.RX, baudrate=9600)

while True:
    # 尝试从串口读取一个字节
    byte = uart.read(1)
    if byte:
        # 如果读取到字节,将其添加到缓冲区
        buffer.append(byte[0])
        # 如果字节是换行符 \n,则表示接收到一行数据
        if byte[0] == ord('\n'):
            # 将缓冲区的数据转换为字符串并打印
            temperature_room = buffer.decode('utf-8')
            print("室温:", temperature_room)

            weather_time_temp = request_weater() + get_light() + " 室温:" + temperature_room + request_time()[:-3]

            updata_display(weather_time_temp)

            # 清空缓冲区
            buffer[:]=b''

 

任务5:通过网络控制WS2812B

本次进行任务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="改成自己的host地址",
    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()

 

 

最新回复

非常精彩   详情 回复 发表于 2023-10-7 10:49
点赞 关注
 
 

回复
举报

1万

帖子

203

TA的资源

管理员

沙发
 

非常精彩

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复

143

帖子

4

TA的资源

一粒金砂(高级)

板凳
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表