Большая вне плановая задержка при переключении режимов ленты. Что делать?

programist

✩✩✩✩✩✩✩
10 Июн 2021
7
0
Всем здравствуйте, тем кто отозвался. У меня произошла проблема с режимами на ленте. Проблема: что бы переключить с режима на режим нужно подождать 20-35 секунд, а этого не должно быть! Помогите кто может. Вот код:
C++:
#include <FastLED.h>
#include "GyverButton.h"
GButton butt1(3, HIGH_PULL, NORM_OPEN);

#define NUM_LEDS 90     
#define LED_PIN 4       
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
#define UPDATES_PER_SECOND 100
int i = 0;
void setup() {
  delay( 3000 );
    FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
    FastLED.setBrightness(  BRIGHTNESS );
    
    Serial.begin(9600);
    butt1.setTimeout(500);
}

void loop() {
  butt1.tick();
  if (butt1.hasClicks()) {
  byte clicks = butt1.getClicks();
   switch (clicks){
    case 1: FastLED.clear();
 while(i < 90)
{
leds[i] = CRGB( 50, 100, 150);
FastLED.show();
i++;
delay(50);
leds[i] = CRGB(0, 0, 150);
FastLED.show();
i++;
delay(50);
leds[i] = CRGB( 0, 100, 0);
FastLED.show();
i++;
delay(50);
 leds[i] = CRGB( 50, 0, 0);
FastLED.show();
i++;
delay(50);

}
    break;
    case 2:  while(i < 90)
{ leds[i] = CRGB( 0, 0, 0);
FastLED.show();
i++;
delay(50);
}

  }
 }
 }
 

bort707

★★★★★★✩
21 Сен 2020
2,898
862
@programist, проблема типичная, возникает у каждого второго новичка.
Ваш код надо переписывать без оператора delay(). иначе кнопки работать не будут.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Millis тут так просто не вставить. Возьмем пример из кода:
C++:
 while(i < 90)
{
leds[i] = CRGB( 50, 100, 150);
FastLED.show();
i++;
delay(50);
leds[i] = CRGB(0, 0, 150);
FastLED.show();
i++;
delay(50);
leds[i] = CRGB( 0, 100, 0);
FastLED.show();
i++;
delay(50);
leds[i] = CRGB( 50, 0, 0);
FastLED.show();
i++;
delay(50);

}
Тут delay(50) встречается 4 раза. Итого 200мс. Вроде не много, но этот обрывок кода повторяется 90 раз. 0,20*90=18 секунд.
если сделать задержку на миллис и оставить цикл, то butt1.tick(); будет выполняться так же редко. Поэтому надо убирать цикл while , благо i уже описана как глобальная. Вместо whikle надо сделать if.

Остальное , что куда, что в if, что в else додумывайте сами.

ЗЫ, Зачем писать i<90 когда есть NUM_LEDS ?
 
  • Лойс +1
Реакции: programist