/*
* Набор для экспериментов ArduinoKit
* Код программы для опыта №3: sketch 03
*
*
* RGB Светодиод
*
*
*
*
*/

// Программа демонстрации возможностей RGB LED

// Перевод

// Сначала мы присвоим нужным портам имена, чтобы легче
// читать и понимать нашу программу.

 

// Вот новый трюк: поставленное слово «const» перед переменной
// указывает, на то что эта переменная имеет «постоянное» значение,
// которое никогда не будет меняются. ( Вы должны это помнить, иначе
// Arduino выдаст вам дружеское предупреждение, если вы случайно
// попытаетесь изменить это значение.

const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;

// Следующая переменная контролирует, на сколько быстро выполняется цикл
// по смене цветов (в качестве эксперимента попробуйте поменять ее значение)

int DISPLAY_TIME = 100; // в миллисекундах

void setup()
{
// Далее мы конфигурируем порты Arduino которые будут управлять светодиодом:

pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}

void loop()
{

// В этом примере, мы начнем писать свои собственные функции.
// Функции разбивают программу на маленькие кусочки, это упрощает
// понимание программы и поэтому отпадает необходимость каждый
// раз вносить изменения в setup() или loop().

// Мы покажем вам два способа для запуска RGB LED.
// Первый способ состоит из включения и выключения красного,
// зеленого и синего в различных сочетаниях (например красный – синий,
// или зеленый синий, зеленый — синий и т.п). Такие сочетания, в общей
// сложности, дают вам восемь цветов (если считать «черный» в качестве цвета).

// Мы создали функцию с именем mainColors (), которая проходит через
// все восемь цветов. Здесь мы только вызываем нашу функцию,
// как бы говорим – запустить. Сам же код функции находится ниже.

mainColors();

// Эта функция включает и выключает отдельно каждый светодиод либо Вкл., либо
// Выкл. Если вы хотите получить больше чем восемь цветов, вам придется
// изменять еще и яркость каждого светодиода. Для этого можно воспользоваться
// функцию analogWrite(), — градация яркости от 0 до 255. Далее идет функция
// с именем showSpectrum (), которая плавно проследует через каждый из 8 цветов.
// Опять же здесь мы только называем ее, сам же код находится ниже.

showSpectrum();
}

// Если вам захочется использовать функцию mainColors() в своих собственных
// программах, просто скопируйте ее код и добавьте в свой скетч.

void mainColors()
{
// Выкл. – все светодиоды выключены

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);

delay(1000);

// Включаем КРАСНЫЙ – RED_PIN, HIGH.

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);

delay(1000);

// Включаем ЗЕЛЕНЫЙ – GREEN_PIN, HIGH.

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);

delay(1000);

// Включаем СИНИЙ – BLUE_PIN, HIGH.

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);

delay(1000);

// Включаем ЖЕЛТЫЙ – RED и BLUE HIGH.

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);

delay(1000);

// БИРЮЗОВЫЙ – GREEN и BLUE

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);

delay(1000);

//РОЗОВЫЙ – RED и BLUE

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);

delay(1000);

//БЕЛЫЙ – все цвета HIGH (Вкл.)

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);

delay(1000);
}

// Ниже приведен код еще двух функций:
// ShowSpectrum () и showRGB().

// ShowRGB () выводит один цвет на светодиод. Когда вам необходим
// определённый цвет, вызываете showRGB() с нужным вам цветом.

// ShowSpectrum () выводит все цвета по очереди – радуга.
// На самом деле showSpectrum() вызывает снова и снова
// функцию showRGB (), для того чтобы получилась радуга.

// Мы будем часто разбивать задачи на отдельные функции, как
// в этом примере. Это Упрощает написание программ, и можно
// легко перенести функцию в свою новую программу.

// showSpectrum()
// Эта функция перебирает все возможные цвета, путем увеличения
// переменной от 0 до 768 (общее количество цветов), и неоднократно
// вставляет полученное значение в showRGB (), чтобы отобразить отдельные цвета.

// В этой функции, мы используем петлю “loop()” в которой выполняется цикл
// из трех последовательных шагов:
// Инициализация переменной «int x», в следующем шаге увеличиваем эту
// переменную на единицу, и в следующем шаге вызываем функцию showRGB(),
// вставляя в нее новое значение переменной, ждем некоторое время, примерно 10мс.,
// и выполняем петлю заново. Таким образом наша функция showRGB() получает
// новое значение при каждом новом проходе петли.

// Если еще подробнее — Каждый «for() loop» цикл имеет
// три инструкции через точку с запятой:

// 1. Что-то делать, прежде чем начать
// 2. Тест — выполняется ли условие. Петля «loop()» будет выполняться, пока условие истинно.
// 3. Что-то сделать после каждого цикла — в нашем случае увеличить переменную.

// Услови для for(), чуть ниже:

// 1. х = 0; Перед началом, убедиться, что х = 0.
// 2. х <768; Далее условие: проверить, x меньше 768, если да,
// то выполнить следующую инструкцию.
// 3. x + + т.е увиличить переменную х на единицу.
// Вы можете использовать и такой вид записи — «х = х + 1»

// Каждый раз, когда вы идете через петлю, значение переменной будет увеличиваться
// пока не дойдет до 768, а это значит, что условие стало ложным, и значит пора
// выходить из петли. И переходить к следующей инструкции.

void showSpectrum()
{
int x;
for (x = 0; x < 768; x++)
{
showRGB(x); // Вызов RGBspectrum() сновым значением x
delay(10); // Пауза 10 ms (1/100 секунды)
}
}

// ShowRGB()
// Эта функция переводит число от 0 до 767 в определенный цвет.
// Если плавно пройтись по этому числовому ряду, то светодиод будет
// плавно менять цвет через весь цветовой спектр.

// Базовые цифры:
// 0 = чистый красный
// 255 = чистый зеленый
// 511 = чистый синий
// 767 = чистый красный (опять же)

//Числа между вышеуказанных создадут промежуточные цвета.
// Например, 640 находится на полпути между 512 (чистый синий)
// и 767 (Чистый красный). Это даст смесь синего и красного,
// в результате чего получится фиолетовый.

// Если посчитать в верх от 0 до 767 и передать это число функции,
// то светодиод будет плавно переливаться всеми цветами радуги.
// Начиная и заканчивая красным.

void showRGB(int color)
{
int redIntensity;
int greenIntensity;
int blueIntensity;

//Здесь мы будем использовать условие «if/else» (если/тогда), для
// того чтобы определить в какую из трех зон (R,G,B)
// попадет значение переменной x
//Каждая из этих зон охватывает значение от 0 до 255, потому что
// только такие значения понимает функция analogWrite().
// В каждой из этих зон, мы будем вычислять яркость для
// каждого из светодиодов — красного, зеленого и синего.

if (color <= 255) // зона 1
{
redIntensity = 255 — color; // красный меняется из включенного на выключенный
greenIntensity = color; // зеленый меняется из выключенного на включенный
blueIntensity = 0; // голубой всегда выключен
}
else if (color <= 511) // зона 2
{
redIntensity = 0; // красный всегда выключен
greenIntensity = 255 — (color — 256); // зеленый от включенного к выключенному
blueIntensity = (color — 256); // голубой от выключенного к включенному
}
else // color >= 512 // зона 3
{
redIntensity = (color — 512); // красный выкл. К вкл.
greenIntensity = 0; // зеленый всегда выкл.
blueIntensity = 255 — (color — 512); // голубой от вкл. К выкл.
}

// Теперь, когда параметры значения яркости были установлены,
// функциям передаются значение этих переменных

analogWrite(RED_PIN, redIntensity);
analogWrite(BLUE_PIN, blueIntensity);
analogWrite(GREEN_PIN, greenIntensity);
}