鱼C论坛

 找回密码
 立即注册
查看: 942|回复: 9

micro python问题

[复制链接]
发表于 2023-12-31 19:52:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
@fishc

ssd1306接收mqtt消息,大于128个字符 每行16个字符从下往上滚动,小于129个字符每行显示16个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-31 19:52:25 | 显示全部楼层
对于ssd1306接收mqtt消息并进行显示的问题,你可以按照以下步骤解决:

1. 首先,建议使用Python MQTT客户端库(如paho-mqtt)来连接mqtt服务器并接收消息。你需要安装该库,可使用pip命令进行安装。

2. 创建一个函数来处理接收到的消息。在函数内部,你可以检查消息的长度,并根据长度来确定滚动显示规则。

   - 对于大于128个字符的消息,我们可以将其分割为多行,并使用滚动显示效果。可以使用循环将消息分成每16个字符一行,并逐行滚动显示。
   
   - 对于小于等于128个字符的消息,我们直接将其完整地显示在屏幕上即可。

3. 根据你所使用的硬件来初始化SSD1306 OLED显示屏。

4. 连接mqtt服务器,并设置回调函数来处理接收到的消息。

5. 运行mqtt客户端循环以保持连接并处理消息。

下面是一个示例代码,可以帮助你实现上述功能:
from machine import Pin, I2C
from time import sleep
from umqtt.simple import MQTTClient
import ssd1306

# 初始化SSD1306显示屏
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# MQTT服务器信息
mqtt_server = "mqtt.example.com"
mqtt_port = 1883
mqtt_user = "your_username"
mqtt_pass = "your_password"

# 回调函数处理接收到的消息
def callback(topic, msg):
    message = msg.decode()
    if len(message) > 128:
        # 大于128个字符,滚动显示
        lines = [message[i:i+16] for i in range(0, len(message), 16)]
        for line in reversed(lines):
            oled.fill(0)
            oled.text(line, 0, 0)
            oled.show()
            sleep(1)  # 可调整滚动速度
    else:
        # 小于等于128个字符,直接显示
        oled.fill(0)
        oled.text(message, 0, 0)
        oled.show()

# 连接到mqtt服务器
client = MQTTClient("esp8266", mqtt_server, port=mqtt_port, user=mqtt_user, password=mqtt_pass)
client.set_callback(callback)
client.connect()

# 订阅主题
client.subscribe("your_topic")

# 保持连接并处理消息
while True:
    client.check_msg()
    sleep(1)

请注意,此示例代码仅提供了一个框架,你可能需要根据你具体的硬件和需求进行适配和修改。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-31 19:57:18 | 显示全部楼层
FishC 发表于 2023-12-31 19:52
对于ssd1306接收mqtt消息并进行显示的问题,你可以按照以下步骤解决:

1. 首先,建议使用Python MQTT客 ...

大于128个字符从下到上滚动显示,再次接收小于128个字符,跳出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-31 19:57:32 | 显示全部楼层
yc0526vip 发表于 2023-12-31 19:57
大于128个字符从下到上滚动显示,再次接收小于128个字 ...


要实现大于128个字符从下到上滚动显示,再次接收小于128个字符后跳出循环的效果,你可以按照以下步骤进行操作:

1. 首先,确保你已经安装了相应的库(如paho-mqtt和ssd1306)。

2. 初始化SSD1306 OLED显示屏,连接到MQTT服务器,并设置回调函数来处理接收到的消息。

from machine import Pin, I2C
   from time import sleep
   from umqtt.simple import MQTTClient
   import ssd1306

   # 初始化SSD1306显示屏
   i2c = I2C(scl=Pin(5), sda=Pin(4))
   oled = ssd1306.SSD1306_I2C(128, 64, i2c)

   # MQTT服务器信息
   mqtt_server = "mqtt.example.com"
   mqtt_port = 1883
   mqtt_user = "your_username"
   mqtt_pass = "your_password"

   # 回调函数处理接收到的消息
   def callback(topic, msg):
       message = msg.decode()
       if len(message) > 128:
           # 大于128个字符,滚动显示
           lines = [message[i:i+16] for i in range(0, len(message), 16)]
           for line in reversed(lines):
               oled.scroll(0, -8)
               oled.fill(0)
               oled.text(line, 0, 56)
               oled.show()
               sleep(1)  # 可调整滚动速度
       else:
           # 小于等于128个字符,直接显示
           oled.fill(0)
           oled.text(message, 0, 56)
           oled.show()
           sleep(3)  # 显示3秒后跳出循环

   # 连接到mqtt服务器
   client = MQTTClient("esp8266", mqtt_server, port=mqtt_port, user=mqtt_user, password=mqtt_pass)
   client.set_callback(callback)
   client.connect()

   # 订阅主题
   client.subscribe("your_topic")

   # 保持连接并处理消息
   while True:
       client.check_msg()

这段代码中,我们使用了SSD1306的scroll函数来实现滚动显示效果。对于大于128个字符的消息,我们将其分割成多行并逐行滚动显示;而对于小于等于128个字符的消息,我们直接显示在屏幕上,并设置一个延时时间来跳出循环。请根据你的具体需求进行适当的调整和修改。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-31 19:59:03 | 显示全部楼层
FishC 发表于 2023-12-31 19:57
要实现大于128个字符从下到上滚动显示,再次接收小于128个字符后跳出循环的效果,你可以按照以下步骤进 ...

大于128从下到上不停循环,输入小于128字符跳出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-31 19:59:14 | 显示全部楼层
yc0526vip 发表于 2023-12-31 19:59
大于128从下到上不停循环,输入小于128字符跳出循环


要实现大于128个字符从下到上不停循环显示,当输入小于128个字符时跳出循环,你可以按照以下步骤进行操作:
from machine import Pin, I2C
from time import sleep
from umqtt.simple import MQTTClient
import ssd1306

# 初始化SSD1306显示屏
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# MQTT服务器信息
mqtt_server = "mqtt.example.com"
mqtt_port = 1883
mqtt_user = "your_username"
mqtt_pass = "your_password"

# 回调函数处理接收到的消息
def callback(topic, msg):
    message = msg.decode()
    if len(message) > 128:
        # 大于128个字符,滚动显示
        lines = [message[i:i+16] for i in range(0, len(message), 16)]
        while True:
            for line in reversed(lines):
                oled.scroll(0, -8)
                oled.fill(0)
                oled.text(line, 0, 56)
                oled.show()
                sleep(1)  # 可调整滚动速度
    else:
        # 小于等于128个字符,直接显示并跳出循环
        oled.fill(0)
        oled.text(message, 0, 56)
        oled.show()
        sleep(3)  # 显示3秒后跳出循环
        return

# 连接到mqtt服务器
client = MQTTClient("esp8266", mqtt_server, port=mqtt_port, user=mqtt_user, password=mqtt_pass)
client.set_callback(callback)
client.connect()

# 订阅主题
client.subscribe("your_topic")

# 保持连接并处理消息
while True:
    client.check_msg()

这段代码在`callback`函数中,使用了一个无限循环来实现大于128个字符从下到上滚动显示的效果,直到输入小于等于128个字符时跳出循环。为了防止代码陷入死循环,你可以在跳出循环后使用`return`语句来结束循环。

请根据你的具体需求进行适当的调整和修改。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-31 20:00:56 | 显示全部楼层
FishC 发表于 2023-12-31 19:59
要实现大于128个字符从下到上不停循环显示,当输入小于128个字符时跳出循环,你可以按照以下步骤进行操 ...

当前代码不能跳出wlile循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-31 20:01:15 | 显示全部楼层
yc0526vip 发表于 2023-12-31 20:00
当前代码不能跳出wlile循环


要在callback函数中跳出while循环,你可以在callback函数中设置一个全局变量来控制while循环的执行状态。具体实现如下:from machine import Pin, I2C
from time import sleep
from umqtt.simple import MQTTClient
import ssd1306

# 初始化SSD1306显示屏
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# MQTT服务器信息
mqtt_server = "mqtt.example.com"
mqtt_port = 1883
mqtt_user = "your_username"
mqtt_pass = "your_password"

# 设置全局变量用于控制while循环
is_running = True

# 回调函数处理接收到的消息
def callback(topic, msg):
    global is_running  # 使用全局变量
    message = msg.decode()
    if len(message) > 128:
        # 大于128个字符,滚动显示
        lines = [message for i in range(0, len(message), 16)]
        while is_running:
            for line in reversed(lines):
                oled.scroll(0, -8)
                oled.fill(0)
                oled.text(line, 0, 56)
                oled.show()
                sleep(1)  # 可调整滚动速度
    else:
        # 小于等于128个字符,直接显示并跳出循环
        oled.fill(0)
        oled.text(message, 0, 56)
        oled.show()
        sleep(3)  # 显示3秒后跳出循环
        is_running = False  # 跳出while循环

# 连接到mqtt服务器
client = MQTTClient("esp8266", mqtt_server, port=mqtt_port, user=mqtt_user, password=mqtt_pass)
client.set_callback(callback)
client.connect()

# 订阅主题
client.subscribe("your_topic")

# 保持连接并处理消息
while is_running:  # 使用全局变量来控制while循环的执行
    client.check_msg()

这样,在callback函数中,当输入小于等于128个字符时,会将is_running变量设置为False,跳出while循环,停止处理消息。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-31 20:32:44 | 显示全部楼层
FishC 发表于 2023-12-31 20:01
要在callback函数中跳出while循环,你可以在callback函数中设置一个全局变量来控制while循环的执行状态 ...

不要断开与mqtt的链接
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-31 20:32:54 | 显示全部楼层
yc0526vip 发表于 2023-12-31 20:32
不要断开与mqtt的链接


如果你想保持与MQTT服务器的连接,并且在接收到消息后仅仅处理消息而不断开连接,可以使用一个标志变量来控制是否处理消息。以下是一个示例代码,可以帮助你实现这个需求:from machine import Pin, I2Cfrom time import sleepfrom umqtt.simple import MQTTClientimport ssd1306# 初始化SSD1306显示屏i2c = I2C(scl=Pin(5), sda=Pin(4))oled = ssd1306.SSD1306_I2C(128, 64, i2c)# MQTT服务器信息mqtt_server = "mqtt.example.com"mqtt_port = 1883mqtt_user = "your_username"mqtt_pass = "your_password"# 设置标志变量用于控制消息处理is_handling_message = False# 回调函数处理接收到的消息def callback(topic, msg):    global is_handling_message     # 使用全局变量    message = msg.decode()     if not is_handling_message:        is_handling_message = True         # 标记为正在处理消息        if len(message) > 128:            # 大于128个字符,滚动显示            lines = [message[i:i+16] for i in range(0, strlen(message), 16)]            for line in reversed(lines):                oled.scroll(0, -8)                oled.fill(0)                oled.text(line, 0, 56)                oled.show()                sleep(1)  # 可调整滚动速度        else:            # 小于等于128个字符,直接显示            oled.fill(0)            oled.text(message, 0, 56)            oled.show()            sleep(3)  # 显示3秒后跳出循环        is_handling_message = False  # 标记为消息处理完成# 连接到mqtt服务器client = MQTTClient("esp8266", mqtt_server, port=mqtt_port, user=mqtt_user, password=mqtt_pass)client.set_callback(callback)client.connect()# 订阅主题client.subscribe("your_topic")# 保持连接并处理消息while True:    client.check_msg()你可以在callback函数内部通过is_handling_message变量来标记当前是否正在处理消息。当标志变量为True时,表示正在处理消息,因此在下一次callback时不再处理。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表