Ardunio实现按钮控制LED常亮或常灭

2024-05-25 08:32

本文主要是介绍Ardunio实现按钮控制LED常亮或常灭,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

想法

Arduino中 如何实现

  • 情况一: LED常灭时, 按钮按下并松开之后保持LED灯常亮?
  • 情况二:LED常亮时, 按钮按下并松开之后保持LED灯常灭?

想法实现过程

版本1 亮个灯

Arduino上有一个LED灯,上面的字母为L
在这里插入图片描述

当然我们也可以自己再额外加一个LED灯, 长脚接PIN13, 短脚接GND
不推荐以上做法: 外接的LED灯容易烧掉, 最好将LED插在面包板上, 串联加一个电阻
不要问我为什么? 因为我无意中烧掉了好几个了, 还好这玩意多!
在这里插入图片描述

#define LED 13void setup() {// initialize digital pin LED_BUILTIN as an output.pinMode(LED , OUTPUT);
}void loop() {digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)delay(1000);                       // wait for a seconddigitalWrite(LED, LOW);    // turn the LED off by making the voltage LOWdelay(1000);                       // wait for a second
}

结果: LED灯每隔1S闪烁一次

版本2 加个按钮

在这里插入图片描述

#define LED 13
#define BUTTON 7int val = 0;void setup() {// put your setup code here, to run once:pinMode(LED, OUTPUT);pinMode(BUTTON, INPUT);
}void loop() {// put your main code here, to run repeatedly:val = digitalRead(BUTTON);  // 获取按钮是否被按下的状态if (val == HIGH){digitalWrite(LED, HIGH);}else{digitalWrite(LED, LOW);}
}

新的问题: 必须用手指一直按着不能松手, 不然灯就会灭, 如何按一下亮, 再按一下灭呢?

版本3 让按钮按下放开后能开启及关闭LED
#define LED 13
#define BUTTON 7int val = 0;
int state = 0;  // 新添加一个变量记录LED状态void setup() {// put your setup code here, to run once:pinMode(LED, OUTPUT);pinMode(BUTTON, INPUT);
}void loop() {// put your main code here, to run repeatedly:val = digitalRead(BUTTON);if (val == HIGH){  // 每当按钮按下时 切换state状态state = 1 - state;}if (state == 1){ // 根据 state状态 来点亮或熄灭LEDdigitalWrite(LED, HIGH);} else{digitalWrite(LED, LOW);}
}

新的问题: LED灯的显示很不稳定, 有时会明明是亮的,再按下并松开按钮, 灯还是亮的, 反之, 也是

原因: Arduino 芯片会以每秒16 000 000次的速度执行程序指令. 所以 当我们按下并在松开按钮之间, 其实状态值已经被反复读取并取反赋值数千次了, 导致它的值的不确定.

所以我们如何解决这个不确定呢?
只要让我们的state值每次按一次按钮只被修改其值一次, 即取反一次即可!

版本4 解决 state值 被多次修改的问题
#define LED 13
#define BUTTON 7int val = 0;
int old_val = 0;
int state = 0;void setup() {// put your setup code here, to run once:pinMode(LED, OUTPUT);pinMode(BUTTON, INPUT);
}void loop() {// put your main code here, to run repeatedly:val = digitalRead(BUTTON);if (val == HIGH && old_val == LOW) {  // 注释2state = 1 - state;}old_val = val;  //  注释1if (state == 1) {digitalWrite(LED, HIGH);} else {digitalWrite(LED, LOW);}
}

首先 我们先看注释1处的代码
它的作用是 在按钮按下并未松开时, old_val 永远会是 HIGH, 只有当按钮松开释放后, old_val 才会是 LOW
然后 我们再看注释2处的代码
它的作用是 为了让了按钮被按下之后, 代码只运行一次, 不能循环回来之后还能进入这个 if条件

版本5 克服按键抖动

在按钮尚未按到底的瞬间和按钮弹回的时候, 会产生杂波, 这时 Arduino会收到一连串开关交错的信号.
我们在程序中 加入 10~50 ms 的延迟批令可以克服这个杂波.

#define LED 13
#define BUTTON 7int val = 0;
int old_val = 0;
int state = 0;void setup() {// put your setup code here, to run once:pinMode(LED, OUTPUT);pinMode(BUTTON, INPUT);
}void loop() {// put your main code here, to run repeatedly:val = digitalRead(BUTTON);if (val == HIGH && old_val == LOW) { state = 1 - state;delay(10); // 加入延迟以克服杂波}old_val = val;if (state == 1) {digitalWrite(LED, HIGH);} else {digitalWrite(LED, LOW);}
}

参考书籍: <<爱上Arduino>>

这篇关于Ardunio实现按钮控制LED常亮或常灭的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分