Оптимизация и интеграция кода
- Войдите на сайт для отправки комментариев
Добрый вечер, форумчане!
В программировании ардуино еще зеленый. И на форуме тоже первый день, не бейте пожалуйста, если что-то оформлено не правильно.
Имеется собранный каркас куба, с приклеенными на его грани кусками адресной ленты, соединенными последовательно по три куска в одном углу и еще три в противоположном. Вот так.
Так же имеется ардуина. Схема подключения такова.
Собственноручно реализовал эффект, который хотел(удивительно, но он работает несмотря на то, что это мой первый опыт). Ниже прикладываю видео с демонстрацией(понимаю, что из-за зеркал непонятно, что происходит, но если вкратце, лента зажигается в одном углу и бежит в противоположный)
1 видео: https://drive.google.com/file/d/1cbu9K5tcB2_YgmXz3-l2ZJUH7JqAoYYW/view?usp=sharing
2 видео: https://drive.google.com/file/d/1Es5rnmKXaaShKaNSy3ybSRSOtN6R1z3O/view?usp=sharing
и сам код.
#define LED_DI 6 #define BRIGHT 255 #define CUR_LIMIT 2000 #include <FastLED.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(); }
Так же имеется скопипастнутый код с набором эффектов для ленты, разбитый на три файла.
Первый.
/* Скетч создан на основе FASTSPI2 EFFECTS EXAMPLES автора teldredge (www.funkboxing.com) А также вот этой статьи https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/... Доработан, переведён и разбит на файлы 2017 AlexGyver Смена выбранных режимов кнопкой. Кнопка подключена на D2 и GND */ #include "FastLED.h" // библиотека для работы с лентой #define LED_COUNT 40 // число светодиодов в кольце/ленте #define LED_DT 6 // пин, куда подключен DIN ленты int max_bright = 255; // максимальная яркость (0 - 255) boolean adapt_light = 1; // адаптивная подсветка (1 - включить, 0 - выключить) byte fav_modes[] = {2, 11, 14, 25, 27, 30, 41}; // список "любимых" режимов byte num_modes = sizeof(fav_modes); // получить количество "любимых" режимов (они все по 1 байту..) unsigned long change_time, last_change, last_bright; int new_bright; volatile byte ledMode = 3; /* Стартовый режим 0 - все выключены 1 - все включены 3 - кольцевая радуга 888 - демо-режим */ // цвета мячиков для режима byte ballColors[3][3] = { {0xff, 0, 0}, {0xff, 0xff, 0xff}, {0 , 0 , 0xff} }; // ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ----------------- int BOTTOM_INDEX = 0; // светодиод начала отсчёта int TOP_INDEX = int(LED_COUNT / 2); int EVENODD = LED_COUNT % 2; struct CRGB leds[LED_COUNT]; int ledsX[LED_COUNT][3]; //-ARRAY FOR COPYING WHATS IN THE LED STRIP CURRENTLY (FOR CELL-AUTOMATA, MARCH, ETC) int thisdelay = 20; //-FX LOOPS DELAY VAR int thisstep = 10; //-FX LOOPS DELAY VAR int thishue = 0; //-FX LOOPS DELAY VAR int thissat = 255; //-FX LOOPS DELAY VAR int thisindex = 0; int thisRED = 0; int thisGRN = 0; int thisBLU = 0; const int NUM_LEDS = 240; CRGBPalette16 currentPalette; 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; int idex = 0; //-LED INDEX (0 to LED_COUNT-1 int ihue = 0; //-HUE (0-255) int ibright = 0; //-BRIGHTNESS (0-255) int isat = 0; //-SATURATION (0-255) int bouncedirection = 0; //-SWITCH FOR COLOR BOUNCE (0-1) float tcount = 0.0; //-INC VAR FOR SIN LOOPS int lcount = 0; //-ANOTHER COUNTING VAR volatile uint32_t btnTimer; volatile byte modeCounter; volatile boolean changeFlag; // ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ----------------- void setup() { Serial.begin(9600); // открыть порт для связи LEDS.setBrightness(max_bright); // ограничить максимальную яркость LEDS.addLeds<WS2811, LED_DT, GRB>(leds, LED_COUNT); // настрйоки для нашей ленты (ленты на WS2811, WS2812, WS2812B) one_color_all(0, 0, 0); // погасить все светодиоды LEDS.show(); // отослать команду randomSeed(analogRead(0)); pinMode(2, INPUT_PULLUP); pinMode(A3, INPUT); // к входу A3 подключаем потенциометр attachInterrupt(0, btnISR, FALLING); } void one_color_all(int cred, int cgrn, int cblu) { //-SET ALL LEDS TO ONE COLOR for (int i = 0 ; i < LED_COUNT; i++ ) { leds[i].setRGB( cred, cgrn, cblu); } } void loop() { if (adapt_light) { // если включена адаптивная яркость if (millis() - last_bright > 5) { // каждые полсекунды last_bright = millis(); // сброить таймер int val = analogRead(A3); // считываем данные с порта A1 val = val / 4; // делим значения на 4 new_bright = val; LEDS.setBrightness(new_bright); // установить новую яркость } } if (Serial.available() > 0) { // если что то прислали int slk = Serial.parseInt(); // парсим в тип данных int if (slk != 0) { ledMode = slk; Serial.println(ledMode); change_mode(ledMode); // меняем режим через change_mode (там для каждого режима стоят цвета и задержки) } } switch (ledMode) { case 999: break; // пазуа // case 2: rainbow_fade(); break; // Радуга */ case 3: rainbow_loop(); break; // крутящаяся радуга + /* case 4: random_burst(); break; // случайная смена цветов */ case 5: color_bounce(); break; // бегающий светодиод + case 6: color_bounceFADE(); break; // бегающий паровозик светодиодов + case 7: pinkFlower(); break; // вращаются красный и синий // case 8: ems_lightsALL(); break; // вращается половина красных и половина синих */ case 9: flicker(); break; // случайный стробоскоп + /* case 10: pulse_one_color_all(); break; // пульсация одним цветом case 11: pulse_one_color_all_rev(); break; // пульсация со сменой цветов case 12: fade_vertical(); break; // плавная смена яркости по вертикали (для кольца) */ case 13: rule30(); break; // безумие красных светодиодов + case 14: random_march(); break; // безумие случайных цветов + /* case 15: rwb_march(); break; // белый синий красный бегут по кругу (ПАТРИОТИЗМ!) case 16: radiation(); break; // пульсирует значок радиации case 17: color_loop_vardelay(); break; // красный светодиод бегает по кругу case 18: white_temps(); break; // бело синий градиент (?) case 19: sin_bright_wave(); break; // тоже хрень какая то case 20: pop_horizontal(); break; // красные вспышки спускаются вниз case 21: quad_bright_curve(); break; // полумесяц case 22: flame(); break; // эффект пламени case 23: rainbow_vertical(); break; // радуга в вертикаьной плоскости (кольцо) case 24: pacman(); break; // пакман */ case 25: random_color_pop(); break; // безумие случайных вспышек + /* case 26: ems_lightsSTROBE(); break; // полицейская мигалка case 27: rgb_propeller(); break; // RGB пропеллер */ case 28: kitt(); break; // случайные вспышки красного в вертикаьной плоскости + case 29: matrix(); break; // зелёненькие бегают по кругу случайно + /* case 30: new_rainbow_loop(); break; // крутая плавная вращающаяся радуга case 31: strip_march_ccw(); break; // чёт сломалось case 32: strip_march_cw(); break; // чёт сломалось case 33: colorWipe(0x00, 0xff, 0x00, thisdelay); colorWipe(0x00, 0x00, 0x00, thisdelay); break; // плавное заполнение цветом */ case 34: CylonBounce(0xff, 0, 0, 4, 10, thisdelay); break; // бегающие светодиоды + /* case 35: Fire(55, 120, thisdelay); break; // линейный огонь case 36: NewKITT(0xff, 0, 0, 8, 10, thisdelay); break; // беготня секторов круга (не работает) */ case 37: rainbowCycle(thisdelay); break; // очень плавная вращающаяся радуга + /* case 38: TwinkleRandom(20, thisdelay, 1); break; // случайные разноцветные включения (1 - танцуют все, 0 - случайный 1 диод) case 39: RunningLights(0xff, 0xff, 0x00, thisdelay); break; // бегущие огни case 40: Sparkle(0xff, 0xff, 0xff, thisdelay); break; // случайные вспышки белого цвета */ case 41: SnowSparkle(0x10, 0x10, 0x10, thisdelay, random(100, 1000)); break; // случайные вспышки белого цвета на белом фоне + /* case 42: theaterChase(0xff, 0, 0, thisdelay); break; // бегущие каждые 3 (ЧИСЛО СВЕТОДИОДОВ ДОЛЖНО БЫТЬ КРАТНО 3) */ case 43: theaterChaseRainbow(thisdelay); break; // бегущие каждые 3 радуга (ЧИСЛО СВЕТОДИОДОВ ДОЛЖНО БЫТЬ КРАТНО 3) + /* case 44: Strobe(0xff, 0xff, 0xff, 10, thisdelay, 1000); break; // стробоскоп case 45: BouncingBalls(0xff, 0, 0, 3); break; // прыгающие мячики case 46: BouncingColoredBalls(3, ballColors); break; // прыгающие мячики цветные case 888: demo_modeA(); break; // длинное демо case 889: demo_modeB(); break; // короткое демо */ } } void btnISR() { if (millis() - btnTimer > 500) { btnTimer = millis(); // защита от дребезга if (++modeCounter >= num_modes) modeCounter = 0; ledMode = fav_modes[modeCounter]; // получаем новый номер следующего режима change_mode(ledMode); // меняем режим через change_mode (там для каждого режима стоят цвета и задержки) changeFlag = true; } } void change_mode(int newmode) { thissat = 255; switch (newmode) { case 0: one_color_all(0, 0, 0); LEDS.show(); break; //---ALL OFF case 1: one_color_all(255, 255, 255); LEDS.show(); break; //---ALL ON case 2: thisdelay = 60; break; //---STRIP RAINBOW FADE case 3: thisdelay = 20; thisstep = 10; break; //---RAINBOW LOOP case 4: thisdelay = 20; break; //---RANDOM BURST case 5: thisdelay = 20; thishue = 0; break; //---CYLON v1 case 6: thisdelay = 80; thishue = 0; break; //---CYLON v2 case 7: thisdelay = 40; thishue = 0; break; //---POLICE LIGHTS SINGLE case 8: thisdelay = 40; thishue = 0; break; //---POLICE LIGHTS SOLID case 9: thishue = 160; thissat = 50; break; //---STRIP FLICKER case 10: thisdelay = 15; thishue = 0; break; //---PULSE COLOR BRIGHTNESS case 11: thisdelay = 30; thishue = 0; break; //---PULSE COLOR SATURATION case 12: thisdelay = 60; thishue = 180; break; //---VERTICAL SOMETHING case 13: thisdelay = 100; break; //---CELL AUTO - RULE 30 (RED) case 14: thisdelay = 80; break; //---MARCH RANDOM COLORS case 15: thisdelay = 80; break; //---MARCH RWB COLORS case 16: thisdelay = 60; thishue = 95; break; //---RADIATION SYMBOL //---PLACEHOLDER FOR COLOR LOOP VAR DELAY VARS case 19: thisdelay = 35; thishue = 180; break; //---SIN WAVE BRIGHTNESS case 20: thisdelay = 100; thishue = 0; break; //---POP LEFT/RIGHT case 21: thisdelay = 100; thishue = 180; break; //---QUADRATIC BRIGHTNESS CURVE //---PLACEHOLDER FOR FLAME VARS case 23: thisdelay = 50; thisstep = 15; break; //---VERITCAL RAINBOW case 24: thisdelay = 50; break; //---PACMAN case 25: thisdelay = 35; break; //---RANDOM COLOR POP case 26: thisdelay = 25; thishue = 0; break; //---EMERGECNY STROBE case 27: thisdelay = 100; thishue = 0; break; //---RGB PROPELLER case 28: thisdelay = 100; thishue = 0; break; //---KITT case 29: thisdelay = 100; thishue = 95; break; //---MATRIX RAIN case 30: thisdelay = 15; break; //---NEW RAINBOW LOOP case 31: thisdelay = 100; break; //---MARCH STRIP NOW CCW case 32: thisdelay = 100; break; //---MARCH STRIP NOW CCW case 33: thisdelay = 50; break; // colorWipe case 34: thisdelay = 50; break; // CylonBounce case 35: thisdelay = 15; break; // Fire case 36: thisdelay = 50; break; // NewKITT case 37: thisdelay = 20; break; // rainbowCycle case 38: thisdelay = 10; break; // rainbowTwinkle case 39: thisdelay = 50; break; // RunningLights case 40: thisdelay = 0; break; // Sparkle case 41: thisdelay = 30; break; // SnowSparkle case 42: thisdelay = 50; break; // theaterChase case 43: thisdelay = 50; break; // theaterChaseRainbow case 44: thisdelay = 100; break; // Strobe case 101: one_color_all(255, 0, 0); LEDS.show(); break; //---ALL RED case 102: one_color_all(0, 255, 0); LEDS.show(); break; //---ALL GREEN case 103: one_color_all(0, 0, 255); LEDS.show(); break; //---ALL BLUE case 104: one_color_all(255, 255, 0); LEDS.show(); break; //---ALL COLOR X case 105: one_color_all(0, 255, 255); LEDS.show(); break; //---ALL COLOR Y case 106: one_color_all(255, 0, 255); LEDS.show(); break; //---ALL COLOR Z } bouncedirection = 0; one_color_all(0, 0, 0); ledMode = newmode; }
Второй.
//------------------------LED EFFECT FUNCTIONS------------------------ void one_color_allHSV(int ahue) { //-SET ALL LEDS TO ONE COLOR (HSV) for (int i = 0 ; i < LED_COUNT; i++ ) { leds[i] = CHSV(ahue, thissat, 255); } } void rainbow_loop() { //-m3-LOOP HSV RAINBOW idex++; ihue = ihue + thisstep; if (idex >= LED_COUNT) { idex = 0; } if (ihue > 255) { ihue = 0; } leds[idex] = CHSV(ihue, thissat, 255); LEDS.show(); if (safeDelay(thisdelay)) return; } void color_bounce() { //-m5-BOUNCE COLOR (SINGLE LED) if (bouncedirection == 0) { idex = idex + 1; if (idex == LED_COUNT) { bouncedirection = 1; idex = idex - 1; } } if (bouncedirection == 1) { idex = idex - 1; if (idex == 0) { bouncedirection = 0; } } for (int i = 0; i < LED_COUNT; i++ ) { if (i == idex) { leds[i] = CHSV(thishue, thissat, 255); } else { leds[i] = CHSV(0, 0, 0); } } LEDS.show(); if (safeDelay(thisdelay)) return; } void color_bounceFADE() { //-m6-BOUNCE COLOR (SIMPLE MULTI-LED FADE) if (bouncedirection == 0) { idex = idex + 1; if (idex == LED_COUNT) { bouncedirection = 1; idex = idex - 1; } } if (bouncedirection == 1) { idex = idex - 1; if (idex == 0) { bouncedirection = 0; } } int iL1 = adjacent_cw(idex); int iL2 = adjacent_cw(iL1); int iL3 = adjacent_cw(iL2); int iR1 = adjacent_ccw(idex); int iR2 = adjacent_ccw(iR1); int iR3 = adjacent_ccw(iR2); for (int i = 0; i < LED_COUNT; i++ ) { if (i == idex) { leds[i] = CHSV(thishue, thissat, 255); } else if (i == iL1) { leds[i] = CHSV(thishue, thissat, 150); } else if (i == iL2) { leds[i] = CHSV(thishue, thissat, 80); } else if (i == iL3) { leds[i] = CHSV(thishue, thissat, 20); } else if (i == iR1) { leds[i] = CHSV(thishue, thissat, 150); } else if (i == iR2) { leds[i] = CHSV(thishue, thissat, 80); } else if (i == iR3) { leds[i] = CHSV(thishue, thissat, 20); } else { leds[i] = CHSV(0, 0, 0); } } LEDS.show(); if (safeDelay(thisdelay)) return; } void flicker() { //-m9-FLICKER EFFECT int random_bright = random(0, 255); int random_delay = random(10, 100); int random_bool = random(0, random_bright); if (random_bool < 10) { for (int i = 0 ; i < LED_COUNT; i++ ) { leds[i] = CHSV(thishue, thissat, random_bright); } LEDS.show(); if (safeDelay(random_delay)) return; } } void random_red() { //QUICK 'N DIRTY RANDOMIZE TO GET CELL AUTOMATA STARTED int temprand; for (int i = 0; i < LED_COUNT; i++ ) { temprand = random(0, 100); if (temprand > 50) { leds[i].r = 255; } if (temprand <= 50) { leds[i].r = 0; } leds[i].b = 0; leds[i].g = 0; } LEDS.show(); } void rule30() { //-m13-1D CELLULAR AUTOMATA - RULE 30 (RED FOR NOW) if (bouncedirection == 0) { random_red(); bouncedirection = 1; } copy_led_array(); int iCW; int iCCW; int y = 100; for (int i = 0; i < LED_COUNT; i++ ) { iCW = adjacent_cw(i); iCCW = adjacent_ccw(i); if (ledsX[iCCW][0] > y && ledsX[i][0] > y && ledsX[iCW][0] > y) { leds[i].r = 0; } if (ledsX[iCCW][0] > y && ledsX[i][0] > y && ledsX[iCW][0] <= y) { leds[i].r = 0; } if (ledsX[iCCW][0] > y && ledsX[i][0] <= y && ledsX[iCW][0] > y) { leds[i].r = 0; } if (ledsX[iCCW][0] > y && ledsX[i][0] <= y && ledsX[iCW][0] <= y) { leds[i].r = 255; } if (ledsX[iCCW][0] <= y && ledsX[i][0] > y && ledsX[iCW][0] > y) { leds[i].r = 255; } if (ledsX[iCCW][0] <= y && ledsX[i][0] > y && ledsX[iCW][0] <= y) { leds[i].r = 255; } if (ledsX[iCCW][0] <= y && ledsX[i][0] <= y && ledsX[iCW][0] > y) { leds[i].r = 255; } if (ledsX[iCCW][0] <= y && ledsX[i][0] <= y && ledsX[iCW][0] <= y) { leds[i].r = 0; } } LEDS.show(); if (safeDelay(thisdelay)) return; } void random_march() { //-m14-RANDOM MARCH CCW copy_led_array(); int iCCW; leds[0] = CHSV(random(0, 255), 255, 255); for (int idex = 1; idex < LED_COUNT ; idex++ ) { iCCW = adjacent_ccw(idex); leds[idex].r = ledsX[iCCW][0]; leds[idex].g = ledsX[iCCW][1]; leds[idex].b = ledsX[iCCW][2]; } LEDS.show(); if (safeDelay(thisdelay)) return; } void random_color_pop() { //-m25-RANDOM COLOR POP idex = random(0, LED_COUNT); ihue = random(0, 255); one_color_all(0, 0, 0); leds[idex] = CHSV(ihue, thissat, 255); LEDS.show(); if (safeDelay(thisdelay)) return; } void kitt() { //-m28-KNIGHT INDUSTIES 2000 int rand = random(0, TOP_INDEX); for (int i = 0; i < rand; i++ ) { leds[TOP_INDEX + i] = CHSV(thishue, thissat, 255); leds[TOP_INDEX - i] = CHSV(thishue, thissat, 255); LEDS.show(); if (safeDelay(thisdelay / rand)) return; } for (int i = rand; i > 0; i-- ) { leds[TOP_INDEX + i] = CHSV(thishue, thissat, 0); leds[TOP_INDEX - i] = CHSV(thishue, thissat, 0); LEDS.show(); if (safeDelay(thisdelay / rand)) return; } } void matrix() { //-m29-ONE LINE MATRIX int rand = random(0, 100); if (rand > 90) { leds[0] = CHSV(thishue, thissat, 255); } else { leds[0] = CHSV(thishue, thissat, 0); } copy_led_array(); for (int i = 1; i < LED_COUNT; i++ ) { leds[i].r = ledsX[i - 1][0]; leds[i].g = ledsX[i - 1][1]; leds[i].b = ledsX[i - 1][2]; } LEDS.show(); if (safeDelay(thisdelay)) return; } //-----------------------------------бегающие светодиоды----------------------------------- void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) { for (int i = 0; i < LED_COUNT - EyeSize - 2; i++) { setAll(0, 0, 0); setPixel(i, red / 10, green / 10, blue / 10); for (int j = 1; j <= EyeSize; j++) { setPixel(i + j, red, green, blue); } setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10); FastLED.show(); if (safeDelay(SpeedDelay)) return; } if (safeDelay(ReturnDelay)) return; for (int i = LED_COUNT - EyeSize - 2; i > 0; i--) { setAll(0, 0, 0); setPixel(i, red / 10, green / 10, blue / 10); for (int j = 1; j <= EyeSize; j++) { setPixel(i + j, red, green, blue); } setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10); FastLED.show(); if (safeDelay(SpeedDelay)) return; } if (safeDelay(ReturnDelay)) return; } //-------------------------------newKITT--------------------------------------- void rainbowCycle(int SpeedDelay) { byte *c; uint16_t i, j; for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel for (i = 0; i < LED_COUNT; i++) { c = Wheel(((i * 256 / LED_COUNT) + j) & 255); setPixel(i, *c, *(c + 1), *(c + 2)); } FastLED.show(); if (safeDelay(SpeedDelay)) return; } } byte * Wheel(byte WheelPos) { static byte c[3]; if (WheelPos < 85) { c[0] = WheelPos * 3; c[1] = 255 - WheelPos * 3; c[2] = 0; } else if (WheelPos < 170) { WheelPos -= 85; c[0] = 255 - WheelPos * 3; c[1] = 0; c[2] = WheelPos * 3; } else { WheelPos -= 170; c[0] = 0; c[1] = WheelPos * 3; c[2] = 255 - WheelPos * 3; } return c; } //-------------------------------SnowSparkle--------------------------------------- void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) { setAll(red, green, blue); int Pixel = random(LED_COUNT); setPixel(Pixel, 0xff, 0xff, 0xff); FastLED.show(); if (safeDelay(SparkleDelay)) return; setPixel(Pixel, red, green, blue); FastLED.show(); if (safeDelay(SpeedDelay)) return; } //-------------------------------theaterChaseRainbow--------------------------------------- void theaterChaseRainbow(int SpeedDelay) { byte *c; for (int j = 0; j < 256; j++) { // cycle all 256 colors in the wheel for (int q = 0; q < 3; q++) { for (int i = 0; i < LED_COUNT; i = i + 3) { c = Wheel( (i + j) % 255); setPixel(i + q, *c, *(c + 1), *(c + 2)); //turn every third pixel on } FastLED.show(); if (safeDelay(SpeedDelay)) return; for (int i = 0; i < LED_COUNT; i = i + 3) { setPixel(i + q, 0, 0, 0); //turn every third pixel off } } } } //------------------------------------PinkFlower-------------------------------------------- void pinkFlower() { 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; } if (safeDelay(thisdelay)) return; } 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(); } boolean safeDelay(int delTime) { uint32_t thisTime = millis(); while (millis() - thisTime <= delTime) { if (changeFlag) { changeFlag = false; return true; } } return false; }
Третий.
//------------------------------------- UTILITY FXNS -------------------------------------- //---SET THE COLOR OF A SINGLE RGB LED void set_color_led(int adex, int cred, int cgrn, int cblu) { leds[adex].setRGB( cred, cgrn, cblu); } //---FIND INDEX OF HORIZONAL OPPOSITE LED int horizontal_index(int i) { //-ONLY WORKS WITH INDEX < TOPINDEX if (i == BOTTOM_INDEX) { return BOTTOM_INDEX; } if (i == TOP_INDEX && EVENODD == 1) { return TOP_INDEX + 1; } if (i == TOP_INDEX && EVENODD == 0) { return TOP_INDEX; } return LED_COUNT - i; } //---FIND INDEX OF ANTIPODAL OPPOSITE LED int antipodal_index(int i) { int iN = i + TOP_INDEX; if (i >= TOP_INDEX) { iN = ( i + TOP_INDEX ) % LED_COUNT; } return iN; } //---FIND ADJACENT INDEX CLOCKWISE int adjacent_cw(int i) { int r; if (i < LED_COUNT - 1) { r = i + 1; } else { r = 0; } return r; } //---FIND ADJACENT INDEX COUNTER-CLOCKWISE int adjacent_ccw(int i) { int r; if (i > 0) { r = i - 1; } else { r = LED_COUNT - 1; } return r; } void copy_led_array() { for (int i = 0; i < LED_COUNT; i++ ) { ledsX[i][0] = leds[i].r; ledsX[i][1] = leds[i].g; ledsX[i][2] = leds[i].b; } } void setPixel(int Pixel, byte red, byte green, byte blue) { leds[Pixel].r = red; leds[Pixel].g = green; leds[Pixel].b = blue; } void setAll(byte red, byte green, byte blue) { for (int i = 0; i < LED_COUNT; i++ ) { setPixel(i, red, green, blue); } FastLED.show(); }
Прикрутил к нему смену яркости по потенциометру и, собственно, пытаюсь свой эффект добавить в один из кейсов, добавив тело во второй файл с функциями и прописав название функции в один из кейсов в первом файле. Все компилится нормально. При загрузке прошивки и переключении кейсов в порте работают все эффекты кроме моего. Когда я пытаюсь включить свой эффект(PinkFlower в коде с набором эффектов) - лента гаснет и все, при последующих попытках сменить эффект, никакого результата, ардуино просто не выходит из моего. Помогите пожалуйста разобраться в чем дело. И еще был бы крайне благодарен за советы по оптимизации кода. Заранее большое спасибо!
Для сексуальных утех с кодами данного автора существует специальный форум - https://community.alexgyver.ru/
Удачи Вам там!
Для сексуальных утех с кодами данного автора существует специальный форум - https://community.alexgyver.ru/
Удачи Вам там!
Что не так? Поясните пожалуйста. Я не шарю.
Просьбами привести в порядок традиционно низкокачественный код алекса, нужно засорять форум алекса, только и всего.
Поясните пожалуйста.
Каких пояснений Вы ждёте? Я Вам сказал, что для консультаций по коду этого автора есть специальный форум. И даже дал его (форума) адрес. Какое именно слово Вам в этой фразе непонятно?
Евгений, что Вам именно не понятно в вопросе, что не так с кодом алекса? Глядите, rkit сразу понял о чем я. Вы уверены, что это я что-то не понимаю?
что не так с кодом алекса?
Всё так, просто для него есть специальный форум.
Вы уверены, что это я что-то не понимаю?
Нет, не уверен, просто поверил Вам, когда Вы сказали:
Поясните пожалуйста. Я не шарю.
Евгений, что Вам именно не понятно в вопросе, что не так с кодом алекса? Глядите, rkit сразу понял о чем я. Вы уверены, что это я что-то не понимаю?
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/redaktor-effek...
Как напрограммируете кучу своих эффектов и научитесь их перебирать кнопкой, блютусом и т.д. вам быстро поскучнеет. Вот тогда и надо Гайвера трясти что бы его программёры писали приложение на пк подобное как по моей ссылке. Это гораздо интереснее будет и Гайверу самому. Именно тогда для простых пользователей, не отягощённых программированием изделие это приобретёт черты законченного.
Может и понимаете, просто пошутили, откуда ж мне знать?
То, что данного автора тут недолюбливают, я понял. У Вас же спрашивал причину.
То, что данного автора тут недолюбливают, я понял. У Вас же спрашивал причину.
Как написал один иностранец в комментах под одним из видео Гайвера - "очень хороший блогер, никакой программист". Вот за вторую часть его здесь и недолюбливают ))
Так я же вроде и не говорю, что он хороший программист) Я всего лишь попросил взглянуть на код, так сказать, профессиональным взглядом и посоветовать в какую сторону копать, чтобы оно работало. На форуме гайвера помощь получить несколько проблематично.
Вот Вы пришли и просите "взглянуть на его код". И знаете сколько таких, как Вы? Нас что, суд приговорил на его коды постоянно взглядывать? Достало уже.
Евгений, Вы не подумайте, я не с агрессией. Читал Ваши сообщения на форуме (особенно запомнилось когда Вы человеку объясняли то, что ему нужно понять логику работы МК, раскладывая свою цель на простейшие действия), очень понравилось. Но мне кажется, что Вы несправедливо выплескиваете на меня желчь по этому поводу.
А где Ваш код? На что смотреть? Как его выделить из кучи приведённого кода? Если Вы читали посты Евгения, то он всегда просит привести компилируемый минимальный код, который не работает как задумано.
anatonokao ну ты и зануда....
Вставьте в начало своего pinkFlower() зажигание светодиода на пине 13.
Если при выборе эффекта он загорится - то ошибки в самой функции, а не в свиче.
Потому, что, искренне желая Вам помочь, решил дать Вам ссылку на профильный форум. Дал ссылку и пожелал удачи.
Что-то не так?
Что-то не так?
А где Ваш код?
и сам код.
Далее вставленный во второй файл скопипастнутого кода (строки 342-441)
и прописанный в кейс в первый файл (скопипастнутого) (124 строка)
Большое спасибо за первый дельный совет, sadman41. Я попробую.
Что-то не так?
Вы отвечали ПОСЛЕ моего ответа в посте #1. Так что, простите, я не умею предугадывать что мне скажут в будущем и Ваших претензий ко мне совершенно не понимаю.
Повторюсь в третий раз, на форуме гайвера не вышло получить помощи.
и что дальше-то? Из этого разве следует, что нужно спрашивать тут?
Никаких претензий у меня к Вам нету. И я ничего не говорю про Ваш первый ответ. Я говорю о том, что не понимаю, почему после того как я написал
Вы снова говорите мне, в следующем же комментарии #11.
b707, сначала Вы назвали меня занудой, теперь задаёте не совсем понятные вопросы. Какого ответа Вы от меня ждёте?
b707, сначала Вы назвали меня занудой, теперь задаёте не совсем понятные вопросы. Какого ответа Вы от меня ждёте?
честно? - чтоб вы свалили к гайверу :)
b707, заметьте, я не спрашивал каких действий, я спрашивал какого ответа)
А так, удачи Вам дождаться)
b707, заметьте, я не спрашивал каких действий, я спрашивал какого ответа)
подловили :)
Вы снова говорите мне, в следующем же комментарии #11.
Это было сказано в общем, обо всех кто приходит сюда с чужими кодами.
Только на самом деле Вы не понимаете другого. Вы не понимаете, что когда Вы берёте и используете продукт, который не поддерживается производителем - это Ваш собственный риск. Ваш, а не каких-то людей с форумов. Вы спросили, что делать, Вам ответили - обратитесь к автору. А то, что автор Вас посылает - это и есть реализация того самого риска, который Вы на себя взяли. Вот и всё.
Что теперь делать? Отвечу. Не берите у этого автора. Пишите сами. Свой собственный код. Не будет получаться - поможем.
Это было сказано в общем, обо всех кто приходит сюда с чужими кодами.
Только на самом деле Вы не понимаете другого. Вы не понимаете, что когда Вы берёте и используете продукт, который не поддерживается производителем - это Ваш собственный риск. Ваш, а не каких-то людей с форумов. Вы спросили, что делать, Вам ответили - обратитесь к автору. А то, что автор Вас посылает - это и есть реализация того самого риска, который Вы на себя взяли. Вот и всё.
Что теперь делать? Отвечу. Не берите у этого автора. Пишите сами. Свой собственный код. Не будет получаться - поможем.
Вы правы. Спасибо. В своем коде действительно разбираться намного проще, хотя не всегда. Тоже возникают проблемы.
Простите за некропост.