I'm trying to program about 200 LEDs to fade in and out simultaneously and at different speeds and using a softPWM function that imitates analog output (so that I can use digital pins, though I'm open to using analog write if there is a way to get enough pins cheaply) Does anyone know how to do this?
So far I have the code below, which fades 5 LEDs simultaneously and to different brightnesses, but not at different speeds.
I'm really new to this, so please help!
LEDPWMtest
fades 5 LEDs up and down using digitalWrite to do PWM "by hand"
Wiring (replicate for all 5 LEDs, separate protection resistors)
* digital pin to LED anode (long leg)
* LED cathode to protection resistor to GND
pct 31jan2014
*/
int LED1 = 3; // set pin numbers for LEDs
int LED2 = 4;
int LED3 = 5;
int LED4 = 6;
int LED5 = 7;
int br1 = 2; // set relative brightness for each LED
int br2 = 4;
int br3 = 8;
int br4 = 16;
int br5 = 32;
int rest = 2000; // wait time after fade down, before looping
#define fadeSpeed 4000
void setup() {
// set LED pin as output:
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
}
void loop() {
// for loop to fade up:
for(int fade=1;fade<254;fade++) {
softPWM(LED1,fade,br1);
softPWM(LED2,fade,br2);
softPWM(LED3,fade,br3);
softPWM(LED4,fade,br4);
softPWM(LED5,fade,br5);
}
// for loop to fade down:
for(int fade=254;fade>1;fade--) {
softPWM(LED1,fade,br1);
softPWM(LED2,fade,br2);
softPWM(LED3,fade,br3);
softPWM(LED4,fade,br4);
softPWM(LED5,fade,br5);
}
delay(rest);
}
void softPWM(int pin, int index, int stpsz) { // software PWM function that fakes analog output
digitalWrite(pin,HIGH);
delayMicroseconds(index*stpsz);
digitalWrite(pin,LOW);
delayMicroseconds((255-index)*stpsz);
}