// Видеообзоры и уроки работы с 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;                       // Меняем направление изменения значений на противоположное
}