本文介绍如何使用行空板 M10 与 SIoT 通信,并分别用 Mind+ 的 Python 积木模式Python 代码模式 完成两个项目:

  1. 行空板 M10 上传温度数据到 SIoT。
  2. SIoT 发送控制指令,让行空板 M10 控制 LED 灯打开或关闭。

为了便于学习,本文将两种编程方式分开编写。建议初学者先完成 Python 积木模式,再对照学习 Python 代码模式

1. 准备工作

1.1 硬件准备

本教程以外接 DHT11 温湿度传感器和外接 LED 模块为例。

硬件 用途 示例连接
行空板 M10 运行程序、连接 SIoT、控制硬件 通过 USB 或 Wi-Fi 连接电脑
DHT11 温湿度传感器 采集温度(本教程主要上传温度数据) 数据线接 P21
LED 模块 接收 SIoT 指令后亮灭 信号线接 P22
电脑 运行 Mind+、访问 SIoT 页面 与行空板在同一局域网

如果使用的是其他传感器、其他 LED 模块或其他引脚,请根据实际硬件连接修改程序中的引脚号。

1.2 软件准备

开始前请确认:

  1. 已安装 Mind+。
  2. 行空板 M10 可以正常连接电脑。
  3. SIoT 服务已经启动。
  4. 电脑和行空板 M10 处在同一局域网内。
  5. 浏览器可以打开 SIoT Web 管理页面。

常用连接参数如下:

参数 示例值
SIoT 服务器地址 10.1.2.3 或行空板的局域网 IP
MQTT 端口 1883
用户名 siot
密码 dfrobot

如果 SIoT 运行在行空板 M10 上, USB 连接时常用服务器地址为:10.1.2.3

如果行空板通过 Wi-Fi 接入网络,也可以填写行空板在当前局域网中的 IP,例如:192.168.1.46

1.3 本教程使用的 Topic

Topic 通信方向 用途
siot/m10_temp 行空板 M10 -> SIoT 上传温度数据
siot/m10_led SIoT -> 行空板 M10 接收 LED 控制指令

在 SIoT V2 中,可以在 Web 页面中创建 m10_tempm10_led 两个主题。创建后,程序中使用完整 Topic:

siot/m10_temp
siot/m10_led

2. Python 积木模式

Python 积木模式适合初学者理解流程。它不需要一开始手写完整代码,只需要通过积木完成“连接 SIoT、上传数据、接收指令、控制 LED”这几步。

2.1 进入 Python 积木模式

打开 Mind+ 后,按下面步骤操作:

  1. 点击 新建项目
  2. 进入 程序设计
  3. 选择 Python 积木模式
  4. 点击 扩展
  5. 加载以下扩展库:
扩展库 用途
行空板 M10 控制行空板屏幕和引脚
MQTT 连接 SIoT 并收发消息
DHT11 读取温湿度传感器数据

2.2 设置 SIoT 连接

在程序开始后,先完成 MQTT 初始化和连接。

初始化 MQTT 积木参数建议如下:

设置项 填写内容
平台 SIoT V2
服务器地址 10.1.2.3 或实际 SIoT IP
端口 1883
用户名 siot
密码 dfrobot

积木程序如下:

连接成功后,Mind+ 终端一般会出现类似“连接成功”的提示。

2.3 项目一:上传温度数据到 SIoT

项目效果

行空板 M10 每隔 5 秒读取一次 DHT11 传感器,并把温度数据发送到 SIoT:

数据 Topic
温度 siot/m10_temp

积木编写步骤

  1. Python 主程序开始 下初始化 MQTT,并连接 SIoT。
  2. 初始化 DHT11 传感器,型号选择 DHT11,引脚选择 P21
  3. 创建变量 temp
  4. 在循环中读取温度,把结果赋值给 temp
  5. temp 发布到 siot/m10_temp,建议使用带 SIoT V2 或“保存到数据库”说明的发布积木。
  6. 在行空板屏幕上显示当前温度。
  7. 等待 5 秒后继续循环。

参考程序如下:

查看上传结果

程序运行后,打开 SIoT Web 页面,进入 siot/m10_temp 的数据管理页面。如果可以看到不断更新的数据,说明温度上传成功。

2.4 项目二:通过 SIoT 控制 LED 灯

项目效果

在 SIoT Web 页面中向 siot/m10_led 发送指令,行空板 M10 根据指令控制 LED。

发送内容 LED 状态
ON 打开
OFF 关闭

也可以使用中文指令:

发送内容 LED 状态
打开
关闭

初学阶段建议先使用 ONOFF,方便排错。

积木编写步骤

  1. 在 MQTT 连接成功后,订阅主题 siot/m10_led
  2. 设置 LED 所接引脚 P22 为输出。
  3. 添加“当 MQTT 接收到消息”事件。
  4. 在事件中判断接收到的主题是否为 siot/m10_led
  5. 如果接收到的消息是 ON,设置 P22 输出高电平。
  6. 如果接收到的消息是 OFF,设置 P22 输出低电平。

参考程序如下:

发送控制指令

打开 SIoT Web 页面,进入 siot/m10_led 主题的数据管理页面。在消息内容中输入 ON,点击发送后,LED 应点亮。再发送 OFF,LED 应熄灭。

2.5 积木模式综合效果

完成以上两个项目后,可以将它们合并到同一个积木程序中。这样,一个程序就能同时完成“数据上传”和“远程控制”两个方向的通信。

Image

程序运行效果:


3. Python 代码模式

除了使用 Mind+ 图形化积木外,如果设备支持 Python 编程(例如行空板、树莓派等),也可以直接通过 Python 代码连接 SIoT,实现数据上传、消息订阅与远程控制。

3.1 Python 连接 SIoT 的基本流程

使用 Python 连接 SIoT 时,通常需要完成以下几个步骤,如果需要与前面的 Web 管理页面配合测试,建议继续使用 项目名/设备名 格式作为 Topic,例如:siot/m10_led and siot/m10_temp,这样更方便后续的数据管理与设备区分。

3.2 最小连接示例

下面代码只完成连接 SIoT,用于检查服务器地址、账号、密码是否正确。

import siot

SERVER = "10.1.2.3"      # 请改成实际运行 SIoT 的设备 IP
CLIENT_ID = ""           # 在 SIoT 上,CLIENT_ID 可以留空
IOT_USERNAME = 'siot'    # 用户名
IOT_PASSWORD = 'dfrobot' # 密码

siot.init(CLIENT_ID, SERVER, user=IOT_USERNAME, password=IOT_PASSWORD)
siot.connect()
siot.loop()

当运行成功后,在终端区域会出现“连接成功”的提示。

重要代码说明:

  • SERVER:指的是开启 SIoT 服务用以连接的服务器的 IP 地址。
  • CLIENT_ID:指的是客户端标识符,它是客户端到服务器的唯一标识,这里我们可以不输入内容。
  • user:指的是物联网平台账户的用户名。
  • password:指账号对应的密码。
  • siot.init():初始化连接参数。
  • siot.connect():连接 SIoT 平台。
  • siot.loop():保持消息循环。

3.3 项目一:上传温度数据到 SIoT

如果需要向 SIoT 上传数据,可以使用 publish_save() 方法。下面示例会每隔 2 秒向平台发送一次行空板 M10 读取到的温度数据:

import siot                               # 导入 SIoT MQTT 客户端库,用于物联网通信
import time                               # 导入时间库,用于控制延时与主循环频率

from unihiker import GUI                  # 导入行空板 GUI 库,用于屏幕显示与交互
from pinpong.board import Board           # 导入 PinPong 库的 Board 类,用于初始化主控
from pinpong.board import DHT11           # 导入 PinPong 库的 DHT11 传感器类
from pinpong.board import Board, Pin       # 导入 Pin 引脚类(与 Board 类合并导入)
from pinpong.extension.unihiker import *  # 导入行空板专属拓展库

# --- 硬件驱动与界面初始化 ---
Board().begin()                           # 初始化行空板
u_gui = GUI()                             # 实例化 GUI 引擎,用于屏幕绘制

# --- 物联网连接配置 ---
SERVER = "10.1.2.3"                       # SIoT 服务器 IP(若运行在行空板本地,USB连接时为10.1.2.3)
CLIENT_ID = ""                            # MQTT 客户端唯一标识 ID,一般留空即可
IOT_USERNAME = 'siot'                     # 默认 SIoT 登录用户名
IOT_PASSWORD = 'dfrobot'                  # 默认 SIoT 登录密码
PUB_TOPIC = "siot/m10_temp"                # 发布消息的 MQTT 温度主题,格式为“项目名/设备名”

# --- 启动 MQTT 物联网连接 ---
siot.init(CLIENT_ID, SERVER, user=IOT_USERNAME, password=IOT_PASSWORD) # 载入 MQTT 配置参数
siot.connect()                            # 发起与服务器的连接
siot.loop()                               # 开启后台非阻塞消息循环,保持与服务器持续通信

# --- 硬件与显示初始化 ---
dht11 = DHT11(Pin((Pin.P21)))             # 初始化 DHT11 传感器,数据引脚连接至 P21 数字口
# 在屏幕坐标 (0,0) 处绘制初始温度文本,通过外部只创建一次,防图层重叠
temp1 = u_gui.draw_text(text="实时温度:", x=0, y=0, font_size=20, color="#0000FF")

# --- 主循环:持续读取温度并上传 ---
while True:
    temp = dht11.temp_c()                 # 读取外接 DHT11 传感器测得的摄氏温度值
    temp1.config(text="实时温度:" + str(temp)) # 使用 .config 方法动态更新屏幕文字,实时显示温度
    siot.publish_save(PUB_TOPIC, temp)    # 向指定 Topic 发布数据并同步存入 SIoT 数据库
    print(temp)                           # 在终端/控制台中打印当前温度,便于本地调试
    time.sleep(2)                         # 延时 2 秒,避免数据发送过快,降低 CPU 占用

运行后,在 SIoT Web 页面中查看数据,如果页面中出现持续更新的温度数据,说明上传成功。

重要代码说明:

  • siot.publish_save():将指定 Topic 发布的数据存入数据库。

3.4 项目二:通过 SIoT 控制 LED 灯

如果需要从 SIoT 接收控制指令,可以使用 subscribe() 订阅 Topic。下面示例演示通过 SIoT 平台向指定 Topic 发送 ONOFF 控制指令,从而实现对 LED 灯的远程开关控制。

import time                               # 导入时间库,用于控制主循环运行频率
import siot                               # 导入 SIoT MQTT 客户端库,用于物联网通信
from pinpong.board import Board           # 导入 PinPong 库的 Board 类,用于初始化主控
from pinpong.board import Board, Pin       # 导入 Pin 类(用于控制引脚,Board 重复导入不影响运行)
from pinpong.extension.unihiker import *  # 导入行空板专属扩展库
from unihiker import GUI                  # 导入行空板 GUI 库,用于控制屏幕显示

# --- 物联网连接配置 ---
SERVER = "10.1.2.3"                       # SIoT 服务器 IP(若运行在行空板本地,USB连接时为10.1.2.3)
CLIENT_ID = ""                            # MQTT 客户端唯一标识 ID,一般留空即可
IOT_USERNAME = "siot"                     # 默认 SIoT 登录用户名
IOT_PASSWORD = "dfrobot"                  # 默认 SIoT 登录密码
u_gui = GUI()                             # 实例化 GUI 引擎,用于屏幕绘制
LED_TOPIC = "siot/m10_led"                # 订阅的 MQTT 控制主题

# --- 硬件驱动配置 ---
Board().begin()                           # 初始化行空板
led = Pin(Pin.P22, Pin.OUT)               # 将行空板的 P22 引脚配置为数字输出模式,用于控制 LED

# --- 定义 MQTT 消息监听回调函数 ---
def on_message(client, userdata, msg):
    topic = msg.topic                     # 获取接收消息的主题
    payload = msg.payload.decode().strip() # 解码消息内容,并使用 .strip() 过滤多余的空格或换行

    print("收到消息:", topic, payload)

    # 校验接收的消息主题是否为 LED 控制主题
    if topic != LED_TOPIC:
        return

    # 根据不同的控制指令切换 LED 亮灭并更新屏幕显示
    if payload in ["ON", "on", "1", "开"]: # 接收到开启指令
        led.write_digital(1)              # 往 P22 引脚写入高电平点亮 LED
        print("LED 已打开")
        LED.config(text="LED灯状态:打开")  # 使用 .config 方法动态更新屏幕文字,避免图层重叠模糊

    elif payload in ["OFF", "off", "0", "关"]: # 接收到关闭指令
        led.write_digital(0)              # 往 P22 引脚写入低电平熄灭 LED
        print("LED 已关闭")
        LED.config(text="LED灯状态:关闭")  # 动态更新屏幕文字

# --- 启动 MQTT 物联网连接 ---
siot.init(CLIENT_ID, SERVER, user=IOT_USERNAME, password=IOT_PASSWORD) # 载入 MQTT 配置参数
siot.connect()                            # 发起与服务器的连接
siot.subscribe(LED_TOPIC, on_message)     # 订阅 LED 控制主题,并绑定消息接收的回调函数
siot.loop()                               # 开启后台非阻塞消息循环,保持 MQTT 在后台持续运行

# --- 屏幕界面初始化 ---
# 必须放置在循环体外只创建一次,通过 config 动态刷新的方式可以彻底解决“文字覆盖堆叠”的问题
LED = u_gui.draw_text(text="LED灯状态:", x=0, y=40, font_size=20, color="#0000FF")

# --- 主循环维持运行 ---
while True:
    time.sleep(0.1)                       # 保持微小延时,维持程序运行,降低 CPU 占用

当运行成功后,在 SIoT Web 页面向 siot/m10_led 发送 ONOFF 控制指令,你就能远程控制行空板 M10 上的 LED 灯。

本教程使用外接 LED,示例引脚为 P22。如果你想控制板载 LED,可根据实际板载 LED 引脚把 Pin.P22 改为对应引脚,例如使用 Pin.P25

重要代码说明:

  • on_message:是定义的接收到平台消息后所要执行的功能函数。
  • msg.payload.decode():表示把收到的消息内容转换成字符串,便于做 ON、OFF 之类的判断。
  • siot.subscribe():是用来订阅平台发送来的消息。

3.5 综合示例:温度上传 + LED 控制

下面代码把两个项目合并到同一个程序中。行空板 M10 会持续上传温度,同时接收 SIoT 发来的 LED 控制指令。

import siot                               # 导入 SIoT MQTT 客户端库,用于物联网通信
import time                               # 导入时间库,用于控制延时与主循环频率

from unihiker import GUI                  # 导入行空板 GUI 库,用于屏幕显示与交互
from pinpong.board import Board, Pin, DHT11 # 导入 PinPong 库的 Board、Pin 和 DHT11 传感器类
from pinpong.extension.unihiker import *  # 导入行空板专属拓展库

# --- 硬件驱动与界面初始化 ---
Board().begin()                           # 初始化行空板
u_gui = GUI()                             # 实例化 GUI 引擎,用于屏幕绘制

# --- 物联网连接配置 ---
SERVER = "10.1.2.3"                       # SIoT 服务器 IP(若运行在行空板本地,USB连接时为10.1.2.3)
CLIENT_ID = ""                            # MQTT 客户端唯一标识 ID,一般留空即可
IOT_USERNAME = 'siot'                     # 默认 SIoT 登录用户名
IOT_PASSWORD = 'dfrobot'                  # 默认 SIoT 登录密码

TEMP_TOPIC = "siot/m10_temp"              # 上传温度数据的 MQTT 主题
LED_TOPIC = "siot/m10_led"                # 订阅 LED 控制指令的 MQTT 主题

# --- 定义 MQTT 消息监听回调函数 ---
def on_message(client, userdata, msg):
    topic = msg.topic                     # 获取接收消息的主题
    payload = msg.payload.decode().strip() # 解码消息内容,并去除两端的空格与换行

    print("收到消息:", topic, payload)

    # 校验接收的消息主题是否为 LED 控制主题
    if topic != LED_TOPIC:
        return

    # 根据不同的控制指令切换 LED 亮灭并更新屏幕显示
    if payload in ["ON", "on", "1", "开"]:
        led.write_digital(1)              # 往 P22 引脚写入高电平,点亮 LED
        print("LED 已打开")
        led_txt.config(text="LED灯状态:打开") # 动态更新屏幕文字,避免图层重叠模糊
    elif payload in ["OFF", "off", "0", "关"]:
        led.write_digital(0)              # 往 P22 引脚写入低电平,熄灭 LED
        print("LED 已关闭")
        led_txt.config(text="LED灯状态:关闭") # 动态更新屏幕文字

# --- 启动 MQTT 物联网连接 ---
siot.init(CLIENT_ID, SERVER, user=IOT_USERNAME, password=IOT_PASSWORD) # 载入 MQTT 配置参数
siot.connect()                            # 发起与服务器的连接
siot.subscribe(LED_TOPIC, on_message)     # 订阅 LED 控制主题,并绑定消息接收的回调函数
siot.loop()                               # 开启后台非阻塞消息循环,保持 MQTT 在后台持续运行

# --- 硬件与显示图层初始化 ---
dht11 = DHT11(Pin(Pin.P21))               # 初始化 DHT11 传感器,数据引脚连接至 P21 数字口
led = Pin(Pin.P22, Pin.OUT)               # 将 P22 引脚配置为数字输出模式,用于控制 LED

# 在屏幕上创建文本显示对象(在循环外部绘制一次,防重叠)
temp_txt = u_gui.draw_text(text="实时温度:", x=0, y=0, font_size=20, color="#0000FF")
led_txt = u_gui.draw_text(text="LED灯状态:", x=0, y=40, font_size=20, color="#0000FF")

# --- 主循环:持续读取温度并上传 ---
while True:
    temp = dht11.temp_c()                 # 读取外接 DHT11 传感器测得的摄氏温度值
    temp_txt.config(text="实时温度:" + str(temp)) # 动态更新屏幕显示的实时温度值
    siot.publish_save(TEMP_TOPIC, temp)    # 向温度主题发布数据并同步存入 SIoT 数据库
    print("已上传温度:", temp)             # 在终端打印当前温度
    time.sleep(2)                         # 延时 2 秒,避免数据发送过快,降低 CPU 占用

如果程序运行正常,可以在 SIoT 中看到温度数据,同时也可以通过发送 ONOFF 控制 LED。

提示: 以上这一类示例尤其适合行空板这类既能运行 Python 程序、又能直接访问 SIoT 服务的设备。相比图形化积木,Python 方式更加灵活,适合开发更复杂的物联网项目。

例如:

  • 多线程数据处理
  • 本地界面开发
  • AI 数据联动
  • 自动化控制系统
  • 数据分析与存储

对于教学来说,它也能帮助学生建立:“图形化编程 → 代码编程 → 真实物联网开发”之间的完整认知链路。