第十一篇、基于Arduino uno,获取单个按键的输入信号(滤波消抖)——结果导向

本文主要是介绍第十一篇、基于Arduino uno,获取单个按键的输入信号(滤波消抖)——结果导向,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0、结果

说明:先来看看串口调试助手显示的结果,当按下按键的时候,按一次会打印一次按键被按下。如果是你想要的,可以接着往下看。

 1、外观

说明:虽然每个型号的按键形态各异,但是原理和代码都是适用的,只要能保证按下导通,不按下不导通就行。

 

 2、连线

说明:只需要连接两根线,一端和另一端需要保证按下导通,不按下不导通。

  • uno————按键
  • GND--------------按键一端
  • D2--------------按键另一端

下面的图是多个按键的,但是连接方式和单个的是一样的,可以参考。

3、源程序

说明:对按键进行了消抖,基本上不会存在误触发的可能,并将对应功能进行函数化,方便移植。

/****************************************按键 part****************************************/
/*接线:按键一端接GND,一端接D2,能保证按下导通,不按下不导通就行。
*/
#define startButton   2                                             //按钮
#define buttonON      LOW                                           //按钮按下时为低电平struct Button {int buttonState = !buttonON;                                      //按钮状态变量,与按钮按下时的状态取反int lastButtonState = !buttonON;                                  //按钮状态初始化,与按钮按下时的状态取反long lastDebounceTime = 0;                                        //记录抖动变量long debounceDelay = 30;                                          //抖动时间变量bool flag = false;                                                //按钮flag
};
const int buttonPins[1] = {startButton};
Button button, buttons[1];                                          //新建1个按钮
/****************************************set up and loop part*********************************/
void setup() {Serial.begin(9600);                                               //初始化串口,波特率为9600initButtons();                                                    //初始化所有按键串口
}
void loop() {getButton(startButton);                                          //适用于单个按钮
}
/****************************************按键 part****************************************/
/*初始化按键串口*/
void initButtons() {pinMode(startButton, INPUT_PULLUP);                              //适用于单个按钮
}
/*读取按键的状态*/
void getButton(int _buttonPin) {int reading = digitalRead(_buttonPin);                           //读取状态if (reading != button.lastButtonState) {                         //如果状态改变button.lastDebounceTime = millis();                            //更新时间}                                                                //如果等待大于debounceDelayif ((millis() - button.lastDebounceTime) > button.debounceDelay) {if (reading != button.buttonState) {                           //读取状态不等于按钮状态button.buttonState = reading;                                //更新状态if (button.buttonState == buttonON) {                        //判断按钮是否真的按下Serial.println("button is pressed");                       //输出按钮按下的文字button.flag = true;                                        //按钮flag为真}else {button.flag = false;                                       //按钮flag为假}}}button.lastButtonState = reading;                                //更新last状态
} 

4、注意事项

说明:按键有四个引脚或者三个引脚,四个引脚的按键,两个引脚挨得近的是不按下不导通,按下导通;如果是三个引脚的,随便接两个引脚就行。

5、基本原理

       在按键被按下时使得电路闭合,从而触发相应的程序操作。按键通常由两个部分组成:一个是用于连接电路的接点(也称为触点或固定触点),另一个是用于控制接点状态的弹簧式机构(也称为活动触点)。
        当按键未被按下时,接点处于断开状态,此时电路不通,无法传递电信号。当按键被按下时,机械结构将弹簧压缩,使活动触点与固定触点接触,从而形成闭合电路。在这个过程中,电流可以沿着闭合的电路流通,达到控制相应程序操作的目的。
        在Arduino中,按键的工作流程主要包括两个阶段:输入和处理。在输入阶段,当按键被按下时,Arduino会读取对应的数字或模拟输入引脚的电压状态,并将其转换为高或低电平信号。在处理阶段,Arduino根据输入信号的状态进行相应的判断和操作,如执行特定函数、调用模块等操作。

6、消抖的方法

        采用软件消抖的原理是通过编程实现,在按键被按下后,通过程序进行一定的处理和判断,使得系统仅响应有效的按键操作,避免因按键抖动等原因产生误触发现象。
        具体来说,软件消抖的原理主要包括以下几个步骤:

  1. 读取按键状态:首先需要读取按键状态,即检测输入引脚的电平是否发生变化(从高电平到低电平)。可以使用Arduino中的digitalRead函数实现该功能。

  2. 延时消抖:当检测到按键状态发生变化时,需要延时一段时间,以等待按键抖动消除。可以使用Arduino中的delay函数或借助定时器实现延时功能。

  3. 再次读取按键状态:在延时结束后,需要再次读取按键状态,并与之前的状态比较,以确定是否发生有效的按键操作。只有当两次读取的状态相同,且状态为低电平时,才表示发生了有效的按键操作。

这篇关于第十一篇、基于Arduino uno,获取单个按键的输入信号(滤波消抖)——结果导向的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/217723

相关文章

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.