Программа

Составим простую программу, которая будет по очереди зажигать каждый из трех цветов.

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 имеем максимальную яркость.

Загружаем программу на Ардуино.


Изменено: