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
    +关注

    关注

    243

    文章

    24433

    浏览量

    687322
  • 按钮
    +关注

    关注

    0

    文章

    134

    浏览量

    13392
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash?

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash,有一norflash被模拟成U盘,会在中断中操作spi。
    发表于 09-26 06:18

    ‌TPS92663-Q1 高亮度LED矩阵管理器芯片总结报告

    TPS92663-Q1 LED 矩阵管理器设备通过提供单独的像素级 LED 控制来实现完全动态的自适应照明解决方案。 该器件包括三
    的头像 发表于 08-25 16:11 638次阅读
    ‌TPS92663-Q1 高亮度<b class='flag-5'>LED</b>矩阵管理器芯片总结报告

    ‌TPS92663A-Q1 高亮度LED矩阵管理器技术文档总结

    TPS92663A-Q1 LED 矩阵管理器设备通过提供单独的像素级 LED 控制来实现完全动态的自适应照明解决方案。 该器件包括三
    的头像 发表于 08-22 14:43 904次阅读
    ‌TPS92663A-Q1 高亮度<b class='flag-5'>LED</b>矩阵管理器技术文档总结

    有可能在 FX3 GPIF2 中创建两个独立的状态机吗?

    我想,如果我想通过 FX3 GPIF2 创建两个独立的传输流接口,我需要在 GPIF2 设计器中创建两个独立的状态机,我是否有可能在 GPIF2 设计器中创建两个独立的
    发表于 05-20 06:14

    DA芯片电源和MCU电源是两个不同电源,MCU断电重启后DA无输出,为什么?

    我司使用AD5724AREZ产品做一款模拟量输出的模块,AD5724AREZ的电源是IO电源单独供的隔离电,MCU是另一电源,如果两个电源同时断开重启AD5724AREZ的所有通道就正常输出,如果
    发表于 04-16 07:04

    HTR3316 16路LED驱动器和GPIO控制器中文手册

         HTR3316是一款16路多功能LED驱动器和GPIO控制器,2.5V~5.5V电源供电。16IO端口中的任何一可以配置为
    发表于 04-11 17:51 2次下载

    TPS3424 具有可编程延迟的毫微功耗按钮控制器数据手册

    TPS3423 和 TPS3424 是按钮控制器,可提供广泛的短按和长按独立检测功能。这些器件每个按钮最多提供两个输出(RESET 和 INT),可用于各种用例,包括启用稳压器或断路器
    的头像 发表于 04-09 11:20 648次阅读
    TPS3424 具有可编程延迟的毫微功耗<b class='flag-5'>按钮</b><b class='flag-5'>控制</b>器数据手册

    TPS3423 毫微功耗双按钮控制器,具有短按和长按差异化技术手册

    TPS3423 和 TPS3424 是按钮控制器,可提供广泛的短按和长按独立检测功能。这些器件每个按钮提供多达两个输出(RESET 和 INT),可用于各种用例,包括启用稳压器或断路器
    的头像 发表于 04-09 10:49 656次阅读
    TPS3423 毫微功耗双<b class='flag-5'>按钮</b><b class='flag-5'>控制</b>器,具有短按和长按差异化技术手册

    是否可以两个PTN3222GMJ设备背靠背连接以制作USB2中继器?

    是否可以两个 PTN3222GMJ 设备背靠背连接以制作 USB2 中继器。 Connection 将如下所示: 如果这个背靠背中继器是可能的,它是否涉及任何配置或编程?
    发表于 03-28 08:08

    请问DSP可以同时控制两个不同的RGB屏吗?

    如题,这种情况两个LCD的时钟信号和复位信号是不是都要分开?H和V信号可以共用?
    发表于 03-06 06:50

    DLP4500两个投影仪外触发接一相机,无法触发是什么原因导致的?

    大佬们,请问我采用两个投影仪的trig out1连接在一起接到相机的触发端,投影仪正常投影,但是无法输出触发。若两个投影仪拆开单独触发就可以,请问是什么原因造成的呢,如何解决呢,跪
    发表于 02-21 07:05

    请问DLPA100可以单独驱动LED光源吗?

    请问DLPA100可以单独驱动LED光源么?不搭配专用的DLPC用。
    发表于 02-18 07:37

    可以驱动两个直流有刷电机、一双极步进电机的双H桥电机驱动芯片-SS8833E

    电机驱动芯片 - SS8833E是一种双桥电机驱动器,具有两个H桥驱动器,可以驱动两个直流有刷电机、一双极步进电机、电磁阀或其他电感负载。
    的头像 发表于 02-12 09:43 925次阅读
    <b class='flag-5'>可以</b>驱动<b class='flag-5'>两个</b>直流有刷电机、一<b class='flag-5'>个</b>双极步进电机的双H桥电机驱动芯片-SS8833E

    两个不同频率晶振靠的近会怎样

    晶振的振荡本质上是一种机械振动(在压电晶体层面)。当两个晶振靠得很近时,它们的机械振动可能会相互影响。一晶振的振动可能会通过电路板或者外壳等介质传递给另一晶振,从而改变另一晶振的
    的头像 发表于 01-20 13:55 2017次阅读
    <b class='flag-5'>两个</b>不同频率晶振靠的近会<b class='flag-5'>怎样</b>

    ADC124S021同时使用两个通道,两个通道的转换数据发生串扰怎么解决?

    用DSP的SPI接口接ADC124S021,如果只是进行单通道的信号采集,则转换后的数值稳定,但是同时使用两个通道时则两个通道的数据发生串扰现象。如,我单独使用2通道,则转换后数值稳定,但是如果
    发表于 12-30 07:41