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

如何通过MQTT从Raspberry Pi向ThingSpeak批量提交温度数据?

解决ThingSpeak多字段15秒一次上传的方案

当然可以搞定!ThingSpeak的MQTT API支持一次上传多个字段的数据,刚好能解决你的问题——不用每次只传一个温度值,你可以把10个温度值分别对应到ThingSpeak频道的10个字段里,每15秒发送一组完整的数据包就行,这样既符合平台的速率限制,又能在频道里按时间轴绘制所有温度数据的图表。

具体操作步骤

1. 配置ThingSpeak频道字段

  • 登录ThingSpeak后台,进入你的频道设置页,添加10个字段(Field 1到Field 10),可以分别命名为Temperature 1到Temperature 10,方便后续识别数据。
  • 找到频道的MQTT凭据:包括Client ID、Username、Password(即你的ThingSpeak API Key),以及MQTT服务器地址mqtt3.thingspeak.com,端口可选1883(非加密)或8883(加密)。

2. 树莓派端Python代码示例(基于paho-mqtt)

下面是一个可直接复用的代码模板,你只需要替换自己的配置信息即可:

import paho.mqtt.client as mqtt
import random
import time

# 替换成你自己的ThingSpeak配置
CHANNEL_ID = "你的频道ID"
MQTT_CLIENT_ID = "你的MQTT Client ID"
MQTT_USERNAME = "你的MQTT用户名"
MQTT_PASSWORD = "你的ThingSpeak API Key"
MQTT_SERVER = "mqtt3.thingspeak.com"
MQTT_PORT = 1883
MQTT_TOPIC = f"channels/{CHANNEL_ID}/publish"

def on_connect(client, userdata, flags, rc):
    print(f"连接成功,返回码: {rc}")

# 初始化MQTT客户端
client = mqtt.Client(client_id=MQTT_CLIENT_ID)
client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
client.on_connect = on_connect

# 启动连接和消息循环
client.connect(MQTT_SERVER, MQTT_PORT, 60)
client.loop_start()

try:
    while True:
        # 生成10个随机温度值(模拟传感器数据)
        temp_list = [round(random.uniform(20.0, 30.0), 2) for _ in range(10)]
        # 构造MQTT消息负载:格式为field1=值1&field2=值2&...&field10=值10
        payload = "&".join([f"field{i+1}={temp_list[i]}" for i in range(10)])
        # 发布消息到ThingSpeak
        client.publish(MQTT_TOPIC, payload)
        print(f"已发送一组温度数据: {payload}")
        # 等待15秒,遵守ThingSpeak的速率限制
        time.sleep(15)
except KeyboardInterrupt:
    print("程序已终止")
    client.loop_stop()
    client.disconnect()

3. 关键注意事项

  • 严格遵守速率限制:免费版ThingSpeak频道要求每15秒最多一次发布,代码里的time.sleep(15)刚好满足要求,不要缩短这个时间,否则会被平台限流。
  • 字段一一对应:确保代码中field1到field10和你在ThingSpeak后台创建的字段顺序一致,避免数据传错位置。
  • 连接稳定性:如果树莓派网络不稳定,可以在代码中添加on_disconnect回调函数,实现自动重连逻辑,避免数据丢失。
  • 图表展示:数据上传后,进入ThingSpeak频道的视图页面,你可以为每个字段单独添加图表,或者将多个字段合并到同一个图表中对比,平台会自动按时间轴生成数据曲线。

替代方案(不推荐)

如果你不想使用10个字段,也可以把10个温度值用逗号分隔打包成一个字符串,传到单个字段中。但这种方式后续在ThingSpeak中分析和绘图会非常麻烦,因为平台无法直接解析单个字段内的多个数值,所以优先推荐使用多字段上传的方式。

内容的提问来源于stack exchange,提问作者ahmed-abdelhakem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:04:34