示例3B:命令脚本流水灯
实验概述
使用 FastBee 的命令脚本动作(actionType=15),通过 PERIPH、DELAY 和 LOG 等简单的声明式命令实现 LED 流水灯效果。
先启用commandScript及开发模式。按示例3创建四个数字输出,将ID对应改为cmd_led1~cmd_led4;所有引用的外设必须先配置并核对接线。GPIO0受板级保留检查约束,必要时改用可用脚位。
硬件接线
| 开发板标识 | GPIO引脚 | 连接设备 |
|---|---|---|
| D1 | GPIO15 | LED1(低电平点亮) |
| D2 | GPIO2 | LED2(低电平点亮) |
| D3 | GPIO0 | LED3(低电平点亮) |
| D4 | GPIO4 | LED4(低电平点亮) |
方式1:基础顺序流水灯
外设执行规则配置
json
{
"id": "rule_cmd_flow_basic",
"name": "命令脚本-基础流水灯",
"enabled": false,
"triggers": [
{ "triggerType": 1, "timerMode": 0, "intervalSec": 3600 }
],
"actions": [
{
"targetPeriphId": "",
"actionType": 15,
"actionValue": "PERIPH cmd_led1 LOW\nDELAY 300\nPERIPH cmd_led1 HIGH\nPERIPH cmd_led2 LOW\nDELAY 300\nPERIPH cmd_led2 HIGH\nPERIPH cmd_led3 LOW\nDELAY 300\nPERIPH cmd_led3 HIGH\nPERIPH cmd_led4 LOW\nDELAY 300\nPERIPH cmd_led4 HIGH\nLOG 基础流水灯一轮完成",
"useReceivedValue": false,
"syncDelayMs": 0,
"execMode": 0
}
],
"protocolType": 0,
"scriptContent": "",
"reportAfterExec": false
}命令脚本解析
PERIPH cmd_led1 LOW # 点亮LED1(低电平)
DELAY 300 # 延时300ms
PERIPH cmd_led1 HIGH # 熄灭LED1(高电平)
PERIPH cmd_led2 LOW # 点亮LED2
DELAY 300 # 延时300ms
PERIPH cmd_led2 HIGH # 熄灭LED2
...(依次类推)
LOG 基础流水灯一轮完成 # 打印日志执行方式
- 手动执行:保持规则禁用,在 Web 页面点击“执行一次”。当前 schema 没有 manual 触发器,禁用的定时触发器只用于满足规则格式。
- API 调用:
POST /api/periph-exec/run,表单参数id=rule_cmd_flow_basic
方式2:定时器自动循环流水灯
外设执行规则配置
json
{
"id": "rule_cmd_flow_timer",
"name": "命令脚本-定时循环流水灯",
"enabled": false,
"triggers": [
{ "triggerType": 1, "timerMode": 0, "intervalSec": 5 }
],
"actions": [
{
"actionType": 15,
"actionValue": "PERIPH cmd_led1 LOW\nDELAY 300\nPERIPH cmd_led1 HIGH\nPERIPH cmd_led2 LOW\nDELAY 300\nPERIPH cmd_led2 HIGH\nPERIPH cmd_led3 LOW\nDELAY 300\nPERIPH cmd_led3 HIGH\nPERIPH cmd_led4 LOW\nDELAY 300\nPERIPH cmd_led4 HIGH",
"execMode": 0
}
]
}配置说明
intervalSec: 5- 每5秒执行一轮流水(脚本内部通过 DELAY 控制时序)- 定时触发自动循环,无需手动触发
方式3:来回往复流水灯
外设执行规则配置
json
{
"id": "rule_cmd_flow_bidirectional",
"name": "命令脚本-往复流水灯",
"enabled": false,
"triggers": [
{ "triggerType": 1, "timerMode": 0, "intervalSec": 5 }
],
"actions": [
{
"actionType": 15,
"actionValue": "PERIPH cmd_led1 LOW\nDELAY 200\nPERIPH cmd_led1 HIGH\nPERIPH cmd_led2 LOW\nDELAY 200\nPERIPH cmd_led2 HIGH\nPERIPH cmd_led3 LOW\nDELAY 200\nPERIPH cmd_led3 HIGH\nPERIPH cmd_led4 LOW\nDELAY 200\nPERIPH cmd_led4 HIGH\nPERIPH cmd_led3 LOW\nDELAY 200\nPERIPH cmd_led3 HIGH\nPERIPH cmd_led2 LOW\nDELAY 200\nPERIPH cmd_led2 HIGH",
"execMode": 0
}
]
}执行顺序
LED1 → LED2 → LED3 → LED4 → LED3 → LED2 → (循环)实现类似"乒乓球"的来回效果。
方式4:叠加渐亮流水灯
外设执行规则配置
json
{
"id": "rule_cmd_flow_accumulate",
"name": "命令脚本-叠加流水灯",
"enabled": false,
"triggers": [
{ "triggerType": 1, "timerMode": 0, "intervalSec": 5 }
],
"actions": [
{
"actionType": 15,
"actionValue": "PERIPH cmd_led1 LOW\nDELAY 200\nPERIPH cmd_led2 LOW\nDELAY 200\nPERIPH cmd_led3 LOW\nDELAY 200\nPERIPH cmd_led4 LOW\nDELAY 500\nPERIPH cmd_led1 HIGH\nPERIPH cmd_led2 HIGH\nPERIPH cmd_led3 HIGH\nPERIPH cmd_led4 HIGH",
"execMode": 0
}
]
}效果说明
- LED依次点亮,不熄灭
- 4个LED全部点亮后延时500ms
- 然后全部熄灭,开始下一轮
方式5:随机 MQTT 数据(同时复位 LED)
外设执行规则配置
json
{
"id": "rule_cmd_flow_random",
"name": "命令脚本-随机流水灯",
"enabled": false,
"triggers": [
{ "triggerType": 1, "timerMode": 0, "intervalSec": 5 }
],
"actions": [
{
"targetPeriphId": "",
"actionType": 15,
"actionValue": "PERIPH cmd_led1 HIGH\nPERIPH cmd_led2 HIGH\nPERIPH cmd_led3 HIGH\nPERIPH cmd_led4 HIGH\nMQTT 0 [{\"id\":\"flow_state\",\"value\":\"RANDOM(1,4)\"}]\nLOG 随机流水灯触发",
"useReceivedValue": false,
"syncDelayMs": 0,
"execMode": 0
}
],
"protocolType": 0,
"scriptContent": "",
"reportAfterExec": false
}说明
- 先将四个 LED 复位为高电平,再在 MQTT 载荷中使用
RANDOM(1,4)生成演示值 RANDOM()只在MQTT和LOG命令中展开,不能动态改写外设 ID- 需要启用 MQTT 且连接成功;MQTT 不可用或发布失败时脚本返回失败,不继续执行后续命令
命令脚本语法参考
支持的命令
| 命令 | 格式 | 说明 |
|---|---|---|
| PERIPH | PERIPH <id> <action> [value] | 控制外设 |
| DELAY | DELAY <ms> | 延时(毫秒) |
| LOG | LOG <message> | 打印日志 |
| MQTT | MQTT <topicIndex> <payload> | 通过从 0 开始的已配置主题索引发布 MQTT 消息 |
PERIPH 子命令
| 子命令 | 格式 | 说明 |
|---|---|---|
| HIGH | PERIPH <id> HIGH | 输出高电平 |
| LOW | PERIPH <id> LOW | 输出低电平 |
| PWM | PERIPH <id> PWM <value> | 设置目标外设分辨率内的PWM占空比 |
| BLINK | PERIPH <id> BLINK <interval_ms> | 闪烁 |
| BREATHE | PERIPH <id> BREATHE <cycle_ms> | 启动呼吸效果 |
| STOP | PERIPH <id> STOP | 停止目标外设当前效果 |
命令分隔符
- 使用
\n(换行符)分隔多条命令 - JSON字符串使用
\n表示一个换行,不要写成表示反斜杠加n的\\n
能力边界
命令脚本适合短小、确定性的动作序列,不提供变量、条件判断和循环。需要条件联动时使用规则触发器和多个动作,需要重复执行时使用定时触发器。
注意事项
- 命令长度限制:一段命令脚本最多 1024 字符、50 条命令
- DELAY 精度:软件调度延时不保证硬实时精度
- GPIO0 限制:启动时不要将 GPIO0 拉低,否则会进入下载模式
- 延时限制:单条
DELAY最长 10 秒,总延时最长 30 秒,整体执行超过 35 秒会超时 - 触发频率:定时器间隔应大于脚本总执行时间,避免队列堆积
- 日志输出:使用 LOG 命令可追踪脚本执行进度,便于调试
- 错误处理:如果 PERIPH 命令中的外设ID不存在,会跳过并继续执行
扩展练习
练习1:呼吸灯效果
先另建type17、8位PWM外设pwm_led;下面的duty仅适用于8位分辨率:
json
{
"actionValue": "PERIPH pwm_led PWM 0\nDELAY 50\nPERIPH pwm_led PWM 32\nDELAY 50\nPERIPH pwm_led PWM 64\nDELAY 50\nPERIPH pwm_led PWM 128\nDELAY 50\nPERIPH pwm_led PWM 255\nDELAY 50\nPERIPH pwm_led PWM 128\nDELAY 50\nPERIPH pwm_led PWM 64\nDELAY 50\nPERIPH pwm_led PWM 32\nDELAY 50\nPERIPH pwm_led PWM 0"
}练习2:交通灯模拟
使用3个LED模拟红黄绿灯:
json
{
"actionValue": "PERIPH led_red LOW\nDELAY 3000\nPERIPH led_red HIGH\nPERIPH led_yellow LOW\nDELAY 1000\nPERIPH led_yellow HIGH\nPERIPH led_green LOW\nDELAY 3000\nPERIPH led_green HIGH\nLOG 交通灯一轮完成"
}练习3:摩尔斯电码
使用LED发送SOS信号:
json
{
"actionValue": "PERIPH cmd_led1 LOW\nDELAY 200\nPERIPH cmd_led1 HIGH\nDELAY 200\nPERIPH cmd_led1 LOW\nDELAY 200\nPERIPH cmd_led1 HIGH\nDELAY 200\nPERIPH cmd_led1 LOW\nDELAY 200\nPERIPH cmd_led1 HIGH\nDELAY 600\nPERIPH cmd_led1 LOW\nDELAY 600\nPERIPH cmd_led1 HIGH\nDELAY 600\nPERIPH cmd_led1 LOW\nDELAY 600\nPERIPH cmd_led1 HIGH\nDELAY 600\nPERIPH cmd_led1 LOW\nDELAY 600\nPERIPH cmd_led1 HIGH\nDELAY 600\nPERIPH cmd_led1 LOW\nDELAY 200\nPERIPH cmd_led1 HIGH\nDELAY 200\nPERIPH cmd_led1 LOW\nDELAY 200\nPERIPH cmd_led1 HIGH\nDELAY 200\nPERIPH cmd_led1 LOW\nDELAY 200\nPERIPH cmd_led1 HIGH\nLOG SOS发送完成"
}相关文档
提示:硬件控制规则建议先保存为禁用状态,手动“执行一次”验证安全后,再启用定时或事件触发。

