我试着去做出打开的代码的LED红外检测时,但是当一个循环开始,我想将其更改为另一个循环,但它不工作
#include <IRremote.h>
int receptor = 7;
int led = 2;
IRrecv irrecv(receptor);
decode_results codigo; //OBJETO CODIGO DE CLASE decode_result, oriundo de IRremote.h
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // INICIA LA RECEPCIÓN
pinMode(led, OUTPUT);
}
void loop()
{
if (irrecv.decode(&codigo))
{
Serial.println(codigo.value, HEX);
if (codigo.value == 0xFF6897) //CÓDIGO DEL NÚMERO CERO PARA ACTIVAR LED
{
digitalWrite(led, HIGH);
}
if (codigo.value == 0xFF30CF) //CÓDIGO DEL NÚMERO UNO PARA DESACTIVAR LED
{
loop();
digitalWrite(led, LOW);
delay(1000);
digitalWrite(led, HIGH);
delay(1000);
}
delay(500);
irrecv.resume();
}
}
如果我理解正确你的目标 - 你可以简单地虚空环分成2个部分,从那里你禁用和由IF函数检查布尔启用部分。所以,如果布尔值为true运行它的第一功能,否则第二。我希望这一个对你的作品!
你可能不希望在递归你的代码(调用循环()循环函数内)。虽然不熟悉adruino,我想我知道足够的C到修复您的代码。
int blinkingState = 0; // should probably be an enum.
void loop()
{
irrecv.decode(&codigo); // decode into codigo
if (codigo != NULL) // null reference check
{
Serial.println(codigo.value, HEX);
// Case 1: always on
if (codigo.value == 0xFF6897) //CÓDIGO DEL NÚMERO CERO PARA ACTIVAR LED
{
blinkingState = 0;
}
// Case 2: blinking, made else if to get some more speed and skip a second check if case 1 is true.
else if (codigo.value == 0xFF30CF) //CÓDIGO DEL NÚMERO UNO PARA DESACTIVAR LED
{
blinkingState = 1;
}
}
// blink or don't blink according to global variable.
if (blinkingState == 0)
{
digitalWrite(led, HIGH);
delay(500); // moved from end of function to here otherwise case 2 will blink irregularly
}
else if (blinkingState = 1)
{
digitalWrite(led, LOW);
delay(1000);
digitalWrite(led, HIGH);
delay(1000);
}
irrecv.resume();
}
这个假设循环从外部反复调用,并且不需要在它的内部实际的循环。
你不应该使用递归潜在的长期运行的循环。其实你应该避免的地方是不是太麻烦这样做。调用一个函数创建一个新的StackFrame。和堆栈是非常有限到1MB在大多数系统上。
递归可以为某些问题是有用的,但你不希望这样的99.99%的时间。