步骤1:理论
首先介绍一些理论。 使用按钮打开灯很简单,如果按钮显示 HIGH (按下时),那么我们可以通过写连接到的输出引脚来打开LED 》 HIGH 。按钮读取 LOW 后,我们可以再次将输出引脚设置为 LOW 以关闭LED。这就是我们所说的瞬时的。
对于此设置,我们希望打开或关闭LED。对于上面的简单示例,这本身就是一个问题,因为Arduino中的循环功能每秒重复数百次。即使最快的按键也可以多次打开和关闭。第一个问题我们将使用一个或两个简单的布尔值来克服,这将在接下来的几页中进行解释。
第二个问题是长按功能。我们如何触发此功能而不先触发短按功能?答案很简单。按下按钮时触发长按功能,释放按钮后触发短按功能。通过在长按功能激活之前在屏幕上释放一个对象,可以再次在智能手机上观察到这一点。
在下一步中,我们将创建硬件设置,如果需要,请跳过此设置您已经处于这个阶段。..
步骤2:硬件
硬件非常简单,所以我不会给您带来太多负担。
首先是两个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
+关注
关注
240文章
23100浏览量
657524 -
按钮
+关注
关注
0文章
134浏览量
12725
发布评论请先 登录
相关推荐
评论