Смена режимов работы RGB ленты.
- Войдите на сайт для отправки комментариев
Прошу помощи в смене режимов мерцания RGB ленты, а именно в данном коде выбор группы по долгому зажатию кнопки. На текущий момент работает 1 группа (смена цветов 1.1-1.9) в if'e group1, при зажатии кнопки, происходит переход в другой if group 0, все как положено, НО по какой то причине при однократном нажатии снова включается group 1.
В кратце опишу что должен выполнять код:
Режимы:
I группа:
1.1 - красный
1.2 - оранжевый
1.3 - желтый
1.4 - зеленый
1.5 - голубой
1.6 - синий
1.7 - фиолетовый
1.8 - розовый
1.9 - белый
II группа:
2.1 - последовательная смена цветов от 1.1 до 1.7
2.2 - смена с пропусками (цветные стробы)
2.3 - плавная смена цветов (радуга/градиенты/переливания)
2.4 - стробоскоп Синий-Желтый
2.5 - стробоскоп Красная-Зеленая
2.6 - стробоскоп Фиолетовый-ораневый
2.7 - стробоскоп Белый (высокая скорость)
2.8 - стробоскоп белый-красный-белый-синий (высокая скорость)
2.9 - стробоскоп белый-зеленый-белый-синий (высокая скорость)
Управление 1 кнопкой:
- короткое нажатие - следующий режим (по кругу в пределах выбранной группы)
- длинное нажатие - смена группы.
#define REDPIN 11
#define GREENPIN 10
#define BLUEPIN 9
#define FADESPEED 3
int r=0, g=0, b=0, color=1, flag=0, group=1, val=0;
long prmill = 0;
void setup() {
pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
pinMode(BLUEPIN, OUTPUT);
}
void Z1_output_rgbled ()
{
analogWrite(REDPIN, r);
analogWrite(GREENPIN, g);
analogWrite(BLUEPIN, b);
}
void loop()
{
if (digitalRead(2)==HIGH)
{
prmill++;
flag=1;
}
if (digitalRead(2)==LOW)
{
if (prmill<100&&flag==1)
{
color++;
if (color>9)
{
color=1;
}
//delay(500);
flag=0;
prmill=0;
}
if (prmill>100&&flag==1)
{
if (group==1)
{
group=0;
}
else
{
group=1;
}
flag=0;
prmill=0;
}
}
if (group==1)
{
switch (color) {
case 1:
r=255;
g=0;
b=0;
Z1_output_rgbled ();
delay(10);
break;
case 2:
r=255;
g=18;
b=0;
Z1_output_rgbled ();
delay(10);
break;
case 3:
r=255;
g=70;
b=5;
Z1_output_rgbled ();
delay(10);
break;
case 4:
r=0;
g=255;
b=0;
Z1_output_rgbled ();
delay(10);
break;
case 5:
r=0;
g=255;
b=255;
Z1_output_rgbled ();
delay(10);
break;
case 6:
r=0;
g=0;
b=255;
Z1_output_rgbled ();
delay(10);
break;
case 7:
r=255;
g=0;
b=255;
Z1_output_rgbled ();
delay(10);
break;
case 8:
r=255;
g=0;
b=80;
Z1_output_rgbled ();
delay(10);
break;
case 9:
r=255;
g=255;
b=150;
Z1_output_rgbled ();
delay(10);
break;
}
if (group==0) {
r=0;g=0;b=0;
Z1_output_rgbled ();
}
}
Какой хороший у вас кнопка. Видимо совсем без дребезга. Такая реализация задержки должна очень нестабильно работать. Почитайте как правильно обрабатывать нажатие кнопки. А еще про функию millis()
Но если текущая версия вас устраивает, то просто добавьте delay(10) внутрь if
(group==0)Скорее всего сейчас у вас очень быстро счетчик prmill при group=0 набирает 100