《博哥Arduino学习笔记系列》- 第四课 经典按键实验
本帖最后由 单片机菜鸟 于 2016-12-3 23:55 编辑一、前言
回顾一下第三课
《博哥Arduino学习笔记系列》- 第三课 经典LED
http://www.geek-workshop.com/thread-27948-1-1.html(出处: 极客工坊)
我们讲了数字IO口介绍以及做了流水灯演示(主要用到IO口的输出功能),这节课我们讲解一下IO口的输入功能,说到输入功能,最经典的例子莫过于按键实验。废话少说,赶紧上车。
二、实验介绍
注意:这课实验是基于第三课实验材料进行的。
使用了大按键模块:
这个模块,低电平有效。
1)实验1当按住按键时点亮LED,当放开按键后熄灭LED
2)实验2当点击一次按键时点亮LED,当再次点击一次按键时熄灭LED(就跟家里灯一样)
三、实验过程
我的实验尽量都在代码中解释,毕竟代码才是最直观的展示
1)实验1 当按住按键时点亮LED,当放开按键后熄灭LED
代码如下:
/**
* @Desc 按键灯(当按住按键时点亮LED,当放开按键后熄灭LED)
* @author 单片机菜鸟
* @Date2016/12/3
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
* 按键是高电平有效
*/
#define LED2
#define KEY10
int buttonState = HIGH;//记录当前按键状态
void setup() {
//配置2号引脚作为输出引脚
pinMode(LED,OUTPUT);
digitalWrite(LED,HIGH);//灭掉LED
//配置10号引脚为输入引脚 如果是自己连接普通按键 pinMode(KEY,INPUT_PULLUP),弱上拉
pinMode(KEY,INPUT);
}
void loop() {
buttonState = digitalRead(KEY);//读取当前按键状态
if(buttonState == HIGH){
//按键按下
digitalWrite(LED,LOW);//点亮LED
}else{
//按键放开
digitalWrite(LED,HIGH);//熄灭LED
}
}
2)实验2当点击一次按键时点亮LED,当再次点击一次按键时熄灭LED(就跟家里灯一样)
代码如下:
/**
* @Desc 按键灯(当点击一次按键时点亮LED,当再次点击一次按键时熄灭LED)
* @author 单片机菜鸟
* @Date2016/12/3
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
* 按键是高电平有效
*/
#define LED2
#define KEY10
int buttonState = HIGH;//记录当前按键状态
int flag = HIGH;//默认当前灭灯
void setup() {
//配置2号引脚作为输出引脚
pinMode(LED,OUTPUT);
digitalWrite(LED,flag);//灭掉LED
//配置10号引脚为输入引脚 如果是自己连接普通按键 pinMode(KEY,INPUT_PULLUP),弱上拉
pinMode(KEY,INPUT);
}
void loop() {
buttonState = digitalRead(KEY);//读取当前按键状态
if(buttonState == HIGH){
//按键按下
delay(40);//做一个防抖动延时(确保真是按下了按键而不是错误)
buttonState = digitalRead(KEY);//再一次读取按键状态
if(buttonState==HIGH){
//再次确认是否真的按下了按键,是的话就置反当前灯的状态
flag = !flag;
digitalWrite(LED,flag);
}
}
}
我的按键模块的实验结果是:偶尔可以,偶尔又不可以,证明只是简单防抖动肯定是不行的。后面经过查资料用以下防抖动方法:
/**
* @Desc 按键灯(当点击一次按键时点亮LED,当再次点击一次按键时熄灭LED)
* @author 单片机菜鸟
* @Date2016/12/3
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
* 按键是高电平有效
*/
#define LED2
#define KEY10
int flag = HIGH;//默认当前灭灯
// 定义记录按键当前状态的变量
int state_btn;
// 定义记录按键最近一次状态变化的变量,并初始化状态为LOW。
int lastButtonState = LOW;
// 定义记录最近一次抖动的时间变量,并初始化时间为0毫秒。
long lastDebounceTime = 0;
// 定义延迟抖动的时间变量
long debouncdDelay = 60;
void setup() {
//配置2号引脚作为输出引脚
pinMode(LED,OUTPUT);
digitalWrite(LED,flag);//灭掉LED
//配置10号引脚为输入引脚 如果是自己连接普通按键 pinMode(KEY,INPUT_PULLUP),弱上拉
pinMode(KEY,INPUT);
}
void loop() {
int buttonState = digitalRead(KEY);//读取当前按键状态
if(buttonState != lastButtonState){
//如果按键发生了变化则重新设置最近一次抖动的时间
//方法millis()可以获取当前时间,单位统一为毫秒。
lastDebounceTime = millis();
}
// 判断按键按下状态时间间隔是否大于延迟抖动的时间长度。
if(millis()-lastDebounceTime>debouncdDelay){
// 判断当前的按键状态是否和之前有所变化
if(buttonState != state_btn){
// 如果发生了变化,
// 则更新按键状态变量。
state_btn = buttonState;
if(state_btn == HIGH){
//再次确认是否真的按下了按键,是的话就置反当前灯的状态
flag = !flag;
digitalWrite(LED,flag);
}
}
}
// 更新按键最近一次状态变化的变量
lastButtonState = buttonState;
}
这里的防抖算法的思路是:需要记录一个最近状态 lastButtonState (每读一次引脚状态就记录一次),然后在抖动间隔内(60ms)判断最新状态,只要间隔内状态改变,就不断更新抖动时间的起始点(也就是 lastDebounceTime = millis(); ),直到防抖动满足 millis()-lastDebounceTime>debouncdDelay。之后再判断一下当前状态和之前状态是否改变 buttonState != state_btn (以防用户按太久了)。
四、总结
这节课我们主要学习数字IO口的输入功能,整体上还算简单,主要是注意按键防抖动。下一节我们计划将模拟IO
博哥学习笔记系列:
《博哥Arduino学习笔记系列》- 第一课 初识Arduino
http://www.geek-workshop.com/thread-27936-1-1.html
《博哥Arduino学习笔记系列》- 第二课 Arduino语言基础
http://www.geek-workshop.com/thread-27938-1-1.html
《博哥Arduino学习笔记系列》- 第三课 经典LED
http://www.geek-workshop.com/thread-27948-1-1.html
《博哥Arduino学习笔记系列》- 第四课 经典按键实验
http://www.geek-workshop.com/thread-27958-1-1.html 写的很详细!顶一个! antbot 发表于 2016-12-4 07:52
写的很详细!顶一个!
:D 互相学习 刚入门不久 顶,新手刚好需要 挺好的,代码也很全 Herman 发表于 2016-12-5 10:16
顶,新手刚好需要
谢谢哈哈哈哈哈哈 coolcxm 发表于 2016-12-6 22:24
挺好的,代码也很全
谢谢哈哈哈哈哈哈 好巧妙的防抖方法,学习啦:lol谢谢楼主分享 BisonRumble 发表于 2017-5-11 10:12
好巧妙的防抖方法,学习啦谢谢楼主分享
谢谢哈哈哈哈哈 if(digitalRead(s1)==1)
{
delay(60);//消去按下抖动
if(digitalRead(s1)==1)
{
k++;
while(digitalRead(s1));//消去松手抖动
}
}
/*************************这个按键消抖要好理解很多,而且程序简*****************************/ bgy 发表于 2017-7-17 18:24
if(digitalRead(s1)==1)
{
delay(60);//消去按下抖动
有用过 但是有时还是有问题
页:
[1]