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 的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue01-vue的简介

一、Vue是什么&#xff1f; 一套用于构建用户界面的渐进式javaScript框架。 构建用户界面&#xff1a; 渐进式&#xff1a; 目前Vue的地位&#xff1a;生态完善&#xff0c;国内前端工程师必备技能。 二、Vue的特点 一个XXX.vue就是一个组件&#xff0c;封装的概念&#xff0c…

智慧校园有哪些特征

随着科技的飞速进步&#xff0c;教育领域正经历着一场深刻的变革。智慧校园&#xff0c;作为这场变革的前沿代表&#xff0c;正在逐步重塑我们的教育理念和实践方式。它不仅仅是一个概念&#xff0c;而是一个集成了物联网、大数据、人工智能等先进技术的综合生态系统&#xff0…

QT 信号和槽 一对多关联示例,一个信号,多个槽函数响应,一个信号源如何绑定多个槽函数

在窗体里放置一个单行文本编辑控件&#xff08;QLineEdit&#xff09;、一个标签控件&#xff08;QLabel&#xff09;和一个文本浏览控件&#xff08;QTextBrowser&#xff09;&#xff0c;在单行文 本编辑控件里的文本被编辑时&#xff0c;标签控件和文本浏览控件都会同步显示…

codefun的蓝桥杯国赛之旅

前言 好久没有刷算法了&#xff0c;今天完成了我的蓝桥杯国赛之旅&#xff01; 总的来说&#xff0c;比赛的过程不是很顺利&#xff0c;只能ac两道题目&#xff0c;好多题都是有思路&#xff0c;但是要么是写不出来&#xff0c;要么是debug不出来&#xff0c;多重背包&#xf…

C++——输入输出、基本变量类型

目录 一、输入输出 1、标准输出流&#xff08;cout&#xff09; 2、标准输入流&#xff08;cin&#xff09; 3、标准错误流&#xff08;cerr&#xff09;和标准日志流&#xff08;clog&#xff09; 4、示例代码 二、基本数据类型 1、宽字符的用法 2、如何使用 3、示例…

能离线翻译的软件有哪些?随时随地,翻译随行

语言不通&#xff0c;旅途怎敢说走就走&#xff1f; 掌握一门或多门外语似乎成了外出旅游的必备技能&#xff0c;然而这是很有难度的一个事情。好在&#xff0c;越来越多的翻译软件浮出水面&#xff0c;给我们带来极大帮助。但谁说非得在线才能沟通无阻&#xff1f; 今天我们…

[数据结构]字典树

概念&#xff1a; 字典树是一种数据结构&#xff0c;常用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;。主要思想是利用字符串的公共前缀来节约存储空间。 实现原理&#xff1a; 在开发的过程中如果需要使用字典树&#xff0c;不必自己…

c++异常处理exception

// c中的异常处理 // 1.throw &#xff1a; 专门用于抛出异常&#xff0c;做出提示 // 2.try &#xff1a; 尝试运行可能会异常的代码 // 3.catch &#xff1a; 用于接收前面跑出来的异常并进行解决// 执行循序为: // try // { // throw ...; // 执行的代码中必须直接或者…

图的创建和遍历

孤勇者探险&#xff08;图的遍历&#xff09; 作者 YJ 单位 西南石油大学 一款名为“孤勇者探险”的游戏&#xff0c;游戏中共有若干个小岛&#xff0c;每个岛上均有怪兽&#xff0c;闯关者打倒岛上的怪兽则可获得该岛对应的游戏积分&#xff08;每个岛的积分根据难度可能不相…

HALCON-从入门到入门-读取图片保存图片

1.废话 视觉算法库的第一步。 读取图片&#xff1a; 看你是从哪里读取&#xff0c;从相机读取还是从本地硬盘中读取。 保存图片&#xff1a;就只有保存到本地了。 上面的截图显示我读取了一张图片 从相机中读取另开一篇来说&#xff0c;先说从本地磁盘读取哈。 怎么读取的…

【Python数据分析--pandas学习笔记】Python数据分析库pandas详细学习笔记(内容详细,适合小白入门),数据分析学习笔记

一&#xff0c;pandas教程 1-1 pandas 安装 1-1-1 使用 pip 安装 pandas: pip install pandas安装成功后&#xff0c;我们就可以导入 pandas 包使用&#xff1a; import pandas1-1-2 查看 pandas 版本 >>> import pandas >>> pandas.__version__ # 查看…

《向量数据库指南》为什么要研发 Milvus Cloud?

许多 AI 应用都需要借助向量相似性搜索的力量来分析处理文本、图像、声音和视频等众多非结构化数据。典型的此类 AI 应用包括聊天机器人、购物助手等。而这些应用&#xff0c;尤其是 RAG 应用的 AI 开发栈中最核心的部分就是用于存储和搜索 Embedding 向量的向量数据库。 虽然业…

【C++】STL中vector常见功能的模拟实现

前言&#xff1a;在上一篇中我们讲到了Vector的一些常见功能的使用方式&#xff0c;今天为了进一步的去学习Vector和能够更深度的去理解Vector的一些底层的原理。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &…

自定义类型:结构体类型

在学习完指针相关的知识后将进入到c语言中又一大重点——自定义类型&#xff0c;在之前学习操作符以及指针时我们对自定义类型中的结构体类型有了初步的了解&#xff0c;学习了结构体类型的创建以及如何创建结构体变量&#xff0c;还有结构体成员操作符的使用&#xff0c;现在我…

[数据集][目标检测][数据集][目标检测]智能手机检测数据集VOC格式5447张

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;5447 标注数量(xml文件个数)&#xff1a;5447 标注类别数&#xff1a;1 标注类别名称:["phone"] 每个类别标注的框数&#xff…

WPF -> MVVM

1.1安装MVV MLight 打开 Visual Studio 2022。 在顶部菜单栏中选择“工具” -> “NuGet 包管理器” -> “程序包管理器控制台”。 在控制台中输入以下命令&#xff0c;并按回车键运行&#xff1a; Install-Package MvvmLightLibsStd104.等待安装完成后&#xff0c;你就…

man命令的作用

man命令是Linux操作系统中一个非常实用的命令&#xff0c;它用于查看命令的手册页面&#xff0c;帮助用户了解特定命令的用法、选项和参数。这不仅对新用户在学习如何使用新命令时很有帮助&#xff0c;也方便了经验丰富的用户快速查找命令的详细信息。以下是具体介绍&#xff1…

基于java18多端展示+ idea hbuilder+ mysql家政预约上门服务系统,源码交付,支持二次开发

基于java18多端展示 idea hbuilder mysql家政预约上门服务系统&#xff0c;源码交付&#xff0c;支持二次开发 家政预约上门系统是一种通过互联网或移动应用平台&#xff0c;为用户提供在线预约、下单、支付和评价家政服务的系统。该系统整合了家政服务资源&#xff0c;使用户能…

LeetCode 算法:无重复字符的最长子串c++

原题链接&#x1f517;&#xff1a;无重复字符的最长子串 难度&#xff1a;中等⭐️⭐️ 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所…

谷歌浏览器的平替,内置开挂神器,我已爱不释手!

油猴浏览器正式版是一款基于谷歌Chromium源码开发的浏览器&#xff0c;它集成了集成了强大的油猴扩展&#xff08;Tampermonkey&#xff09;&#xff0c;使得用户可以轻松安装各种脚本&#xff0c;从而增强网页浏览体验。提供了一个更加个性化和高效的浏览体验。 油猴扩展&…