我试图在我的程序中使用这个Arduino代码,LED将继续运行 持续5秒然后自动关闭
#include <elapsedMillis.h>
int led = 13 ;
elapsedMillis timer0 ;
#define interval 5000
boolean timer0Fired ;
// the setup routine runs once when you press reset:
void setup()
{
pinMode(led, OUTPUT);
digitalWrite(led, HIGH);
timer0Fired = false;
timer0 = 0; // clear the timer at the end of startup
}
void loop()
{
if ((!timer0Fired) && (timer0 > interval))
{
timer0Fired = true; // don't execute this again
digitalWrite(led, LOW); // turn led off after 5 sec
}
}
我不明白if语句在循环中是如何工作的,!timer0Fired应该计算为1,但是当我将它打印出来时它是0,所以当timer0超过 if语句应该计算为false,我在UNO上尝试它并且它可以工作。
答案 0 :(得分:0)
!timer0Fired应评估为1,但是当我将其打印出来时 0
打印时,打印&#34;!timer0Fired&#34;或&#34; timer0Fired&#34;?它会解释输出。
所以当timer0超过间隔时,if语句应该计算 是假的
目前,&#34;(timer0&gt; interval)&#34;当timer0超过间隔时,计算结果为true,而不是相反。这不正确吗?
答案 1 :(得分:0)
这只是一个基本的编程逻辑。
想象一下,你想要数到5并调用一些函数,例如DoSomething
,无限循环。
int count = 0;
bool called = false; // DoSomething not called yet
while (true) // main loop
{
++count;
if (count == 5)
{
// the count is 5
if (called == false)
{
// function not called yet, call it!
called = true;
DoSomething();
}
}
}
在某种程度上,这似乎是无意义的。等等......
然而,您遇到的问题是您没有像我的count
这样的简单计数器。相反,您使用的计时器可能只有几毫秒的时间,而您仍然希望代码能够执行,即使它已经很晚了。
例如:
int count = 0;
bool called = false; // DoSomething not called yet
while (true) // main loop
{
count += 2; // emulate counter being late
if (count >= 5) // note that count == 5 will be always false here...
{
// the count is 5 or more
if (called == false)
{
// function not called yet, call it!
called = true;
DoSomething();
}
}
}
现在完全颠倒了if
的价值。这样,应用程序几乎总是通过第一个if
,但只有一次。为了优化这一点,您只需交换if
s:
if (called == false)
{
if (count >= 5)
{
called = true;
DoSomething();
}
}
现在,正如您可能知道的那样,这些嵌套的if
语句可以使用&&
运算符轻松地分组为一个。此外,使用called == false
可以减少!called
的详细程度。这最终导致了
while (true) // main loop
{
count += 2; // emulate counter being late
if (!called && count >= 5)
{
// function not called yet and count is already 5 or more
called = true;
DoSomething();
}
}
所以发生了什么:
a)您只想执行一段代码一次
- 在您的代码中由bool called = false; if (!called) called = true;
逻辑或timer0fired
表示
count >= 5
或timer >= interval
表示
<强> TL;博士
您的代码运行正常。