Помогите, пожалуйста

Artemlolkek

✩✩✩✩✩✩✩
20 Мар 2020
3
0
Заголовок темы должен отражать содержимое. Отредактируй или ветка будет удалена
Помогите пожалуйста, у меня есть код для того чтоб переключать динамические эффекты на адр с ик пульта, но почему то он постоянно зацикливается и не реагирует на другие кнопки. Как избавиться от зацикливания?
C++:
#include "IRLremote.h"
#define pinIR 2
CHashIR IRLremote;
uint32_t IRdata;
#define NUM_LEDS 300
#include "FastLED.h"
#define PIN 6
CRGB leds[NUM_LEDS];
byte counter;
int thisdelay = 20;         
int idex = 0;               
int bouncedirection = 0;
#define BUTT_1 0xEE708BAD
#define BUTT_2 0x38ADB6AD
int mode = 0;
bool ir_flag = false;
void setup() {
  FastLED.addLeds<WS2812B, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(50);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
  IRLremote.begin(pinIR);

}

void loop() {
  if (IRLremote.available())  {
    auto data = IRLremote.read();
    IRdata = data.command;
    ir_flag = true;
  }
  if (ir_flag) { // если данные пришли
    switch (IRdata) {
      case BUTT_1: mode = 1;
        break;
      case BUTT_2: mode = 2;
        break;
    }
    
  }
  if(mode == 1){
      decodeIR();
      Serial.println("1");
    }
    if(mode == 2){
      color_bounce();
      Serial.println("2");
    }
}

// определяем значение нажатой клавиши
void decodeIR() {
  Serial.println(mode);
  for (int i = 0; i < NUM_LEDS; i++ ) {         // от 0 до первой трети
    leds[i] = CHSV(counter + i * 2, 255, 255);  // HSV. Увеличивать HUE (цвет)
    // умножение i уменьшает шаг радуги
  }
  counter++;        // counter меняется от 0 до 255 (тип данных byte)
  FastLED.show();
  delay(5);
}
void color_bounce() {                        //-m5-BOUNCE COLOR (SINGLE LED)
  if (bouncedirection == 0) {
    idex = idex + 1;
    if (idex == NUM_LEDS) {
      bouncedirection = 1;
      idex = idex - 1;
    }
  }
  if (bouncedirection == 1) {
    idex = idex - 1;
    if (idex == 0) {
      bouncedirection = 0;
    }
  }
  for (int i = 0; i < NUM_LEDS; i++ ) {
    if (i == idex) {
      leds[i] = CHSV(thishue, thissat, 255);
    }
    else {
      leds[i] = CHSV(0, 0, 0);
    }
  }
  LEDS.show();
  delay(thisdelay);
}
 

bort707

★★★★★★✩
21 Сен 2020
2,894
860
На кнопки не реагирует, потому что все достпное время ленту крутит. Вы же во втором режиме шарашите вывод на ленту каждые 20мс, а в первом - аж каждые 5мс.

ну и в самом коде есть интересные моменты.
Как вы думаете, какие значения у вас получаются в выражении (counter + i * 2) в строке
C++:
leds[i] = CHSV(counter + i * 2, 255, 255);
если i у вас пробегает значения от 0 до NUM_LEDS, а NUM_LEDS = 300 ?
И соответвуют ли эти значения диапазону hue 0..255 ?
 

Artemlolkek

✩✩✩✩✩✩✩
20 Мар 2020
3
0
На кнопки не реагирует, потому что все достпное время ленту крутит. Вы же во втором режиме шарашите вывод на ленту каждые 20мс, а в первом - аж каждые 5мс.

ну и в самом коде есть интересные моменты.
Как вы думаете, какие значения у вас получаются в выражении (counter + i * 2) в строке
C++:
leds[i] = CHSV(counter + i * 2, 255, 255);
если i у вас пробегает значения от 0 до NUM_LEDS, а NUM_LEDS = 300 ?
И соответвуют ли эти значения диапазону hue 0..255 ?
в
C++:
#include "IRLremote.h"
#define pinIR 2
CHashIR IRLremote;
uint32_t IRdata;
#define NUM_LEDS 300
#include "FastLED.h"
#define PIN 6
CRGB leds[NUM_LEDS];
byte counter;
int thishue = 0;             //-FX LOOPS DELAY VAR
int thissat = 255;           //-FX LOOPS DELAY VAR
int idex = 0;                //-LED INDEX (0 to LED_COUNT-1
int ihue = 0;                //-HUE (0-255)                //-SATURATION (0-255)                         
int bouncedirection = 0;
#define BUTT_1 0xEE708BAD
#define BUTT_2 0x38ADB6AD
int mode = 0;
bool ir_flag = false;
void setup() {
  FastLED.addLeds<WS2812B, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(50);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
  IRLremote.begin(pinIR);

}

void loop() {
  if (IRLremote.available())  {
    auto data = IRLremote.read();
    IRdata = data.command;
    ir_flag = true;
  }
  if (ir_flag) { // если данные пришли
    switch (IRdata) {
      case BUTT_1: mode = 1;
        break;
      case BUTT_2: mode = 2;
        break;
    }
    
  }
  if(mode == 1){
      rainbow_fade();
      Serial.println("1");
    }
  if(mode == 2){
      color_bounce();
      Serial.println("2");
    }
}

// определяем значение нажатой клавиши
void rainbow_fade() {                         //-m2-FADE ALL LEDS THROUGH HSV RAINBOW
  ihue++;
  if (ihue > 255) {
    ihue = 0;
  }
  for (int idex = 0 ; idex < NUM_LEDS; idex++ ) {
    leds[idex] = CHSV(ihue, thissat, 255);
  }
  LEDS.show();
}
void color_bounce() {                        //-m5-BOUNCE COLOR (SINGLE LED)
  if (bouncedirection == 0) {
    idex = idex + 1;
    if (idex == NUM_LEDS) {
      bouncedirection = 1;
      idex = idex - 1;
    }
  }
  if (bouncedirection == 1) {
    idex = idex - 1;
    if (idex == 0) {
      bouncedirection = 0;
    }
  }
  for (int i = 0; i < NUM_LEDS; i++ ) {
    if (i == idex) {
      leds[i] = CHSV(thishue, thissat, 255);
    }
    else {
      leds[i] = CHSV(0, 0, 0);
    }
  }
  LEDS.show();
}
Я вроде переделал, но что то не работает, или я сделал только хуже?
 

bort707

★★★★★★✩
21 Сен 2020
2,894
860
Вы убрали задержки - значит теперь у вас лента обновляется вообще непрерывно - кнопки, думаю, перестанут работать совсем.
Вместо этого попробуйте увеличить задержки - поставьте 50 в обоих случаяъ и посмотрите что будет

и еще - вы радугу убрали , у вас теперь в первом режиме вся лента должна одним цветом светится
 

Artemlolkek

✩✩✩✩✩✩✩
20 Мар 2020
3
0
Вы убрали задержки - значит теперь у вас лента обновляется вообще непрерывно - кнопки, думаю, перестанут работать совсем.
Вместо этого попробуйте увеличить задержки - поставьте 50 в обоих случаяъ и посмотрите что будет

и еще - вы радугу убрали , у вас теперь в первом режиме вся лента должна одним цветом светится
Спасибо, большое!