0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样制作可以控制两个单独LED状态的按钮

454398 来源:网络整理 作者:网络整理 2019-11-12 11:41 次阅读

步骤1:理论

首先介绍一些理论。 使用按钮打开灯很简单,如果按钮显示 HIGH (按下时),那么我们可以通过写连接到的输出引脚来打开LED 》 HIGH 。按钮读取 LOW 后,我们可以再次将输出引脚设置为 LOW 以关闭LED。这就是我们所说的瞬时的。

对于此设置,我们希望打开或关闭LED。对于上面的简单示例,这本身就是一个问题,因为Arduino中的循环功能每秒重复数百次。即使最快的按键也可以多次打开和关闭。第一个问题我们将使用一个或两个简单的布尔值来克服,这将在接下来的几页中进行解释。

第二个问题是长按功能。我们如何触发此功能而不先触发短按功能?答案很简单。按下按钮时触发长按功能,释放按钮后触发短按功能。通过在长按功能激活之前在屏幕上释放一个对象,可以再次在智能手机上观察到这一点。

在下一步中,我们将创建硬件设置,如果需要,请跳过此设置您已经处于这个阶段。..

步骤2:硬件

怎样制作可以控制两个单独LED状态的按钮

硬件非常简单,所以我不会给您带来太多负担。

首先是两个LED。我们将每个阳极连接到Arduino的引脚12和13,然后将阴极接地。

按钮连接到5V输出和Arduino的引脚3,然后用10kOhm电阻接地。

第3步:详细软件第1部分

现在详细说明代码的每个步骤。如果您想直接阅读完整的代码,则将在步骤5中找到

。首先让我们看一下该设置所需的变量,从简单的引脚参考开始。

p》 int LED1 = 12;

int LED2 = 13;

int button = 3;

接下来,我们需要一些布尔值。这些将用于打开或关闭LED的状态

boolean LED1State = false;

boolean LED2State = false;

现在另外两个布尔值。第一个将根据按钮的状态进行更改。这将使代码可以检测到按下或释放按钮后的第一个循环。第二个功能有两个功能,它将允许代码停止长按多次激活,并在长按后释放按钮时停止激活短按功能。

boolean buttonActive = false;

boolean longPressActive = false;

最后两个变量。第一个变量用于记录第一次按下按钮的时间。第二个变量是您希望按住按钮的时间长度(以毫秒为单位),以激活长按功能。可以更改为您选择的图形。

long buttonTimer = 0;

long longPressTime = 250;

现在进行设置,这又非常简单,我们只需设置引脚模式即可。

void setup() {

pinMode(LED1, OUTPUT);

pinMode(LED2, OUTPUT);

pinMode(button, INPUT);

}

第4步:详细软件部分2

现在进入循环。我将对此进行细分一点一点地解释发生了什么。程序要做的第一件事是读取按钮的状态。这将为我们提供下面的代码,并允许我们为未按下和按下状态创建函数,请记住,短按功能在释放按钮时发生。

if (digitalRead(button) == HIGH) {

//Button pressed

} else {

//Button not pressed

}

在按下按钮的部分中,我们要做的第一件事是测试buttonActive变量,在设置时将其设置为false 。如果当前为假,则表示程序正在检测首次按下的按钮。这是因为在读取false之后,我们立即将其设置为true,只有释放按钮才能将其设置为false。我们还记录了按钮第一次被按下的时间。

if (buttonActive == false) {

buttonActive = true;

buttonTimer = millis();

}

按钮被按下部分的下一步是测试我们将按钮按下了多长时间。 。为此,我们测试当前时间,减去第一次按下的时间(以毫秒为单位),然后将其与希望激活长按之前的时间进行比较。

我们还检查longPressActive布尔值是否为false,因为一旦激活长按功能,我们便会将此布尔值设置为true以停止重复激活。一旦将按钮按住所需的时间,我们将翻转LED1State布尔值的状态,布尔值将相应地翻转LED相应地连接到 HIGH 或 LOW 的引脚。

if ((millis() - buttonTimer 》 longPressTime) && (longPressActive == false)) {

longPressActive = true;

LED1State = !LED1State;

digitalWrite(LED1, LED1State);

}

移至未按下代码部分的按钮。我们将检查的第一件事是buttonActive布尔值是否为true。如果将其设置为true,则代码是自释放按钮以来的第一次循环。然后它将布尔值设置回false,以允许上面的代码检测到再次按下按钮。

if (buttonActive == true) {

buttonActive = false;

}

在上面的if语句中,在我们检测到第一个循环时释放按钮后,我们接下来将检查长按功能是否已激活,这将放弃两个可能的步骤。如果长按被激活,我们只需将longPressActive设置回false即可允许程序再次长按。如果未激活,我们将像第一个那样翻转第二个LED的状态。

if (longPressActive == true) {

longPressActive = false;

} else {

LED2State = !LED2State;

digitalWrite(LED2, LED2State);

}

步骤5:完整代码

这是准备上传到Arduino的完整代码。

int LED1 = 12;

int LED2 = 13;

int button = 3;

boolean LED1State = false;

boolean LED2State = false;

long buttonTimer = 0;

long longPressTime = 250;

boolean buttonActive = false;

boolean longPressActive = false;

void setup() {

pinMode(LED1, OUTPUT);

pinMode(LED2, OUTPUT);

pinMode(button, INPUT);

}

void loop() {

if (digitalRead(button) == HIGH) {

if (buttonActive == false) {

buttonActive = true;

buttonTimer = millis();

}

if ((millis() - buttonTimer 》 longPressTime) && (longPressActive == false)) {

longPressActive = true;

LED1State = !LED1State;

digitalWrite(LED1, LED1State);

}

} else {

if (buttonActive == true) {

if (longPressActive == true) {

longPressActive = false;

} else {

LED2State = !LED2State;

digitalWrite(LED2, LED2State);

}

buttonActive = false;

}

}

}

步骤6:奖金-两个按钮6个功能

如果我们有两个按钮怎么办?那么我们就有6种功能,如下所示。

短按按钮1

短按按钮2

短按按钮1和2

长按按钮1

长按按钮2

长按按钮1和2

该程序的工作方式与第一个代码相同,但有一些显着变化。

首先,LED的数量更多,这意味着变量更多,当然还有额外的按钮。但是最大的改变是激活长按或短按的时间。一旦达到这两个点中的任何一个,而不是打开或关闭LED,我们就可以针对每种功能采取三种可能的措施。结果六个可能的LED之一点亮或熄灭。为了确定要采取的操作,我们检查每个按钮的状态以及这些要点的状态,并做出相应的响应。

这是代码

int LED1 = 8;

int LED2 = 9;

int LED3 = 10;

int LED4 = 11;

int LED5 = 12;

int LED6 = 13;

int button1 = 3;

int button2 = 4;

long buttonTimer = 0;

long buttonTime = 250;

boolean buttonActive = false;

boolean longPressActive = false;

boolean button1Active = false;

boolean button2Active = false;

boolean LED1Active = false;

boolean LED2Active = false;

boolean LED3Active = false;

boolean LED4Active = false;

boolean LED5Active = false;

boolean LED6Active = false;

void setup() {

pinMode(LED1, OUTPUT);

pinMode(LED2, OUTPUT);

pinMode(LED3, OUTPUT);

pinMode(LED4, OUTPUT);

pinMode(LED5, OUTPUT);

pinMode(LED6, OUTPUT);

pinMode(button1, INPUT);

pinMode(button2, INPUT);

}

void loop() {

if (digitalRead(button1) == HIGH) {

if (buttonActive == false) {

buttonActive = true;

buttonTimer = millis();

}

button1Active = true;

}

if (digitalRead(button2) == HIGH) {

if (buttonActive == false) {

buttonActive = true;

buttonTimer = millis();

}

button2Active = true;

}

if ((buttonActive == true) && (millis() - buttonTimer 》 buttonTime) && (longPressActive == false)) {

longPressActive = true;

if ((button1Active == true) && (button2Active == true)) {

LED4Active = !LED4Active;

digitalWrite(LED4, LED4Active);

} else if((button1Active == true) && (button2Active == false)) {

LED5Active = !LED5Active;

digitalWrite(LED5, LED5Active);

} else {

LED6Active = !LED6Active;

digitalWrite(LED6, LED6Active);

}

}

if ((buttonActive == true) && (digitalRead(button1) == LOW) && (digitalRead(button2) == LOW)) {

if (longPressActive == true) {

longPressActive = false;

} else {

if ((button1Active == true) && (button2Active == true)) {

LED1Active = !LED1Active;

digitalWrite(LED1, LED1Active);

} else if ((button1Active == true) && (button2Active == false)) {

LED2Active = !LED2Active;

digitalWrite(LED2, LED2Active);

} else {

LED3Active = !LED3Active;

digitalWrite(LED3, LED3Active);

}

}

buttonActive = false;

button1Active = false;

button2Active = false;

}

}

从这里我们甚至可以为可能的14个LED添加第三个按钮,或为30个LED添加四个按钮。也许还有一段时间:)
责任编辑:wv

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    240

    文章

    23100

    浏览量

    657524
  • 按钮
    +关注

    关注

    0

    文章

    134

    浏览量

    12725
收藏 人收藏

    评论

    相关推荐

    两个循环里后台读取串口信息了,和前面板有一按钮 怎么去控制另外的同一动作呢

    我在两个循环里 读取串口信息了, 怎么去控制另外的同一动作呢 大佬们,这个可以实现吗,。目前搞到了是串口接收循环里,收到字符串,就比较长度,符合就触发来另外循环的
    发表于 10-19 09:25

    两个开关电源可以并联使用吗

    两个开关电源并联使用是一相对复杂的话题,涉及到电子电路设计、电源管理、安全规范等多个方面。 1. 开关电源的基本原理 开关电源是一种通过电子开关元件(如晶体管、MOSFET等)快速切换来控制电流
    的头像 发表于 10-09 16:04 703次阅读

    开关可以控制电路的通和断对吗

    开关是电子电路中非常重要的一种元件,它可以用来控制电路的通断状态。通过控制开关的开合,可以实现对电路的
    的头像 发表于 08-25 09:52 538次阅读

    单稳态触发器的两个工作状态是什么

    单稳态触发器是一种数字逻辑电路,广泛应用于各种电子设备和系统中。它具有两个工作状态:稳定状态和暂态状态。 单稳态触发器的工作原理 单稳态触发器是一种具有
    的头像 发表于 08-22 10:11 328次阅读

    触发器的两个稳定状态分别是什么

    触发器作为数字电路中的基本逻辑单元,具有两个稳定状态,这两个状态通常用于表示二进制数码中的0和1。
    的头像 发表于 08-12 11:01 502次阅读

    双稳态电路的两个稳定状态是什么

    双稳态电路是一种具有两个稳定状态的电子电路,广泛应用于数字电路、通信系统、存储器等领域。 双稳态电路的基本概念 双稳态电路是一种具有两个稳定状态的电路,即在没有外部输入信号的情况下,电
    的头像 发表于 08-11 15:00 978次阅读

    双稳态触发器的两个基本性质是什么

    的定义 双稳态触发器是一种具有两个稳定状态的逻辑电路,通常由两个交叉耦合的反相器或门电路构成。在没有外部输入信号的情况下,双稳态触发器可以保持在两个
    的头像 发表于 08-11 10:08 516次阅读

    双稳态触发器的两个稳定状态是什么

    双稳态触发器的两个稳定状态通常被称为“0”状态和“1”状态,这两个状态
    的头像 发表于 08-11 10:05 645次阅读

    两个铜片可以形成原电池吗

    两个铜片本身不能形成原电池,因为原电池的工作原理依赖于两个不同电位的电极材料之间的氧化还原反应。
    的头像 发表于 05-21 16:23 787次阅读

    arcgis中如何关联两个属性表

    在ArcGIS中,关联两个属性表是一重要的操作,可以通过此操作将两个表中的数据关联起来,以便进行分析和查询。下面是详细介绍如何在ArcGIS中实现属性表的关联。 首先,我们需要明确
    的头像 发表于 02-25 11:01 3938次阅读

    没有电位器,用两个按钮可以实现变频器调速吗?

    没有电位器,用两个按钮可以实现变频器调速吗? 变频器是一种广泛应用于电机调速的设备,它能够调节电机的转速,提高电机的效率,并且降低能耗。电位器是变频器调速中常用的组件,但是在某些情况下,由于种种原因
    的头像 发表于 02-18 16:55 1673次阅读

    两个电位器控制变频器,如何接线?

    是一种可调节电阻器,可以通过改变电阻值来控制电流或电压。变频器是一种能够调整电机转速的设备,让电机在不同的频率下工作。 3. 确定电位器的安装位置。在这个场景中,我们需要两个电位器来控制
    的头像 发表于 02-05 10:13 4770次阅读

    将动态指示段重定向到单独LED

    有时,除了数字指示器之外,还需要单独LED。它们可以连接到微控制器的单独引脚,但您也可以节省
    发表于 02-02 16:49 519次阅读
    将动态指示段重定向到<b class='flag-5'>单独</b>的<b class='flag-5'>LED</b>

    stm32一定时器能同时控制两个灯以不同频率闪烁吗?

    STM32的定时器功能强大,**STM32的定时器可以同时控制两个灯以不同频率闪烁** 。
    的头像 发表于 12-13 10:43 1929次阅读

    两个硬盘2系统开机切换

    切换两个硬盘上的系统是一种常见的行为,可以让用户在不同的操作系统之间进行切换,以满足不同的需求。在本文中,我们将详细介绍如何配置和使用两个硬盘上的系统进行切换。本文将分为以下几个部分进行讨论:硬件
    的头像 发表于 11-28 15:08 7241次阅读