0

Hi I am trying to build a arduino project to control led strip and change the light pattern when pressed different button

the code i am using is

#include <IRremote.h> //include the library
#include <FastLED.h>

// How many leds in your strip?
#define NUM_LEDS 70

#define DATA_PIN 3
#define CLOCK_PIN 13
#define Button_0 0xFF9867
#define Button_1 0xFFA25D
#define Button_2 0xFF629D
#define Button_3 0xFFE21D
#define Button_4 0xFF22DD
#define Button_5 0xFF02FD
#define Button_6 0xFFC23D
#define Button_7 0xFFE01F
#define Button_8 0xFFA857
#define Button_9 0xFF906F

int receiver = 7; //initialize pin 13 as recevier pin. 
IRrecv irrecv(receiver); //create a new instance of receiver
decode_results results;
CRGB leds[NUM_LEDS];
void setup() {
 Serial.begin(9600);
 LEDS.addLeds<WS2812,DATA_PIN,RGB>(leds,NUM_LEDS);
 LEDS.setBrightness(84);
 irrecv.enableIRIn(); //start the receiver
}

void loop() {
 if (irrecv.decode(&results)) { //if we have received an IR signal

 Serial.println (results.value, HEX); //display HEX results 
 irrecv.resume(); //next value
if (results.value == Button_0) {
    RunningLightSlow();
  }
else if(results.value == Button_1) {
    RainbowLights();
  
  }  
//  switch (results.value) {
//    
//    case Button_0: RunningLightSlow(); break;
//    case Button_1: RainbowLights(); break;
//    }


 }
 }

// LIGHTSHOW 0 starts --------------------------------------------------------------------------------------------------

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

 void RunningLightSlow() {
  while(1) {
     static uint8_t hue = 0;
  Serial.print("x");
  // First slide the led in one direction
  for(int i = 0; i < NUM_LEDS; i++) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }
  Serial.print("x");

  // Now go in the other direction.
  for(int i = (NUM_LEDS)-1; i >= 0; i--) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }
    }
  }
// LIGHTSHOW 0 ends --------------------------------------------------------------------------------------------------------


//  LIGHTSHOW 1 STARTS ------------------------------------------------------------------------------------------------------

void RainbowLights() {
   randomSeed(millis());

  int wait=random(10,30);
  int dim=random(4,6);
  int max_cycles=8;
  int cycles=random(1,max_cycles+1);

while(1) {
    rainbowCycle(wait, cycles, dim);
  }

  }

  void rainbowCycle(int wait, int cycles, int dim)
{
  Serial.println("Let's make a rainbow.");
  //loop several times with same configurations and same delay
  for(int cycle=0; cycle < cycles; cycle++)
  {
    byte dir=random(0,2);
    int k=255;

    //loop through all colors in the wheel
    for (int j=0; j < 256; j++,k--)
    {
      
      if(k<0)
      {
        k=255;
      }
      
      //Set RGB color of each LED
      for(int i=0; i<NUM_LEDS; i++)
      {
        CRGB ledColor = wheel(((i * 256 / NUM_LEDS) + (dir==0?j:k)) % 256,dim);        
        leds[i]=ledColor;
      }

      FastLED.show();
      FastLED.delay(wait);
    }
  }
}

CRGB wheel(int WheelPos, int dim)
{
  CRGB color;
  if (85 > WheelPos)
  {
   color.r=0;
   color.g=WheelPos * 3/dim;
   color.b=(255 - WheelPos * 3)/dim;;
  } 
  else if (170 > WheelPos)
  {
   color.r=WheelPos * 3/dim;
   color.g=(255 - WheelPos * 3)/dim;
   color.b=0;
  }
  else
  {
   color.r=(255 - WheelPos * 3)/dim;
   color.g=0;
   color.b=WheelPos * 3/dim;
  }
  return color;
}

Now the issue i am facing is when i press a button (for eg 0) it runs the function RunningLightSlow(); i have written the infinite loop code because i want infinite light show and when i press button 1 it does not change the light pattern ,

Root cause would be once the function goes into infinite loop it then never receives the ir signal and hence never change the light pattern

user4965201
  • 973
  • 1
  • 11
  • 25

1 Answers1

0

Remove all infinite loops from your program and create a simple structure in loop() where you check for IR signal and update a "state" variable with the last button pressed.

void loop() {

  // create a function or add here whatever is needed to read the IR code
  irCode = readIrCode();

  // check if the new code is identical to a previous code
  if (lastIrCode != irCode) {

    // memorize the current code
    lastIrCode = irCode;

    / act according to user selection
    switch (irCode) {
      case Button_0:
        doThis(); // this could be your RunningLightSlow()
        break;
      case Button_1:
        doThat(); // maybe RainbowLights()
        break;
      default:
        // for cases you have not handled above
        doWhatever();
    }
  }
}

Do not forget to remove the infinite loops from the functions that run the lights and obviously you would need to declare the variables and set the correct calls.

Nino
  • 702
  • 2
  • 6
  • 12
  • if i remove infinite loop from the RunningLightSlow() function then my led light strip will stop after completing one iteration, i want to keep calling RunningLightSlow() until i press another button – user4965201 Jul 07 '21 at 21:07
  • Check out the answer, it gives you an idea your function will be called again and again until a new IR code is read. – Nino Jul 07 '21 at 21:10
  • can you share an example code ? not able to build what you said – user4965201 Jul 07 '21 at 22:14
  • Code sample added to answer. – Nino Jul 08 '21 at 07:08