// Interactive Timer/Fader 01 // // A delay-free timer for a single LED that fades in and out // and cascades 6 faders. // Added a switch to reset and added a poteniometer to // change the timing. // Timer variables long timer1 = 0; long timer2 = 0; long timer3 = 0; long timer4 = 0; long timer5 = 0; long timer6 = 0; int offset = 10; // Change this for faster or slower fades // Pin variables int pwm1 = 11; int pwm2 = 10; int pwm3 = 9; int pwm4 = 6; int pwm5 = 5; int pwm6 = 3; // Direction variable int upDown1 = 1; int upDown2 = 1; int upDown3 = 1; int upDown4 = 1; int upDown5 = 1; int upDown6 = 1; // pwm value holding variable int val1 = 1; int val2 = 1; int val3 = 1; int val4 = 1; int val5 = 1; int val6 = 1; // flag variables boolean flag1 = 0; boolean flag2 = 0; boolean flag3 = 0; boolean flag4 = 0; boolean flag5 = 0; boolean constantOn = 0; // Variable to tell loop() light cycle to keep // repeating //Setup void setup() { // The standard stuff... Serial.begin(9600); // Setup the serial communications so we can debug timer1 = millis(); // Set the pin for the digital switch to INPUT pinMode(12,INPUT); // Set pinModes for PWMs pinMode(pwm1,OUTPUT); pinMode(pwm2,OUTPUT); pinMode(pwm3,OUTPUT); pinMode(pwm4,OUTPUT); pinMode(pwm5,OUTPUT); pinMode(pwm6,OUTPUT); } // Das Loop... void loop() { // Timer if( (timer1 + offset) < millis() ) { doFade1(); timer1 = millis(); } // DIGITAL SWITCH if(!digitalRead(12)) { constantOn = 0; // This keeps the loop from replaying the light cycle resetFade(); // This does the light cycle, but only once, because } // constantOn is off. // ANALOG SWITCH if(analogRead(1)>1000) { constantOn = 1; } // EXPERIMENT WITH DIFFERENT SENSORS // Use one of the following senors to modify the // value of "offset", and thereby make the LED's // flash faster or slower // POTENTIOMETER // This pot has a range from ~650 to 1023. // Serial.println(analogRead(2));[ // Change that to a range from 0 to 50 or so // then set offset to change the fade timer // offset = (analogRead(2) - 650)/10; // PHOTORESISTOR // This photoresistor has a range from ~10 to ~225. // Serial.println(analogRead(4)); // Change that range to 1 to 10 or so // offset = analogRead(4)/20; } // Reset Fade Function void resetFade() { Serial.println("Resetting fade..."); // pwm value variables val1 = 1; val2 = 1; val3 = 1; val4 = 1; val5 = 1; val6 = 1; // Direction variables upDown1 = 1; upDown2 = 1; upDown3 = 1; upDown4 = 1; upDown5 = 1; upDown6 = 1; // flag variables flag1 = 0; flag2 = 0; flag3 = 0; flag4 = 0; flag5 = 0; } // Fade function void doFade1() { if(val1 >= 70) { upDown1 = -1; } if(val1 <= 0) { upDown1 = 0; } if(val1 == 30) { flag1 = 1; } val1 = val1 + (upDown1); analogWrite(pwm1, val1); if(flag1) { if(val2 >= 70) { upDown2 = -1; } if(val2 <= 0) { upDown2 = 0; } if(val2 == 30) { flag2 = 1; } val2 = val2 + (upDown2); analogWrite(pwm2, val2); } if(flag2) { if(val3 >= 70) { upDown3 = -1; } if(val3 <= 0) { upDown3 = 0; } if(val3 == 30) { flag3 = 1; } val3 = val3 + (upDown3); analogWrite(pwm3, val3); } if(flag3) { if(val4 >= 70) { upDown4 = -1; } if(val4 <= 0) { upDown4 = 0; } if(val4 == 30) { flag4 = 1; } val4 = val4 + (upDown4); analogWrite(pwm4, val4); } if(flag4) { if(val5 >= 70) { upDown5 = -1; } if(val5 <= 0) { upDown5 = 0; } if(val5 == 30) { flag5 = 1; } val5 = val5 + (upDown5); analogWrite(pwm5, val5); } if(flag5) { if(val6 >= 70) { upDown6 = -1; } if(val6 <= 0) { upDown6 = 0; if(constantOn){ // if constantOn is true (set by the analog switch) resetFade(); // then reset the fade and cycle the lights until } // constantOn is false. } val6 = val6 + (upDown6); analogWrite(pwm6, val6); } }