ESP32开发板TFT触控屏(小黄板)[MicroPython]:连接wifi和mqtt

NO.1
wifi+mqtt

在不适用传感器的情况下,要显示对应的数据

需要优先从网络上(连接WIFI并请求API)获取并可视化显示(LVGL)

使用了几种mqtt库,最终选用micropython-mqtt

参考文章

MicroPython[ESP32-S3]:micropython-mqtt设置MQTT连接

github地址

https://github.com/peterhinch/micropython-mqtt/tree/master

这是官方驱动程序的替代方案。它已在以下平台上进行了测试。

  • ESP8266

  • ESP32、ESP32-S2 和 ESP32-S3

  • pyboard D

  • Arduino Nano Connect

  • 树莓派 Pico W

该驱动程序的主要特点是:

  • 使用 uasyncio 的应用程序的非阻塞操作。

  • 从 WiFi 和代理中断中自动恢复。

  • 带重传的真实qos == 1操作。

  • 由于能够容忍不良连接,因此提高了 WiFi 范围。

注意事项

它在初始化的时候,就需要输入wifi和mqtt账户,两者需要同时连接

用在esp32s3的时候,认为它没有很好的处理模块的耦合

用在小黄板的时候,发现正好适合wifi+mqtt场景的一步到位

NO.2
传输mqtt库文件到ESP32

需要下载mqtt_as.py库传输到esp32中

img

点击thonny,文件-打开

img

选择此电脑

img

选择已下载好的mqtt_as.py

点击打开

img

打开对应文件后,再次点击文件,另存为

img

点击MicroPython设备

img

可以看到当前MicroPython的文件

img

输入要保存的文件名,如mqtt_as.py

记得文件名带后缀

点击好的

img

等待保存完成

img

再次点击Thonny,文件,打开,选择MicroPython设备

可以看到除了boot.py外,多了一个刚刚添加的文件,并显示了文件大小

说明文件保存成功

img

NO.3
连接wifi+mqtt

连接代码,同样参考文章

MicroPython[ESP32-S3]:micropython-mqtt设置MQTT连接

代码中引入依赖

from mqtt_as import MQTTClient, config
import uasyncio as asyncio

然后使用提供的api来连接wifi和mqtt

# 本地配置
config['ssid'] = 'wifi name'
config['wifi_pw'] = 'wifi password'
config['server'] = 'mqtt ip addr'

# 监听消息接收
def dsx2020_call(topic, msg, retained):
print("接收到消息")
topic_str=topic.decode()
msg_str=msg.decode()
print("topic_str",topic_str)
print("msg_str",msg_str)

# 订阅主题
async def conn_han(client):
await client.subscribe('dsx2020', 1)
await client.subscribe('weather', 1)

# 初始化
async def main(client):
await client.connect()
n = 0
while True:
await asyncio.sleep(5)
try:
print('Change every 5 seconds', n)
except:
print("err")
n += 1

# 设置回调函数
config['subs_cb'] = dsx2020_call
# 设置订阅主题
config['connect_coro'] = conn_han

# 实例化
MQTTClient.DEBUG = True
client = MQTTClient(config)
try:
asyncio.run(main(client))
finally:
client.close()

实际效果测试

点击运行,运行当前脚本

img

查看控制台

可以看到,先尝试监测wifi质量并连接

然后连接到qmtt

然后每5秒执行一次log

当我刷新我的网站,发送一个mqtt主题消息,对应的esp32就会收到mqtt消息,并显示当前消息的内容,如网站在线,网站下线等

img

注意事项

此时的演示并没有点亮屏幕,所以wifi+mqtt功能成功

但是一旦点亮屏幕后,再尝试连接wifi+mqtt,就会提示内存不足等

NO.4
点亮屏幕+连接wifi+mqtt

参考文章

ESP32开发板TFT触控屏(小黄板)[MicroPython]:刷入MicroPython+LVGL固件和示例演示

文章中点亮屏幕并显示基本的文字hello world

本文尝试,先点亮屏幕,显示文字,然后连接wifi+mqtt,看看功能是否稳定和抛出错误

实际上,屏幕正常可以点亮以及显示文字,等到连接wifi时就报错了

Traceback (most recent call last):
File "<stdin>", line 75, in <module>
File "uasyncio/core.py", line 1, in run
File "uasyncio/core.py", line 1, in run_until_complete
File "uasyncio/core.py", line 1, in run_until_complete
File "<stdin>", line 56, in main
File "mqtt_as.py", line 637, in connect
File "mqtt_as.py", line 294, in _connect
File "mqtt_as.py", line 233, in _as_write
OSError: [Errno 113] ECONNABORTED

img

在搜索引擎查找OSError: [Errno 113] ECONNABORTED,并没有找到对应的答案

在以前的文章有提示原因

MicroPython[ESP32]:MQTT消息订阅与发布以及断联通知

当ESP32同时使用lvgl和mqtt以及http时,会因为内存分配不足导致进程堵塞或者重启

会提示

  • memory allocation failed, allocating 12300 bytes

  • Not enough DMA-able memory to allocate display buffer

这也是当初学习方向改为ESP32S3,放弃ESP32的原因

NO.5
调整顺序

先连接wif+mqtt

连接成功后等待3秒然后点亮屏幕(当n=1的时候再点亮屏幕init_scrren)

# 初始化
async def main(client):
await client.connect()

n = 0
while True:
await asyncio.sleep(5)
if n==1:
init_scrren()
try:
print('Change every 5 seconds', n)
except:
print("err")
n += 1

可以看到下图并无抛出错误,正常运行中

同样micropython-mqtt会提示当前内存

RAM free 79904 alloc 28128(空余内存79KB,已分配内存28KB)

img

NO.6
Tips

目前已设置生成热点,扫码连接

img

微信扫码

img

配网成功且连接Mqtt成功

img

适用于分发配网用户

如果是自己使用,直接在代码中写入wifi和密码即可

END

觉得本文还行,不妨顺手点赞收藏,下期见。

推荐阅读

ESP32开发板TFT触控屏(小黄板)[MicroPython]:刷入MicroPython+LVGL固件和示例演示

ESP32开发板TFT触控屏(小黄板)[MicroPython]:示例Demo刷入固件,测试屏幕显示和触控

ESP32开发板TFT触控屏(小黄板)[MicroPython]:简单记录一体化开发板特点和使用场景

☕ 朋友,都看到这了,确定不关注一下么? 👇