鱼C论坛

 找回密码
 立即注册
查看: 517|回复: 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客户端循环以保持连接并处理消息。

下面是一个示例代码,可以帮助你实现上述功能:

  1. from machine import Pin, I2C
  2. from time import sleep
  3. from umqtt.simple import MQTTClient
  4. import ssd1306

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

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

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

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

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

  35. # 保持连接并处理消息
  36. while True:
  37.     client.check_msg()
  38.     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服务器,并设置回调函数来处理接收到的消息。

  
  1. from machine import Pin, I2C
  2.    from time import sleep
  3.    from umqtt.simple import MQTTClient
  4.    import ssd1306

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

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

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

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

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

  37.    # 保持连接并处理消息
  38.    while True:
  39.        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个字符时跳出循环,你可以按照以下步骤进行操作:

  1. from machine import Pin, I2C
  2. from time import sleep
  3. from umqtt.simple import MQTTClient
  4. import ssd1306

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

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

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

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

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

  39. # 保持连接并处理消息
  40. while True:
  41.     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-5-22 12:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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