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

电子说

1.2w人已加入

描述

步骤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个功能

led

如果我们有两个按钮怎么办?那么我们就有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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分