专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

Arduino的轻触按键检测

作者:y8686   来源:转自y8686   点击数:  更新时间:2014年07月05日   【字体:

在Arduino上做单纯按键检测,其实是很简单的。 但是我这里做的方法考虑了一下防抖和抗干扰。

 
大概的原理是:
 
每一次主循环检测一次按键,发现低电平(可能为按键按下),就在计数器变量(o_prell)加一, 直到计数器变量(o_prell)达到 BUTTONS_SAMPLES 定义的值,则判定按键按下。 而在此过程中如果检测到高电平,则计数器变量(o_prell)减一,这样起到防抖和抗干扰的作用。
 
按键释放时,则相反,计数器变量(o_prell)减一,直到 0。
 
BUTTONS_SAMPLES 我设置的比较大, 是6000, 主要因为程序里没什么代码,主循环比较快。如果程序代码较多,主循环没有这么快,这个值要调低的。
这个值改低一点,按键灵敏度会提高,但是防抖和抗干扰的作用会变差。
 
如下程序实现的功能是,每按一次按键,Arduino板上的LED会切换亮灭。  按键接在pin#7和GND之间,pin#7需要上拉电阻到5V。
 
 
C++语言: 高亮代码由发芽网提供


#define BUTTON_PIN          7       // Button pin
#define LED_PIN             13      // Led pin
#define BUTTONS_SAMPLES     6000   // Affect the sensitivity of the button
#define BUTTON_PRESSED      LOW     // The state of the pin when button pressed

unsigned int o_prell          = 0;      // counter for button pressing detection
boolean button_state          = false;  
unsigned int led_state        = LOW;    // Led off at the beginning

void setup()
{
   //Serial.begin(9600);

   pinMode(BUTTON_PIN, INPUT);
   pinMode(LED_PIN, OUTPUT);
   
   // set initial LED state
   digitalWrite(LED_PIN, led_state);
}

void loop()
{
   check_button();
   digitalWrite(LED_PIN, led_state);
}

void check_button()
{
   int button_input    =   digitalRead(BUTTON_PIN);

   if ((button_input == BUTTON_PRESSED) && (o_prell <</SPAN> BUTTONS_SAMPLES))
   {
       o_prell++;      // counting for button pressing
   }
   else if ((button_input == BUTTON_PRESSED) && (o_prell == BUTTONS_SAMPLES) && !button_state)
   {
       button_state = true;    // button pressed
       //led_state = HIGH;
       led_state = !led_state;
   }
   else if ((button_input != BUTTON_PRESSED) && (o_prell > 0))
   {
       o_prell--;      // counting for button releasing,  or debouncing / immunity
   }
   else if ((button_input != BUTTON_PRESSED) && (o_prell == 0) && button_state)
   {
       button_state = false;
       //led_state = LOW;
   }
}
关闭窗口

相关文章