Arduino 入门-第2课:按键控制 LED 灯(消抖版)
本文介绍了Arduino入门基础实验——按键控制LED灯的实现方法。实验通过数字输入/输出原理,使用按键控制LED亮灭,并重点讲解了按键消抖处理。硬件方面需要Arduino UNO、按键、LED、电阻等元件,采用上拉输入模式简化电路连接。代码解析部分详细说明了INPUT_PULLUP模式、消抖延时处理以及loop循环的工作原理。文章还提供了常见问题排查方法,并给出进阶优化思路,如实现按键切换功能。
在 Arduino 入门学习中,按键控制 LED 灯是最经典的基础实验之一。这个实验不仅能帮我们理解数字输入 / 输出的基本原理,还能接触到 “按键消抖” 这个实际应用中必须解决的问题。本文将详细讲解如何用按键精准控制 LED 灯的亮灭,并解释核心代码的逻辑和设计思路。
一、实验原理与硬件准备
1. 核心原理
- 数字输入:按键作为输入设备,按下时会改变对应引脚的电平(高 / 低),Arduino 通过
digitalRead()函数读取电平状态。 - 数字输出:LED 作为输出设备,Arduino 通过
digitalWrite()函数控制引脚输出高 / 低电平,从而点亮或熄灭 LED。 - 按键消抖:物理按键按下 / 松开时,金属触点会产生短暂的电平抖动,直接读取会导致误判,需通过延时跳过抖动阶段。
- 上拉输入(INPUT_PULLUP):利用 Arduino 内部上拉电阻,使按键未按下时引脚为高电平(HIGH),按下时为低电平(LOW),无需额外外接上拉电阻,简化电路。
2. 硬件清单
- Arduino UNO(或其他型号)
- 按键开关 ×1
- LED 灯 ×1
- 220Ω 限流电阻 ×1
- 杜邦线若干
- 面包板 ×1
3. 电路连接
| Arduino 引脚 | 元件 | 连接说明 |
|---|---|---|
| 9 | LED 正极 | LED 正极接 9 脚,负极串 220Ω 电阻接 GND |
| 2 | 按键 | 按键一端接 2 脚,另一端接 GND |
| GND | 公共地 | 电阻、按键的公共接地端 |
原理图

连接图

实物图

二、完整代码与逐行解析
这种是按下就亮,松开就熄灭
/*
* Digital_Button
* 通过按键控制LED灯亮灭
* 功能:按下按键LED亮,松开按键LED灭(带消抖处理)
*/
// 1. 管脚定义:将引脚号赋值给变量,方便后续修改和阅读
int buttonPin = 2; // 按键连接的管脚
int ledPin = 9; // LED灯连接的管脚
void setup() {
// 2. 设置管脚模式:初始化引脚为输入/输出模式
pinMode(ledPin, OUTPUT); // LED管脚设为输出模式(可输出高低电平)
pinMode(buttonPin, INPUT_PULLUP); // 按键管脚设为上拉输入模式(默认高电平)
}
void loop() {
// 3. 读取按键状态:判断按键是否按下
if (digitalRead(buttonPin) == LOW) { // 按下按键时,引脚电平变为低
delay(80); // 4. 消抖处理:等待80ms跳过触点抖动的不稳定阶段
// 5. 再次确认按键状态:避免抖动导致的误触发
if (digitalRead(buttonPin) == LOW) {
digitalWrite(ledPin, HIGH); // 点亮LED:输出高电平
}
} else {
digitalWrite(ledPin, LOW); // 松开按键:熄灭LED,输出低电平
}
}
也可以写成这样,用flag变量标记小灯泡状态,按下后,会改变状态
/*
* Digital_Button
* 通过按键控制LED灯亮灭
*/
int buttonPin=2;//按键的管脚定义
int ledPin=9;//LED灯管脚定义
int flag=0;
void setup()
{
pinMode(ledPin,OUTPUT);//设置LED管脚的输出模式
pinMode(buttonPin,INPUT_PULLUP);//设置按键管脚上拉的输入模式
}
void loop()
{
if(digitalRead(buttonPin)==LOW)//如果按键按下
{
delay(80);//等待跳过按键抖动不稳定过程
if(digitalRead(buttonPin)==LOW)//如果被按下
{
flag=(flag+1)%2;
}
}
if(flag==1)
{
digitalWrite(ledPin,HIGH);//点亮LED灯
}
else if(flag==0)
{
digitalWrite(ledPin,LOW);//熄灭LED灯
}
}
关键代码解析
-
INPUT_PULLUP 模式:这是 Arduino 按键输入的常用模式,启用内部上拉电阻后,按键未按下时引脚默认是
HIGH(高电平),按下后引脚接地变为LOW(低电平),无需外接上拉电阻,电路更简洁。 -
按键消抖:
delay(80)是最简易的消抖方式 —— 当检测到按键按下时,先等待 80 毫秒(足够覆盖触点抖动的时间),再重新读取按键状态。只有两次读取都是LOW,才判定为 “真按下”,避免因抖动导致 LED 频繁闪烁。 -
loop () 循环:Arduino 通电后会不断执行
loop()里的代码,因此能实时检测按键状态,实现 “按下亮、松开灭” 的效果。
三、实验效果与常见问题
1. 预期效果
- 未按按键时,LED 灯熄灭;
- 按下按键并保持,LED 灯常亮;
- 松开按键,LED 灯立即熄灭;
- 按键按下 / 松开时无闪烁(消抖生效)。
2. 常见问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| LED 始终常亮 | 按键引脚接反 / 未接 GND | 检查按键连线,确保一端接 2 脚、一端接 GND |
| 按键按下无反应 | LED 限流电阻过大 / 引脚定义错误 | 更换 220Ω 电阻,核对ledPin和buttonPin值 |
| LED 频繁闪烁 | 未做消抖 / 消抖延时过短 | 确认delay(80)代码存在,可调整延时至 50-100ms |
四、进阶优化思路
如果想实现 “按一下亮、再按一下灭” 的 toggle(切换)效果,可修改loop()逻辑(核心是增加状态变量记录 LED 当前状态):
arduino
int ledState = LOW; // 记录LED当前状态,初始灭
void loop() {
if (digitalRead(buttonPin) == LOW) {
delay(80);
if (digitalRead(buttonPin) == LOW) {
ledState = !ledState; // 状态反转:亮变灭,灭变亮
digitalWrite(ledPin, ledState);
while(digitalRead(buttonPin) == LOW); // 等待按键松开,避免重复触发
}
}
}
总结
- 本实验核心是利用
digitalRead()读取按键输入、digitalWrite()控制 LED 输出,INPUT_PULLUP模式简化了按键电路设计; - 按键消抖是关键细节,
delay()延时消抖是入门阶段最易理解和实现的方式; - 代码采用 “变量定义引脚” 的方式,提升了可读性和可维护性,符合编程最佳实践。
更多推荐



所有评论(0)