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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【30天精通Prometheus:一站式监控实战指南】第14天:jmx_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

【LeetCode算法】第104题:二叉树的最大深度

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;二叉树的先序遍历。首先判断根节点是否是空&#xff0c;其次判断根节点是否是叶子节点&#xff0c;再者递归获取左子树的深度、右子树的深度&#xff0c;最后返回左子…

【Mac】Lightroom Classic 2024(LrC 2024中文版) v13.1安装教程

软件介绍 Lightroom Classic 2024 for Mac是一款功能强大的照片编辑和组织软件&#xff0c;专为专业摄影师和爱好者设计。它提供了一系列工具和功能来增强和管理您的数码照片。Lightroom Classic 2024在照片组织和管理方面进行了重大改进。它新增了一个智能化的“发现”面板&a…

1. MySQL 数据库的基本操作

文章目录 【 1. SQL 的书写规则 】大小写规则常量的表示注释 【 2. RDBMS 术语 】Table 表Filed 域/字段Column 列Record 记录NULL 空值Constraint 约束数据的完整性范式 【 3. 数据库基本操作函数 】3.1 SHOW DATABASES 显示数据库3.2 CREATE DATABASE 创建数据库3.3 ALTER DA…

回炉重造java----JUC(第一天)

目录 JUC前置知识①进程和线程的区别&#xff1f;②并行和并发的区别&#xff1f;③异步调用和同步调用的区别&#xff1f;④创建线程的方法⑤线程的上下文切换⑥TimeUtil⑦Interrupt⑧如何在一个线程中终止另外一个线程&#xff1f;⑨线程的状态共享模型之管程 阻塞式&#x…

LLVM后端__llc中值定义信息的查询方法示例

关于LiveIntervals pass中相关数据结构的含义&#xff0c;在寄存器分配前置分析(5.1) - LiveInterval这篇博客中已经做了清晰的讲解&#xff0c;此处不再赘述&#xff0c;本文主要讲解值定义信息VNInfo的使用方法和注意事项。 1. VNInfo含义 在LLVM的源码中&#xff0c;VNInf…

视频汇聚EasyCVR综合安防平台对接GA/T1400公安视图库及应用方案

随着科技的不断进步&#xff0c;视频监控系统在公共安全领域发挥着越来越重要的作用。GA/T1400公安视图库作为公安视频图像信息应用系统的标准&#xff0c;为视频监控系统的对接提供了统一的规范和技术要求。 GA/T1400标准的应用范围广泛&#xff0c;涵盖了公安系统的视频图像信…

图解大模型分布式并行各种通信原语

背景 在分布式集群上执行大模型任务时候&#xff0c;往往使用到数据并行&#xff0c;流水线并行&#xff0c;张量并行等技术&#xff0c;这些技术本质上也就是对数据进行各种方案的切分&#xff0c;然后放到不同的节点上运算。不同节点在计算的过程中需要对数据分发或者同步等…

【精读文献】J. Environ. Manage.|青藏高原生态恢复项目下植被覆盖动态及其对生态系统服务的约束效应

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 2.1 研究背景 2.2 研究现状 03 研究区域与数据集 3.1 研究区域 3.2 研究数据 04 研究方法 4.1 趋势分析 4.2 残差趋势分析 4.3 偏相关 4.4 生态系统服务评价 4.5 约束线的定义和提取 05 研究结果 5.1 植被…

秒杀基本功能开发(不考虑高并发情况)

文章目录 1.显示秒杀状态1.controller修改GoodsController.java的toDetail方法&#xff0c;响应秒杀状态和秒杀剩余时间 2.前端1.goodsDetail.html 图片下面添加一行秒杀开始时间2.goodsDetail.html 添加计时器js代码 3.测试1.秒杀进行中2.修改db的秒杀开始时间为明天3.出现秒杀…

<Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色

前言 本专栏是Rust实例应用。 环境配置 平台&#xff1a;windows 软件&#xff1a;vscode 语言&#xff1a;rust 库&#xff1a;iced、iced_aw 概述 本篇构建了这样的一个实例&#xff0c;可以动态修改UI的主题&#xff0c;通过菜单栏来选择预设的自定义主题和官方主题&#…

python列表的扩展操作

列表的扩展操作 zip() 函数 我们先学习 zip() 函数&#xff0c;将排名与分数挂钩。 还记得期中考试的顺序排名和分数吗&#xff1f;我们把排名放在了列表 midterm_rank 中&#xff0c;把分数放在了 scores 中。不过当时 scores 并没有排序&#xff0c;我们要对数据进行预处理…

深入理解文件系统和日志分析

文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode&#xff1a;存储元信息&#xff08;包括文件的属性&#xff0c;权限&#xff0c;创建者&#xff0c;创建日期等等&#xff09; block&#xff1a;块&#xff0c;连续…

小白跟做江科大32单片机之LED闪烁

原理介绍 原理介绍详见&#xff1a; 【STM32】江科大STM32学习笔记汇总(已完结)_stm32江科大笔记-CSDN博客https://blog.csdn.net/u010249597/article/details/134762513 项目准备 1.在项目文件夹中新建3-1 LED文件夹 2.keil新建项目&#xff0c;打开新建的3-1 LED&#xf…

【CC2530-操作外部flash】

zigbee cc2530操作flash&#xff0c;以cc2530读flash_id为例子&#xff1b; void InitIO() {CLKCONCMD & ~0x40; //设置系统时钟源为32MHZ晶振 while(CLKCONSTA & 0x40); //等待晶振稳定为32M CLKCONCMD & ~0x47; //设置系统主时钟频率为32MHZ…

面试(五)

目录 1. 知道大顶堆小顶端吗&#xff0c;代码怎么区分大顶端小顶端 2. 计算机中栈地址与内存地址增长方向相反吗&#xff1f; 3. %p和%d输出指针地址 4. 为什么定义第二个变量时候&#xff0c;地址反而减了 5. 12&#xff0c;32&#xff0c;64位中数据的占字节&#xff1f;…

物质的量质量,它们可不是一个概念

物质的量&质量&#xff0c;它们可不是一个概念。 物质的量&质量 乍一听物质的量&#xff0c;还以为是和质量有什么关系&#xff0c;是不是&#xff1f;其实物质的量和质量没什么直接的联系。 物质的量是国际单位制中7个基本物理量之一&#xff0c;其符号为n&#xf…

Aras Innovator-Team(群组)的使用方法

当Aras Innovator在处理权限时&#xff0c;在不使用Team的情况下&#xff0c;系统的权限配置可以满足大部分业务场景&#xff0c;如&#xff1a;常见的按照组织架构&#xff0c;成员和角色分配权限&#xff0c;按照生命周期分配权限等。 如果遇到比较复杂的权限需求&#xff0c…

AltiumDesigner/AD添加数据库连接

1.首先确保本机电脑有无对应的数据库驱动&#xff0c;例如我这边要添加MySQL的数据&#xff0c;则需要首先下载MySQL数据驱动&#xff1a;MySQL :: Download MySQL Connector/ODBC (Archived Versions) 2.运行“odbcad32.exe”&#xff0c;如下图添加对应的数据库配置&#xf…

【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…