如何在arduino上停止循环

时间:2018-06-01 20:44:39

标签: arduino

我试图制作一个代码,当检测到红外线时打开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 个答案:

答案 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%的时间您不希望这样做。