Найти в Дзене
KNL Games

Листинг кода к видео Arduino №7 — Управление RGB-светодиодом. Смена цветов и Цветовая Температура с Потенциометром.

const int pin_R = 11; const int pin_G = 10; const int pin_B = 9; int i, R, G, B; void setap(){ pinMode(pin_R, OUTPUT); pinMode(pin_G, OUTPUT); pinMode(pin_B, OUTPUT); i = 0; R = 255; G = 0; B = 0; } void loop(){ switch(i){ case 0: G++; if(G == 255){i = 1;} break; case 1: R--; if(R == 0){i = 2;} break; case 2: B++; if(B == 255){i = 3;} break; case 3: G--; if(G == 0){i = 4;} break; case 4: R++; if(R == 255){i = 5;} break; case 5: B--; if(B == 0){i = 0;} break; } analogWrite(pin_R, (255 - R)); analogWrite(pin_G, (255 - G)); analogWrite(pin_B, (255 - B)); delay(2); } // --- Определения пинов (должны быть PWM пины, помечены тильдой ~) --- const int redPin = 9; const int greenPin = 10; const int bluePin = 11; // --- Параметры смены цвета --- const int colorDuration = 1000; // Длительность показа каждого цвета в миллисекундах (1 секунда) const int transitionDelay = 50; // Короткая пауза между сменой цветов // --- Структура для хранения информации о цвете --- struct RGBColor { int r; int g; in
Оглавление

Плавно меняющий цвет светодиода.

const int pin_R = 11;

const int pin_G = 10;

const int pin_B = 9;

int i, R, G, B;

void setap(){

pinMode(pin_R, OUTPUT);

pinMode(pin_G, OUTPUT);

pinMode(pin_B, OUTPUT);

i = 0; R = 255; G = 0; B = 0;

}

void loop(){

switch(i){

case 0: G++; if(G == 255){i = 1;} break;

case 1: R--; if(R == 0){i = 2;} break;

case 2: B++; if(B == 255){i = 3;} break;

case 3: G--; if(G == 0){i = 4;} break;

case 4: R++; if(R == 255){i = 5;} break;

case 5: B--; if(B == 0){i = 0;} break;

}

analogWrite(pin_R, (255 - R));

analogWrite(pin_G, (255 - G));

analogWrite(pin_B, (255 - B));

delay(2);

}

Резкая смена цветов светодиода.

// --- Определения пинов (должны быть PWM пины, помечены тильдой ~) ---

const int redPin = 9;

const int greenPin = 10;

const int bluePin = 11;

// --- Параметры смены цвета ---

const int colorDuration = 1000; // Длительность показа каждого цвета в миллисекундах (1 секунда)

const int transitionDelay = 50; // Короткая пауза между сменой цветов

// --- Структура для хранения информации о цвете ---

struct RGBColor {

int r;

int g;

int b;

};

// --- Массив цветов для циклической смены ---

// Чистые цвета:

// 0: Красный

// 1: Зеленый

// 2: Синий

// Смешанные цвета:

// 3: Желтый (R+G)

// 4: Пурпурный/Маджента (R+B)

// 5: Голубой/Циан (G+B)

const RGBColor colors[] = {

{255, 0, 0}, // 0. Красный

{0, 255, 0}, // 1. Зеленый

{0, 0, 255}, // 2. Синий

{255, 255, 0}, // 3. Желтый

{255, 0, 255}, // 4. Пурпурный

{0, 255, 255} // 5. Голубой

};

const int numColors = sizeof(colors) / sizeof(colors[0]); // Общее количество цветов (6)

void setup() {

pinMode(redPin, OUTPUT);

pinMode(greenPin, OUTPUT);

pinMode(bluePin, OUTPUT);

Serial.begin(9600);

Serial.println("RGB-светодиод запущен. Начинается смена цветов.");

}

void loop() {

// Проходим по всем сохраненным цветам

for (int i = 0; i < numColors; i++) {

// Получаем текущий цвет из массива

RGBColor currentColor = colors[i];

// 1. Резкая установка цвета

setColor(currentColor.r, currentColor.g, currentColor.b);

Serial.print("Цвет №");

Serial.print(i + 1);

Serial.print(": R="); Serial.print(currentColor.r);

Serial.print(", G="); Serial.print(currentColor.g);

Serial.print(", B="); Serial.println(currentColor.b);

// 2. Ждем заданное время, пока цвет горит ярко

delay(colorDuration);

// 3. Добавляем небольшую паузу перед резкой сменой, чтобы убедиться, что предыдущий цвет полностью выключен

delay(transitionDelay);

}

}

/**

* Устанавливает яркость для каждого канала RGB.

* Яркость задается в диапазоне от 0 (выключен) до 255 (полная яркость).

*/

void setColor(int r, int g, int b) {

// analogWrite() посылает ШИМ сигнал на пин

analogWrite(redPin, r);

analogWrite(greenPin, g);

analogWrite(bluePin, b);

}

Изменение скорости переключения цвета с помощью потенциометра.

// --- Определения пинов ---

const int redPin = 9;

const int greenPin = 10;

const int bluePin = 11;

// --- Пин для потенциометра ---

const int potPin = A0;

// --- Параметры смены цветов ---

// Диапазон времени, которое цвет будет гореть (в мс).

// Минимальное время (быстрая смена) и Максимальное время (медленная смена).

const int minColorDuration = 100; // 100 мс (очень быстро)

const int maxColorDuration = 3000; // 3000 мс (медленно)

const int transitionDelay = 50; // Пауза между сменой цветов (остается постоянной)

// --- Структура для хранения информации о цвете ---

struct RGBColor {

int r;

int g;

int b;

};

// --- Массив цветов для циклической смены ---

const RGBColor colors[] = {

{255, 0, 0}, // 0. Красный

{0, 255, 0}, // 1. Зеленый

{0, 0, 255}, // 2. Синий

{255, 255, 0}, // 3. Желтый

{255, 0, 255}, // 4. Пурпурный

{0, 255, 255} // 5. Голубой

};

const int numColors = sizeof(colors) / sizeof(colors[0]);

void setup() {

pinMode(redPin, OUTPUT);

pinMode(greenPin, OUTPUT);

pinMode(bluePin, OUTPUT);

// Потенциометр подключается к аналоговому пину, который по умолчанию является INPUT

// pinMode(potPin, INPUT); // Не обязательно, но можно добавить для ясности

Serial.begin(9600);

Serial.println("RGB-светодиод с управлением скоростью от потенциометра запущен.");

}

void loop() {

// 1. Считываем значение с потенциометра (диапазон 0 - 1023)

int potValue = analogRead(potPin);

// 2. Преобразуем (маппируем) значение potValue (0-1023) в нужный диапазон задержки (minDuration - maxDuration)

int currentDuration = map(potValue, 0, 1023, minColorDuration, maxColorDuration);

// Вывод в Serial Monitor для отладки

Serial.print("Положение ручки: ");

Serial.print(potValue);

Serial.print(" -> Задержка: ");

Serial.println(currentDuration);

// Проходим по всем сохраненным цветам

for (int i = 0; i < numColors; i++) {

RGBColor currentColor = colors[i];

// Резкая установка цвета

setColor(currentColor.r, currentColor.g, currentColor.b);

// Ждем, используя новую, динамически рассчитанную длительность

delay(currentDuration);

delay(transitionDelay); // Короткая пауза перед сменой

}

}

/**

* Устанавливает яркость для каждого канала RGB.

*/

void setColor(int r, int g, int b) {

analogWrite(redPin, r);

analogWrite(greenPin, g);

analogWrite(bluePin, b);

}

Изменение температуры белого цвета светодиода с помощью потенциометра.

// --- Определения пинов ---

const int redPin = 9; // ШИМ пин для Красного

const int greenPin = 10; // ШИМ пин для Зеленого

const int bluePin = 11; // ШИМ пин для Синего

// --- Пин для потенциометра ---

const int potPin = A0;

// --- Параметры яркости ---

// Устанавливаем общую яркость (чтобы цвета не были слишком яркими)

const int maxBrightness = 200;

void setup() {

pinMode(redPin, OUTPUT);

pinMode(greenPin, OUTPUT);

pinMode(bluePin, OUTPUT);

Serial.begin(9600);

Serial.println("RGB-светодиод: Управление цветовой температурой белого.");

}

void loop() {

// 1. Считываем значение с потенциометра (диапазон 0 - 1023)

int potValue = analogRead(potPin);

// 2. Переводим значение (0-1023) в удобный нам "коэффициент смешивания" (от 0.0 до 1.0)

float mixFactor = (float)potValue / 1023.0f;

// =====================================================================

// 3. Логика смешивания цветов для имитации цветовой температуры

// =====================================================================

int r, g, b;

// Мы хотим, чтобы ручка контролировала баланс между теплым (R+G) и холодным (B).

if (mixFactor < 0.5) {

// === ТЕПЛЫЙ БЕЛЫЙ (Ручка повернута влево/вниз) ===

// Чем меньше mixFactor, тем меньше синего и больше красного/зеленого.

// Максимальное значение синего (B) при этом должно быть минимальным

b = (int)(maxBrightness * mixFactor * 0.5); // Синий будет почти выключен в самом низу

// Красный и Зеленый должны быть близки к полной яркости

r = maxBrightness;

g = maxBrightness;

// Для настоящего теплого белого, R и G немного снижаем, чтобы не пережечь глаза

r = (int)(maxBrightness * 0.9);

g = (int)(maxBrightness * 0.8);

} else {

// === ХОЛОДНЫЙ БЕЛЫЙ (Ручка повернута вправо/вверх) ===

// Чем больше mixFactor, тем больше синего и меньше красного.

// Мы используем "верхнюю половину" потенциометра для управления долей синего

// Переводим 0.5 до 1.0 в диапазон 0 до 1.0 для синего

float blueIntensity = (mixFactor - 0.5f) * 2.0f;

b = (int)(maxBrightness * blueIntensity); // Интенсивность синего растет

// Красный и Зеленый снижаются по мере роста синего

r = (int)(maxBrightness * (1.0f - blueIntensity));

g = (int)(maxBrightness * (1.0f - blueIntensity));

}

// Ограничиваем значения (хотя map уже должен был это сделать, но для безопасности)

r = constrain(r, 0, maxBrightness);

g = constrain(g, 0, maxBrightness);

b = constrain(b, 0, maxBrightness);

// 4. Применяем рассчитанные значения

setColor(r, g, b);

// Вывод для отладки

Serial.print("R="); Serial.print(r);

Serial.print(" G="); Serial.print(g);

Serial.print(" B="); Serial.println(b);

// Небольшая пауза, чтобы не перегружать Serial Monitor

delay(50);

}

/**

* Устанавливает яркость для каждого канала RGB.

*/

void setColor(int r, int g, int b) {

analogWrite(redPin, r);

analogWrite(greenPin, g);

analogWrite(bluePin, b);

}