/* * RGB Pot Mixer2 * -------------- * * Код для управления посредством одного потенциометра 3 светодиодами, красным, * зелёным и синим, или одним трёхцветным светодиодом * * Использует предположительно верный алгоритм преобразования цветового тона в * RGB-значения * * Код предполагает, что у Вас есть светодиоды, подключенные в соответствии со * схемой с общим анодом, когда анод светодиода подключён к +5В через резистор, * и катод подключён к пинам Arduino 9,10,11. * * Tod E. Kurt , отладка через последовательный порт Clay Shirky * */ // ВХОДЫ: Потенциометр должен быть подключён к 5В и "Земле" int potPin = 2; // Подключение потенциометра int potVal = 0; // Переменная для хранения значения с потенциометра // ВЫХОДЫ: Используются цифровые пины 9-11, с Широтно-Импульсной модуляцией (ШИМ) int redPin = 9; // Красный светодиод, подключён на цифровой пин 9 int grnPin = 11; // Зелёный светодиод, подключён на цифровой пин 10 int bluPin = 10; // Синий светодиод, подключён на цифровой пин 11 // Программные переменные int redVal = 0; // Переменные для хранения величин, посылаемых на пины int grnVal = 0; int bluVal = 0; int DEBUG = 0; // Сделайте 1, чтобы включить отладочную печать void setup() { pinMode(redPin, OUTPUT); // сделать пины выходами pinMode(grnPin, OUTPUT); pinMode(bluPin, OUTPUT); if (DEBUG) { // Если мы хотим видеть значения на пинах для отладки... Serial.begin(19200); // ...сделайте последовательный вывод в стиле 0004 } } // Основная программа void loop() { potVal = analogRead(potPin); // считать значение на потенциометре, на входном пине potVal = potVal / 4; // Преобразовать из 0-1023 в 0-255 hue_to_rgb( potVal ); // интерпретировать potVal как цветовой тон и преобразовать в rgb // "255-", потому что у нас светодиоды с общим анодом, а не с общим катодом analogWrite(redPin, 255-redVal); // Послать величины на пины светодиодов analogWrite(grnPin, 255-grnVal); analogWrite(bluPin, 255-bluVal); if (DEBUG) { // Если мы хотим посмотреть, что на выходах DEBUG += 1; // Увеличить счётчик DEBUG if (DEBUG > 100) { // Печатать каждые 100 итераций DEBUG = 1; // Перезапустить счётчик Serial.print("R:"); // Показать, что выводим значение красного Serial.print(redVal); // Напечатать значение красного Serial.print("\t"); // Напечатать табуляцию Serial.print("G:"); // Повторить для зелёного и синего... Serial.print(grnVal); Serial.print("\t"); Serial.print("B:"); Serial.println(bluVal); // println, чтобы закончить символом возврата каретки } } } /* * Дан цветовой тон 'h', в диапазоне 0-252, * сделать примерно соответствующие RGB-значения. * Assumes maximum Saturation & maximum Value (brightness) * Использует арифметику целых чисел, никаких вычислений с плавающей точкой. */ void hue_to_rgb(byte hue) { if( hue > 252 ) hue = 252; byte hd = hue / 42; // 42 == 252/6, 252 == H_MAX byte hi = hd % 6; // gives 0-5 byte f = hue % 42; byte fs = f * 6; switch( hi ) { case 0: redVal = 252; grnVal = fs; bluVal = 0; break; case 1: redVal = 252-fs; grnVal = 252; bluVal = 0; break; case 2: redVal = 0; grnVal = 252; bluVal = fs; break; case 3: redVal = 0; grnVal = 252-fs; bluVal = 252; break; case 4: redVal = fs; grnVal = 0; bluVal = 252; break; case 5: redVal = 252; grnVal = 0; bluVal = 252-fs; break; } }