查看: 2893|回复: 1

Stduino 零基础入门课程系列(五) 实验三:按键输入

[复制链接]

53

主题

55

帖子

431

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
431
发表于 2020-8-21 18:56:53 | 显示全部楼层 |阅读模式
Hello!各位同学大家好~上节课我们利用管脚输出高低电平信号,控制LED的亮灭,那么我们这节课将学会利用Stduino UNO接收按钮是否按下的信号。
按钮的功能非常简单,按钮松开,电路断开;按钮按下,电路接通。
零基础课-05-按键电路图示意.png
开发板的数字信号管脚只能输出高低电平,同时也只能接收高低电平两种信号(5V0V)。那么,怎么利用开发板来接受电平信号呢?
简单改造一下上面的电路,将按键接入到Stduino UNO上的D11管脚,另一端接5V电压。
当我们按下按键,D11就能接收到高电平信号(5V),当松开按键,电路断开,此时D11接收到的就是低电平信号(0V)。(左图按键送开,右图按键按下)
基础5第一.png
理想条件下,我们就实现了接收按键的信号。但是,实际中,D11管脚在按键松开的时候,仍然处于监测信号的状态,而管脚这个时候浮空,容易受到外部的干扰,接收到一些随机干扰信号。因此实际上,D11管脚可能接收到时低时高的电平信号。
在按键断开的时候,为了保证D11管脚接入的是低电平信号,我们可以接入一条GND电路。这样在断开的时候,就能保证接入的是低电平信号了。
电路图A03.png
这样做看似比较正常。但当我们按下按键时,就会发现新的问题。按下按键之后,D11没办法判断节点A是低电位还是高电位,因此D11管脚无法读取出高电位(我们想的是按下案件之后,能够获得高电平信号!)。
电路图A04.png
那么,我们该怎么保证按下按键之后,A节点处一定是高电位(5V)呢。

让我们回到上节课的学习内容,有一样东西能够降低电路中的电位,就是电阻。就像这张图上表示的一样,当电路中加入了一个电阻,那么电阻就会降低电路中的电位。具体的表现,就是电阻一端的电位比另一端的电位高5V
电路图A05.png
那么我们只需要在电路中加入一个电阻,这样,当按键按下的时候,节点A的电位就能够确定为5V。同样,我们送开,此时0V接入到管脚。
电路图A06.png

好啦,同学们现在知道怎么来设计按键输入信号的电路了,那么接下来让我们动手来连接电路吧。
零基础课-05-01.png
现在我们可以通过D11监测到的电平信号来判断按键是否按下了,我们可以整理出一个简单的逻辑:
  1. 如果  D11的电平  HIGH:
  2.     那么   按键按下;
  3. 如果  D11的电平  LOW:
  4.     那么   按键送开;
复制代码
那么现在这个电路还不能够做什么,现在我们在D12管脚上接入LED,利用按键来控制LED的亮灭:
零基础课-05-03.png
那我们可以写一个简单的逻辑,来利用按键控制LED的亮灭:
  1. 如果  D11的电平  HIGH:
  2.     LED被点亮;
  3. 如果  D11的电平  LOW:
  4.     LED被熄灭;
复制代码
LED被点亮还是熄灭,我们在上节课已经学习过,可以控制管脚输出高低电平来控制。实际上,在Stduino中可以利用if语句来判断条件是否成立。一个典型的if语句如下:
零基础课-05-if语句解释.png

因此我们可以把上面的逻辑改成如下代码:
  1. #include <Arduino.h>
  2. void setup(){
  3. pinMode(12,OUTPUT);
  4. }

  5. void loop()
  6. {
  7. if (D11的电平==HIGH){
  8. digitalWrite(12,HIGH);
  9. delay(500);
  10. } else {
  11.     digitalWrite(12,LOW);
  12. delay(500);
  13. }

  14. }
复制代码

其中两个连起来的等于号用来判断等号前后两个量是否相等,这与一个等于号的作用不同。等于号一般用来赋给变量值。
那么怎么来确定D11的电平高低呢?那在这里呢,我们利用D11管脚来监测输入电平高低,那么在最开始的时候,我们需要初始化管脚的模式为“INPUT”模式(即输入),并读取输入的信号。利用digitalRead()这个方法可以获取管脚的电平信号。
因此我们需要在setup()中添加:
  1. pinMode(11,INPUT);
复制代码

接下来,把管脚读取到的信号值存储在D11的电平”中。当然,我们首先需要给它起个英文名字,例如“BUTTON”(按键),此外,我们还需要说清楚这个变量存储什么样类型的数据。对于BUTTON而言,存储01,因此是一个整数型变量,那么我们这样告知机器,我们要这样的一个变量:
  1. int BUTTON;//一个叫“BUTTON”的变量,存储整数(int)类型的数据
复制代码
并把读取到的信号值存到这个BUTTON”中:

  1. BUTTON = digitalRead(11);
复制代码
接下来只需要判断BUTTON为高还是为低就可以知道按键是否按下了。因此,我们可以新建一个文件,并写上下面的代码:
  1. #include <Arduino.h>
  2. int BUTTON;
  3. void setup(){
  4. pinMode(12,OUTPUT);
  5. pinMode(11,INPUT);
  6. }

  7. void loop()
  8. {
  9. BUTTON = digitalRead(11);

  10. if (BUTTON==HIGH){
  11. digitalWrite(12,HIGH);
  12. delay(500);
  13. } else {
  14.     digitalWrite(12,LOW);
  15. delay(500);
  16. }

  17. }
复制代码

写好代码后,我们就可以把代码下载到Stduino UNO中了。如果你下载好代码,有可能会发现,即使LED是熄灭状态,每次按下按键,也不一定会点亮。
理想条件下,这是D11接收到的电平信号。按键松开的时候,电平信号一直为0V,当我们按住按键时,电平信号快速变化为5V
零基础课-05-02时序图01.png
但是,实际上按键按下的一瞬间,电平信号并不稳定,会在0V5V之间“抖动”之后才稳定在5V。这就意味着,我们每次按下的时候,信号并不稳定,因此按键不能很好的控制LED亮灭。
零基础课-05-02时序图02.png
解决方法非常简单,我们在每次读取D11管脚信号的时候,等待一段时间,来跳过这一段抖动的时间即可。等待时间过长,那么按键的灵敏性就要大大下降,按下一会儿才有反应。太短则不能起到消去抖动的作用。一般而言,15毫秒就可以起到比较好的消抖的作用。
因此我们在每次读取信号之前,延迟15毫秒:
  1. delay(15);
复制代码
最终,代码如下:
  1. #include <Arduino.h>
  2. int BUTTON;
  3. void setup(){
  4. pinMode(12,OUTPUT);
  5. pinMode(11,INPUT);
  6. }

  7. void loop()
  8. {
  9.     delay(15);
  10. BUTTON = digitalRead(11);

  11. if (BUTTON==HIGH){
  12. digitalWrite(12,HIGH);
  13. delay(500);
  14. } else {
  15.     digitalWrite(12,LOW);
  16. delay(500);
  17. }

  18. }
复制代码

现在把代码下载到Stduino UNO中,看看是不能够利用按键随心所欲的控制LED呢?
上完这节课,我们就已经掌握了高低电平输入输出的技巧了,是不是很简单?


回复

使用道具 举报

0

主题

11

帖子

26

积分

禁止发言

积分
26
发表于 2022-8-24 19:50:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

Stduino 零基础入门课程系列(五) 实验三:按键输入
Stduino 零基础入门课程系
Hello!各位同学大家好~上节课我们利用管脚输出高低电平信号,控制LED的亮灭,那么我
Stduino小白练习第六弹--按键控制串口通信
Stduino小白练习第六弹--
2020/01/08 星期三 作者:Astilbe 问题:我们如何通过按下按键来传输固定的信息给PC呢
37种传感器(二十九)MPU6050陀螺仪模块+Stduino Nano&UNO
37种传感器(二十九)MPU6
StduinoUno /纳米37种传感器(二十九)六轴 MPU陀螺仪模块关键词: 51 ; stm32 ; ar
stm32 最小系统 小蓝板 LED闪烁灯(三),无需刷Bootloader
stm32 最小系统 小蓝板 LE
关键词:stm32 小蓝板 STM32F103C8T6 Stduino IDE Stduino Nano LED闪烁灯 通过Stduin
Stduino IDE软件下载专区
Stduino IDE软件下载专区
Stduino IDE软件下载专区 Windows版:7月29号发布1.01, 现可
今天在文涛老大的帮助下我的stm32zet6终于把simlpefoc库跑起...
今天在文涛老大的帮助下我
[md]首先本身是刚刚从MDK转到arduino过来的新人,只因为要完开源的simplefoc,期间由
连接ADS1292模拟前端芯片,使用SPI库,导致串口不输出数据
连接ADS1292模拟前端芯片
[md]连接ADS1292模拟前端芯片,使用SPI库,导致串口不输出数据 ![QSJSBEZF83I8C907%$
©2001-2018  Stduino官网  Powered by©Discuz!   ( 皖ICP备17011998号 )
快速回复 返回顶部 返回列表