Arudion学习——按键用作开关

前言

在arduion的学习过程中,我们可以通过长按或放开按键来实现控制LED灯的亮灭,那我们是否可以把按键当作开关,从而达到实现按一次按键,LED灯亮;再按一次按键,LED灯熄灭的效果呢?在这篇文章中,将会讲解如何实现该功能及其注意事项。

一、目标实现

将按键当作开关使用,从而实现通过开关控制LED灯的亮与灭

二、实验器件

  • 开发板:arduion
  • 红色LED灯: 1 个
  • 10K电阻:1 个
  • 220欧电阻:1 个
  • 按键开关:1 个
  • 面包板:1 个
  • 多彩杜邦线:若干

三、接线

接线原理如下图所示

实验接线如图所示

四、代码程序

在正式写程序前,我们首先要了解一个概念:消抖

我们在按下按键时,难免会出现手抖动或者接触不稳定,但如果不消抖,按键按下的瞬间将会产生成百上千次按键有效的结果,最终的现象不可预料,所以有必要进行消抖。

int Switch = 7;  //定义数字2接口为按键的引脚编号
int LED = 10;    //定义数字5接口为灯泡的引脚编号
int control = 0;//定义一个变量comtral,用于存储按钮的当前状态
void setup()
{
  pinMode(LED, OUTPUT);    //定义LED灯接口为输出接口
  pinMode(Switch, INPUT);  //定义按键接口为输入接口
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(Switch_1) == HIGH) //按下按钮
  {
    control_1 = !control_1;        //控制灯是否亮起,当control为1时灯泡亮起,为0时灯泡熄灭
    digitalWrite(LED_1, control_1);
    delay(200);                    //通过延时来消抖
  }
}

以下是某位大佬的代码,里面的消抖设置更为有效,可以更有效的实现消抖,大家也可以参考下。

const int buttonPin = 2;    // 定义一个常量buttonPin,其值为2,表示按钮连接的引脚编号。
const int ledPin = 10;      // 定义一个常量ledPin,其值为10,表示LED灯连接的引脚编号。

int ledState = HIGH;       // 定义一个变量ledState,初始值为HIGH(即1),表示LED灯初始状态为高电平(亮)。
int buttonState = LOW;           // 定义一个变量buttonState,用于存储按钮的当前状态(HIGH或LOW)。
int lastButtonState = LOW; // 定义一个变量lastButtonState,初始值为LOW,用于存储按钮的上一个状态。

unsigned long lastDebounceTime = 0;  // 定义一个无符号长整型变量lastDebounceTime,初始值为0,用于记录上一次按钮状态变化的时间。
unsigned long debounceDelay = 50;    // 定义一个无符号长整型变量debounceDelay,其值为50,表示消抖延迟时间(单位可能是毫秒)。

void setup() {
  pinMode(buttonPin, INPUT);  // 将buttonPin设置为输入模式。
  pinMode(ledPin, OUTPUT);   // 将ledPin设置为输出模式。
  digitalWrite(ledPin, ledState); // 将ledPin设置为ledState的值,即点亮LED灯。
}

void loop() {
  int reading = digitalRead(buttonPin); // 读取buttonPin的值,存储在reading变量中。


  /*消抖是一个重要的概念,特别是在处理物理按钮输入时。因为物理按钮在按下或释放时可能会产生快速的、多次的状态变化(即抖动),如果不进行适当的处理,
    这些抖动可能会被误读为多次按钮操作。通过引入消抖延迟,程序可以等待一段时间,以确保按钮的状态变化是稳定的,然后再进行后续操作。*/
  if (reading != lastButtonState) {//有状态变化
    lastDebounceTime = millis(); // 如果reading和lastButtonState不同,则记录当前时间(毫秒)。1000ms/2000ms
  }

  if ((millis() - lastDebounceTime) > debounceDelay) { // 如果从上一次按钮状态变化到现在的时间超过了消抖延迟时间。

    if (reading != buttonState) { // 如果reading和buttonState不同,说明按钮状态真的发生了变化。
      buttonState = reading;      // 更新buttonState为reading的值。
      if (buttonState == HIGH) { // 如果按钮被按下(即buttonState为HIGH)。
        ledState = !ledState;    // 切换ledState的值,即LED灯的状态。
      }
    }
  }

  digitalWrite(ledPin, ledState); // 根据ledState的值,控制LED灯的亮灭。
  lastButtonState = reading;       // 更新lastButtonState为reading的值,为下一次循环做准备。
}

Gitte源码仓库:https://gitee.com/chen_xy_chen/arduion_c.git

五、最终效果

具体效果视频就不在此展示了,感兴趣的伙伴可以自行接线复制代码进行实验。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值