Using IR remote to change and break pieces of code within a loop

I am quite new to arduino and I have made a large light array, about 50, all indivudually controlled with 74HC595 shift registers. I am trying to make mutiple patterns and I am using an IR remote to change within the patterns but I get too many problems such as the loop won't break or mutiple pattern join into one. I just need some help. Thanks

#include <IRremote.h>
int IRpin=9;
IRrecv IR(IRpin);
decode_results cmd;
unsigned long key_value =0;

int latchPin=8;
int clockPin=12;
int dataPin=11;

int ROW0=2;
int ROW1=3;
int ROW2=4;
int ROW3=5;
int ROW4=6;
int ROW5=7;
int ROW6=8;

//DELAY TIMINGS

int sDl=1;
int lDl=5;
int rDl=500;
int mLd=200;

int oGreen;
int oRed;
int oYellow;
int oBlue;

byte LED0=0b00000000;
byte LED1=0b00100001;
byte LED2=0b10000100;
byte LED3=0b10000100;
byte LED4=0b00100001;
byte LED5=0b00011000;
byte LED6=0b01000010;
byte LED7=0b01000010;
byte LED8=0b00011000;

void setup() {

pinMode(latchPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);

pinMode(ROW0,OUTPUT);
pinMode(ROW1,OUTPUT);
pinMode(ROW2,OUTPUT);
pinMode(ROW3,OUTPUT);
pinMode(ROW4,OUTPUT);
pinMode(ROW5,OUTPUT);

Serial.begin(9600);
IR.enableIRIn();
}

void loop() {

IR.resume();

switch(cmd.value)
{
  //only green LEDs
  case 0xFD30CF:

  digitalWrite(ROW0,HIGH);
  digitalWrite(ROW2,HIGH);
  digitalWrite(ROW4,HIGH);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED1);
  digitalWrite(latchPin,HIGH);
  delay(sDl);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED0);
  digitalWrite(latchPin,HIGH);
  digitalWrite(ROW0,LOW);
  digitalWrite(ROW2,LOW);
  digitalWrite(ROW4,LOW);

  digitalWrite(ROW1,HIGH);
  digitalWrite(ROW3,HIGH);
  digitalWrite(ROW5,HIGH);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED2);
  digitalWrite(latchPin,HIGH);
  delay(sDl);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED0);
  digitalWrite(latchPin,HIGH);
  digitalWrite(ROW1,LOW);
  digitalWrite(ROW3,LOW);
  digitalWrite(ROW5,LOW);
  
  case FD08F7:
//ONLY RED

  digitalWrite(ROW0,HIGH);
  digitalWrite(ROW2,HIGH);
  digitalWrite(ROW4,HIGH);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED3);
  digitalWrite(latchPin,HIGH);
  delay(sDl);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED0);
  digitalWrite(latchPin,HIGH);
  digitalWrite(ROW0,LOW);
  digitalWrite(ROW2,LOW);
  digitalWrite(ROW4,LOW);

  digitalWrite(ROW1,HIGH);
  digitalWrite(ROW3,HIGH);
  digitalWrite(ROW5,HIGH);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED4);
  digitalWrite(latchPin,HIGH);
  delay(sDl);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED0);
  digitalWrite(latchPin,HIGH);
  digitalWrite(ROW1,LOW);
  digitalWrite(ROW3,LOW);
  digitalWrite(ROW5,LOW);
}

}  

case … : usually has a:

break;


Always show us a good schematic of your proposed circuit.
Show us good images of your ‘actual’ wiring.
Give links to components.


Avoid delay(…) at all cost !


Google

Arduino State Machine

2 Likes

Was that supposed to be a hex number?

ie, Did you mean:
case 0xFD08F7:

And, as @LarryD said, did you intend to have a break; between cases?

Thank you, sorry I am quite to this.

I did intent to break and I did mean oxFDO87F. I got closer but I do not know how to break out the pattern and read the IR sensor and going onto another pattern.

#include <IRremote.h>
int IRpin=9;
IRrecv IR(IRpin);
decode_results cmd;
unsigned long key_value =0;

int latchPin=8;
int clockPin=12;
int dataPin=11;

int ROW0=2;
int ROW1=3;
int ROW2=4;
int ROW3=5;
int ROW4=6;
int ROW5=7;
int ROW6=8;

//DELAY TIMINGS

int sDl=1;
int lDl=5;
int rDl=500;
int mLd=200;

int oGreen;
int oRed;
int oYellow;
int oBlue;

byte LED0=0b00000000;
byte LED1=0b00100001;
byte LED2=0b10000100;
byte LED3=0b10000100;
byte LED4=0b00100001;
byte LED5=0b00011000;
byte LED6=0b01000010;
byte LED7=0b01000010;
byte LED8=0b00011000;

void setup() {

pinMode(latchPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);

pinMode(ROW0,OUTPUT);
pinMode(ROW1,OUTPUT);
pinMode(ROW2,OUTPUT);
pinMode(ROW3,OUTPUT);
pinMode(ROW4,OUTPUT);
pinMode(ROW5,OUTPUT);

Serial.begin(9600);
IR.enableIRIn();
}

void loop() {
while(IR.decode(&cmd)==0)
{

}



switch(cmd.value)
{
  //only green LEDs
  case 0xFD30CF:

  digitalWrite(ROW0,HIGH);
  digitalWrite(ROW2,HIGH);
  digitalWrite(ROW4,HIGH);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED1);
  digitalWrite(latchPin,HIGH);
  delay(sDl);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED0);
  digitalWrite(latchPin,HIGH);
  digitalWrite(ROW0,LOW);
  digitalWrite(ROW2,LOW);
  digitalWrite(ROW4,LOW);

  digitalWrite(ROW1,HIGH);
  digitalWrite(ROW3,HIGH);
  digitalWrite(ROW5,HIGH);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED2);
  digitalWrite(latchPin,HIGH);
  delay(sDl);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED0);
  digitalWrite(latchPin,HIGH);
  digitalWrite(ROW1,LOW);
  digitalWrite(ROW3,LOW);
  digitalWrite(ROW5,LOW);
 
if(IR.decode(&cmd)==0xFD08F7)
{
  IR.resume();
}
break;



  case 0xFD08F7:

//ONLY RED

  digitalWrite(ROW0,HIGH);
  digitalWrite(ROW2,HIGH);
  digitalWrite(ROW4,HIGH);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED3);
  digitalWrite(latchPin,HIGH);
  delay(sDl);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED0);
  digitalWrite(latchPin,HIGH);
  digitalWrite(ROW0,LOW);
  digitalWrite(ROW2,LOW);
  digitalWrite(ROW4,LOW);

  digitalWrite(ROW1,HIGH);
  digitalWrite(ROW3,HIGH);
  digitalWrite(ROW5,HIGH);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED4);
  digitalWrite(latchPin,HIGH);
  delay(sDl);
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,LED0);
  digitalWrite(latchPin,HIGH);
  digitalWrite(ROW1,LOW);
  digitalWrite(ROW3,LOW);
  digitalWrite(ROW5,LOW);
  IR.resume();
  
    while(IR.decode(&cmd)==0xFD30CF)
 {
 }
 IR.resume();
break;

}
}  

You should just process any IR commands you receive and then resume() else let loop() do what is was meant to do.

#include <IRremote.h>
int IRpin = 9;
IRrecv IR(IRpin);
decode_results cmd;
unsigned long key_value = 0;

int latchPin = 8;
int clockPin = 12;
int dataPin = 11;

int ROW0 = 2;
int ROW1 = 3;
int ROW2 = 4;
int ROW3 = 5;
int ROW4 = 6;
int ROW5 = 7;
int ROW6 = 8;

//DELAY TIMINGS

int sDl = 1;
int lDl = 5;
int rDl = 500;
int mLd = 200;

int oGreen;
int oRed;
int oYellow;
int oBlue;

byte LED0 = 0b00000000;
byte LED1 = 0b00100001;
byte LED2 = 0b10000100;
byte LED3 = 0b10000100;
byte LED4 = 0b00100001;
byte LED5 = 0b00011000;
byte LED6 = 0b01000010;
byte LED7 = 0b01000010;
byte LED8 = 0b00011000;

void setup() {

  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);

  pinMode(ROW0, OUTPUT);
  pinMode(ROW1, OUTPUT);
  pinMode(ROW2, OUTPUT);
  pinMode(ROW3, OUTPUT);
  pinMode(ROW4, OUTPUT);
  pinMode(ROW5, OUTPUT);

  Serial.begin(9600);
  IR.enableIRIn();
}

void loop() {
  if (IR.decode(&cmd))
  {

    switch (cmd.value)
    {
      //only green LEDs
      case 0xFD30CF:

        digitalWrite(ROW0, HIGH);
        digitalWrite(ROW2, HIGH);
        digitalWrite(ROW4, HIGH);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, LED1);
        digitalWrite(latchPin, HIGH);
        delay(sDl);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, LED0);
        digitalWrite(latchPin, HIGH);
        digitalWrite(ROW0, LOW);
        digitalWrite(ROW2, LOW);
        digitalWrite(ROW4, LOW);

        digitalWrite(ROW1, HIGH);
        digitalWrite(ROW3, HIGH);
        digitalWrite(ROW5, HIGH);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, LED2);
        digitalWrite(latchPin, HIGH);
        delay(sDl);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, LED0);
        digitalWrite(latchPin, HIGH);
        digitalWrite(ROW1, LOW);
        digitalWrite(ROW3, LOW);
        digitalWrite(ROW5, LOW);

        break;

      case 0xFD08F7:

        //ONLY RED

        digitalWrite(ROW0, HIGH);
        digitalWrite(ROW2, HIGH);
        digitalWrite(ROW4, HIGH);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, LED3);
        digitalWrite(latchPin, HIGH);
        delay(sDl);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, LED0);
        digitalWrite(latchPin, HIGH);
        digitalWrite(ROW0, LOW);
        digitalWrite(ROW2, LOW);
        digitalWrite(ROW4, LOW);

        digitalWrite(ROW1, HIGH);
        digitalWrite(ROW3, HIGH);
        digitalWrite(ROW5, HIGH);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, LED4);
        digitalWrite(latchPin, HIGH);
        delay(sDl);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, LED0);
        digitalWrite(latchPin, HIGH);
        digitalWrite(ROW1, LOW);
        digitalWrite(ROW3, LOW);
        digitalWrite(ROW5, LOW);
    }
    IR.resume();
  }
}

Problem with thaty is although it works, it only works when you press the button, I want to loop it indefinelty and maintain it and then if a button is pressed to get out of the loop. But thank, quite usefull. I have to switch the Leds on and off due to it being in a grid or an array and I have to mutiplex it. ROW0-5 control the master reset latch of the 74HC595 shift registers, allowing me to couple 6 of them on the just a few wire, I did this becuase I wasnted to control 50 Leds indiviudually. I didn't expect this type of problem to prop when I was designing the circuit. I also the circuit diagram so....

Then you need to make your code more like a state machine. If you press a button, you get a certain pattern. You remember that. The next time through loop(), if you don't get a button press, you do the pattern again. This will probably be too fast, so you have to wait a bit between looping the pattern. You can't do that with delay() since it blocks your code. Instead, you note the time when the button was press and remember that. When you go through loop() again, you calculate how long it has been since the patterns was displayed, and if long enough, do it again.
So you state machine would go from IDLE -> Pattern1 -> delay1 -> Pattern1 ->... until another button was pressed. If all your delays are the same, that can be one state. If you want some patterns faster, slower, then each unique delay will be a state.

Check out the Blink WIthout Delay example in the IDE (File->examples->02.digital->Blink Without Delay)

I see, interesting, thank you, will try

I have managed to put in a state machine, however, I am not sure how to make it loop, mainly in the second state. I want it to blink or repeat until I switch another button

#include <IRremote.h>
int IRpin=9;
IRrecv IR(IRpin);
decode_results cmd;

int latchPin=8;
int clockPin=12;
int dataPin=11;

int ROW0=2;
int ROW1=3;
int ROW2=4;
int ROW3=5;
int ROW4=6;
int ROW5=7;
int ROW6=8;

//DELAY TIMINGS
int state;
int sDl=1;
int lDl=5;
int rDl=500;
int mLd=200;

int oGreen;
int oRed;
int oYellow;
int oBlue;

int state_s1 =0;
int state_prev_s1 = 0;
int val_s1 = 0;


byte LED0=0b00000000;
byte LED1=0b00100001;
byte LED2=0b10000100;
byte LED3=0b10000100;
byte LED4=0b00100001;
byte LED5=0b00011000;
byte LED6=0b01000010;
byte LED7=0b01000010;
byte LED8=0b00011000;
byte LED9=0b11111111;

enum state{pattern_1, pattern_2,pattern_0};
void setup() {

pinMode(latchPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);

pinMode(ROW0,OUTPUT);
pinMode(ROW1,OUTPUT);
pinMode(ROW2,OUTPUT);
pinMode(ROW3,OUTPUT);
pinMode(ROW4,OUTPUT);
pinMode(ROW5,OUTPUT);

Serial.begin(9600);
IR.enableIRIn();
state=pattern_0;
}

void loop() {
  {
  unsigned long value = cmd.value;
if(IR.decode(&cmd)){
switch(value){

    case 0xFD30CF:
    digitalWrite(ROW0,HIGH);
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,LED0);
    digitalWrite(latchPin,HIGH);
    break;

    case 0xFD08F7:
  
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,LED0);
    digitalWrite(latchPin,HIGH);

    delay(250);

    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,MSBFIRST,LED9);
    digitalWrite(latchPin,HIGH);

   



  }
  IR.resume();
}
}}

That is not really a state machine just because you introduced a variable called state.

Here is some (untested) code that shows you how to sequence through the patterns either slowly or quickly, depending on which button is pressed. It should give you a better understanding of how to develop a state machine and allow you to modify it to suit your needs.

#include <IRremote.h>
const int IRpin = 9;
IRrecv IR(IRpin);
decode_results cmd;

const int latchPin = 8;
const int clockPin = 12;
const int dataPin = 11;

/*
  int ROW0 = 2;
  int ROW1 = 3;
  int ROW2 = 4;
  int ROW3 = 5;
  int ROW4 = 6;
  int ROW5 = 7;
  int ROW6 = 8;
*/

const byte row[] = { 2, 3, 4, 5, 6, 7, 8 };
const byte rowCount = sizeof(row) / sizeof(row[0]);
byte currentRow;


//DELAY TIMINGS
int sDl = 1;
int lDl = 5;
int rDl = 500;
int mLd = 200;

int oGreen;
int oRed;
int oYellow;
int oBlue;

int state_s1 = 0;
int state_prev_s1 = 0;
int val_s1 = 0;


byte LED0 = 0b00000000;
byte LED1 = 0b00100001;
byte LED2 = 0b10000100;
byte LED3 = 0b10000100;
byte LED4 = 0b00100001;
byte LED5 = 0b00011000;
byte LED6 = 0b01000010;
byte LED7 = 0b01000010;
byte LED8 = 0b00011000;
byte LED9 = 0b11111111;

const byte led[] = { LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8, LED9 };
const byte ledCount = sizeof(led) / sizeof(led[0]);

enum {OFF, FAST_MODE, SLOW_MODE};
int currentState = OFF;

const unsigned long fastBlinkInterval = 250;
const unsigned long slowBlinkInterval = 1000;

unsigned long startTime;

void setup() {

  Serial.begin(115200);

  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);

  for ( int i = 0; i < rowCount; ++i ) {
    pinMode(row[i], OUTPUT);
  }

  IR.enableIRIn();

  Serial.println("Ready");
}


void loop() {

  if (IR.decode(&cmd)) {
    switch (cmd.value) {

      case 0xFD30CF:
        endState(currentState);
        beginState(FAST_MODE);
        break;

      case 0xFD08F7:
        endState(currentState);
        beginState(SLOW_MODE);

      default:
        // ignore unkown codes
        break;
    }
    IR.resume();
  }
  updateState();
}


void beginState( int newState ) {
  // start a new state

  Serial.print("Starting state ");
  Serial.println(newState);

  switch (newState) {

    case OFF:
      // turn off all LEDs
      for ( int i = 0; i < rowCount; ++i ) {
        digitalWrite(row[i], HIGH);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, 0x00);
        digitalWrite(latchPin, HIGH);
      }
      break;

    case FAST_MODE:
      // start Fast blinking
      currentRow = 0;
      digitalWrite(currentRow, HIGH);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, led[currentRow]);
      digitalWrite(latchPin, HIGH);
      break;

    case SLOW_MODE:
      // start Fast blinking
      currentRow = 0;
      digitalWrite(currentRow, HIGH);
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, led[currentRow]);
      digitalWrite(latchPin, HIGH);
      break;

    default:
      Serial.println("Uknown state");
      break;
  }
  currentState = newState;
  startTime = millis();   // remember when we started this state
}

void endState( int state ) {
  // finsih up current state

  Serial.print("Ending state ");
  Serial.println(state);

  switch (state) {

    case OFF:
      // nothing to do here
      break;

    case FAST_MODE:   // same behavior for both modes
    case SLOW_MODE:
      // make sure all LEDs are off
      for ( int i = 0; i < rowCount; ++i ) {
        digitalWrite(row[i], HIGH);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, 0x00);
        digitalWrite(latchPin, HIGH);
      }
      break;

    default:
      Serial.println("Uknown state");
      break;
  }
  currentState = OFF;
}

void updateState() {
  // update current state
  // and possibly transition to new state

  switch (currentState) {

    case OFF:
      // nothing to do
      break;

    case FAST_MODE:
      // see if we have waited long enough and then move to the next row
      if ( millis() - startTime >= fastBlinkInterval ) {
        // time for the next row, wrap around if at the end of the rows
        currentRow++;
        if ( currentRow >= rowCount ) currentRow = 0;
        digitalWrite(currentRow, HIGH);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, led[currentRow]);
        digitalWrite(latchPin, HIGH);
        startTime = millis(); // update time
      }
      break;

    case SLOW_MODE:
      // see if we have waited long enough and then move to the next row
      if ( millis() - startTime >= slowBlinkInterval ) {
        // time for the next row, wrap around if at the end of the rows
        currentRow++;
        if ( currentRow >= rowCount ) currentRow = 0;
        digitalWrite(currentRow, HIGH);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, led[currentRow]);
        digitalWrite(latchPin, HIGH);
        startTime = millis(); // update time
      }
      break;
  }
}

This is exactly what I am looking for, thank you so soo much. I appreaciate it

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.