在不适用传感器的情况下,要显示对应的数据
需要优先从网络上(连接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场景的一步到位
需要下载mqtt_as.py库传输到esp32中
点击thonny,文件-打开
选择此电脑
选择已下载好的mqtt_as.py
点击打开
打开对应文件后,再次点击文件,另存为
点击MicroPython设备
可以看到当前MicroPython的文件
输入要保存的文件名,如mqtt_as.py
记得文件名带后缀
点击好的
等待保存完成
再次点击Thonny,文件,打开,选择MicroPython设备
可以看到除了boot.py外,多了一个刚刚添加的文件,并显示了文件大小
说明文件保存成功
连接代码,同样参考文章
《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()
实际效果测试
点击运行,运行当前脚本
查看控制台
可以看到,先尝试监测wifi质量并连接
然后连接到qmtt
然后每5秒执行一次log
当我刷新我的网站,发送一个mqtt主题消息,对应的esp32就会收到mqtt消息,并显示当前消息的内容,如网站在线,网站下线等
注意事项
此时的演示并没有点亮屏幕,所以wifi+mqtt功能成功
但是一旦点亮屏幕后,再尝试连接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
在搜索引擎查找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的原因
先连接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)
目前已设置生成热点,扫码连接
微信扫码
配网成功且连接Mqtt成功
适用于分发配网用户
如果是自己使用,直接在代码中写入wifi和密码即可
END
觉得本文还行,不妨顺手点赞和收藏,下期见。
推荐阅读
《ESP32开发板TFT触控屏(小黄板)[MicroPython]:刷入MicroPython+LVGL固件和示例演示》
《ESP32开发板TFT触控屏(小黄板)[MicroPython]:示例Demo刷入固件,测试屏幕显示和触控》
《ESP32开发板TFT触控屏(小黄板)[MicroPython]:简单记录一体化开发板特点和使用场景》
☕ 朋友,都看到这了,确定不关注一下么? 👇