Arduino 按钮及弹跳

2024-06-03 02:20
文章标签 按钮 arduino 弹跳

本文主要是介绍Arduino 按钮及弹跳,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

所需元件
可插入面包板的按钮1个
220Ω电阻1个
10kΩ电阻1个
3mm或5mm LED 1个
面包板1块
Arduino Uno开发板1块
面包板连接线数条

使用外接电阻
将5V接到按钮,按钮的另一端串联1个10kΩ电阻再接地,这样的接法被称为下拉电阻(pull-down resistor)。若测量电阻及按钮间的电压,当按钮未按下时电路未接通,测量到低电位;当按钮按下时测量到高电位。当按钮被按下时,点亮LED;反之则熄灭。


线路图


实际的装置照片

程式码如下:


#define LEDPIN 7     
#define BUTTONPIN 4  
#define BAUDRATE 9600
int state;void setup() {pinMode(LEDPIN, OUTPUT); pinMode(BUTTONPIN, INPUT); Serial.begin(BAUDRATE);
}void loop() {state = digitalRead(BUTTONPIN);if (state == HIGH) {              digitalWrite(LEDPIN, HIGH);} else {                       digitalWrite(LEDPIN, LOW);}
}

使用开发板内建的上拉电阻
开发板内建有上拉电阻(pull-up resistor),若使用内建的电阻可以使接线方式更加简单,接法如下。


线路图


实际的装置照片

若测量电阻及按钮间的电压,当按钮未按下时电路未接通,测量到高电位;当按钮按下时测量到低电位。当按钮被按下时,点亮LED;反之则熄灭。程式码如下:

#define LEDPIN 7     
#define BUTTONPIN 4 
#define BAUDRATE 9600
int state;void setup() {pinMode(LEDPIN, OUTPUT); pinMode(BUTTONPIN, INPUT_PULLUP); //启用上拉电阻Serial.begin(BAUDRATE);
}void loop() {state = digitalRead(BUTTONPIN); if (state == LOW) {              digitalWrite(LEDPIN, HIGH);} else {   digitalWrite(LEDPIN, LOW);                    }
}

按钮的弹跳问题(方法1:时间延迟)
若连续且快速地按按钮,有时候LED不会在按下时被点亮,这是因为按钮被按下到弹回来的过程中程式已经读取了接脚的状态很多次。为了解决这个问题,我们可以先读取一次接脚的状态并储存起来,隔一小段时间后再测量一次,如果两次的状态相同,代表按钮真的被按下。程式码如下:

#define LEDPIN 7      
#define BUTTONPIN 4   
#define DELAYTIME 200 
#define BUADRATE 9600 
boolean ledState;
unsigned long timePrevious, timeCurrent;void setup() {Serial.begin(BUADRATE);pinMode(LEDPIN, OUTPUT); pinMode(BUTTONPIN, INPUT_PULLUP); ledState = LOW;digitalWrite(LEDPIN, ledState);
}void updateLed() { timeCurrent = millis();if ((timeCurrent - timePrevious) > DELAYTIME) {timePrevious = timeCurrent;ledState = !ledState;digitalWrite(LEDPIN, ledState);
//        Serial.println(ledState);}
}void loop() {boolean buttonState = digitalRead(BUTTONPIN); if (buttonState == LOW) {                     updateLed();
//        Serial.println("Change");}
}

在这个程式当中void updateLed()是自己设定的函数,开头的void 代表函数没有返回值。我们会将程式当中会一直使用到的部分写成一个函数,在程式里其它的部分不断地调用它,这样可以减少代码的长度。

问题:若一直按着按钮会发生什么事?

请先努力地尝试写出解决方案,至少坚持10分钟以后再看,而且这不是唯一的写法,其它写法也能做到同样的效果。

#define LEDPIN 7      
#define BUTTONPIN 4   
#define DELAYTIME 50  
#define BAUDRATE 9600 
boolean ledState;
unsigned long timePrevious, timeCurrent;void setup() {Serial.begin(BAUDRATE);pinMode(LEDPIN, OUTPUT); pinMode(BUTTONPIN, INPUT_PULLUP); ledState = LOW;digitalWrite(LEDPIN, ledState);
}void updateLed() { timeCurrent = millis();if ((timeCurrent - timePrevious) > DELAYTIME) {timePrevious = timeCurrent;ledState = !ledState;digitalWrite(LEDPIN, ledState);}
}void loop() {boolean buttonPrevious, buttonCurrent;buttonPrevious = digitalRead(BUTTONPIN);       delay(DELAYTIME);buttonCurrent = digitalRead(BUTTONPIN);if (buttonCurrent == LOW && buttonCurrent != buttonPrevious) {        //若按下按鈕而且不是持续按著則更新LED状态updateLed();Serial.println("Change");}
}

按钮的弹跳问题(方法2:Bounce2.h)
已经有热心人士将去除弹跳的函式库写好了,名为Bounce2.h,我们可以从Arduino官网上找到( http://playground.arduino.cc/Code/Bounce ),下载的连结为https: //github.com/thomasfredericks/Bounce-Arduino-Wiring/archive/master.zip,将下载的档案解压缩后得到的资料夹复制到Arduino开发程式的资料夹内即可。可能的路径为

Windows环境 C:\Program Files (x86)\Arduino\libraries\
接下来在程式码的开头只要加上#include <Bounce2.h>即可引用。程式码如下:

#include <Bounce2.h>
#define LEDPIN 7      
#define BUTTONPIN 4   
#define DELAYTIME 50 
#define BAUDRATE 9600 Bounce bouncer = Bounce(BUTTONPIN, DELAYTIME);
boolean ledState;void setup() {Serial.begin(BAUDRATE);pinMode(LEDPIN, OUTPUT); pinMode(BUTTONPIN, INPUT_PULLUP); ledState = LOW;digitalWrite(LEDPIN, ledState);
}void loop() {if (bouncer.update() == true && bouncer.read() == LOW) {ledState = !ledState;digitalWrite(LEDPIN, ledState);Serial.println(ledState);}
}

其中

Bounce bouncer = Bounce(buttonPin, delayTime);
先定义了一个名为bouncer 的物件,需要指定读取的接脚及延迟时间。在void loop() 当中

if (bouncer.update() == true && bouncer.read() == LOW){
    ledState = !ledState;
    digitalWrite(ledPin, ledState);
    Serial.println(ledState);
}
bouncer.update() 会读取接脚的状态且判断状态是否有变化,因此这段程式码的功能是当状态发生变化且为低电位时改变LED 的状态。

这篇关于Arduino 按钮及弹跳的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

FastAdmin/bootstrapTable 表格中生成的按钮设置成文字

公司有个系统后台框架用的是FastAdmin,后台表格的操作栏按钮只有图标,想要设置成文字。 查资料后发现其实很简单,主需要新增“text”属性即可,如下 buttons: [{name: 'acceptcompany',title: '复核企业',text:'复核企业',classname: 'btn btn-xs btn-primary btn-dialog',icon: 'fa fa-pe

OpenCV中的按钮问题

在HighGUI中,没有显示提供任何形式的按钮。一般有两种方法替代: 1.用只有两个状态的滑动条来替代按钮。开关(switch)事实上就是只有两个状态的滑动条,这两个状态是on和off。然后通过回调函数来实现相关的功能。 实例源码(使用滑动条实现一个开关功能) #include<cv.h>#include<highgui.h>int g_switch_value = 0;void swit

yii2 前端导出、导入按钮

<?= Bar::widget([ // {refresh}刷新 {export}导出 {import}导入 {delete}伤处 {create}创建 'template' => '{refresh} {export}', 'buttons' => [ // 导出 'export' =>Html::a('<i class="fa fa-download"></i> ' .'导出', U

Qt: QPushButton 按钮实现 上图标下文字

效果如下:  实现有如下几种方式: 1. 使用 QPushButton 设置 setStyleSheet 例: ui->recorder->setStyleSheet("QPushButton{"\"border: 1px solid #00d2ff; "\"min-height: 60px; "\"color: #FFFFFF;;

QT事件处理系统之三:子类化QPushButton后,对事件进行相应处理后,自定义按钮无法发出clicked信号的问题

1、信号槽绑定 如下,Widget中进行了SelfButton按钮的信号槽绑定。 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天:2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽(优点:松散耦合)帮助文档的查阅方法-②找信号函数的方法找槽函数的方法 自定义信号和槽 lambda表达式练习MenuTool Qt creator 快捷键 运行:ctrl

【深海王国】小学生都能玩的单片机?零基础入门单片机Arduino带你打开嵌入式的大门!(8)

Hi٩(๑o๑)۶, 各位深海王国的同志们,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督继续为大家带来系列——小学生都能玩的单片机!带你一周内快速走进嵌入式的大门,let’s go! (8)软串口与SoftwareSerial库使用 在第六节中我们提到了,如果我们Arduino开发板的0、1号引脚接线了,即硬件串口被占用了,想给Arduino下载程序,就需要先

【Vision AI v2开箱之SenseCraft AI猫狗识别Arduino教程】

【Vision AI v2开箱之SenseCraft AI猫狗识别Arduino教程】 1. 前言2. 实验材料2.1 Grove Vision AI Module V22.1.1 特征2.1.2 硬件概述2.1.3 启动/重置/程序2.1.4 驱动 2.2 ESP32C32.2.1 引脚图2.2.2 组件概述2.2.3 电源引脚 2.3 SenseCraft AI Model Assist

HTML:下拉列表框、提交按钮、重置按钮

<body><form action="save.php" method="post"><label>爱好:</label><select multiple="multiple">//multiple表示许多的,倍数,在浏览器里面按下ctrl+单击就可以多选<option value="看书">看书</option><option value="旅游" selected="selected">旅

关于VC6 MFC使用Gdiplus实现自绘按钮的总结

步骤1:简易教程(更换对话框的背景)及Gdiplus下载地址可查看这个博客https://blog.csdn.net/misads/article/details/78619735。 步骤2:使用Gdiplus实现自绘按钮可参考这个博客https://blog.csdn.net/wyansai/article/details/50971959。 首先感谢上面两位博主的分享,那么我写这个博客是干