Возможно, вам не нужна рекурсия в вашем коде (вызов 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% случаев вам этого не нужно.