Помимо одноцветных диодов, в природе (и в стартере) есть — 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
тёмные участки на елде — более толстый слой ПКЛ-а, если будете делать что-нибудь в этом духе — обеспечьте равномерность толщины стенок=)
Скетч тоже можно ещё ровнять и ровнять — сделать постоянной общую яркость, поменять распределение вероятностей — а то красных не дождаться, как и «чистых цветов», ну т.д.