本文为 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. 第 1 篇:静态 IP 配置与网络基础

  2. 第 2 篇:DHCP 自动联网与网络诊断

  3. 第 3 篇:TCP Client 客户端通信

  4. 第 4 篇:TCP Server 服务端通信

  5. 第 5 篇:UDP 单播数据通信

  6. 第 6 篇:UDP 组播/广播数据通信

  7. 第 7 篇:DNS 域名解析

  8. 第 8 篇:NTP 从网络获取时间

  9. 第 9 篇:HTTP Client 客户端请求

  10. 第 10 篇:HTTP Server 服务端搭建

  11. 第 11 篇:HTTP 协议与 OneNET 平台数据上云

  12. 第 12 篇:MQTT 协议基础通信验证

  13. 第 13 篇:MQTT 协议与阿里云平台对接

  14. 第 14 篇:MQTT 协议与 OneNET 平台对接

  15. 第 15 篇:MQTT 协议与 ThingSpeak 平台对接(本文)

  16. 第 16 篇:Modbus 工业协议通信 

建议收藏本专栏,跟随教程逐步学习,所有代码均会同步更新至官方 Gitee 仓库

目录

1、准备工作

1.1 软件准备

1.2 硬件准备

2. 烧录 W55RP20-EVB-Pico 模块专属 CircuitPython 固件

3. 硬件连接与开发环境配置

3.1 硬件连接

3.1.1 基础连接(供电+调试)

3.1.2 以太网连接

3.1.3 模块与开发板接线

3.2 Thonny 开发环境配置

4. ThingSpeak平台操作流程

5、核心CircuitPython代码复制与烧录

5.1 依赖库说明

5.2 完整CircuitPython代码(主程序)

5.3 代码关键配置说明(必看,否则连接失败)

5.4 编译与烧录步骤

6、运行结果与ThingSpeak平台验证

6.1 串口输出结果

6.2 ThingSpeak平台数据验证

7、常见问题一站式排查

8、W55RP20 核心优势对比

9. 典型应用场景

10. 系列预告与资源获取

10.1系列预告

10.2 资源获取

1、准备工作

1.1 软件准备

所需软件均为免费版本,操作简单,新手可快速上手,无需复杂配置。

软件名称

版本要求

下载地址

说明

Thonny

4.0 及以上

Thonny 官方下载

轻量级 MicroPython IDE,支持代码编辑、烧录与串口调试,新手友好

W55RP20-EVB-Pico 模块 CircuitPython驱动库

最新稳定版

WIZnet 官方固件/驱动库下载

专为 W55RP20-EVB-Pico 模块编写,已集成 WIZnet 硬件驱动、TCP/IP协议栈及MQTT客户端库

串口调试助手(如SecureCRT)

任意版本

官方下载或第三方工具

用于查看串口输出的运行日志、调试信息,定位连接和数据上传问题

ThingSpeak物联网平台

在线版

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 固件烧录方式,操作简单无需额外烧录器,新手可快速上手:

  1. 按住 RP2040 开发板上的 BOOTSEL 按键不放;
  2. 使用 Micro USB 数据线连接开发板与电脑;
  3. 待电脑识别出名为 RPI-RP2 的 U 盘后,松开 BOOTSEL 按键;
  4. 将下载好的 W5500_RP2040_firmware.uf2 固件文件拖拽到 U 盘中;
  5. 开发板会自动重启,固件烧录完成。

注意:如果电脑没有识别出 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 软件,按以下步骤配置开发环境,确保代码能正常烧录和运行:

  1. 点击顶部菜单栏「运行」→「配置解释器」;
  2. 切换到「解释器」选项卡;
  3. 在「解释器」下拉列表中选择 MicroPython (通用);
  4. 在「端口」下拉列表中选择开发板对应的串口(通常显示为 Board CDC @ COMx);
  5. 勾选「运行代码前先重启解释器」和「同步设备的实时时钟」;
  6. 点击「确定」完成配置。

如果端口列表中没有出现开发板,请尝试:

  • 重新插拔 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 编译与烧录步骤

  1. 打开Thonny,将上述代码复制到code.py文件中,修改ThingSpeak MQTT相关参数(CHANNEL_ID、CLIENT_ID、USERNAME、PASSWORD等);

  2. 确认开发板通过Micro USB数据线连接电脑,Thonny已识别开发板(解释器选择正确);

  3. 点击Thonny工具栏中的“保存”按钮,将代码保存到开发板(选择“W55RP20”对应的存储设备);

  4. 保存完成后,开发板会自动运行代码,打开串口调试助手,即可查看运行日志;

  5. 若代码有修改,重复步骤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平台,进入创建的频道详情页,通过以下两种方式验证数据上传是否成功:

  1. 方式一:实时数据验证——点击顶部“Private View”,可实时查看温湿度数据(field1为26.5℃,field2为60.0%RH),数据会每15秒更新一次;

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

  3. 方式三:数据日志验证——点击顶部“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 官方资料网址


如果本文对你有帮助,欢迎点赞、收藏、关注,你的支持是我们持续更新的动力!如有任何问题,欢迎在评论区留言,我们会第一时间回复。

更多推荐