Arduino 按钮控制LED

介绍所需材料

   ● 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);  // 等待释放
    }
  }
}

代码解析

关键点说明

  1. INPUT_PULLUP
    • Arduino 内部上拉电阻使按钮默认高电平(HIGH),按下时接地(LOW)。

    • 避免悬空(Floating)状态,防止误触发。

  2. 防抖(Debounce)
    • 机械按钮按下时会有抖动(Bounce),导致多次误触发。

    • delay(50) 可以过滤抖动信号。

  3. LED 状态切换(Toggle)
    • ledState = !ledState 实现开关切换(LOW ↔ HIGH)。

  4. 等待按钮释放
    • 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();
    }
  }
}

最终显示效果

完整源代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值