Как остановить цикл на Arduino - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь создать код, который включает светодиод при обнаружении инфракрасного излучения, но когда цикл запускается, и я хочу изменить его на другой, но он не работает

#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 голосов
/ 06 февраля 2019

Возможно, вам не нужна рекурсия в вашем коде (вызов 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();
}

это предполагает, что цикл вызывается неоднократно извне и не нуждается в реальном цикле внутри него.

Вы не должны использовать рекурсию для потенциально длинных циклов.на самом деле вы должны избегать этого, где это не так уж и сложно.вызов функции создает новый стековый фрейм.в большинстве систем размер стека очень ограничен 1 МБ.

Рекурсия может быть полезна для определенных задач, но в 99,99% случаев вам этого не нужно.

0 голосов
/ 02 июня 2018

Если я правильно понял вашу цель - вы можете просто разделить цикл void на 2 секции, из которых вы отключаете и включаете свои секции с помощью функции if, проверяющей логическое значение.Поэтому, если логическое значение истинно, выполняется первая функция, а в противном случае - вторая.Я надеюсь, что это работает для вас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...