arduino教程系列6-按键实验 arduino入门,arduino教程



按键是一种常用的控制电器元件,常用来接通或断开电路,从而达到控制电机或者其他设备运行的开关。按键的外观多种多样,本次实验使用的是这种微型按键,6mm的,如下图。


IMGP9811-1调整大小.jpg

2011-7-21 20:11 上传
(152.07 KB)





此种按键有4个脚,从背面看是这样子的。


IMGP9801-1调整大小.jpg

2011-7-21 20:11 上传
(99.5 KB)




Snap1.jpg

2011-7-21 20:11 上传
(15.51 KB)





在按键没有按下去的时候1,2号脚相连,3,4号脚相连。按键按下去的时候,1,2,3,4号脚就全部接通。



本次实验使用按键来控制led的亮或者灭。

一般情况是直接把按键开关串联在led的电路中来开关,这种应用情况比较单一。

这次实验通过间接的方法来控制,按键接通后判断按键电路中的输出电压,如果电压大于4.88V,就使给LED电路输出高电平,反之就输出低电平。使用逻辑判断的方法来控制LED亮或者灭,此种控制方法应用范围较广。



本次连接方法如下图。按键开关两段一端连接5V接口,一端连接模拟5号口。LED长针脚串联220Ω电阻连接数字7号口,短针脚连接GND。


Snap4.jpg

2011-7-21 20:11 上传
(106.78 KB)




IMGP9867_调整大小.JPG

2011-7-21 20:11 上传
(195.93 KB)





把下面的代码上传到arduino控制板上,看看效果。

int key=7;//设置LED的数字IO脚
void setup()
{
pinMode(key,OUTPUT);//设置数字IO引脚为输出模式
}
void loop()
{
int i;//定义变量
while(1)
{
i=analogRead(5);//读取模拟5口电压值
if(i>1000)//如果电压值大于1000(即4.88V)
digitalWrite(key,HIGH);//设置第七引脚为高电平,点亮led灯
else
digitalWrite(key,LOW);//设置第七引脚为低电平,熄灭led灯
}
}

本次实验的效果如下

本次实验使用到analogRead()这个新命令。

analogRead()作用是读取模拟口的数值。默认是把0-5V的输入电压分成1024份,每一份大约为0.0049V,其数值在0-1023之间。

在本次程序代码中的读取数值如果大于1000则给LED输出高电平, 所对应的电压也就为大于4.88V。

analogRead()命令输入的范围与分辨率可以使用analogReference()命令进行改动。



刚开始本实验选用的判断标准是512,也就是2.5V。但是有网友按照教程的方法进行试验发现有问题,有时不需要按按钮灯就会自己亮。根据多次试验与分析后,确定其为各种干扰所致。比如感应电流等等不少都是大于2.5V的,所以为了提高准确度,只能提高判断的电压,本次实验就是提高到1000(4.88V)。人体自身也带电,早中晚还个不一样。下面的实验就是把模拟5号口判断标准定位512,用手去触摸模拟5号口导线就可以点亮LED。


前面的按键实验,有人会反映手接近开关就会亮灯。这个是因为没有下拉电阻,使得外界干扰影响了判断。

先来看一下下拉电阻的接法。在接按键的接口与GND之间接一个1K-10K Ω的电阻。其作用是当外界有干扰源的时候,在断开状态下,干扰源在通向GND的过程中,会被电阻消耗掉。

无标题.jpg

2011-11-3 22:39 上传
(18.58 KB)





看一下硬件连接图,本次实验直接使用arduino duemilanove 13号口自带的led作为指示灯。


Snap1.jpg

2011-11-3 22:39 上传
(87.88 KB)





下面的代码和上面的不同,其中加入了软件消抖。因为本次例子是按键按一次灯亮,再按一次灯灭,如果不加消抖,就会产生按下去状态无法改变的情况。

软件消抖指的是检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

硬件消抖是在开关两段接一个0.1uf的电容,但是其无法替代软件消抖。 其作用不同,搭配使用效果最好。

感谢ansifa提供的加入了软件消抖的实验代码。
ARDUINO 代码复制打印

/* 开关连接实验
接线方法:
材料:一个轻触开关、一个10kΩ电阻,一个0.1uF电容(可选)
连接方法:
开关接在Arduino D3和+5V之间;
10kΩ电阻接在Arduino D3和GND之间;
0.1uF电容接在Arduino D3和+5V之间(可以不用电容);
*/

int Button=3; //连接开关到D3。
int LED=13; //连接LED到13(实际上UNO等版本已经有了)。
boolean onoff=LOW; //设定一个变量用于记录开关状态。
void setup()
{
  pinMode(Button,INPUT); //按钮端子作为输入
  pinMode(LED,OUTPUT); //LED端子作为输出
}
void loop(){
  if(digitalRead(Button)==LOW)  //由于本例检测上升沿触发,所以先检测输入是否低电平,
  {
    delay(10); //然后延时一段时间,
    if(digitalRead(Button)==HIGH) //然后检测是不是电平变为高了。是的话,就是刚好按钮按下了。
    {
      digitalWrite(LED,onoff);  //写入当前LED状态onoff,
      onoff=(!onoff); //然后LED状态反转,以便下一次使用。
      delay(10);  //延时一段时间,防止按钮突然断开再按下。
      while(digitalRead(Button)==HIGH) //判断按钮状态,如果仍然按下的话,等待松开。防止一直按住导致LED输出端连续反转
      {
        delay(1);
      }
    }
  }
}

下面是这段代码的效果:

当没有下拉电阻的时候,可以明显看到下面的示波器波形,按键断开时低电平漂浮不定,这样子容易出现误判。看按键按下与松开的波形,也能明显感觉到低电平不稳。

IMGP5562_调整大小.JPG

2011-11-3 22:39 上传
(147.42 KB)




没加电阻的低电平.jpg

2011-11-3 22:59 上传
(67.8 KB)




没加电阻按住.jpg

2011-11-3 22:59 上传
(68.38 KB)




没加电阻松开.jpg

2011-11-3 22:59 上传
(69.69 KB)





当接上电阻后,低电平的稳定了,按键按下时,波形没问题,但是按键松开时,波形抖动很厉害。


IMGP5564_调整大小.JPG

2011-11-3 22:39 上传
(139.88 KB)




不加电容按住.jpg

2011-11-3 22:59 上传
(68 KB)




不加电容松开.jpg

2011-11-3 22:59 上传
(75.01 KB)





最完美的是把下拉电阻和电容都接上,这样就综合了所有优点,按键松开时,波形很稳定。


IMGP5563_调整大小.JPG

2011-11-3 22:39 上传
(141.14 KB)




加了电容按住.jpg

2011-11-3 22:59 上传
(70.06 KB)




加了电容松开.jpg

2011-11-3 22:59 上传
(70.27 KB)





via - 极客工坊

标签: Arduino教程