Интеграция и оптимизация кода

anato_no_kao

✩✩✩✩✩✩✩
23 Авг 2021
1
0
Добрый вечер, форумчане!

В программировании ардуино еще зеленый. И на форуме тоже первый день, не бейте пожалуйста, если что-то оформлено не правильно.

Имеется собранный каркас куба, с приклеенными на его грани кусками адресной ленты, соединенными последовательно по три куска в одном углу и еще три в противоположном. Вот так.

Собственноручно реализовал эффект, который хотел(удивительно, но он работает несмотря на то, что это мой первый опыт). Ниже прикладываю видео с демонстрацией(понимаю, что из-за зеркал непонятно, что происходит, но если вкратце, лента зажигается в одном углу и бежит в противоположный)

1 видео: https://drive.google.com/file/d/1cbu9K5tcB2_YgmXz3-l2ZJUH7JqAoYYW/view?usp=sharing

2 видео: https://drive.google.com/file/d/1Es5rnmKXaaShKaNSy3ybSRSOtN6R1z3O/view?usp=sharing

и сам код.
C++:
#define LED_DI 6
#define BRIGHT 255
#define CUR_LIMIT 2000

#include <FastLED.h>
//#include <microLED.h>
const int NUM_LEDS = 240;
CRGBPalette16 currentPalette;
CRGB leds[NUM_LEDS];
CRGB color;
unsigned long timing = 0;
unsigned long timing2 = 0;
unsigned long timing3 = 0;
byte thisRow = 0;
byte blackRow = 0;
byte thisRow2 = 0;
byte blackRow2 = 0;
byte thisRow3 = 0;
byte blackRow3 = 0;
byte count = 0;
byte stripBright = 10;

void setup() {
  Serial.begin(9600);
  FastLED.addLeds<WS2812, LED_DI, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  if (CUR_LIMIT > 0) FastLED.setMaxPowerInVoltsAndMilliamps(5, CUR_LIMIT);
  FastLED.setBrightness(255);
  FastLED.clear();
  currentPalette = CRGB(252, 3, 152);
}

void loop() {
  count += 3;

  if (thisRow <= 16) {                                         //первые три грани
    if (millis() - timing > 40) {
      timing = millis();
      if (thisRow <= 9) {
        firstEdges(ColorFromPalette(currentPalette, 1, stripBright, LINEARBLEND), thisRow);
      }
      if (thisRow >= 3) {
        firstEdges(CRGB(0, 0, 0), blackRow);
        blackRow += 1;
      }
      thisRow += 1;
      stripBright += 2;
    }
  }

  if (thisRow > 10 && thisRow2 <= 16) {                        //вторые шесть граней
    if (millis() - timing2 > 40) {
      timing2 = millis();
      if (thisRow2 <= 9) {
        secondEdges(ColorFromPalette(currentPalette, count, stripBright, LINEARBLEND), thisRow2);
      }
      if (thisRow2 >= 3) {
        secondEdges(CRGB(0, 0, 0), blackRow2);
        blackRow2 += 1;
      }
      thisRow2 += 1;
      stripBright += 3;
    }
  }

  if (thisRow > 10 && thisRow2 > 10 && thisRow3 <= 16) {       //третие три грани
    if (millis() - timing3 > 40) {
      timing3 = millis();
      if (thisRow3 <= 9) {
        thirstEdges(ColorFromPalette(currentPalette, count, stripBright, LINEARBLEND), thisRow3);
      }
      if (thisRow3 >= 3) {
        thirstEdges(CRGB(0, 0, 0), blackRow3);
        blackRow3 += 1;
      }
      thisRow3 += 1;
      stripBright += 5;
    }
  }

  if (thisRow >= 16 && thisRow2 >= 16 && thisRow3 >= 16) {       //обнуление переменных
    timing = 0;
    timing2 = 0;
    timing3 = 0;
    thisRow = 0;
    thisRow2 = 0;
    thisRow3 = 0;
    blackRow = 0;
    blackRow2 = 0;
    blackRow3 = 0;
    stripBright = 10;
    count = 0;
  }
  //delay(200);
  Serial.println(thisRow2);
}

void firstEdges(CRGB colorStrip, byte blackRow) {
  leds[40 + blackRow] = colorStrip;   // передняя левая
  leds[39 - blackRow] = colorStrip;   // передняя правая
  leds[79 - blackRow] = colorStrip;   // нижняя левая   (верхняя)
  leds[80 + blackRow] = colorStrip;   // нижняя левая   (нижняя)
  leds[0 + blackRow] = colorStrip;    // нижняя правая  (верхняя)
  leds[119 - blackRow] = colorStrip;  // нижняя правая  (нижняя)
  FastLED.show();
}

void secondEdges(CRGB colorStrip2, byte blackRow2) {
  leds[179 - blackRow2] = colorStrip2;  // нижняя левая   (верхняя)
  leds[90 + blackRow2] = colorStrip2;   // нижняя левая   (нижняя)
  leds[140 + blackRow2] = colorStrip2;  // нижняя правая  (верхняя)
  leds[109 - blackRow2] = colorStrip2;  // нижняя правая  (нижняя)
  leds[219 - blackRow2] = colorStrip2;  // верхняя левая  (верхняя)
  leds[50 + blackRow2] = colorStrip2;   // верхняя левая  (нижняя)
  leds[220 + blackRow2] = colorStrip2;  // верхняя правая (верхняя)
  leds[29 - blackRow2] = colorStrip2;   // верхняя правая (нижняя)
  leds[69 - blackRow2] = colorStrip2;   // боковая левая  (ближняя)
  leds[180 + blackRow2] = colorStrip2;  // боковая левая  (дальняя)
  leds[10 + blackRow2] = colorStrip2;   // боковая правая (ближняя)
  leds[139 - blackRow2] = colorStrip2;  // боковая правая (дальняя)
  FastLED.show();
}

void thirstEdges(CRGB colorStrip3, byte blackRow3) {
  leds[169 - blackRow3] = colorStrip3;  // задняя левая
  leds[150 + blackRow3] = colorStrip3;  // задняя правая
  leds[209 - blackRow3] = colorStrip3;  // верхняя левая  (верхняя)
  leds[190 + blackRow3] = colorStrip3;  // верхняя левая  (нижняя)
  leds[230 + blackRow3] = colorStrip3;  // верхняя правая (верхняя)
  leds[129 - blackRow3] = colorStrip3;  // верхняя правая (нижняя)
  FastLED.show();
}

Так же имеется скопипастнутый(Куча эффектов для WS2812B) код с набором эффектов для ленты, разбитый на три файла(прикрепил).
Прикрутил к нему смену яркости по потенциометру и, собственно, пытаюсь свой эффект добавить в один из кейсов, добавив тело во второй файл с функциями и прописав название функции в один из кейсов в первом файле. Все компилится нормально. При загрузке прошивки и переключении кейсов в порте работают все эффекты кроме моего. Когда я пытаюсь включить свой эффект(PinkFlower в коде с набором эффектов) - лента гаснет и все, при последующих попытках сменить эффект, никакого результата, ардуино просто не выходит из моего. Помогите пожалуйста разобраться в чем дело. И еще был бы крайне благодарен за советы по оптимизации кода. Заранее большое спасибо!
 

Вложения