Помогите пожалуйста уменьшить размер скетча.
- Войдите на сайт для отправки комментариев
Вс, 31/05/2020 - 21:31
#include "FastLED.h" // библиотека для работы с лентой
#define LED_COUNT 600 // число светодиодов в кольце/ленте
#define LED_DT 13 // пин, куда подключен DIN ленты
int max_bright = 100; // максимальная яркость (0 - 255)
boolean adapt_light = 0; // адаптивная подсветка (1 - включить, 0 - выключить)
byte fav_modes[] = {2, 3, 4, 6, 11, 19, 22, 30, 33, 35, 37, 39, 101}; // список "любимых" режимов
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;
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);
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 > 500) { // каждые полсекунды
last_bright = millis(); // сброить таймер
new_bright = map(analogRead(6), 1, 1000, 3, max_bright); // считать показания с фоторезистора, перевести диапазон
LEDS.setBrightness(new_bright); // установить новую яркость
}
}
/*
if (Serial.available() > 0) { // если что то прислали
ledMode = Serial.parseInt(); // парсим в тип данных int
change_mode(ledMode); // меняем режим через change_mode (там для каждого режима стоят цвета и задержки)
}
*/
switch (ledMode) {
case 2: rainbow_fade(); break; // плавная смена цветов всей ленты
case 3: rainbow_loop(); break; // крутящаяся радуга
case 4: random_burst(); break; // случайная смена цветов
case 6: color_bounceFADE(); break; // бегающий паровозик светодиодов
case 11: pulse_one_color_all_rev(); break; // пульсация со сменой цветов
case 22: flame(); break; // эффект пламени
case 30: new_rainbow_loop(); break; // крутая плавная вращающаяся радуга
case 33: colorWipe(0x00, 0xff, 0x00, thisdelay);
colorWipe(0x00, 0x00, 0x00, thisdelay); break; // плавное заполнение цветом
case 35: Fire(55, 120, thisdelay); break; // линейный огонь
case 37: rainbowCycle(thisdelay); break; // очень плавная вращающаяся радуга
case 39: RunningLights(0xff, 0xff, 0x00, thisdelay); break; // бегущие огни
case 101: one_color_all(255, 255, 255); LEDS.show(); break; //---ALL WHITE
}
}
void btnISR() {
if (millis() - btnTimer > 150) {
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 6: thisdelay = 80; thishue = 0; break; //---CYLON v2
case 11: thisdelay = 30; thishue = 0; break; //---PULSE COLOR SATURATION
//---PLACEHOLDER FOR COLOR LOOP VAR DELAY VARS
case 30: thisdelay = 15; break; //---NEW RAINBOW LOOP
case 33: thisdelay = 50; break; // colorWipe
case 37: thisdelay = 20; break; // rainbowCycle
case 39: thisdelay = 50; break; // RunningLights
case 101: one_color_all(255, 255, 255); LEDS.show(); break; //---ALL WHITE
}
bouncedirection = 0;
one_color_all(0, 0, 0);
ledMode = newmode;
}
Немного удалил ненужные обьекты, но всё равно занимает 103%.
вот код:
Для начала все int, какие можно, на byte поменяйте...
осталось 2078 из 2048 возможных(1% всё равно лишний)
Дак а автора кода чо не спросишь?
осталось блин 30 байт всего лишних. а автора ищи свищи
Вангую - надо уменьшить количество светодиодов ! Не хватает ОЗУ для 600 диодов. Или надо другую бибилотеку, где есть возможность уменьшить битность цвета ...
как раз таки нужно 600 светодиодов, ибо это полный круг на потолок, который мне нужен. а под другую библиотеку переписывать нужно скетч полностью
Хочу и могу часто не совпадают... Есть разные библиотеки. 600 светодиодов 8 бит на цвет - это 600*3=1800 байт
но скетч то я переписать не смогу. Сможете помочь?
Тут ещё даже если и скомпилируется при уменьшении числа светодиодов - может глючить в работе. Стек может наехать на данные, ибо глубина стека точно не известна при компиляции.
Ничо там ниглючит и стэк там нафик ниупал. Делашь процедуру на асме, пихаш ей два параметра: указатель и количество. Формируешь в озу цветовую картинку и скармливаешь её процедуре. Там фсё просто: берём по указателю 3 байта и скармливаем светодиодам и так далее до конца. Процедурка не более 100 команд проца.
Фпринципе если зарезервировать под стэк 100 байтов, то палучицца кол-во светодиодов = память - 2*100. Так-шо 600 нипридел для 2048.
слюшай, сможешь помочь переписать скетч(тут просто переключение эффектов кнопкой, и эффекты норм такие)
Вот эффекты + диоды и жрут память ! Вывод данных на ленту думаю там сделан нормально.
к слову замена инт на байт не работает, лента не горит
Этот массив не меняется, замените его на const, и num_modes - тоже известен, замените на define.
P.S. Код по правилам форума оформите...
Это сразу было понятно ...
Верните как было и перебором узнайте при каком числе нормально компилируется и нормально работает !
Потом уже будем думать что и как...
к слову замена инт на байт не работает, лента не горит
Не все int меняйте, а те, что можно, те что в пределах от 0 до 255
те что в пределах от 0 до 255
думаю, шо тс и знать-низнат о чём ты талкуешь)))
аваще код гавно. нахер там сериал? фавориты и массивы можно в прогмем отослать... ну и далее по рыхлому)))))))))))))))))))))))))))))))))))))))))))))))))))
Serial там для смены режима через терминал - можно выкусить и кусок кода где проверяется есть ли что в порту и если есть - сменить режим. Буфер Serial занимает много памяти !
имхо, пока код не выложит правильно - ничего больше не отвечать
имхо, пока код не выложит правильно - ничего больше не отвечать
Подредачил код. Работают все нужные режимы, НО не работает заполнение одним цветом
Вот такой кейс на выполнение заполнения одним цветом был изначально в коде. Я его добавил в избранное для переключения кнопкой, но когда очередь доходит до него, ардуино зависает. В чем проблема?
"case 101: one_color_all(255, 0, 0); LEDS.show(); break; //---ALL RED"
П. С. Только что вырезал все режимы кроме этого заполнения, и оно заработало, дело в памяти?
выложил, подскажешь один момент пж?
плата ардуино какая?
arduino nano
скорее всего что то не так с этим кейсом, ибо без него всё работает, и переключает, а когда я добавляю его, то она зависает, когда доходит очередь до этого режима
arduino nano
не смешно.
В Нано 2048 байт памяти, а тут только массив в строке 42 занимает 3600 байт. Это не считая всех остальных переменных.
Я смотрю, вы не выполнили ни одной рекомендации по сокращению размера данных. что вам давали выше...
но он же не выполняеться. Как мне его убрать?
но он же не выполняеться. Как мне его убрать?
блин, вам уже несколько человек сказали - не будет 600 диодов работать в этом скетче. Уменяьшайте число диодов либо берите ардуину "толще"
подскажите плс, какую лучше взять? гуглил, не нашел
и кстати, если в теории заставить в этом скетче работать диоды через один белым, то получиться?. Не могли бы помочь написать код для такого варианта, потому что я не силён.)
и кстати, если в теории заставить в этом скетче работать диоды через один белым, то получиться?.
этот скетч для этого не подходит. Нужно писать работу с диодами без библиотеки.
А с библиотекой (любой) - 600 диодов в Нано не влезут.
подскажете как написать/где найти инфу пожалуйста?
Включаем логику (в голове) -> рисуем схему с пониманием что и когда и как делается -> пишем всю схему в виде кода.
легко говорить человеку, который понимает с)
легко говорить человеку, который понимает с)
так в том-то и проблема, дружище.
Что в этой ситуации можно тебе обьяснить, если ты даже int на byte не осилил исправить в простенькой программе?
берите ардуину "толще"
Склеить наноклеем две наны и будет 2048*2=4096 байт памяти. На 600 светиков хватит.
-NMi- второй массив не используется нигде и компилятор его аннигилирует ... так что 600 диодов должно работать при правильном написании кода.
компилятор его аннигилирует ... так что 600 диодов должно работать при правильном написании кода.
анифига! Это если`б униво светодиоды были {3*byte} то всё харашо, а у ниго {3*int} ,,, так-шо 600 никатит! Клей нужен.
Я не знаю какую версию библиотеки он использует - не думаю что в самой библиотеке такой косяк !
второй массив не используется нигде и компилятор его аннигилирует ... так что 600 диодов должно работать при правильном написании кода.
так там даже первый массив (строка 41) уже 1800 байт. А сколько у него еще в коде наворочено?
В общем, 600 ледов впихнуть можно, но только совсем на пределе. И желательно вообще без эффектов :)
Если писать с умом и следить за глубиной вызовов, то можно и эффекты запустить.
Если писать с умом и следить за глубиной вызовов, то можно и эффекты запустить.
охотно верю.
но я бы "блюпилл" взял :) - дешевле и памяти в 10 раз больше
ТС осилит ?
ТС осилит ?
В Нану точно не осилит.
Если писать с умом и следить за глубиной вызовов...
Могу посоветовать только одно - резче, чаще, глубже!!! Эффэкт потрясающий!