前言
在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
五、最终效果
具体效果视频就不在此展示了,感兴趣的伙伴可以自行接线复制代码进行实验。