// christmas tree lights #define NR_OF_LIGHTS 6 int pins[NR_OF_LIGHTS] = { 3, 5, 6, 9, 10, 11 }; int values[NR_OF_LIGHTS]; int steps[NR_OF_LIGHTS]; #define NR_OF_FADESTEPS 4 int fadesteps[NR_OF_FADESTEPS] = { 192, 128, 64, 0 }; int fade_delay = 30; // millisec int fade_cycles = 1000; int nr_of_blinks = 2; int blink_delay = 400; //millisec int effect = 1; int randomlights[NR_OF_LIGHTS]; bool chosenlights[NR_OF_LIGHTS]; /** * */ void setup() { randomSeed(analogRead(0)); for (int i = 0; i < NR_OF_LIGHTS; i++) { values[i] = (int)random(230) + 13; // start values between 'max min' and 'min max' steps[i] = (int)random(4) + 1; // steps between 1 and 4 } } /** * */ void loop() { for (int j = 0; j < fade_cycles; j++) { for (int i = 0; i < NR_OF_LIGHTS; i++) { fadingLight(i); } delay(fade_delay); } if (effect == 1) { blinkAll(); effect = 2; } else if (effect == 2) { runningLight(0); effect = 3; } else if (effect == 3) { runningLight(255); effect = 1; } } /** * */ void fadingLight(int i) { int minvalue = (NR_OF_FADESTEPS * abs(steps[i])) + 1; int maxvalue = 255 - minvalue; int fs = NR_OF_FADESTEPS; for (int j = 0; fs > 0; fs--, j++) { if (values[i] > fadesteps[j]) { break; } } values[i] += fs * steps[i]; if (values[i] > maxvalue || values[i] < minvalue) { steps[i] *= -1; } analogWrite(pins[i], values[i]); } /** * */ void setAllLights(int value) { for (int i = 0; i < NR_OF_LIGHTS; i++) { analogWrite(pins[i], value); } } /** * */ void blinkAll() { for (int i = 0; i < nr_of_blinks; i++) { setAllLights(255); delay(blink_delay); setAllLights(0); delay(blink_delay); } } /** * */ void runningLight(int startvalue) { setAllLights(startvalue); for (int j = 0; j < 2; j++) { randomize(); for (int i = 0; i < NR_OF_LIGHTS; i++) { analogWrite(pins[randomlights[i]], 255 - startvalue); delay(200); analogWrite(pins[randomlights[i]], startvalue); } } } /** * */ void randomize() { for (int i = 0; i < NR_OF_LIGHTS; i++) { chosenlights[i] = false; } //first one always ok int r = (int)random(NR_OF_LIGHTS); randomlights[0] = r; chosenlights[r] = true; //next 4 for (int i = 1; i < 5; i++) { while (true) { r = (int)random(NR_OF_LIGHTS); if (chosenlights[r] == false) { break; } } randomlights[i] = r; chosenlights[r] = true; } //last one for (int i = 0; i < NR_OF_LIGHTS; i++) { if (chosenlights[i] == false) { randomlights[5] = i; break; } } }