Программа
Составим простую программу, которая будет по очереди зажигать каждый из трех цветов.
const byte rPin = 3;
const byte gPin = 5;
const byte bPin = 6;
void setup() {
pinMode( rPin, OUTPUT );
pinMode( gPin, OUTPUT );
pinMode( bPin, OUTPUT );
}
void loop() {
// гасим синий, зажигаем красный
digitalWrite( bPin, LOW );
digitalWrite( rPin, HIGH );
delay( 500 );
// гасим красный, зажигаем зеленый
digitalWrite( rPin, LOW );
digitalWrite( gPin, HIGH );
delay( 500 );
// гасим зеленый, зажигаем синий
digitalWrite( gPin, LOW );
digitalWrite( bPin, HIGH );
delay( 500 );
}
Загружаем программу на Ардуино и наблюдаем результат.
Немного оптимизируем программу: вместо переменных rPin, gPin и bPin применим массив. Это нам поможет в следующих заданиях.
const byte rgbPins[3] = {3,5,6};
void setup() {
for( byte i=0; i<3; i++ )
pinMode( rgbPins[i], OUTPUT );
}
void loop() {
digitalWrite( rgbPins[2], LOW );
digitalWrite( rgbPins[0], HIGH );
delay( 500 );
digitalWrite( rgbPins[0], LOW );
digitalWrite( rgbPins[1], HIGH );
delay( 500 );
digitalWrite( rgbPins[1], LOW );
digitalWrite( rgbPins[2], HIGH );
delay( 500 );
}
Семь цветов радуги
Теперь попробуем зажигать одновременно по два цвета. Запрограммируем такую последовательность цветов:
- красный
- красный + зеленый = желтый
- зеленый
- зеленый + синий = голубой
- синий
- синий + красный = фиолетовый
Оранжевый цвет мы для упрощения опустили. Так что, получилось шесть цветов радуги 🙂
const byte rgbPins[3] = {3,5,6};
const byte rainbow[6][3] = {
{1,0,0}, // красный
{1,1,0}, // жёлтый
{0,1,0}, // зелёный
{0,1,1}, // голубой
{0,0,1}, // синий
{1,0,1}, // фиолетовый
};
void setup() {
for( byte i=0; i<3; i++ )
pinMode( rgbPins[i], OUTPUT );
}
void loop() {
// перебираем все шесть цветов
for( int i=0; i<6; i++ ){
// перебираем три компоненты каждого из шести цветов
for( int k=0; k<3; k++ ){
digitalWrite( rgbPins[k], rainbow[i][k] );
}
delay( 1000 );
}
}
В результате работы программы получается:
Плавное изменение цвета
Мы не зря подключили RGB-светодиод к выводам 3, 5 и 6. Как известно, эти выводы позволяют генерировать ШИМ сигнал разной скважности. Другими словами, мы можем не просто включать или выключать светодиод, а управлять уровнем напряжения на нем. Делается это с помощью функции analogWrite.
Сделаем так, что наш светодиод будет переходить между цветами радуги не скачкообразно, а плавно.
const byte rgbPins[3] = {3,5,6};
int dim = 1;
void setup() {
for(byte i=0; i<3; i++){
pinMode( rgbPins[i], OUTPUT );
}
// начальное состояние - горит красный цвет
analogWrite(rgbPins[0], 255);
analogWrite(rgbPins[1], 0);
analogWrite(rgbPins[2], 0);
}
void loop() {
// гасим красный, параллельно разжигаем зеленый
for(int i=255; i>=0; i--){
analogWrite( rgbPins[0], i/dim );
analogWrite( rgbPins[1], (255-i)/dim );
delay(10);
}
// гасим зеленый, параллельно разжигаем синий
for(int i=255; i>=0; i--){
analogWrite( rgbPins[1], i/dim );
analogWrite( rgbPins[2], (255-i)/dim );
delay(10);
}
// гасим синий, параллельно разжигаем красный
for(int i=255; i>=0; i--){
analogWrite( rgbPins[2], i/dim );
analogWrite( rgbPins[0], (255-i)/dim );
delay(10);
}
}
Переменная dim определяет яркость свечения. При dim = 1 имеем максимальную яркость.
Загружаем программу на Ардуино.
Не знаю, как на предыдущих версиях Arduino IDE, но на моей (1.8.5) скетч плавного изменения яркости не заработал — отладчик дюже ругался на (переменную?) dim. Немного пошукав по сети, добавил сразу после строчки [const byte rgbPins[3] = {6,5,3}; (изменил порядок под свою раскладку цветов)] такую строчку: [int dim = 1;] — всё заработало! Здесь число dim меняет шаг
дискретности уровня свечения. Чем меньше число, тем меньше шаг и
плавнее изменение яркости.
В коде была ошибка, исправили. Спасибо за комментарий!
Cпасибо очень интересно. и познавательно.
Довольно прикольно. Интересно, а на этот RGB светодиод на каждый выход(цвет) добавить три потенциометра и через них регулировать свечение цвета и яркость?
Разумеется можно. Три потенциометра подключаются к трем аналоговым входам контроллера. Программа берет с них значения, и пропорционально передает их на три контакта RGB светодиода.
скетч рабочий и компактный .Я применил задержку — 50,так мне кажется лучше. Уно- китайская.
вот код Ж
убрал переменную dim , работает так же вот код : const byte rgbPins[3] = {3,5,6};
void setup() {
for(byte i=0; i=0; i—){
analogWrite( rgbPins[0], i );
analogWrite( rgbPins[1], (255-i) );
delay(10);
}
// гасим зеленый, параллельно разжигаем синий
for(int i=255; i>=0; i—){
analogWrite( rgbPins[1], i );
analogWrite( rgbPins[2], (255-i));
delay(10);
}
// гасим синий, параллельно разжигаем красный
for(int i=255; i>=0; i—){
analogWrite( rgbPins[2], i);
analogWrite( rgbPins[0], (255-i) );
delay(10);
}