介绍
所需材料
● Arduino 开发板(如 Uno、Nano)*1
● 使用板载 LED * 1
● 杜邦线 *2
电路连接
方法 1:使用内部上拉电阻(推荐)
Arduino 内部自带上拉电阻,可以简化电路:
●按钮一脚 → Arduino 数字引脚(如 D2
)
●按钮另一脚 → GND(接地)
方法 2:外部下拉电阻(传统方式)
●按钮一脚 → Arduino D2
●按钮另一脚 → VCC(5V)
Arduino 代码
代码 1:内部上拉电阻 + 防抖(推荐)
const int buttonPin = 2; // 按钮接 D2
const int ledPin = LED_BUILTIN; // 使用板载 LED
int ledState = LOW; // LED 初始状态
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // 启用内部上拉电阻
pinMode(ledPin, OUTPUT); // LED 设为输出
}
void loop() {
if (digitalRead(buttonPin) == LOW) { // 检测按钮是否按下(接地)
delay(50); // 防抖延时(Debounce)
if (digitalRead(buttonPin) == LOW) { // 确认按钮状态
ledState = !ledState; // 切换 LED 状态(开→关 / 关→开)
digitalWrite(ledPin, ledState); // 更新 LED
while (digitalRead(buttonPin) == LOW); // 等待按钮释放
}
}
}
代码 2:外部下拉电阻(传统方式)
const int buttonPin = 2;
const int ledPin = 13;
int ledState = LOW;
void setup() {
pinMode(buttonPin, INPUT); // 注意:这里没有上拉
pinMode(ledPin, OUTPUT);
}
void loop() {
if (digitalRead(buttonPin) == HIGH) { // 按钮按下(接 VCC)
delay(50); // 防抖
if (digitalRead(buttonPin) == HIGH) {
ledState = !ledState;
digitalWrite(ledPin, ledState);
while (digitalRead(buttonPin) == HIGH); // 等待释放
}
}
}
代码解析
关键点说明
-
INPUT_PULLUP
-
Arduino 内部上拉电阻使按钮默认高电平(
HIGH
),按下时接地(LOW
)。 -
避免悬空(Floating)状态,防止误触发。
-
-
防抖(Debounce)
-
机械按钮按下时会有抖动(Bounce),导致多次误触发。
-
delay(50)
可以过滤抖动信号。
-
-
LED 状态切换(Toggle)
-
ledState = !ledState
实现开关切换(LOW
↔HIGH
)。
-
-
等待按钮释放
-
while (digitalRead(buttonPin) == LOW)
防止按住按钮时多次触发。
-
进阶改进
1. 使用中断(更高效)
const int buttonPin = 2;
const int ledPin = LED_BUILTIN;
volatile int ledState = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), toggleLED, FALLING);
}
void toggleLED() {
ledState = !ledState;
digitalWrite(ledPin, ledState);
}
void loop() {
// 主循环可执行其他任务
}
2. 使用 millis()
替代 delay()
(非阻塞式)
unsigned long lastDebounceTime = 0;
const int debounceDelay = 50;
void loop() {
if (digitalRead(buttonPin) == LOW) {
if (millis() - lastDebounceTime > debounceDelay) {
ledState = !ledState;
digitalWrite(ledPin, ledState);
lastDebounceTime = millis();
}
}
}