Плавно меняющий цвет светодиода.
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);
}