// Видеообзоры и уроки работы с ARDUINO на YouTube-канале IOMOIO: https://www.youtube.com/channel/UCmNXABaTjX_iKH28TTJpiqA
/*
ИЗМЕНЕНИЕ СПЕКТРА ЦВЕТОВ В RGB:
От красного к желтому
R: 255
G: 0 -> 255
B: 0
От желтого к зеленому
R: 255 -> 0
G: 255
B: 0
От зеленого к голубому
R: 0
G: 255
B: 0 -> 255
От голубого к синему
R: 0
G: 255 -> 0
B: 255
От синего к фиолетовому
R: 0 -> 255
G: 0
B: 255
От фиолетового к красному
R: 255
G: 0
B: 255 -> 0
*/
#define r 6 // Пин подключения красного
#define g 5 // Пин подключения зеленого
#define b 3 // Пин подключения синего
int active_color; // Объявляем целочисленную переменную для с цветом
boolean turn = true; // Объявляем логическую переменную для определения направления изменения спектра
int invert(int value) { // Функция инвертирования значений для светодиода с общим анодом
return map(value, 0, 255, 255, 0); // Возвращаем инвертированное значение в место вызова функции
}
void setup() {
pinMode(r, OUTPUT); // Определяем пин подключения красного, как исходящий
pinMode(g, OUTPUT); // Определяем пин подключения зеленого, как исходящий
pinMode(b, OUTPUT); // Определяем пин подключения синего, как исходящий
// Для светодиода с общим анодом будем инвертировать значения
//analogWrite(r,invert(255)); // Зажигаем красный
//analogWrite(g,invert(0)); // Отключаем зеленый
//analogWrite(b,invert(0)); // Отключаем синий
// Для светодиода с общим катодом инвертировать значения не надо
analogWrite(r, 255); // Зажигаем красный
analogWrite(g, 0); // Отключаем зеленый
analogWrite(b, 0); // Отключаем синий
active_color = b; // Определяем активный пин для управления спектром (b = синий)
}
// В блоке loop воспроизводим все цвета радуги по порядку для светодиода с общим анодом
void loop() {
switch (active_color) { // Условие смены активного цвета по спектру
case r: // В случае текущей работы с красным
active_color = b; // изменяем его на синий
break; // и прерываем дальнейшую обработку условий
case g: // В случае текущей работы с зеленым
active_color = r; // изменяем его на красный
break; // и прерываем дальнейшую обработку условий
case b: // В случае текущей работы с синим
active_color = g; // изменяем его на зеленый
break; // и прерываем дальнейшую обработку условий (прописывать не обязательно, т.к. это условие и так последнее)
}
if (!turn) // Если значение логической переменной "Ложь (False)"
for (int i = 0; i <= 255; i++) { // в цикле меняем значение от 0 до 255
analogWrite(active_color, i); // и записываем его в пин, соответствующий текущему активному цвету
delay(20); // Задержка в 5 мс
}
else // Иначе, если значение логической переменной turn - "Истина (True)"
for (int i = 255; i >= 0; i--) { // в цикле меняем значение от 255 до 0
analogWrite(active_color, i); // и записываем его в пин, соответствующий текущему активному цвету
delay(20); // Задержка в 5 мс
}
turn = !turn; // Меняем направление изменения значений на противоположное
}