Raspberry Pi Pico W气象站MQTT发布温湿度值问题求助
Raspberry Pi Pico W气象站MQTT温湿度发布问题解决
问题背景
用Raspberry Pi Pico W、Pimoroni Pico Explorer扩展板和BME280搭建气象站,已实现按键触发MQTT消息发布,但无法正确发送温湿度数值:
- 直接将
topic_msg设为bme.read()时触发语法错误 - 用变量存储传感器读数后,发布的是变量名字符串而非实际数值
- 尝试定义函数后出现无
len()属性的错误
代码错误分析
你提供的完整代码存在以下语法和逻辑问题:
def temp缺少冒号,属于语法错误topic_msg =未赋值,直接导致语法报错bme.read()返回的是元组类型(包含温度、湿度、气压),而MQTT发布要求消息是字节串,直接传入会触发类型错误- 循环中用
if bme.read()作为判断条件逻辑错误,应该检测按键状态而非传感器读数 - 重复导入
time模块,属于冗余代码
修正后的完整代码
import time from breakout_bme280 import BreakoutBME280 from pimoroni_i2c import PimoroniI2C from pimoroni import PICO_EXPLORER_I2C_PINS import network from umqtt.simple import MQTTClient from picographics import PicoGraphics, DISPLAY_PICO_EXPLORER # 导入Pico Explorer库用于按键检测 # 初始化I2C和BME280传感器 i2c = PimoroniI2C(**PICO_EXPLORER_I2C_PINS) bme = BreakoutBME280(i2c, address=0x76) # 初始化Pico Explorer按键检测 display = PicoGraphics(display=DISPLAY_PICO_EXPLORER) # MQTT配置 mqtt_server = 'broker.hivemq.com' client_id = 'bigles' topic_pub = b'TempHumidity' # 主题名修改为更直观的名称 # 连接WiFi wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect("i can hear what u sayin", "12345678") time.sleep(5) print("WiFi连接状态:", wlan.isconnected()) def mqtt_connect(): client = MQTTClient(client_id, mqtt_server, keepalive=3600) client.connect() print(f'已连接到MQTT代理: {mqtt_server}') return client def reconnect(): print('MQTT连接失败,正在重连...') time.sleep(5) import machine machine.reset() try: client = mqtt_connect() except OSError as e: reconnect() # 主循环:检测按键并发布温湿度 while True: # 检测按键A是否被按下(可根据需求更换为其他按键) if display.is_pressed(display.BUTTON_A): # 读取传感器数据,拆解元组为单独变量 temperature, pressure, humidity = bme.read() # 格式化消息内容,保留两位小数后转成字节串(MQTT要求消息为字节类型) topic_msg = f"温度: {temperature:.2f}°C, 湿度: {humidity:.2f}%, 气压: {pressure:.2f}hPa".encode() # 发布MQTT消息 client.publish(topic_pub, topic_msg) print(f'已发布消息: {topic_msg.decode()}') # 防抖延迟,避免短时间内重复触发 time.sleep(0.5) time.sleep(0.1)
关键修改说明
- 修复语法错误:删除无效的
def temp定义,给topic_msg添加正确的赋值逻辑 - 传感器数据处理:将
bme.read()返回的元组拆解为单独变量,格式化字符串后转成字节串,符合MQTT消息格式要求 - 按键检测逻辑:使用Pico Explorer官方库的按键检测方法,替代原错误的传感器读数判断逻辑
- 代码优化:删除重复导入的模块,调整主题名更直观,增加防抖延迟避免按键重复触发
内容的提问来源于stack exchange,提问作者bopaloolah
相关产品推荐
相关产品推荐

