|
本帖最后由 OpenJumper 于 2022-1-17 11:49 编辑
[md]## 一、按钮控制LED延时开关
在上一章中我们使用了Arduino语言编写了程序,通过程序完成了流水灯的设计与实验,在这一章中,我们将更加深入,通过程序,来达到手动控制LED灯的点亮熄灭,在按下按钮时,LED将被点亮,松开按钮时,LED将被熄灭,这样自己动手参与其中,也会更有兴趣吧。
## 二、实验器件
+ UNO 控制板:1块
+ LED灯:1个
+ 220Ω电阻:1个
+ 10KΩ电阻:1个
+ 面包板:1块
+ 面包板跳线:若干
+ 按钮:1个
## 三、连线示意图
图2-1
## 四、硬件连线图
图2-2
## 五、硬件知识要点
实验中我们将使用到的按钮开关为四脚按钮开关,其内部电路如图2-3所示:
图2-3
**限流电阻**
一般LED的最大能承受的电流为25mA,如若直接将LED连接到电路中,当其点亮时,如果电流过大,很容易烧毁。如图2-1所示,我们在LED正极串联了一个电阻R2,这样做可以控制流过LED的电流,防止损坏LED。这个电阻我们称之为限流电阻。
**下拉电阻**
在UNO的2号引脚到GND之前,连接了一个阻值10K的电阻。如果没有该电阻,当未按下按键时,2号引脚会一直处于悬空 状态,此时使用digitalRead() 读取2号引脚状态,会得到一个不稳定的值(可能是高,也可能是低)。添加这个R1电阻到地就是为了稳定引脚的电平,当引脚悬空时,就会识别为低电平。而这种将某节点通过电阻接地的做法,叫做下拉,这个电阻叫做下拉电阻。
当未按下按键时,2号引脚检测到的输入电压为低电平;当按下按键时,会导通2号引脚和VCC,此时2号引脚检测到的输入电压为高电平。通过判断按键是否被按下,来控制LED的亮灭。
## 六、程序编写
我们可以在Arduino IDE菜单>文件>示例>02.Digital>Button 中找到以下程序:[/md]
- // 设置各引脚别名
- const int buttonPin = 2; // 连接按键的引脚
- const int ledPin = 13; // 连接LED的引脚
-
- // 变量定义
- int buttonState = 0; // 存储按键状态的变量
-
- void setup() {
- // 初始化LED引脚为输出状态
- pinMode(ledPin, OUTPUT);
- // 初始化按键引脚为输入状态
- pinMode(buttonPin, INPUT);
- }
-
- void loop(){
- // 读取按键状态并存储在变量中
- buttonState = digitalRead(buttonPin);
-
- // 检查按键是否被按下
- // 如果按键按下,那buttonState应该为高电平
- if (buttonState == HIGH) {
- // 点亮LED
- digitalWrite(ledPin, HIGH);
- }
- else {
- // 熄灭LED
- digitalWrite(ledPin, LOW);
- }
- }
复制代码
[md]
## 七、程序知识要点
const关键字代表常量。它是一个变量限定符,用于修改变量的性质,使其变为只读状态。这意味着该变量,就像任何相同类型的其他变量一样使用,但不能改变其值。
buttonState:按钮的状态。
## 八、拓展阅读
在上面的实验中,我们在按下按钮之后,LED会点亮,松开按键后,LED熄灭,接下来我们将对于程序和电路做一个小的修改,从而实现按下按钮后,LED点亮,再次按下按钮后,LED熄灭。具体电路图如图2-4所示:
图2-4
在上图2-4中,我们去掉了原来电路中2号引脚连接的下拉电阻,并将按键的一端连接到GND;同时,我们将原程序setup()中的程序,
pinMode(buttonPin,INPUT);
改为pinMode(buttonPin,INPUT_PULLUP);
这样能使能该引脚上的内部上拉电阻,等效于在该引脚到VCC之间连接一个外部上拉电阻。
**上拉电阻**
同下拉电阻一样,可以稳定I/O口电平,不同的是电阻连接到VCC,将引脚稳定在高电位。这种电阻叫做上拉电阻。
这里使用的是内部上拉电阻,也可以使用外部上拉电阻替代。稳定悬空引脚的电平所用电阻应该选择合适的阻值,例如10K。
修改之后的程序如下:
[/md]- <div>int buttonPin = 2;
- int ledPin = 13;
- boolean ledState=false; // 记录LED状态
- boolean buttonState=true; // 记录按键状态
-
- void setup()
- {
- // 初始化I/O口
- pinMode(buttonPin, INPUT_PULLUP);
- pinMode(ledPin,OUTPUT);
- }
-
- void loop()
- {
- // 等待按键按下
- while(digitalRead(buttonPin)==HIGH){}
-
- // 当按键按下时,点亮或熄灭LED
- if(ledState==true)
- {
- digitalWrite(ledPin,LOW);
- ledState=!ledState;
- }
- else
- {
- digitalWrite(ledPin,HIGH);
- ledState=!ledState;
- }
- delay(500);
- }</div><div></div>
复制代码
[md]
这样我们就完成了对于程序的修改,使用上述程序,我们可以实现,每按一下按钮,都可以让LED的状态发生改变。
[/md]
|
|