yc0526vip 发表于 2023-12-31 19:52:09

micro python问题

@fishc

ssd1306接收mqtt消息,大于128个字符 每行16个字符从下往上滚动,小于129个字符每行显示16个字符

FishC 发表于 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 = 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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2023-12-31 19:57:18

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

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

大于128个字符从下到上滚动显示,再次接收小于128个字符,跳出循环

FishC 发表于 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 = 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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2023-12-31 19:59:03

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

大于128从下到上不停循环,输入小于128字符跳出循环

FishC 发表于 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 = 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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2023-12-31 20:00:56

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

当前代码不能跳出wlile循环

FishC 发表于 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 =
      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 小助理,如未能正确解答您的问题,请继续追问。

yc0526vip 发表于 2023-12-31 20:32:44

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

不要断开与mqtt的链接

FishC 发表于 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 = 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: micro python问题