Программа
Составим простую программу, которая будет по очереди зажигать каждый из трех цветов.
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 имеем максимальную яркость.
Загружаем программу на Ардуино.