You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改说明

  1. 修复语法错误:删除无效的def temp定义,给topic_msg添加正确的赋值逻辑
  2. 传感器数据处理:将bme.read()返回的元组拆解为单独变量,格式化字符串后转成字节串,符合MQTT消息格式要求
  3. 按键检测逻辑:使用Pico Explorer官方库的按键检测方法,替代原错误的传感器读数判断逻辑
  4. 代码优化:删除重复导入的模块,调整主题名更直观,增加防抖延迟避免按键重复触发

内容的提问来源于stack exchange,提问作者bopaloolah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:55:42