Смена режимов работы RGB ленты.

morphy
morphy аватар
Offline
Зарегистрирован: 24.03.2016

Прошу помощи в смене режимов мерцания 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 ();
        
      }
}
    
 
    

 

okta
Offline
Зарегистрирован: 10.01.2015

Какой хороший у вас кнопка. Видимо совсем без дребезга. Такая реализация задержки должна очень нестабильно работать. Почитайте как правильно обрабатывать нажатие кнопки. А еще про функию millis()

Но если текущая версия вас устраивает, то просто добавьте delay(10) внутрь if (group==0) Скорее всего сейчас у вас очень быстро счетчик prmill при group=0 набирает 100