示例6:按键控制
大约 4 分钟
示例6:按键控制
实验概述
通过 GPIO 数字输入(上拉)读取按键状态,实现按键触发 LED、蜂鸣器等外设动作。普中开发板有4个按键(KEY1-KEY4),按下时为低电平。
硬件接线
| 开发板标识 | GPIO引脚 | 连接设备 |
|---|---|---|
| KEY1 | GPIO14 | 按键(按下为低电平) |
| KEY2 | GPIO27 | 按键(按下为低电平) |
| KEY3 | GPIO26 | 按键(按下为低电平) |
| KEY4 | GPIO25 | 按键(按下为低电平) |
按键一端接 GPIO,另一端接 GND,使用内部上拉电阻,按下时 GPIO 读取到低电平。
JSON 配置示例
{
"peripherals": [
{
"id": "key1",
"name": "按键1",
"type": 13,
"enabled": false,
"pins": [14],
"params": {}
},
{
"id": "key2",
"name": "按键2",
"type": 13,
"enabled": false,
"pins": [27],
"params": {}
},
{
"id": "key3",
"name": "按键3",
"type": 13,
"enabled": false,
"pins": [26],
"params": {}
},
{
"id": "key4",
"name": "按键4",
"type": 13,
"enabled": false,
"pins": [25],
"params": {}
}
]
}外设执行联动
场景1:按键控制LED(轮询触发)
功能:按下按键1时切换LED-D1的开关状态
Web界面配置步骤
步骤1:创建规则
- 点击左侧菜单 外设配置 → 切换到 外设执行管理 标签
- 点击 新增规则 按钮
- 填写基础配置:
- 规则名称:
按键控制LED - 上报数据:❌ 禁用
- 启用:✅ 启用
- 规则名称:
步骤2:配置触发器
点击 添加触发 按钮
填写触发器配置:
字段 填写内容 说明 触发类型 选择 轮询触发 定时检测按键状态 目标外设 选择 key1要轮询的按键外设 轮询间隔 50毫秒检测频率,50ms可避免漏按 响应超时 1000毫秒默认值即可 重试次数 2次默认值即可 轮询延迟 100毫秒默认值即可 比较操作 选择 等于 精确匹配 比较值 0按下时为低电平(0)
步骤3:配置动作
点击 添加动作 按钮
填写动作配置:
字段 填写内容 说明 动作类型 选择 切换电平 翻转GPIO状态 目标外设 选择 led_d1要控制的LED 点击 保存 按钮
执行流程:
每50ms检测一次
↓
读取 key1 状态
↓
判断: key1 == 0 ? (按下)
↓ 是
切换 led_d1 状态(亮→灭 或 灭→亮)⚠️ 注意:轮询间隔建议50ms,太快会占用CPU,太慢可能漏掉短按
场景2:按键事件触发(自动检测单击/双击/长按)
功能:利用系统内置的按键状态机,自动检测单击、双击、长按事件,无需手动轮询。
前提条件
按键外设保持为 数字输入(上拉) (type: 13) 或 数字输入(下拉) (type: 14) 即可。系统会自动对这类外设运行按键状态机,产生以下事件:
| 事件 ID | 触发条件 |
|---|---|
button_press | 按键按下(消抖后确认) |
button_release | 按键释放 |
button_click | 单击(按下后快速释放) |
button_double_click | 双击(300ms内连按两次) |
button_long_press_2s | 长按超过2秒 |
button_long_press_5s | 长按超过5秒 |
Web界面配置步骤
步骤1:创建规则
- 点击 新增规则
- 填写基础配置:
- 规则名称:
按键事件控制 - 上报数据:✅ 启用
- 启用:✅ 启用
- 规则名称:
步骤2:配置触发器
点击 添加触发 按钮
填写触发器配置:
字段 填写内容 说明 触发类型 选择 事件触发 响应系统事件 事件类别 选择 按键事件 从下拉框选择 具体事件 选择 button_click单击事件 触发外设 选择 key1指定哪个按键(可选,不填则响应所有按键)
步骤3:配置动作
点击 添加动作 按钮
填写动作配置:
字段 填写内容 说明 动作类型 选择 高电平 GPIO输出HIGH 目标外设 选择 relay_01控制继电器 点击 保存 按钮
执行流程:
按键状态机每轮检测 key1
↓
检测到单击(按下+快速释放)
↓
发射 button_click 事件(triggerPeriphId=key1)
↓
匹配事件触发器(eventId=button_click, triggerPeriphId=key1)
↓
执行动作:继电器闭合💡 优势:按键状态机内置 50ms 消抖,自动区分单击/双击/长按,无需手动处理。
JSON 配置参考
事件方式(推荐,自动检测单击):
{
"name": "按键事件控制",
"enabled": true,
"reportEnabled": true,
"triggers": [
{
"triggerType": 4,
"triggerPeriphId": "key1",
"eventId": "button_click"
}
],
"actions": [
{ "actionType": 0, "targetPeriphId": "relay_01" }
]
}定时方式(每5秒切换一次LED):
{
"name": "按键控制LED",
"enabled": true,
"triggers": [
{
"triggerType": 1,
"timerMode": 0,
"intervalSec": 5
}
],
"actions": [
{ "actionType": 2, "targetPeriphId": "led_d1" }
]
}ℹ️ 轮询/定时触发的最小间隔为 5 秒(系统安全限制)。如需更快响应,请使用事件触发方式。
注意事项
- 消抖处理:FastBee 内部对 GPIO 输入做了 50ms 软件消抖
- 上拉/下拉:按键接 GND 使用上拉(type: 13),按键接 VCC 使用下拉(type: 14)
- 轮询间隔:按键检测建议 50ms 间隔,兼顾响应速度和资源消耗
- GPIO25 冲突:如果同时使用继电器和按键4,需更换引脚
- 长按检测:系统内置长按检测(2s/5s),通过事件触发器使用
button_long_press_2s或button_long_press_5s事件即可
