第 15 篇:W55RP20 CircuitPython实战:MQTT 协议与 ThingSpeak 平台对接
本文为 WIZnet W55RP20 芯片CircuitPython 教程第15篇,基于官方最新固件编写,代码均经过实际验证,可直接烧录运行。
版权声明:本文为 WIZnet 官方原创技术文章,转载请注明出处。
前言
此前我们完成了W55RP20与oenet云平台通信,本篇将聚焦轻量化物联网场景,实现W55RP20通过MQTT协议与ThingSpeak平台对接,完成温湿度数据定时上传、数据可视化监控、连接状态反馈等核心功能,掌握ThingSpeak平台配置、MQTT身份认证、数据格式封装、定时上传逻辑等关键技能,适配个人项目、小型环境监测、教学演示等轻量化场景。
W55RP20集成硬件TCP/IP协议栈,搭配CircuitPython专属MQTT客户端库(adafruit_minimqtt),无需关心底层Socket细节和复杂配置,依托WIZnet官方驱动库和ThingSpeak平台极简的接入规范,大幅降低嵌入式设备上云开发门槛,无需复杂编程基础,新手也能快速实现数据上云与可视化。
学完本文,你将掌握:
-
W55RP20在CircuitPython环境下的引脚配置(CS、RST、SPI引脚),适配硬件连接;
-
ThingSpeak平台的注册、频道创建及MQTT连接参数(Client ID、用户名、API Key、Broker地址)的获取方法;
-
CircuitPython环境下adafruit_wiznet5k驱动库、adafruit_minimqtt库的配置与调用;
-
W55RP20以太网初始化(DHCP自动获取IP)、ThingSpeak MQTT客户端初始化与连接;
-
ThingSpeak MQTT回调函数(连接、断开)的编写与调试,实时反馈连接状态;
-
ThingSpeak专属数据格式封装(field字段赋值),符合平台数据上报规范;
-
定时数据上传逻辑实现(适配ThingSpeak 15秒最小上传周期),掌握时间戳控制技巧;
-
串口调试与ThingSpeak平台数据监控方法,快速定位连接失败、数据上传异常等问题。
系列教程学习路径
本专栏共 16 篇,循序渐进覆盖 W55RP20-EVB-Pico 模块 CircuitPython语言开发全流程:
-
第 1 篇:静态 IP 配置与网络基础
-
第 2 篇:DHCP 自动联网与网络诊断
-
第 3 篇:TCP Client 客户端通信
-
第 4 篇:TCP Server 服务端通信
-
第 5 篇:UDP 单播数据通信
-
第 6 篇:UDP 组播/广播数据通信
-
第 7 篇:DNS 域名解析
-
第 8 篇:NTP 从网络获取时间
-
第 9 篇:HTTP Client 客户端请求
-
第 10 篇:HTTP Server 服务端搭建
-
第 11 篇:HTTP 协议与 OneNET 平台数据上云
-
第 12 篇:MQTT 协议基础通信验证
-
第 13 篇:MQTT 协议与阿里云平台对接
-
第 14 篇:MQTT 协议与 OneNET 平台对接
-
第 15 篇:MQTT 协议与 ThingSpeak 平台对接(本文)
-
第 16 篇:Modbus 工业协议通信
建议收藏本专栏,跟随教程逐步学习,所有代码均会同步更新至官方 Gitee 仓库
目录
2. 烧录 W55RP20-EVB-Pico 模块专属 CircuitPython 固件
1、准备工作
1.1 软件准备
所需软件均为免费版本,操作简单,新手可快速上手,无需复杂配置。
|
软件名称 |
版本要求 |
下载地址 |
说明 |
|
Thonny |
4.0 及以上 |
轻量级 MicroPython IDE,支持代码编辑、烧录与串口调试,新手友好 |
|
|
W55RP20-EVB-Pico 模块 CircuitPython驱动库 |
最新稳定版 |
WIZnet 官方固件/驱动库下载 |
专为 W55RP20-EVB-Pico 模块编写,已集成 WIZnet 硬件驱动、TCP/IP协议栈及MQTT客户端库 |
|
串口调试助手(如SecureCRT) |
任意版本 |
官方下载或第三方工具 |
用于查看串口输出的运行日志、调试信息,定位连接和数据上传问题 |
|
ThingSpeak物联网平台 |
在线版 |
创建通道、获取MQTT设备凭证,查看上传的温湿度数据及趋势图表 |
1.2 硬件准备

- W55RP20-EVB-Pico × 1
- Micro USB 数据线(必须支持数据传输,不能使用纯充电线)× 1
- 标准网线 × 1
- 开启 DHCP 功能的路由器 / 交换机 × 1(用于获取网络参数,实现 DNS 解析)
W55RP20-EVB-Pico 模块已集成以太网相关器件,无需额外焊接飞线,配合 RP2040 开发板可快速搭建开发环境,大幅降低接线错误和硬件故障概率。
2. 烧录 W55RP20-EVB-Pico 模块专属 CircuitPython 固件
W55RP20-EVB-Pico 模块 完全兼容树莓派 Pico 的 UF2 固件烧录方式,操作简单无需额外烧录器,新手可快速上手:
- 按住 RP2040 开发板上的 BOOTSEL 按键不放;
- 使用 Micro USB 数据线连接开发板与电脑;
- 待电脑识别出名为 RPI-RP2 的 U 盘后,松开 BOOTSEL 按键;
- 将下载好的 W5500_RP2040_firmware.uf2 固件文件拖拽到 U 盘中;
- 开发板会自动重启,固件烧录完成。
注意:如果电脑没有识别出 RPI-RP2 U 盘,请尝试更换 USB 数据线、重新插拔开发板,或更换电脑 USB 接口(优先使用 USB 2.0 接口)。
3. 硬件连接与开发环境配置
3.1 硬件连接
W55RP20-EVB-Pico 模块连接分为两步,分别实现供电/调试和以太网连接,操作简单,无需复杂接线:3.1.1 基础连接(供电+调试)
使用 Micro USB 数据线连接 RP2040 开发板与电脑,用于开发板供电、代码烧录和串口调试。
3.1.2 以太网连接
使用网线连接 W55RP20-EVB-Pico 模块的以太网接口与路由器的 LAN 口(或直接连接电脑网口,需手动配置电脑 IP 与开发板同网段)。
3.1.3 模块与开发板接线
若使用分离式模块与开发板,需按以下引脚对应连接(SPI 通信):

3.2 Thonny 开发环境配置
打开 Thonny 软件,按以下步骤配置开发环境,确保代码能正常烧录和运行:
- 点击顶部菜单栏「运行」→「配置解释器」;
- 切换到「解释器」选项卡;
- 在「解释器」下拉列表中选择 MicroPython (通用);
- 在「端口」下拉列表中选择开发板对应的串口(通常显示为 Board CDC @ COMx);
- 勾选「运行代码前先重启解释器」和「同步设备的实时时钟」;
- 点击「确定」完成配置。
如果端口列表中没有出现开发板,请尝试:
重新插拔 USB 数据线;
更换支持数据传输的 USB 数据线;
关闭其他占用串口的软件(如串口助手、Arduino IDE 等);
重新烧录 MicroPython 固件;
安装树莓派 Pico USB 驱动。
4. ThingSpeak平台操作流程
ThingSpeak是一款轻量级物联网云平台,支持数据上传、存储与可视化,适合快速验证物联网数据上报功能,操作流程如下:
第一步:创建通道

1. 访问ThingSpeak官方网站(https://thingspeak.com/),注册并登录账号;
2. 点击顶部菜单栏「Channels」→「Create New Channel」,进入通道创建页面;
3. 填写通道基本信息(如通道名称、描述),在「Field 1」填写“Temperature”(温度),「Field 2」填写“Humidity”(湿度),其他参数默认;
4. 点击页面底部「Save Channel」,完成通道创建,记录页面显示的「Channel ID」(后续配置MQTT主题使用)。
第二步:获取MQTT连接参数

1. 进入创建好的通道,点击顶部「API Keys」,查看并保存「Write API Key」(用于数据上报权限验证);
2. 点击顶部「MQTT Settings」,获取MQTT连接核心参数,具体如下表(实际参数以个人平台显示为准):
|
参数名 |
参数值 |
|
mqttHostUrl |
mqtt3.thingspeak.com(固定) |
|
port |
1883(固定) |
|
clientId |
Nx45MSAgCAkFNzQYDwwOOAc |
|
username |
Nx45MSAgCAkFNzQYDwwOOAc |
|
passwd |
WGG/tlO7RcEA89G8Ab+vIhmW |
|
发布主题 |
channels/2362531/publish |
注意:发布主题中的“2362531”为个人Channel ID,需替换为自己创建通道的ID;passwd需妥善保存,用于MQTT连接身份验证。
5、核心CircuitPython代码复制与烧录
5.1 依赖库说明
核心依赖3类库,代码中已全部调用,直接关联到项目中即可使用,无需额外添加ThingSpeak专用库:
-
基础库(time、board、bitbangio、digitalio):CircuitPython自带,用于时间控制、引脚配置、SPI通信;
-
adafruit_wiznet5k库:用于实现W55RP20硬件初始化、以太网连接、IP获取等功能;
-
adafruit_minimqtt库:用于实现MQTT客户端的初始化、连接、发布、回调等功能,适配ThingSpeak MQTT协议和身份认证机制。
5.2 完整CircuitPython代码(主程序)
将以下代码复制到Thonny项目的主文件(如code.py)中,重点替换ThingSpeak MQTT连接参数(CHANNEL_ID、CLIENT_ID、USERNAME、PASSWORD),烧录到开发板后即可运行,代码注释清晰,关键配置部分已标注,可直接修改。
import time
import board
import bitbangio
import digitalio
from adafruit_wiznet5k.adafruit_wiznet5k import WIZNET5K
from adafruit_wiznet5k.adafruit_wiznet5k_socketpool import SocketPool
import adafruit_minimqtt.adafruit_minimqtt as MQTT
print("===================================")
print(" ThingSpeak W5500 MQTT Demo")
print("===================================")
# =========================================================
# ThingSpeak MQTT 参数
# =========================================================
# Channel ID
CHANNEL_ID = "3360951"
# MQTT Client ID
CLIENT_ID = "DhMGLycADBorAAAxFCE9MBE"
# MQTT 用户名
USERNAME = "DhMGLycADBorAAAxFCE9MBE"
# MQTT API Key
PASSWORD = "QpLYgaExcXbApfkoYoI4G2jc"
# MQTT服务器
MQTT_BROKER = "mqtt3.thingspeak.com"
# MQTT端口
MQTT_PORT = 1883
# =========================================================
# 发布 Topic
# =========================================================
PUB_TOPIC = "channels/" + CHANNEL_ID + "/publish"
# =========================================================
# W5500 引脚
# =========================================================
cs = digitalio.DigitalInOut(board.GP20)
rst = digitalio.DigitalInOut(board.GP25)
rst.direction = digitalio.Direction.OUTPUT
print("Reset W5500...")
rst.value = False
time.sleep(0.2)
rst.value = True
time.sleep(2)
# =========================================================
# SPI
# =========================================================
print("Init SPI...")
spi_bus = bitbangio.SPI(
board.GP21,
MOSI=board.GP23,
MISO=board.GP22
)
# =========================================================
# DHCP
# =========================================================
print("Start DHCP...")
eth = WIZNET5K(spi_bus, cs)
print("DHCP Success")
print("IP Address:", eth.pretty_ip(eth.ip_address))
# =========================================================
# Socket Pool
# =========================================================
pool = SocketPool(eth)
# =========================================================
# MQTT 回调
# =========================================================
def connected(client, userdata, flags, rc):
print("\n[ MQTT Connected ]")
print("Broker :", MQTT_BROKER)
print("Topic :", PUB_TOPIC)
def disconnected(client, userdata, rc):
print("[ MQTT Disconnected ]")
# =========================================================
# MQTT Client
# =========================================================
mqtt_client = MQTT.MQTT(
broker=MQTT_BROKER,
port=MQTT_PORT,
username=USERNAME,
password=PASSWORD,
client_id=CLIENT_ID,
socket_pool=pool,
)
mqtt_client.on_connect = connected
mqtt_client.on_disconnect = disconnected
# =========================================================
# 连接 MQTT
# =========================================================
print("Connecting ThingSpeak MQTT...")
try:
mqtt_client.connect()
print("ThingSpeak MQTT Connected OK")
except Exception as e:
print("MQTT Connect Failed:", repr(e))
while True:
time.sleep(1)
# =========================================================
# 上传函数
# field1 = 温度
# field2 = 湿度
# =========================================================
def upload_data(temp, hum):
payload = (
"field1=" + str(temp) +
"&field2=" + str(hum)
)
print("\n========== Upload ==========")
print(payload)
mqtt_client.publish(
PUB_TOPIC,
payload
)
print("Upload Success")
print("============================")
# =========================================================
# 主循环
# =========================================================
print("Start Uploading...\n")
last_time = 0
while True:
try:
mqtt_client.loop()
# ThingSpeak最少15秒上传一次
if time.monotonic() - last_time > 15:
last_time = time.monotonic()
# 固定温湿度
temperature = 26.5
humidity = 60.0
upload_data(
temperature,
humidity
)
except Exception as e:
print("Loop Error:", repr(e))
time.sleep(0.1)
5.3 代码关键配置说明(必看,否则连接失败)
-
ThingSpeak MQTT参数配置:CHANNEL_ID、CLIENT_ID、USERNAME、PASSWORD,必须替换为自己ThingSpeak频道的参数,复制平台生成的内容即可,不可手动修改格式;
-
Topic配置:PUB_TOPIC由代码自动拼接,无需手动修改,只需确保CHANNEL_ID正确即可,若拼接错误,数据无法上传到ThingSpeak;
-
引脚配置:CS、RST、SPI引脚(GP20、GP25、GP21、GP23、GP22)需与硬件连接一致,若修改硬件接线,需同步修改代码中的引脚定义;
-
DHCP配置:代码中默认使用DHCP自动获取IP,需确保路由器已开启DHCP,且开发板能正常访问互联网(可通过ping ThingSpeak Broker地址测试);
-
自动重连:代码中集成异常处理逻辑,当MQTT连接断开、循环出错时,会自动尝试重新连接,无需手动重启开发板;
-
温湿度数据:本实战使用固定值(26.5℃、60.0%RH),后续可替换为DHT11/DHT22等温湿度传感器的采集值,只需修改temperature和humidity变量即可;
-
上传周期:默认15秒(ThingSpeak最小上传周期),可修改“time.monotonic() - last_time > 15”中的“15”,调整为更长的周期(单位:秒),但不可小于15秒,否则数据上传失败。
5.4 编译与烧录步骤
-
打开Thonny,将上述代码复制到code.py文件中,修改ThingSpeak MQTT相关参数(CHANNEL_ID、CLIENT_ID、USERNAME、PASSWORD等);
-
确认开发板通过Micro USB数据线连接电脑,Thonny已识别开发板(解释器选择正确);
-
点击Thonny工具栏中的“保存”按钮,将代码保存到开发板(选择“W55RP20”对应的存储设备);
-
保存完成后,开发板会自动运行代码,打开串口调试助手,即可查看运行日志;
-
若代码有修改,重复步骤1-3,重新保存即可完成烧录,无需额外操作。
6、运行结果与ThingSpeak平台验证
6.1 串口输出结果
烧录完成后,开发板自动重启,打开串口调试助手,会输出以下内容,说明以太网初始化、ThingSpeak MQTT连接及数据上传功能正常:
===================================
ThingSpeak W5500 MQTT Demo
===================================
Reset W5500...
Init SPI...
Start DHCP...
DHCP Success
IP Address: 192.168.1.140
Connecting ThingSpeak MQTT...
[ MQTT Connected ]
Broker : mqtt3.thingspeak.com
Topic : channels/3360951/publish
ThingSpeak MQTT Connected OK
Start Uploading...
========== Upload ==========
field1=26.5&field2=60.0
Upload Success
============================
说明:若打印“MQTT Connect Failed”,检查ThingSpeak参数配置(重点核对CHANNEL_ID、CLIENT_ID、PASSWORD)和开发板网络连接(确保能访问互联网),开发板会自动重试;若一直无法连接,参考“常见问题排查”部分。
6.2 ThingSpeak平台数据验证
打开ThingSpeak平台,进入创建的频道详情页,通过以下两种方式验证数据上传是否成功:
-
方式一:实时数据验证——点击顶部“Private View”,可实时查看温湿度数据(field1为26.5℃,field2为60.0%RH),数据会每15秒更新一次;

-
方式二:数据可视化验证——平台会自动生成温湿度数据的折线图,可查看数据变化趋势,支持放大、缩小、查看历史数据;

-
方式三:数据日志验证——点击顶部“Data Import/Export”,可查看所有上传的数据记录,确认数据上传是否稳定。

2026-05-18 17-36-35
至此,W55RP20的CircuitPython版MQTT协议与ThingSpeak平台对接实战完成!
7、常见问题一站式排查
结合ThingSpeak平台对接的特殊性(身份认证、上传周期、数据格式),以下是高频问题及排查步骤,优先排查连接参数和网络配置问题:
|
问题现象 |
排查步骤 |
|
1. 串口无打印或打印乱码 |
1. 确认串口参数配置正确(波特率115200、无校验);2. 固件为W55RP20专属CircuitPython固件;3. 重新烧录固件,检查USB数据线是否支持数据传输;4. 确认Thonny解释器选择正确。 |
|
2. DHCP获取IP失败,提示Start DHCP后无后续输出 |
1. 确认路由器已开启DHCP功能;2. 检查以太网接线是否正常,网线是否完好;3. 重启路由器和开发板;4. 手动配置开发板IP,确保能访问互联网。 |
|
3. MQTT连接失败,提示Connect Failed |
1. 确认CHANNEL_ID、CLIENT_ID、USERNAME、PASSWORD与ThingSpeak平台一致,无拼写错误;2. 检查开发板能正常访问互联网(ping mqtt3.thingspeak.com测试);3. 确认ThingSpeak频道状态正常,未被禁用;4. 关闭电脑防火墙,避免拦截连接。 |
|
4. 能连接ThingSpeak,但无法上传数据或平台接收不到 |
1. 检查PUB_TOPIC拼接是否正确(CHANNEL_ID无错误);2. 确认数据格式为“field1=值&field2=值”,无语法错误;3. 检查上传周期是否小于15秒,ThingSpeak禁止小于15秒的上传频率;4. 查看ThingSpeak频道的field序号,确保代码中field1、field2与频道配置一致。 |
|
5. 数据上传不稳定,频繁断开连接 |
1. 检查以太网接线是否松动,路由器网络是否稳定;2. 增加主循环中的sleep时间(如修改为0.5秒),减少数据处理压力;3. 检查开发板供电是否稳定,避免供电不足导致断开;4. 确认上传周期不小于15秒,避免频繁上传导致平台限制连接。 |
|
6. 串口提示上传成功,但ThingSpeak平台无数据 |
1. 确认CHANNEL_ID正确,避免上传到错误频道;2. 检查代码中field1、field2与ThingSpeak频道的field序号对应;3. 确认上传周期不小于15秒,平台会过滤小于15秒的重复数据;4. 重启开发板和重新连接MQTT,再次尝试上传。 |
8、W55RP20 核心优势对比
为了让你更直观地了解 W55RP20 在ThingSpeak上云场景中的价值,我们对比了目前主流的三种嵌入式以太网方案,适配CircuitPython开发场景:
|
对比维度 |
W55RP20 集成方案 |
外接 PHY 芯片 方案 |
外接 串口转以太网模块 方案 |
|
BOM 成本 |
低(单芯片,集成TCP/IP协议栈) |
中高(MCU + 模块 + 外围器件) |
高 |
|
PCB 面积 |
小(仅需网口电路,适配小体积设备) |
大(需预留芯片和布线空间) |
高 |
|
开发难度 |
低(官方CircuitPython驱动库,一行代码联网,无需底层开发,适配ThingSpeak认证) |
中高(调试协议栈、编写驱动,适配CircuitPython和ThingSpeak难度高) |
低,但灵活性差 |
|
网络稳定性 |
极高(WIZnet 专注硬件 TCP/IP 协议栈 25 年,适配CircuitPython环境,上云连接稳定) |
不定(对于研发人员要求高,熟悉协议栈与CircuitPython、ThingSpeak适配,才能调试稳定) |
不定(视模块集成情况,易出现通信延迟、数据丢失) |
|
CPU 资源占用 |
0%(协议栈网络处理完全由硬件完成,不占用RP2040资源,可专注ThingSpeak数据处理) |
50% 以上(协议栈完全运行在 MCU 上,占用相关资源,影响数据上传效率) |
0%,但数据传输效率低 |
|
适配ThingSpeak场景 |
极佳(轻量化、低功耗,适配ThingSpeak极简接入,适合个人项目、教学演示) |
一般(成本高、开发复杂,不适配轻量化场景) |
一般(灵活性差,数据传输效率低,影响ThingSpeak数据实时性) |
9. 典型应用场景
W55RP20开发板,结合MicroPython的便捷开发和MQTT的轻量化通信,适合多种物联网场景,尤其适合快速原型开发和小型物联网项目:
1. 环境监测终端:用于室内、大棚、机房等环境的温湿度、光照等数据采集,通过MQTT上报至云平台,实现远程监控;
2. 智能传感节点:作为物联网边缘节点,采集各类传感器数据(如温湿度、气压、土壤湿度),通过ThingSpeak等平台实现数据可视化与分析;
3. 远程控制终端:接收云平台MQTT命令,控制继电器、LED等外设,实现设备远程开关、参数调节;
4. 工业数据采集:适配工业场景中的传感器,采集设备运行参数,通过MQTT协议上传至工业物联网平台,实现设备状态监测;
5. 教学实验平台:适合嵌入式、物联网相关教学,快速实现网络连接、数据上报等功能,降低教学难度。
10. 系列预告与资源获取
10.1系列预告
下一篇教程:将讲解Modbus 工业协议通信,W55RP20 搭建 Modbus TCP Server等一系列的内容。
10.2 资源获取
本文完整代码:WIZnet 官方 Gitee 仓库
W55RP20 芯片手册:WIZnet 官方资料网址
如果本文对你有帮助,欢迎点赞、收藏、关注,你的支持是我们持续更新的动力!如有任何问题,欢迎在评论区留言,我们会第一时间回复。
更多推荐
所有评论(0)