第十一篇、基于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

相关文章

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re