Помимо одноцветных диодов, в природе (и в стартере) есть — RGB-светодиоды (Red, Green, Blue — красный, зелёный, синий), у этих ног по-больше — один общий катод и по аноду на каждый цвет. Фактически это просто три светодиода в одном корпусе. Меняя ток через каналы можно получить любой цвет.
Суём катод на GND, а остальные через резисторы будем ШИМить:

Пример нехитрого скетча:
//обзавём каналы
int red = 9;
int green = 10;
int blue = 11;
void setup() {
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(blue, OUTPUT);
}
void loop() {
digitalWrite(red, HIGH); // посветим красным
delay(500);
digitalWrite(red, LOW);
delay(500);
digitalWrite(green, HIGH); // посветим зелёным
delay(500);
digitalWrite(green, LOW);
delay(500);
digitalWrite(blue, HIGH); // посветим синим
delay(500);
digitalWrite(blue, LOW);
delay(500);
analogWrite(red, 235); // белый
analogWrite(green, 100);
analogWrite(blue, 255);
delay(1000);
analogWrite(red, 255); // фиолетовый
analogWrite(green, 0);
analogWrite(blue, 255);
delay(1000);
analogWrite(red, 255); // жёлтый
analogWrite(green, 140);
analogWrite(blue, 0);
delay(1000);
digitalWrite(red, LOW);
digitalWrite(green, LOW);
digitalWrite(blue, LOW);
}

Можно менять цвета плавно и в рандомном порядке — так красивее=) А если накрыть светодиод рассеивателем, получится симпатичный ночник=)
Соорудим.
Залепим по-быстрому из ПКЛа рассеивающую елду:

Гусары, молчать!…=))
И нарисуем соответсвующий скетч:
//обзавём каналы
int RedPin = 9;
int GreenPin = 10;
int BluePin = 11;
//заведём переменные текущих значений каналов, и сразу их забьём рандомными значениями
int ValRed = random(0, 255);
int ValGreen = random(0, 255);
int ValBlue = random(0, 255);
void setup() {
pinMode(RedPin, OUTPUT); //настроим пины каналов на выход
pinMode(GreenPin, OUTPUT);
pinMode(BluePin, OUTPUT);
analogWrite(RedPin, ValRed); //и сразу запихает туда первую пачку значений
analogWrite(GreenPin, ValGreen);
analogWrite(BluePin, ValBlue);
}
void loop() {
int NewValRed = random(10, 255); //сгенерим новые значения
int NewValGreen = random(10, 255);
int NewValBlue = random(10, 255);
//будем крутить пока новые не сравняются с текущими
while ((ValRed != NewValRed)&(ValGreen != NewValGreen)&(ValBlue != NewValBlue)) {
//для красного канала
if (ValRed < NewValRed){ //если новое больше текущего
analogWrite(RedPin, ValRed++ ); //то текущий увеличиваем
};
if (ValRed > NewValRed) { // если меньше уменьшаем
analogWrite(RedPin, ValRed-- );
};
//для зелёного канала
if (ValGreen < NewValGreen){
analogWrite(GreenPin, ValGreen++ );
};
if (ValGreen > NewValGreen) {
analogWrite(GreenPin, ValGreen-- );
};
//для синего канала
if (ValBlue < NewValBlue){
analogWrite(BluePin, ValBlue++ );
};
if (ValBlue > NewValBlue) {
analogWrite(BluePin, ValBlue-- );
};
delay(10); //чтоб в глазах не рябило подождём
}
}
В итоге:
http://www.youtube.com/watch?v=lrrLTV8iCmE
тёмные участки на елде — более толстый слой ПКЛ-а, если будете делать что-нибудь в этом духе — обеспечьте равномерность толщины стенок=)
Скетч тоже можно ещё ровнять и ровнять — сделать постоянной общую яркость, поменять распределение вероятностей — а то красных не дождаться, как и «чистых цветов», ну т.д.
