switching between functions using an IR remote

-1

I have bought a WS2812B Led Strip. I'm trying to controll it with a IR remote. it is all controlled by a arduino uno.
I know the leds work and i know the remote works. I'm trying to pre-program a few animations on the remote.
The code below is as far as i got. I can show one animation, but i have to wait until it end to change it to onother one.
Is it possible to interupt this (becouse some animations are infinite) when i push a button to choose another animation?

#include <IRremote.h>
#include "FastLED.h"
#define NUM_LEDS 232
CRGB leds[NUM_LEDS];
#define PIN 7

const int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;

void setup(){
  FastLED.addLeds<WS2812B, PIN, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

//switch case for remote
void loop(){
  if (irrecv.decode(&results)){

        if (results.value == 0XFFFFFFFF)
          results.value = key_value;

        switch(results.value){
          case 0xFF30CF:
          Serial.println("1");
          RGBLoop();
          break ;
          case 0xFF18E7:
          Serial.println("2");
          red();
          break ;
          case 0xFF7A85:
          Serial.println("3");
          break ;
        }
        key_value = results.value;
        irrecv.resume(); 
  }
}


void RGBLoop(){

  while(key_value==key_value){
  for(int j = 0; j < 6; j++ ) {
    // Fade IN
    for(int k = 0; k < 256; k++) {
      switch(j) {
        case 0: setAll(k,0,0); break;
        case 2: setAll(k,k,0); break;
        case 3: setAll(0,k,0); break;
        case 4: setAll(0,k,k); break;
        case 5: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
    // Fade OUT
    for(int k = 255; k >= 0; k--) {
      switch(j) {
        case 0: setAll(k,0,0); break;
        case 2: setAll(k,k,0); break;
        case 3: setAll(0,k,0); break;
        case 4: setAll(0,k,k); break;
        case 5: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
  }
}
}

void red(){
  irrecv.resume();
  setAll(0,255,255);
  showStrip();
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}


void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}


void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }

being honnest most of this I got online. it is my first time programming an arduino. but so far Im liking it

arduino
arduino-uno
fastled
asked on Stack Overflow Apr 30, 2020 by applesomthing

1 Answer

0

Instead of using infinite loops, you can just check for if any other command is received.

E.g:

instead of

while ( key_value == key_value ) //This is a weird infinite loop condition but whatever 
{
    // do stuff
}

you can have

while ( decode() == condition_for_this_loop )
{
    // do stuff
}

or

for(;;) //This also is just an infinite loop, but looks nicer.
{
    // do stuff

    if ( decode() != condition_for_this_loop ) {  break;  }
}

Note that this is a pseudo code. You need to properly implement it. And you may need to alter the logic of your program a bit.

Since you have defined irrecv object globally, it will be visible for other functions below, this won't be a problem. Your code may even work just by replacing the loop condition. But if you get errors, you need to deal with them, I am just pointing to the logic. In the end, you can have something like this:

irrecv.decode( &results );

switch ( results )
{
    case CONDITION_1:
        inf_loop1();
    break;

    case CONDITION_2:
        int_loop2();
    break;
}

...

void inf_loop1()
{
    for(;;) 
    {
        // do stuff

        irrecv.decode( &results );
        if ( results != CONDITION_1 ) {  break;  }
    }
}


void inf_loop2()
{
    for(;;) 
    {
        // do stuff

        irrecv.decode( &results );
        if ( results != CONDITION_2 ) {  break;  }
    }
}

By the way, it's not a good idea to start with relatively big projects. By your question, I am assuming this is not only your first program for Arduino, but your first ever program. You don't run before you walk. Start slowly, blink some LEDs, implement some fun algorithms with LEDs, i don't know, have multiple of them and light them in different sequences, have some buttons and combine them with LEDs. Just play with LEDs. As you get more experience, you won't be asking questions like this. And if you start with some big project, chances are, you won't be able to do it, and got disappointed, or you will be just followed some online tutorials and copy-paste code, hence it won't feel like you did it.

answered on Stack Overflow Apr 30, 2020 by melonduofromage

User contributions licensed under CC BY-SA 3.0