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

相关文章

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

PNG透明背景按钮的实现(MFC)

问题描述: 当前要在对话框上添加一个以两个PNG图片作为背景的按钮,PNG图的背景是透明的,按钮也要做出相同的透明效果。并且鼠标不在按钮上时,按钮显示"bg1.png";鼠标移动到按钮上时,按钮显示"bg2.png" 开发环境为VS2010。 解决办法: 使用GDI+库装载PNG图片,并使用MFC Button Control和CMFCButton类结合,调用CMFCButton

龙芯+FreeRTOS+LVGL实战笔记(新)——05部署主按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了改进和优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以前往本人在B站的视频合集(图2所示)观看所有演示视频,合集首个视频链接为: 借助RT-Thread和LVGL

致远个性化之--发起流程页面,去掉【查看流程】按钮

需求 近期在做的项目中,遇到一个需求,想把发起流程页面中的【查看流程】按钮去掉,只让员工预测流程,知道自己的事项流程走向,不让看全局流程图。包含PC端和移动端,以及微协同端。 如下图效果示例: 实现 此需求,只能通过修改页面代码实现。在此不分析实现过程,现把具体实现方式呈现如下,各位如有需求可参照设置。适用版本V9.0,其他版本未进行测试,估计不会有大的差别! PC端 找到文件

如何在Excel中创建一个VBA宏,并设置一个按钮来执行这个宏

下面是一个详细的步骤指南 步骤1:创建VBA宏 1. 打开Excel并按 `Alt + F11` 打开VBA编辑器。 2. 在VBA编辑器中,选择 `Insert` > `Module` 来插入一个新的模块。 3. 将以下代码粘贴到模块中: ```vba Sub CreateNewSheet()' 声明一个工作表对象Dim newSheet As Worksheet' 添加一个新的工作表S

Vue3实现点击按钮下载头像功能

要实现的效果 点击头像右上角弹出选项,点击保存图片可以把图片下载保存到本地 实现方式关键代码 1.第一种,直接创建a标签给头像地址。进行下载 // 创建一个隐藏的 <a> 标签const link = document.createElement("a");link.href = headPic; // 设置为图片的 URLlink.download = "avatar.jpg"; //

Android ToggleButton 开关按钮

ToggleButton相关属性,方法android:textOn="On"android:textOff="Off"android:checked="true"setChecked(boolean) package shortcut.song.com.myapplication;import android.support.v7.app.AppCompatActivity;impo

Android RadioButton 单选按钮

RadioGroup 单选按钮组, 可以包含多个单选按钮,当单选按钮选中状态改变时会触发setOnCheckedChangeListener package shortcut.song.com.myapplication;import android.graphics.Color;import android.support.v7.app.AppCompatActivity;imp

delphi如何给按钮添加单键快捷键(F1~F12)

用action 讲按钮窗体的Keypreview设为True,然后加如下代码 Delphi/Pascal code ? 1 2 3 4 5 6 procedure  TForm1 . FormKeyDown(Sender: TObject;  var  Key:  Word ;    Shift: TShiftState); begin    i