Добрый вечер, форумчане!
В программировании ардуино еще зеленый. И на форуме тоже первый день, не бейте пожалуйста, если что-то оформлено не правильно.
Имеется собранный каркас куба, с приклеенными на его грани кусками адресной ленты, соединенными последовательно по три куска в одном углу и еще три в противоположном. Вот так.
Собственноручно реализовал эффект, который хотел(удивительно, но он работает несмотря на то, что это мой первый опыт). Ниже прикладываю видео с демонстрацией(понимаю, что из-за зеркал непонятно, что происходит, но если вкратце, лента зажигается в одном углу и бежит в противоположный)
1 видео: https://drive.google.com/file/d/1cbu9K5tcB2_YgmXz3-l2ZJUH7JqAoYYW/view?usp=sharing
2 видео: https://drive.google.com/file/d/1Es5rnmKXaaShKaNSy3ybSRSOtN6R1z3O/view?usp=sharing
и сам код.
Так же имеется скопипастнутый(Куча эффектов для WS2812B) код с набором эффектов для ленты, разбитый на три файла(прикрепил).
Прикрутил к нему смену яркости по потенциометру и, собственно, пытаюсь свой эффект добавить в один из кейсов, добавив тело во второй файл с функциями и прописав название функции в один из кейсов в первом файле. Все компилится нормально. При загрузке прошивки и переключении кейсов в порте работают все эффекты кроме моего. Когда я пытаюсь включить свой эффект(PinkFlower в коде с набором эффектов) - лента гаснет и все, при последующих попытках сменить эффект, никакого результата, ардуино просто не выходит из моего. Помогите пожалуйста разобраться в чем дело. И еще был бы крайне благодарен за советы по оптимизации кода. Заранее большое спасибо!
В программировании ардуино еще зеленый. И на форуме тоже первый день, не бейте пожалуйста, если что-то оформлено не правильно.
Имеется собранный каркас куба, с приклеенными на его грани кусками адресной ленты, соединенными последовательно по три куска в одном углу и еще три в противоположном. Вот так.
Собственноручно реализовал эффект, который хотел(удивительно, но он работает несмотря на то, что это мой первый опыт). Ниже прикладываю видео с демонстрацией(понимаю, что из-за зеркал непонятно, что происходит, но если вкратце, лента зажигается в одном углу и бежит в противоположный)
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 в коде с набором эффектов) - лента гаснет и все, при последующих попытках сменить эффект, никакого результата, ардуино просто не выходит из моего. Помогите пожалуйста разобраться в чем дело. И еще был бы крайне благодарен за советы по оптимизации кода. Заранее большое спасибо!
Вложения
-
14.5 KB Просмотры: 2
-
13.3 KB Просмотры: 0
-
1.5 KB Просмотры: 0