5. 按键
5.1 独立按键基础知识
独立按键是一种简单的输入设备,广泛应用于各种电子设备中,用于实现基本的用户交互。它们的工作原理通常基于一个简单的机械开关,当按下按键时触发某些操作。独立按键可以有多种尺寸、形状和颜色,便于用户辨识和使用。
5.2 独立按键结构组成
独立按键的主要结构组成包括:按钮、外壳、弹簧、触点、导电片和引脚。由一个弹性体(如弹簧或金属片)和一个按键帽组成。当按键被用户按下时,弹性体会缩短,使按键帽压缩,使按钮顶部变得接近或触摸基底。当用户松开按钮时,弹性体恢复原状,按键返回初始位置。所以当按键未被按下时,通常触点是分开的,电路是断开的。当按下按键时,导电片触碰到触点,从而形成一个闭合电路。
5.3 独立按键驱动原理
独立按键驱动是为了让微控制器能识别按键的状态,而微控制器正好可以识别高电平和低电平,所以大多数的按键都是通过给按键的一端接入高电平,一端接入GPIO;或者是给按键的一端接入低电平,一端接入GPIO。通过检测连接按键的引脚有没有发生电平变化,就可以知道按键是否按下。
5.4 消抖措施
由于机械按键在闭合和分开时可能产生的机械振动(相当于弹簧),导致开关状态在短时间内多次变换,这就是按键抖动现象。消抖措施主要分为软件消抖和硬件消抖:
- 软件消抖:主要是通过编程的方法,设定一个延迟或计时器,确保在一定的时间内只读取一次按键状态,避免抖动对程序的影响。
- 硬件消抖:在按键电路中加入元器件如电阻、电容组成的RC低通滤波器,对按键信号进行平滑处理,降低抖动的影响。
5.5 独立按键原理图
开发板原理图中,将按键一端通过上拉电阻R14接到的3.3V的高电平和引脚GPIO0上,另一端接到了GND(低电平)。将开发板的按键电路简化,得到下图。
开发板一上电,GPIO0引脚就会因为R14这个上拉电阻变为高电平,所以当按键没有按下的时候,GPIO0引脚默认为高电平;当按键按下时,因为按键闭合,GPIO0通过按键接到了GND上,所以GPIO0变为了低电平;
5.6 独立按键驱动流程
以下是一个简化的独立按键驱动流程:
- 初始化微控制器的GPIO为输入功能。
- 检测按键状态(定时轮询或中断触发)。
- 如有抖动现象,应用消抖措施。
- 根据按键状态执行相应的程序代码。
- 在操作完成后等待下一次按键触发。
❓什么是定时轮询或中断触发?
- 定时轮询也叫顺序检测,它是一种扫描式的按键驱动方式,在一个循环的代码中循环的检测按键状态。当检测到按键闭合时,就进行相应操作。
- 中断触发主要利用微控制器的中断功能,当按键状态发生变化时,微控制器会立即响应,停止当前任务并执行按键响应程序。这种方式对实时性要求较高。
❓我们知道可以通过代码读取按键引脚上的电平,判断按键是否按下。但是如何编写读取的代码呢?
digitalRead()
是 Arduino 编程中用于从数字引脚读取电平状态的函数。当引脚设置为输入模式(INPUT
或 INPUT_PULLUP
)时,你可以使用这个函数来读取该引脚的当前电平状态。 digitalRead()
函数只有一个参数:
引脚编号(Pin number):这是你要读取的数字引脚的编号。
digitalRead()
函数返回的值为 HIGH(高电平)或 LOW(低电平)。以一个使用了
digitalRead()
的示例为例:cint buttonState = digitalRead(2);
1在此例子中,我们从编号为2的引脚上(GPIO2)读取值。返回的值存储在变量
buttonState
中,它将会是HIGH
或者LOW
,分别表示在该引脚上读取的电平是高还是低。
5.7 按键点灯验证
设置LED引脚为输出模式,设置按键引脚为输入模式。当按键按下时,先进行按键消抖,再判断一次是否按下按键。确定按下按键后将执行LED状态变化的操作。
// 定义 LED 引脚
int led_pin = 48;
// 定义 按键 引脚
int button_pin = 0;
// 定义 LED 逻辑值
int led_logic = 0;
//定义LED状态变量,默认为假即低电平, 通过它判断 LED 的状态是否改变过
bool status = false;
//只执行一次
void setup()
{
//设置LED引脚(48) 为输出模式
pinMode(led_pin, OUTPUT);
//设置按键引脚(0) 为上拉输入模式
pinMode(button_pin, INPUT_PULLUP);
}
//循环执行
void loop()
{
// 如果读取到的按键引脚电平为 0 (低电平)
// 说明按键按下
if ( digitalRead(button_pin) == 0 )
{
// 延时 100ms,消除按键抖动
delay(100);
//如果消抖后按键状态还是低电平0
//说明不是按键抖动导致的按下
if (digitalRead(button_pin) == 0 )
{
//将LED的状态变量进行取反,即在低电平和高电平之间切换
status = !status;
//控制LED状态变化
digitalWrite(led_pin, status);
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
5.8 按键点灯效果
按下按键灯亮,再按下按键灯灭,如此反复。