我试图制作一个代码,当检测到红外线时打开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();
}
}
答案 0 :(得分:0)
如果我正确地理解了你的目标 - 你可以简单地将void循环拆分为2个部分,从中通过if-function检查布尔值来禁用和启用你的部分。因此,如果布尔值为true,则运行第一个函数,否则运行第二个函数。 我希望这个适合你!
答案 1 :(得分:0)
您可能不想在代码中进行递归(在循环函数内调用loop())。 虽然不熟悉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();
}
这假定循环是从外部重复调用的,不需要在内部循环。
不应将递归用于可能长时间运行的循环。实际上,您应该避免这样做,因为这样做没有太大麻烦。调用函数会创建一个新的堆栈框架。在大多数系统上,堆栈的大小限制为1MB。
对于某些问题,递归可能很有用,但是99.99%的时间您不希望这样做。