Due to (un)popular demand; my (horrible) code!
I started over with the pasting in of files, and documented things i changed, so it should be easier to follow.
theres 4 tabs for the code, which i will now rattle off...
RGB_Controller
// #include <NECIRrcv.h> not included anymore
//Assignments
#define red_out 9
#define green_out 5
#define blue_out 6
#define red_in 0
#define green_in 1
#define blue_in 2
#define speakerpin 4
#define btn1 2
#define ir_pin 12
#define led 13
#define max_state 5
//Logitech Remote Codes
#define Test 4194694920
#define Input 4127848200
#define Effect 3793614600
#define Settings 3760191240
#define Power 4010866440
#define Sub_up 4228118280
#define Sub_down 4261541640
#define Centre_up 4244829960
#define Centre_down 4177983240
#define Surround_up 4278253320
#define Surround_down 4211406600
#define Volume_up 3843749640
#define Volume_down 4044289800
#define Mute 3910596360
//Fade Variables
float redinc, greeninc, blueinc;
float floattemp;
//Global Variables
int state = 0;
int delaytime = 0;
int delaytime2 = 0;
int increment = 0;
unsigned long ir_code;
//NECIRrcv ir(ir_pin); was here
void setup()
{
ir_set(ir_pin); //moved set to here
//Reset PWM outputs
analogWrite(red_out, 255);
analogWrite(green_out, 255);
analogWrite(blue_out, 255);
//Set Pinmodes
pinMode(red_out, OUTPUT);
pinMode(green_out, OUTPUT);
pinMode(blue_out, OUTPUT);
pinMode(speakerpin, OUTPUT);
pinMode(btn1, INPUT);
//Setup IR, Serial, Interrupts, Timers
ir_begin();
Serial.begin(19200);
attachInterrupt(0, btn1_press, RISING);
//Startup Sequence
play_tone(1915, 70);
play_tone(1136, 70);
play_tone(800, 70);
play_tone(400, 100);
fade_pot(1, 0);
state = 0;
toggle_pin(led);
}
void loop()
{
Serial.println(state);
ir_check();
switch (state){
case -2:
set_rgb(0,0,0);
break;
case -1:
if ((analogRead(red_out) > 0)
|| (analogRead(green_out) > 0)
|| (analogRead(blue_out) > 0))
fade_pot(-1,0);
break;
case 0:
manual_mix();
break;
case 1:
effect_1();
break;
case 2:
effect_2();
break;
case 3:
effect_3();
break;
case 4:
effect_4();
break;
case 5:
effect_5();
break;
}
}
void logWrite(int colour,int pwmval) //adapted version of analogWrite
{
if (pwmval < 0)
analogWrite(colour, 255);
else if (pwmval > 255)
analogWrite(colour, 0);
else
analogWrite(colour, 255-pwmval);
}
void set_rgb(int red, int green, int blue){
logWrite(red_out, red);
logWrite(green_out, green);
logWrite(blue_out, blue);
}
void toggle_pin(int pin){
digitalWrite(pin, !digitalRead(pin));
}
void play_tone(int tone, int duration) {
for (long i = 0; i < duration * 1000L; i += tone * 2) {
digitalWrite(speakerpin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerpin, LOW);
delayMicroseconds(tone);
}
}
void btn1_press(){
state_inc(true);
kill_effects();
}
void state_inc(boolean up){
if (up == true){
if (state != max_state){
beep_std();
state++;
}else{
beep_high();
}
} else {
if (state != 0){
beep_std();
state--;
}else{
beep_low();
}
}
}
void beep_std(){
play_tone(1000, 20);
}
void beep_low(){
play_tone(1800, 20);
}
void beep_high(){
play_tone(700, 20);
}
void ir_check(){
if (ir_available()){
ir_code = ir_read();
switch (ir_code){
case Power:
if (state == -1){
beep_low();
state = -2;
}else{
beep_high();
beep_low();
state = -1;
}
break;
case Volume_up:
state_inc(true);
break;
case Volume_down:
state_inc(false);
break;
}
kill_effects();
}
}
Effects
void manual_mix(){
set_rgb(analogRead(red_in)/4, analogRead(green_in)/4, analogRead(blue_in)/4);
}
void effect_1(){
fade_pot(-1, 0);
fade_pot(1,0);
}
void effect_2(){
increment = 1;
delaytime = 2;
for(int i = 0 ; i <= 255; i+=increment){
logWrite(red_out, i);
delay(delaytime);
}
for(int i = 255 ; i >= 0; i-=increment){
logWrite(red_out, i);
delay(delaytime);
}
for(int i = 0 ; i <= 255; i+=increment){
logWrite(green_out, i);
delay(delaytime);
}
for(int i = 255 ; i >= 0; i-=increment){
logWrite(green_out, i);
delay(delaytime);
}
for(int i = 0 ; i <= 255; i+=increment){
logWrite(blue_out, i);
delay(delaytime);
}
for(int i = 255 ; i >= 0; i-=increment){
logWrite(blue_out, i);
delay(delaytime);
}
}
void effect_3(){
increment = 1;
delaytime = 2;
for(int i = 0 ; i <= 255; i+=increment){
set_rgb(i, 255-i, 0);
delay(delaytime);
}
for(int i = 0 ; i <= 255; i+=increment){
set_rgb(0, i, 255-i);
delay(delaytime);
}
for(int i = 0 ; i <= 255; i+=increment){
set_rgb(255-i, 0, i);
delay(delaytime);
}
}
void effect_4(){
increment = 1;
delaytime = 2;
for(int i = 0 ; i <= 255; i+=increment){
logWrite(red_out, i);
delay(delaytime);
}
for(int i = 255 ; i >= 0; i-=increment){
logWrite(red_out, i);
delay(delaytime);
}
for(int i = 0 ; i <= 255; i+=increment){
logWrite(green_out, i);
delay(delaytime);
}
for(int i = 255 ; i >= 0; i-=increment){
logWrite(green_out, i);
delay(delaytime);
}
for(int i = 0 ; i <= 255; i+=increment){
logWrite(blue_out, i);
delay(delaytime);
}
for(int i = 255 ; i >= 0; i-=increment){
logWrite(blue_out, i);
delay(delaytime);
}
}
void effect_5(){
increment = 1;
delaytime = 2000;
delaytime2 = 100;
for (int i = 1; i <= 3; i+=increment){
switch (i) {
case 1:
set_rgb(255,0,0);
break;
case 2:
set_rgb(0,255,0);
break;
case 3:
set_rgb(0,0,255);
break;
}
delay (delaytime2);
set_rgb(0,0,0);
delay (delaytime);
}
}
void kill_effects(){
delaytime = 0;
delaytime2 = 0;
increment = 1000;
}
void fade_pot(byte updown, int minimum){
increment = 1;
delaytime = 8;
if (updown == 1){
for (int i = minimum ; i < 1001 ; i++){
if (i>250) i+=increment;
if (i>500) i+=increment;
if (i>750) i+=increment;
fade_pot_helper(i);
}
} else {
for (int i = 1001 ; i > minimum ; i-=increment){
if (i>250) i-=increment;
if (i>500) i-=increment;
if (i>750) i-=increment;
fade_pot_helper(i);
}
}
}
void fade_pot_helper(int i){
floattemp = analogRead(red_in);
redinc = floattemp/4000;
floattemp = analogRead(green_in);
greeninc = floattemp/4000;
floattemp = analogRead(blue_in);
blueinc = floattemp/4000;
set_rgb(redinc * i, greeninc * i, blueinc * i);
delay(delaytime);
}