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学习笔记④ 经典按键实验的更多相关文章

  1. Arduino学习笔记⑤ 模拟IO实验

    1.前言     还记得前几个我们都是在讲解数字IO,而其实我们生活中大多数信号都是模拟信号,如声音以及温度变化.在Arduino中,常用0~5v的电压来表示模拟信号. 1.1 模拟输入功能      ...

  2. Arduino学习笔记③ 经典LED

    1.前言     今天我们开始同时讲解理论以及实践.对于绝大部分有过单片机编程经历的人来说,第一个接触的大多数就是LED灯(忽然想起博主大一那个懵懂的时代,当时大三的师兄给我们展现了一把流水灯功力,当 ...

  3. input子系统学习笔记六 按键驱动实例分析下【转】

    转自:http://blog.chinaunix.net/uid-20776117-id-3212095.html 本文接着input子系统学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例! i ...

  4. Arduino学习笔记① 初识Arduino

    1.前言     近段时间,博主陆续更新了ESP8266学习笔记,主要开发平台是Arduino.但是,对于很多无基础的初学者来说,甚至不了解Arduino是什么.因此,博主决定加入一个Arduino学 ...

  5. 【Arduino学习笔记04】消抖动的按键切换

    "开关抖动": 由于按键是基于弹簧-阻尼系统的机械部件,所以当按下一个按键时,读到的信号并不是从低到高,而是在高低电平之间跳动几毫秒之后才最终稳定. 代码解读: 1 const i ...

  6. AM335x(TQ335x)学习笔记——GPIO按键驱动移植

    还是按照S5PV210的学习顺序来,我们首先解决按键问题.TQ335x有六个用户按键,分别是上.下.左.右.Enter和ESC.开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题 ...

  7. Arduino学习笔记⑧ 红外通信

    1.前言     红外通信是一种利用红外光编码进行数据传输的无线通信方式,在目前来说是使用非常广泛的.生活中常见电视遥控器,空调遥控器,DVD遥控器(现在估计是老古董了),均使用红外线遥控.使用红外线 ...

  8. 【Arduino学习笔记05】Arduino数字输入、输出和脉冲宽带调制 -- 小项目:彩色小台灯

    基本功能: 长按控制按钮开机,长按控制按钮关机(>3s) 通过三个调节按钮调节灯的颜色,每一个按钮分别对应R,G,B值 模式切换:短按控制按钮切换模式(长亮模式/闪烁模式) 元器件清单: Ard ...

  9. Arduino学习笔记二:修改LED点灯程序

    看了开源社区的LED控制程序,开始上手代码编写,修改,下载以及调试,原文地址:http://www.arduino.cn/thread-1072-1-1.html,这个帖子写的比较通俗易懂. 自己移植 ...

随机推荐

  1. Java基本数据类型转换及运算符

    上次我们说到完了Java中的基本数据类型,今天我们来说说Java中的基本数据类型转换和Java中的运算符 基本数据类型转换 java中可以从任意基本数据类型转型到外的基本数据类型 注意:(boolea ...

  2. helm部署Filebeat + ELK

    helm部署Filebeat + ELK 系统架构图: 1) 多个Filebeat在各个Node进行日志采集,然后上传至Logstash 2) 多个Logstash节点并行(负载均衡,不作为集群),对 ...

  3. Hadoop点滴-初识MapReduce(1)

    分析气候数据,计算出每年全球最高气温(P25页) Map阶段:输入碎片数据,输出一系列“单键单值”键值对 内部处理,将一系列“单键单值”键值对转化成一系列“单键多值”键值对 Reduce阶段,输入“单 ...

  4. 《你不知道的JavaScript》笔记(一)

    用了一个星期把<你不知道的JavaScript>看完了,但是留下了很多疑惑,于是又带着这些疑惑回头看JavaScript的内容,略有所获. 第二遍阅读这本书,希望自己能够有更为深刻的理解. ...

  5. zookeeper 都有哪些使用场景?

    面试题 zookeeper 都有哪些使用场景? 面试官心理分析 现在聊的 topic 是分布式系统,面试官跟你聊完了 dubbo 相关的一些问题之后,已经确认你对分布式服务框架/RPC框架基本都有一些 ...

  6. 【IT技术概念】什么是webservice?

    WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互. WebServi ...

  7. Angular 常用命令行

    1. ng -v 查看angular-cli是否安装成功.angular-cli的版本号 2. ng new 项目名称 新建angular项目 3. ng g class 类名 动态生成类文件: 4. ...

  8. jQuery常用方法(五)-jQuery CSS

    JQuery CSS 方法说明 css( name ) 访问第一个匹配元素的样式属性. css( properties ) 把一个"名/值对"对象设置为所有匹配元素的样式属性. $ ...

  9. 夯实Java基础系列12:深入理解Java中的反射机制

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  10. 【算法随记五】使用FFT变换自动去除图像中严重的网纹。

    这个课题在很久以前就已经有所接触,不过一直没有用代码去实现过.最近买了一本<机器视觉算法与应用第二版>书,书中再次提到该方法:使用傅里叶变换进行滤波处理的真正好处是可以通过使用定制的滤波器 ...