Amateur Radio Station R9AL

      Лампа настроения (mood lamp) - это такая лампа, которая со временем меняет свой цвет. Смена цвета может быть задана программно, но наиболее интересно, когда это происходит в случайном порядке. Например, розовый цвет, плавно сменяется голубым, затем зеленым и т.д. Удобнее всего сделать такую лампу использую RGB-светодиоды или RGB-ленты.

Для экспериментов используем схему, аналогичную рассмотренной на Уроке 14, на котором мы познакомились с RGB-светодиодом и научились менять его цвет, в том числе плавно изменяя его цвет перебирая все цвета радуги.


      Когда мы перебирали все цвета радуги, мы меняли яркость светодиодов от минимальной (0, светодиод не горит), до максимальной (255, светодиод светится с максимальной яркостью). Перепишем программу используя теперь циклы while и введя в нее еще одну переменную k, которая будет ограничивать максимальную яркость светодиода. Мы можем ограничить максимальную яркость светодиодов, присвоив переменной k любое значение от 0 (минимальна яркость) до 255 (максимальная яркость).

int r=0;                  // вводим переменную r типа int, красный
int g=0;                  // вводим переменную g типа int, зеленый
int b=0;                  // вводим переменную b типа int, синий
int k=255;		  // вводим переменную k типа int, яркость

void setup()
{
  pinMode(9, OUTPUT);   // назначаем вывод 9 выходом, к нему подключаем зеленый светодиод
  pinMode(10, OUTPUT);  // назначаем вывод 10 выходом, к нему подключаем синийй светодиод
  pinMode(11, OUTPUT);  // назначаем вывод 11 выходом, к нему подключаем красный светодиод
}                        

void loop()
{
  while(r < k) {rgb(); r++;} // плавно зажигаем красный светодиод
  while(g < k) {rgb(); g++;} // плавно зажигаем зеленый светодиод
  while(r > 0) {rgb(); r--;} // плавно гасим красный светодиод
  while(b < k) {rgb(); b++;} // плавно зажигаем синий светодиод
  while(g > 0) {rgb(); g--;} // плавно гасим зеленый светодиод
  while(r < k) {rgb(); r++;} // плавно зажигаем красный светодиод
  while(b > 0) {rgb(); b--;} // плавно гасим синий светодиод
}
  
void rgb()
{
 analogWrite(11, r);
 analogWrite(9, g);
 analogWrite(10, b);
 delay(10); 
} 
Программа очень простая, но в ней есть одна особенность - для упрощения кода использована подпрограмма. Подпрограмма - это часть кода, которая содержит описание определенного набора действий, которая может быть многократно вызвана из разных частей программы. В данном случае подпрограмма - это блок void rgb(), в котором происходит включение RGB-светодиода с заданными уровнями сигналов r, g, b на время, которое задается функцией delay().

Меняя переменную k мы можем делать свечение светодиода более тусклым. А можно ли наоборот сделать свечение светодиода более ярким? Оказывается можно. Если вы заметили, то для получения любого цвета используется только один или два светодиода. Мы можем задать некий уровень свечения неиспользуемых светодиодов, и тогда общее свечение будет более ярким, и будет стремиться к белому цвету. Введем еще одну переменную - h, которая будет задавать минимальную яркость светодиода. Мы можем ограничить минимальную яркость светодиодов, присвоив переменной h любое значение от 0 (минимальна яркость) до 255 (максимальная яркость).
int h=128;
int r=h;                  // вводим переменную r типа int
int g=h;                  // вводим переменную g типа int
int b=h;                  // вводим переменную b типа int
int k=255;		    	  // вводим переменную k типа int, яркость

void setup()
{
  pinMode(9, OUTPUT);   // назначаем вывод 9 выходом
  pinMode(10, OUTPUT);  // назначаем вывод 10 выходом
  pinMode(11, OUTPUT);  // назначаем вывод 11 выходом
}                        

void loop()
{
  while(r < k) {rgb(); r++;} // плавно зажигаем красный светодиод
  while(g < k) {rgb(); g++;} // плавно зажигаем зеленый светодиод
  while(r > h) {rgb(); r--;} // плавно гасим красный светодиод
  while(b < k) {rgb(); b++;} // плавно зажигаем синий светодиод
  while(g > h) {rgb(); g--;} // плавно гасим зеленый светодиод
  while(r < k) {rgb(); r++;} // плавно зажигаем красный светодиод
  while(b > h) {rgb(); b--;} // плавно гасим синий светодиод
}
  
void rgb()
{
 analogWrite(11, r);
 analogWrite(9, g);
 analogWrite(10, b);
 delay(10); 
} 
И, наконец мы можем менять скорость изменения цвета, меняя значение функции delay(10); или введя еще одну переменную.

      Но, изменение цветов происходит по жесткой программе, даже если мы изменим порядок включения светодиодов - все равно цвет будет предсказуем. Попробуем сделать изменения цвета случайным. Для этого, случайным образом будем определять цвет светодиода и после этого плавно будем менять цвет, пока не придем к нужному цвету, после чего случайным образом определяем новый цвет и опять постепенно приближаемся к нему и так далее. Для реализации такого алгоритма введем три переменные: r2, g2, b2. В самом начале программы мы будем определять случайные значения этих переменных с помощью функции random(), при этом случайные значения должны попадать в заданный переменными h и k диапазон яркости - random(h, k). Затем мы проверяем каждый цвет, приближая значение переменных r, g, b к значениям r2, g2, b2.

int h=0;                  // вводим переменную k типа int, яркость 1
int r=h;                  // вводим переменную r типа int
int g=h;                  // вводим переменную g типа int
int b=h;                  // вводим переменную b типа int
int r2;                  // вводим переменную r2 типа int
int g2;                  // вводим переменную g2 типа int
int b2;                  // вводим переменную b2 типа int
int k=255;		 // вводим переменную k типа int, яркость 2

void setup()
{
  pinMode(9, OUTPUT);   // назначаем вывод 9 выходом
  pinMode(10, OUTPUT);  // назначаем вывод 10 выходом
  pinMode(11, OUTPUT);  // назначаем вывод 11 выходом
}                        

void loop()
{

 int r2= random(h, k);
 int g2= random(h, k);
 int b2= random(h, k);
  
 while(g < g2) {rgb(); g++;} // плавно зажигаем зеленый светодиод
 while(g > g2) {rgb(); g--;} // плавно гасим зеленый светодиод
 while(r < r2) {rgb(); r++;} // плавно зажигаем красный светодиод
 while(r > r2) {rgb(); r--;} // плавно гасим красный светодиод
 while(b < b2) {rgb(); b++;} // плавно зажигаем синий светодиод
 while(b > b2) {rgb(); b--;} // плавно гасим синий светодиод

}
  
void rgb()
{
 analogWrite(11, r);
 analogWrite(9, g);
 analogWrite(10, b);
 delay(30);
} 
В качестве практического задания:

Придумайте свой алгоритм работы "лампы настроения"







Copyright © R9AL 2021 Все права защищены

Рейтинг@Mail.ru