Смена режимов работы 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