Arduino学习笔记④ 经典按键实验
1.前言
我们讲了数字IO口介绍以及做了流水灯演示(主要用到IO口的输出功能),这节课我们讲解一下IO口的输入功能,说到输入功能,最经典的例子莫过于按键实验。废话少说,赶紧上车。
2.实验材料
- 按键模块
- LED模块(这里属于共阳极LED模块)
- Mega2560板子
注意:这课实验是基于第三课实验材料进行的。
3.实验内容
3.1 按键实验1
实验内容:
当按住按键时点亮LED,当放开按键后熄灭LED;
实验代码:
/**
* @Desc 按键灯(当按住按键时点亮LED,当放开按键后熄灭LED)
* @author 单片机菜鸟
* @Date 2016/12/3
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
* 按键是高电平有效
*/
#define LED 2
#define KEY 10
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
}
}
3.2 按键实验2
实验内容:
当点击一次按键时点亮LED,当再次点击一次按键时熄灭LED(就跟家里灯一样)
实验代码:
/**
* @Desc 按键灯(当点击一次按键时点亮LED,当再次点击一次按键时熄灭LED)
* @author 单片机菜鸟
* @Date 2016/12/3
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
* 按键是高电平有效
*/
#define LED 2
#define KEY 10
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 单片机菜鸟
* @Date 2016/12/3
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
* 按键是高电平有效
*/
#define LED 2
#define KEY 10
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 (以防用户按太久了)。
4.总结
这节课我们主要学习数字IO口的输入功能,整体上还算简单,主要是注意按键防抖动。
Arduino学习笔记④ 经典按键实验的更多相关文章
- Arduino学习笔记⑤ 模拟IO实验
1.前言 还记得前几个我们都是在讲解数字IO,而其实我们生活中大多数信号都是模拟信号,如声音以及温度变化.在Arduino中,常用0~5v的电压来表示模拟信号. 1.1 模拟输入功能 ...
- Arduino学习笔记③ 经典LED
1.前言 今天我们开始同时讲解理论以及实践.对于绝大部分有过单片机编程经历的人来说,第一个接触的大多数就是LED灯(忽然想起博主大一那个懵懂的时代,当时大三的师兄给我们展现了一把流水灯功力,当 ...
- input子系统学习笔记六 按键驱动实例分析下【转】
转自:http://blog.chinaunix.net/uid-20776117-id-3212095.html 本文接着input子系统学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例! i ...
- Arduino学习笔记① 初识Arduino
1.前言 近段时间,博主陆续更新了ESP8266学习笔记,主要开发平台是Arduino.但是,对于很多无基础的初学者来说,甚至不了解Arduino是什么.因此,博主决定加入一个Arduino学 ...
- 【Arduino学习笔记04】消抖动的按键切换
"开关抖动": 由于按键是基于弹簧-阻尼系统的机械部件,所以当按下一个按键时,读到的信号并不是从低到高,而是在高低电平之间跳动几毫秒之后才最终稳定. 代码解读: 1 const i ...
- AM335x(TQ335x)学习笔记——GPIO按键驱动移植
还是按照S5PV210的学习顺序来,我们首先解决按键问题.TQ335x有六个用户按键,分别是上.下.左.右.Enter和ESC.开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题 ...
- Arduino学习笔记⑧ 红外通信
1.前言 红外通信是一种利用红外光编码进行数据传输的无线通信方式,在目前来说是使用非常广泛的.生活中常见电视遥控器,空调遥控器,DVD遥控器(现在估计是老古董了),均使用红外线遥控.使用红外线 ...
- 【Arduino学习笔记05】Arduino数字输入、输出和脉冲宽带调制 -- 小项目:彩色小台灯
基本功能: 长按控制按钮开机,长按控制按钮关机(>3s) 通过三个调节按钮调节灯的颜色,每一个按钮分别对应R,G,B值 模式切换:短按控制按钮切换模式(长亮模式/闪烁模式) 元器件清单: Ard ...
- Arduino学习笔记二:修改LED点灯程序
看了开源社区的LED控制程序,开始上手代码编写,修改,下载以及调试,原文地址:http://www.arduino.cn/thread-1072-1-1.html,这个帖子写的比较通俗易懂. 自己移植 ...
随机推荐
- 41 (OC)* OC的理解与动态特性
1:动态类型(Dynamic typing),动态绑定(Dynamic binding)和动态加载(Dynamic loading). 动态类型:即运行时再决定对象的类型.简单说就是id类型.id类型 ...
- VS Code中无法识别npm命令
今天在VS Code中执行npm install命令时报了“'npm' 不是内部或外部命令,也不是可运行的程序或批处理文件”的错误. 首先检查环境变量是否配置正常: 系统变量中NODE_PATH,变量 ...
- HashMap浅析
一.概述 HashMap,基于哈希结构的Map接口的一个实现,无序,允许null键值对,线程不安全的.可以使用集合工具类Collections中的synchronizedMap方法,去创建一个线程安全 ...
- APP自動化測試腳本3
package com.lemon.day01; import java.net.MalformedURLException; import java.net.URL; import java.uti ...
- supervisor模块学习使用
supervisor组件 supervisord supervisord是supervisor的服务端程序. 启动supervisor程序自身,启动supervisor管理的子进程,响应来自clien ...
- HNU_中小学数学卷子自动生成程序(个人项目)简要分析
一.前言 首先,在这里特别感谢我的结对编程伙伴HnuLyx,他在算法上和设计思路上都与我有很大的不同,个人项目互评中,为我的项目提出了很多很好的建议,让我在认清自己不足的同时,了解到很多以前没有注意的 ...
- selenium介绍及环境安装
selenium简介: seelenium是web应用程序自动化工具,通过自动操作浏览器,进行点击.输入.回车.返回等来模拟用户的真实行为.如何理解和看待selenium项目,selenium官方 ...
- 安装sublime text3 、转化为汉化版、安装SublimeREPL使得在交互条件下运行代码,设置快捷键
一.sublime Sublime Text 3是轻量级的,安装包很小,它的大部分功能是依靠丰富的插件实现的,而且占用资源少.目前主流版本是Sublime Text3,在官网就可以下载,http:// ...
- Mybatis面试题吐血总结
高强度训练第二十天总结:Mybatis面试题 什么是Mybatis? Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力 ...
- 中缀表达式转后缀表达式(Java代码实现)
后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 ...