Hello!各位同学大家好~上节课我们利用管脚输出高低电平信号,控制LED的亮灭,那么我们这节课将学会利用Stduino UNO接收按钮是否按下的信号。 按钮的功能非常简单,按钮松开,电路断开;按钮按下,电路接通。 开发板的数字信号管脚只能输出高低电平,同时也只能接收高低电平两种信号(5V与0V)。那么,怎么利用开发板来接受电平信号呢? 简单改造一下上面的电路,将按键接入到Stduino UNO上的D11管脚,另一端接5V电压。 当我们按下按键,D11就能接收到高电平信号(5V),当松开按键,电路断开,此时D11接收到的就是低电平信号(0V)。(左图按键送开,右图按键按下) 理想条件下,我们就实现了接收按键的信号。但是,实际中,D11管脚在按键松开的时候,仍然处于监测信号的状态,而管脚这个时候浮空,容易受到外部的干扰,接收到一些随机干扰信号。因此实际上,D11管脚可能接收到时低时高的电平信号。 在按键断开的时候,为了保证D11管脚接入的是低电平信号,我们可以接入一条GND电路。这样在断开的时候,就能保证接入的是低电平信号了。 这样做看似比较正常。但当我们按下按键时,就会发现新的问题。按下按键之后,D11没办法判断节点A是低电位还是高电位,因此D11管脚无法读取出高电位(我们想的是按下案件之后,能够获得高电平信号!)。 那么,我们该怎么保证按下按键之后,A节点处一定是高电位(5V)呢。
让我们回到上节课的学习内容,有一样东西能够降低电路中的电位,就是电阻。就像这张图上表示的一样,当电路中加入了一个电阻,那么电阻就会降低电路中的电位。具体的表现,就是电阻一端的电位比另一端的电位高5V。 那么我们只需要在电路中加入一个电阻,这样,当按键按下的时候,节点A 的电位就能够确定为5V。同样,我们送开,此时0V接入到管脚。
好啦,同学们现在知道怎么来设计按键输入信号的电路了,那么接下来让我们动手来连接电路吧。 现在我们可以通过D11监测到的电平信号来判断按键是否按下了,我们可以整理出一个简单的逻辑: - 如果 D11的电平 HIGH:
- 那么 按键按下;
- 如果 D11的电平 LOW:
- 那么 按键送开;
复制代码那么现在这个电路还不能够做什么,现在我们在D12管脚上接入LED,利用按键来控制LED的亮灭: 那我们可以写一个简单的逻辑,来利用按键控制LED的亮灭: - 如果 D11的电平 HIGH:
- LED被点亮;
- 如果 D11的电平 LOW:
- LED被熄灭;
复制代码LED 被点亮还是熄灭,我们在上节课已经学习过,可以控制管脚输出高低电平来控制。实际上,在Stduino中可以利用if语句来判断条件是否成立。一个典型的if语句如下:
因此我们可以把上面的逻辑改成如下代码: - #include <Arduino.h>
- void setup(){
- pinMode(12,OUTPUT);
- }
- void loop()
- {
- if (D11的电平==HIGH){
- digitalWrite(12,HIGH);
- delay(500);
- } else {
- digitalWrite(12,LOW);
- delay(500);
- }
- }
复制代码
其中两个连起来的等于号用来判断等号前后两个量是否相等,这与一个等于号的作用不同。等于号一般用来赋给变量值。 那么怎么来确定D11的电平高低呢?那在这里呢,我们利用D11管脚来监测输入电平高低,那么在最开始的时候,我们需要初始化管脚的模式为“INPUT”模式(即输入),并读取输入的信号。利用digitalRead()这个方法可以获取管脚的电平信号。 因此我们需要在setup()中添加:
接下来,把管脚读取到的信号值存储在“D11的电平”中。当然,我们首先需要给它起个英文名字,例如“BUTTON”(按键),此外,我们还需要说清楚这个变量存储什么样类型的数据。对于BUTTON而言,存储0和1,因此是一个整数型变量,那么我们这样告知机器,我们要这样的一个变量: - int BUTTON;//一个叫“BUTTON”的变量,存储整数(int)类型的数据
复制代码并把读取到的信号值存到这个“BUTTON”中:
- BUTTON = digitalRead(11);
复制代码接下来只需要判断BUTTON为高还是为低就可以知道按键是否按下了。因此,我们可以新建一个文件,并写上下面的代码: - #include <Arduino.h>
- int BUTTON;
- void setup(){
- pinMode(12,OUTPUT);
- pinMode(11,INPUT);
- }
- void loop()
- {
- BUTTON = digitalRead(11);
- if (BUTTON==HIGH){
- digitalWrite(12,HIGH);
- delay(500);
- } else {
- digitalWrite(12,LOW);
- delay(500);
- }
- }
复制代码
写好代码后,我们就可以把代码下载到Stduino UNO中了。如果你下载好代码,有可能会发现,即使LED是熄灭状态,每次按下按键,也不一定会点亮。 理想条件下,这是D11接收到的电平信号。按键松开的时候,电平信号一直为0V,当我们按住按键时,电平信号快速变化为5V。 但是,实际上按键按下的一瞬间,电平信号并不稳定,会在0V和5V之间“抖动”之后才稳定在5V。这就意味着,我们每次按下的时候,信号并不稳定,因此按键不能很好的控制LED亮灭。 解决方法非常简单,我们在每次读取D11管脚信号的时候,等待一段时间,来跳过这一段抖动的时间即可。等待时间过长,那么按键的灵敏性就要大大下降,按下一会儿才有反应。太短则不能起到消去抖动的作用。一般而言,15毫秒就可以起到比较好的消抖的作用。 因此我们在每次读取信号之前,延迟15毫秒: 最终,代码如下: - #include <Arduino.h>
- int BUTTON;
- void setup(){
- pinMode(12,OUTPUT);
- pinMode(11,INPUT);
- }
- void loop()
- {
- delay(15);
- BUTTON = digitalRead(11);
- if (BUTTON==HIGH){
- digitalWrite(12,HIGH);
- delay(500);
- } else {
- digitalWrite(12,LOW);
- delay(500);
- }
- }
复制代码
现在把代码下载到Stduino UNO中,看看是不能够利用按键随心所欲的控制LED呢? 上完这节课,我们就已经掌握了高低电平输入输出的技巧了,是不是很简单?
|