开启左侧

Arduino之按钮库

[复制链接]
发表于 2017-7-23 11:41:21 | 显示全部楼层 |阅读模式
在很多Adruino的小制作中,按钮其实扮演着一个比较重要的角色,它是一个人机交互的最简单的实现方法,所以要能较为熟练的使用按钮,才能在最基本的交互上不出问题。这里我们首先讲述两个按钮的连接方法。如左图所示这是一个按钮上拉连接的方式,右图则是一个按钮下拉的连接方式。这里解释一下上下拉的意思。上拉是将按钮不按下去的电平状态拉到VCC,而下拉则是将按钮不按下去的状态拉到GND。这样做的目的是为了保证电平的稳定性。有兴趣的朋友可以自己试验一下。就简单的将按钮一端连接到数字口一端连接到VCC或者GND,用串口打印该引脚的状态,会发现在按钮没有按下去的时候,电平是不稳定的,会在0与1之间不规则跳动。
按钮连线_上拉.PNG 按钮连线_下拉.PNG

上下拉同时也会改变IO口电平的常态。例如我们使用上拉的时候,按钮没有按下去IO口读到的就是HIGH,而按下去了就是LOW,下拉正好反过来。
为什么会这样?
进行一个简单的解释,比如说上拉,如上图所示,当按钮没有按下去的时候,电路没有形成回路,我们可以把按钮断路的那部分看成是一个无穷大的电阻,根据串联电路的电阻分压原理,一个无穷大的电阻和一个有限值得电阻进行分压,那我们可以认为无穷大的电阻基本分到了全部的电压。而Arduino的D7和GND是一个电压表正负极,那我们再去测量一个无穷大的电阻两端的电压的时候,那就是VCC的电压。然后因为数字电路的门电压关系,所以得到了D7在按钮没有按下去的状态就是HIGH。
当按钮按下去后,按钮就相当于是一根导线,导线有电阻但是相对于1K的电阻可以忽略不计,所以电压全部被串联的电阻分去,也就是导致了“电压表”无法测量到电压,也就是LOW了。
下拉有兴趣可以自己分析一下。
这样我们有了简单的外部电路连接。
接下来我们需要开始编写读取的程序,一般初学者能搭建出这样的电路,编写程序后上手就是
  1. digitalRead(7)
复制代码
这样可以么?答案是不行的!因为人的操作与按钮的制造以及使用老化的问题,如果只是简单的这样读取是非常不能保证准确性的。举个例子,就像老手机用多了充电线接触不好一样。按钮你感觉按下去了,但是因为老化或者其他缘故实际上没有按下去或者接触不良导致HIGH LOW HIGH这样的跳变也不是不可能存在。所以我们在编程序的时候就要考虑到这个问题并且解决他。最简单也是最常用的处理方法就是两次读取加延迟,也就是所谓的按键去抖。
  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   pinMode(7, INPUT);
  5. }

  6. void loop()
  7. {
  8.   if (digitalRead(7) == LOW)
  9.   {
  10.     delay(10);
  11.     if (digitalRead(7) == LOW)
  12.     {
  13.       Serial.println("Button is pressed!");
  14.     }
  15.   }
  16.   delay(1000);
  17. }
复制代码
这是一个最简单的按键去抖程序,其中的delay(10)的作用就是去抖。

讲了这么多,是不是发现按钮的读取并不是想象中的那么简单。这时候我们就要回归我们的标题,提供一个非常好用的按钮库给大家, Button.zip (9.79 KB, 下载次数: 0)
回复

使用道具 举报

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

本版积分规则

精彩课程推荐

关于我们

帮助中心

商务合作

点击这里给我发消息

关注微信公众号

Copyright © 2016-2017 i创学院 - 上海享渔教育科技有限公司 Powered by Discuz!     ( 沪ICP备16033954号-1 )