I posted this another time but no one could help due to the formatting of the code..
I have a decent script set up to blink LED's using an old blu-ray player remote. As it stands, the remote has numbered buttons, volume buttons etc.. It also has a red, green, blue and yellow button. I have it so if I push the R, G or B button, the LED of that color lights up. If I push Yellow, it shuts everything off. I am trying to incorporate fading into this, and while it will being and run the fade, it will no longer pay attention to the IR remote during the fade. I tried removing all delays, and even adding in some calls to read the IR, but no matter what I do, the Fade codes stay going until I reset the Arduino.
While any of the fades are going, I can't get Arduino to check the IR for changes.
I have 2 versions of the code, I would love for either one to work. One uses IF statements, the other uses WHILE statements:
// include
#include <IRremote.h>
int RECV_PIN = 11;
int periode = 2000;
int displace = 500;
int testtime = 1000;
long time=0;
/* FUTURE USE
int RED1 = 2;
int GREEN1 = 3;
int BLUE1 = 4;
int RED2 = 5;
int GREEN2 = 6;
int BLUE2 = 7;
int RED3 = 8;
int GREEN3 = 9;
int BLUE3 = 10;
int RED4 = 11;
int GREEN4 = 12;
int BLUE4 = 13;
*/
int redPin = 7; // Red LED, connected to digital pin 9
int grnPin = 6; // Green LED, connected to digital pin 10
int bluPin = 8; // Blue LED, connected to digital pin 11
int value, value2, value3 ;
int RED = 7;
int GREEN = 6;
int BLUE = 8;
// Color arrays
int black[3] = {
0, 0, 0 };
int white[3] = {
100, 100, 100 };
int red[3] = {
100, 0, 0 };
int green[3] = {
0, 100, 0 };
int blue[3] = {
0, 0, 100 };
int yellow[3] = {
100, 100, 0 };
int pink[3] = {
0, 100, 100 };
int magenta[3] = {
100, 0, 100 };
// etc.
// Set initial color
int redVal = black[0];
int grnVal = black[1];
int bluVal = black[2];
//int wait = 2; // no longer used
int prevR = redVal;
int prevG = grnVal;
int prevB = bluVal;
IRrecv irrecv(RECV_PIN);
decode_results results;
long previousMillis = 0;
long interval = 1000;
long chill = 2;
int ledState = LOW; // only for BLUE LED for now, will add more later, just want to blink blue for now
int blinkone = 0;
int blinktwo= 0;
int blinkthree = 0;
int blinkfour = 0;
int blinkfive = 0;
int blinksix = 0;
int blinkseven = 0;
int blinkeight = 0;
int blinknine = 0;
int val;
void setup()
{
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
irrecv.enableIRIn(); // kick on the IR receiver
}
void loop() {
unsigned long currentMillis = millis(); // Start the arduino counting so it can keep time
if (irrecv.decode(&results)) {
while (results.value == 0x66B47) { // BLUE button on the remote
digitalWrite(BLUE, HIGH);
}
while (results.value == 0xE6B47) { // RED button on the remote
digitalWrite(RED, HIGH);
}
while (results.value == 0x490) { // Vol Up button on the remote
interval = interval - 50;
if (interval < 75) {
interval =100;
}
}
while (results.value == 0xC90) { // Vol Down button on the remote
interval = interval + 50;
}
while (results.value == 0x290) { // Vol Down button on the remote
interval = 1000;
}
while (results.value == 0x16B47) { // GREEN button on the remote
digitalWrite(GREEN, HIGH);
}
// else if (results.value == 0xB47) { // 1 button on the remote
while (results.value == 0xB47) {
time = millis();
value = 128+127*cos(2*PI/periode*time);
value2 = 128+127*cos(2*PI/periode*(displace-time));
value3 = 128+127*cos(2*PI/periode*(testtime-time));
analogWrite(redPin, value);
analogWrite(grnPin, value2);
analogWrite(bluPin, value3);
loop();
}
// }
while(results.value == 0x80B47) { // 2 button on the remote
blinkone = 1;
}
while (results.value == 0x40B47) { // 3 button on the remote
}
while (results.value == 0xC0B47) { // 4 button on the remote
}
while (results.value == 0x20B47) { // 5 button on the remote
}
while (results.value == 0xA0B47) { // 6 button on the remote
}
while (results.value == 0x60B47) { // 7 button on the remote
crossFade(red);
crossFade(green);
crossFade(blue);
crossFade(yellow);
crossFade(white);
crossFade(pink);
crossFade(magenta);
}
while (results.value == 0xE0B47) { // 8 button on the remote
}
while (results.value == 0x10B47) { // 9 button on the remote
}
while (results.value == 0x96B47 ) { // YELLOW - shut everything off. aka blackout
digitalWrite(BLUE, LOW);
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
blinkone = 0;
}
irrecv.resume();
}
while (blinkone == 1) { // First flash pattern. On and off
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(BLUE, ledState);
}
} //include this
}
int calculateStep(int prevValue, int endValue) {
int step = endValue - prevValue; // What's the overall gap?
if (step) { // If its non-zero,
step = 1020/step; // divide by 1020
}
return step;
}
int calculateVal(int step, int val, int i) {
if ((step) && i % step == 0) { // If step is non-zero and its time to change a value,
if (step > 0) { // increment the value if step is positive...
val += 1;
}
else if (step < 0) { // ...or decrement it if step is negative
val -= 1;
}
}
// Defensive driving: make sure val stays in the range 0-255
if (val > 255) {
val = 255;
}
else if (val < 0) {
val = 0;
}
return val;
}
void crossFade(int color[3]) {
unsigned long currentMillis = millis();
// Convert to 0-255
int R = (color[0] * 255) / 100;
int G = (color[1] * 255) / 100;
int B = (color[2] * 255) / 100;
int stepR = calculateStep(prevR, R);
int stepG = calculateStep(prevG, G);
int stepB = calculateStep(prevB, B);
for (int i = 0; i <= 1020; i++) {
redVal = calculateVal(stepR, redVal, i);
grnVal = calculateVal(stepG, grnVal, i);
bluVal = calculateVal(stepB, bluVal, i);
analogWrite(redPin, redVal); // Write current values to LED pins
analogWrite(grnPin, grnVal);
analogWrite(bluPin, bluVal);
int zag = 1;
do {
zag = zag + 1;
getIR();
}
while (zag < 200);
}
// Update current values for next loop
prevR = redVal;
prevG = grnVal;
prevB = bluVal;
}
void getIR() {
IRrecv irrecv(RECV_PIN);
decode_results nresults;
}
I am at a dead stop. I just need it to be able to switch to different modes, even while a fade is running.
Thanks in advance!