查看: 37958|回复: 19

Arduino示例教程模块版——2、按键实验

[复制链接]

该用户从未签到

发表于 2013-5-31 14:53 | 显示全部楼层 |阅读模式
按键模块采用手感舒适的轻触按键,当按下按键,直接将按键的两极导通连接,而按键两极直接引出连接Arduino的信号线与负极,所以按下按键就表示信号线与负极导通。在实验中,我们利用按下按键触发点亮LED灯,当松开按键时,灯熄灭。
图片21.png
元件清单:
Zduino UNO × 1
OJ传感器扩展板× 1
USB数据线 × 1
3p杜邦线 × 2
按键模块 × 1
食人鱼LED模块 × 1

主要知识点:
pinMode(Button, STATE); 配置引脚输入输出状态,只有当配置了过后才能正常操作IO,默认为输入INPUT状态。
  STATE可以为INPUT;OUTPUT;INPUT_PULLUP;
  INPUT---设置该引脚为输入状态;
  OUTPUT---设置该引脚为输出状态;
  PULLUP---设置该引脚为输入上拉状态

digitalRead(Button); 读取该引脚的状态值。带有返回值。
  返回值有0和1;
  为0表明读到的是低电平,范围为-0.5V~1.5V将被认为是读到的低电平。
  为1 表明读到的是高电平,范围为3V~5.5V被认为读到了高电平。

digitalWrite(LEDpin,VAL);  设置引脚输出高或者低电平      
  VAL可以为HIGH;LOW;
  HIGH---设置引脚输出高电平
  LOW---设置引脚输出低电平


接线示意图:
图片22.png

  
Arduino示例程序:

kittenblock中小学创客名师推荐的图形化编程软件

/*
www.openjumper.com
日期:2013.5.18
IDE 版本:1.0.1
功能:按下按键,LED灯点亮。松开按键,LED灯熄灭。
*/
int Button = 2;
int LEDpin = 13;

void setup() {
  pinMode(Button, INPUT_PULLUP); //由于在默认状态时IO口读到的是一个不稳定的电平值,加上拉使之默认接高电平。
  pinMode(LEDpin, OUTPUT);  //设置13号IO口为输出状态
}

void loop() {
  int ButtonState = digitalRead(Button); //设置变量存储读到的状态值
  if(ButtonState==0) 
  {
  digitalWrite(LEDpin,HIGH);        //判断,如果读到的状态为0,表明按键已经按下,这时候点亮LED
  }
  else
  {
  digitalWrite(LEDpin,LOW);      // 否则说明按键没有按,熄灭LED
  }   
}
在实际操作中,可能会出现一个问题,就是按下按键时会出现抖动,抖动时间的长短由按键的机械特性决定,一般为5ms10ms。这是一个很重要的时间参数,在很多场合都要用到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。
图片23.jpg
此处,我们用软件对其进行延时处理消除抖动。

kittenblock中小学创客名师推荐的图形化编程软件

if(ButtonState==0) 
  {
   delay(10);
   if(ButtonState==0) {
   digitalWrite(LEDpin,HIGH); 
   }
  }
示例程序:

kittenblock中小学创客名师推荐的图形化编程软件

/*
www.openjumper.com
日期:2013.5.18
IDE 版本:1.0.1
功能:按下按键,LED灯点亮。松开按键,LED灯熄灭。
*/
int Button = 2;
int LEDpin = 13;
void setup() {
  pinMode(Button, INPUT_PULLUP); //由于在默认状态时IO口读到的是一个不稳定的电平值,加上拉使之默认接高电平。
  pinMode(LEDpin, OUTPUT);  //设置13号IO口为输出状态
}
void loop() {
  int ButtonState = digitalRead(Button); //设置变量存储读到的状态值
  if(ButtonState==0)
  {
  delay(10);
  if(ButtonState==0)               //延时消抖处理
    {
      digitalWrite(LEDpin,HIGH);        //判断,如果读到的状态为0,表明按键已经按下,这时候点亮LED
    }  
   }
  else
    {
    digitalWrite(LEDpin,LOW);      // 否则说明按键没有按,熄灭LED
    }

}


接线实物图:
IMG_20130615_144133_副本.jpg
当什么时候需要设置IO为上拉状态?
答:一般情况下,IO口不接任何电平,用digitalRead()去读它的状态时,读到的是一个不确定的值,不一定是0也不一定是1。这时候观察硬件是否有接一个上拉电阻(提供一个稳定的高电平),如果没有接的话便可以通过软件设置IO口内部加上上拉,也就是 这里的pinMode(Button, INPUT_PULLUP)。
消除抖动是否还有其他方法?
答:另外一种消抖方式为硬件消抖,常用的硬件消抖方式有利用电容的放电延时,采用并联电容法,也可以实现硬件消抖。

该用户从未签到

发表于 2014-3-16 20:14 | 显示全部楼层
如果按一下一直开着,如果再按下一直关着,这样的程序怎么写呢

该用户从未签到

发表于 2014-4-27 20:27 | 显示全部楼层
liguohong 发表于 2014-3-16 20:14
如果按一下一直开着,如果再按下一直关着,这样的程序怎么写呢

默认输出低(或高)电平,每按一次输出取反。

该用户从未签到

发表于 2014-5-18 10:47 | 显示全部楼层
海神师傅
系统 说INPUT_PULLUP函数找不到, 怎么回事, 谢谢

sketch_may18c.cpp: In function 'void setup()':
sketch_may18c:5: error: 'INPUT_PULLUP' was not declared in this scope

该用户从未签到

 楼主| 发表于 2014-5-19 07:58 | 显示全部楼层
387925791 发表于 2014-5-18 10:47
海神师傅
系统 说INPUT_PULLUP函数找不到, 怎么回事, 谢谢

检测下你的IDE版本,选择下载高一点的版本就行·~·
  • TA的每日心情
    开心
    2015-3-30 22:49
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2014-7-23 20:20 | 显示全部楼层
    海神师傅真棒~很通俗易懂哦~
  • TA的每日心情
    开心
    2019-5-1 11:28
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-7-30 19:18 | 显示全部楼层
    真要实现“如果按一下一直开着,再按下一直关着”这样的程序没那么简单的程序的,不信大家写写看。把你的源码贴出来。

    想着简单,其实不然。

    该用户从未签到

    发表于 2014-11-3 22:41 | 显示全部楼层
    本帖最后由 xw123789 于 2014-11-3 22:46 编辑

    kittenblock中小学创客名师推荐的图形化编程软件

    //button_test_without_10K.ino
    int inpin=8;
    int led = 13;
    int va1;
    int va2;
    int n=1;
    int m;
    
    void setup() 
    {
      pinMode(led, OUTPUT);
      pinMode(inpin, INPUT_PULLUP);
      Serial.begin(9600);
      va2=digitalRead(inpin);
    }
    void loop() 
    {
        va1=digitalRead(inpin);
        if(va1!=va2)
        {
               if(va1==LOW)
                {
                        n=n+1;
                        m=pow(-1, n);
                        if(m>0)
                        {digitalWrite(led, HIGH);}
                        else
                        {digitalWrite(led, LOW);}
                Serial.println(n); 
                 }
        }
    va2=digitalRead(inpin);
    delay(10);
    }

    新人学习了, 写一个,试试
  • TA的每日心情
    奋斗
    2015-1-17 16:25
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    发表于 2015-1-2 20:34 | 显示全部楼层
    xw123789 发表于 2014-11-3 22:41
    [mw_shl_code=c,true]//button_test_without_10K.ino
    int inpin=8;
    int led = 13;

    表示看不懂
  • TA的每日心情
    奋斗
    2015-3-27 17:42
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2015-2-24 00:01 | 显示全部楼层
    本帖最后由 子夏清 于 2015-2-24 00:12 编辑

    [size=14.4444446563721px](分享)如果按一下一直开着,可以这样写
    #define LED 13
    #define KEY 4
    int KEY_NUM = 0;                        //按键键值存放变量,不等于1说明有按键按下

    void setup()
    {
      pinMode(LED,OUTPUT);                        //定义LED为输出引脚
      pinMode(KEY,INPUT_PULLUP);                //定义KEY为带上拉输入引脚
    }

    void loop()
    {
      ScanKey();                                //按键扫描程序,当按键按下时候,该子程序会修改KEY_NUM的值
      if(KEY_NUM == 1)                        //是否按键按下
      {   
        digitalWrite(LED,!digitalRead(LED));//LED的状态翻转
      }
    }

    void ScanKey()                                //按键扫描程序
    {
      KEY_NUM = 0;                                //清空变量
      if(digitalRead(KEY) == LOW)                //有按键按下
      {
        delay(20);                                //延时去抖动
        if(digitalRead(KEY) == LOW)                //有按键按下
        {
          KEY_NUM = 1;                        //变量设置为1
          while(digitalRead(KEY) == LOW);        //等待按键松手
        }
      }
    }
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    求大神看看哪里有问题,设备在线,米家也同步正常,就.....
    求大神看看哪里有问题,设
    代码: #define BLINKER_PRINT Serial //用于打开串口 #define BLINKER_WIFI #define
    晒图ESP8266一个框架
    晒图ESP8266一个框架
    好久没发帖了,出来活跃活跃一下。ESP8266免身份登录截图。 最近外研究新的架构M2M或P
    Arduino 求助 串口接收数据不正确,数据丢失问题
    Arduino 求助 串口接收数
    问题整了好久,我自己写的C#程序发送数据,arduino接收数据。 但是发现arduino接收的
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表