#include <IRremote.h>
int IRpin=6;
IRrecv IR(IRpin);
decode_results cmd;
String myCom;
int red=11;
int green=10;
int blue=9;
int dt=100;
void setup(){
Serial.begin(74800);
pinMode(red,OUTPUT);
pinMode(green,OUTPUT);
pinMode(blue,OUTPUT);
IR.enableIRIn();
}
void loop() {
// put your main code here, to run repeatedly:
while (IR.decode(&cmd)==0){
}
Serial.println(cmd.value,HEX);
IR.resume();
//off
if (cmd.value==0xFF6897){
digitalWrite(red,LOW);
digitalWrite(green,LOW);
digitalWrite(blue,LOW);
}
//red
if (cmd.value==0xFF30CF){
digitalWrite(red,HIGH);
digitalWrite(green,LOW);
digitalWrite(blue,LOW);
}
//green
if (cmd.value==0xFF18E7){
digitalWrite(green,HIGH);
digitalWrite(red,LOW);
digitalWrite(blue,LOW);
}
//blue
if (cmd.value==0xFF10EF){
digitalWrite(green,LOW);
digitalWrite(red,LOW);
digitalWrite(blue,HIGH);
}
while (cmd.value==0xFF7A85){
digitalWrite(green,LOW);
digitalWrite(red,LOW);
digitalWrite(blue,HIGH);
delay(dt);
digitalWrite(green,LOW);
digitalWrite(red,HIGH);
digitalWrite(blue,LOW);
delay(dt);
digitalWrite(green,HIGH);
digitalWrite(red,LOW);
digitalWrite(blue,LOW);
delay(dt);
}
}
I can switch between each of the colors but when i hit the button to do the while loop, I cant switch out of it and the arduino doesnt look for IR signals. If i use an if statement, then it only loops once and It doesnt read buttons until the sequence is done. How do i fix
In your while-loop, cmd.value will never change.
And basically while-loops have no place in Arduino code; let loop() do the looping for you.
You need to remove the delay() calls. Use millis() instead, to time the sequence and read the buttons in a round robin multitasking way.
The way to get the blinking to repeat is to act on the last command if no new command arrives:
#include <IRremote.h>
int IRpin = 6;
IRrecv IR(IRpin);
decode_results cmd;
String myCom;
int red = 11;
int green = 10;
int blue = 9;
int dt = 100;
void setup()
{
Serial.begin(74800);
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(blue, OUTPUT);
IR.enableIRIn();
}
void loop()
{
static unsigned long command = 0;
if (IR.decode(&cmd))
{
// A new command has arrived
command = cmd.value;
Serial.println(command, HEX);
// Start the receiver again
IR.resume();
}
switch (command)
{
case 0xFF6897: // Off
digitalWrite(red, LOW);
digitalWrite(green, LOW);
digitalWrite(blue, LOW);
break;
case 0xFF30CF: // Red
digitalWrite(red, HIGH);
digitalWrite(green, LOW);
digitalWrite(blue, LOW);
break;
case 0xFF18E7: // Green
digitalWrite(green, HIGH);
digitalWrite(red, LOW);
digitalWrite(blue, LOW);
break;
case 0xFF10EF: // Blue
digitalWrite(green, LOW);
digitalWrite(red, LOW);
digitalWrite(blue, HIGH);
break;
case 0xFF7A85: // Sparkle
digitalWrite(green, LOW);
digitalWrite(red, LOW);
digitalWrite(blue, HIGH);
delay(dt);
digitalWrite(green, LOW);
digitalWrite(red, HIGH);
digitalWrite(blue, LOW);
delay(dt);
digitalWrite(green, HIGH);
digitalWrite(red, LOW);
digitalWrite(blue, LOW);
delay(dt);
break;
}
}