VU метр на адресной ленте WS 2812. помогите разобраться
- Войдите на сайт для отправки комментариев
Приветствую всех, собственно зарегился дабы спросить совета.
Суть такова, купил адресную ленту на WS 2812, задумка сделать цветомузыку(знаю что есть готовые решения, но хочется хоть немного вникнуть в вопрос, бездумно скопировать всегда успею), вся установка будет 2 вертикальных VUметра по бокам от монитора и горизонтальная полоса на полке над столом(что будет там еще не думал). Застрял на VUметре, экспериментирую с лентой 27 диодов, в целом убив пару дней получил вполне неплохой результат, шкала работает даже с хреновым микрофоном(хорошие микрофоны едут). Идея такова: на ленте горит постоянно тускло задник(некий цвет) и при работе VUметра на диодах зажигаемых самой шкалой задник гаснет, потом загорается снова. Это как бы работает, проблема в том, что когда сигнал ==0, лента гаснет полностью(иногда тускло светит первый диод, хз почему) при появлении минимального сигнала на вход(пробовал микрофон и потенциометр) шкала работает,все не занятые шкалой диоды светятся фоновым цветом.
Подскажите как сделать чтобы при пропадании сигнала на AUDIO_IN продолжал гореть задник, желательно на пальцах как маленькому))
#define STRIP_PIN 12 // пин ленты #define NUMLEDS 27 // число диодов в ленте #define COLOR_DEBTH 3 // глубина цвета #define CRT_OFF #define STRIP_TYPE LED_WS2812 #include <microLED.h> // подключаем библиотеку #define AUDIO_IN A0 //вход звука #define LOW_VAL 18 //нижний порог звука #define HI_VAL 670 //верхний порог звука #define EXT 1.1 #define SMOOTH 0.3 microLED<NUMLEDS, STRIP_PIN, -1, STRIP_TYPE, ORDER_GRB, CLI_AVER> strip; //инициализируем ленту int val=0,val2=0,val3=0,x=0; //обьявляем переменные uint32_t timer; //обьявляем таймер void setup() { Serial.begin(9600); //включаем порт strip.setBrightness(255); //яркость ленты strip.clear(); //очищаем ленту strip.show(); //обновляем ленту delay(1); } void loop() { mGradient< 4 > myGrad; // создать градиент с именем myGrad на 4 точки myGrad.colors[0] = mGreen;// указываем цвет каждой точки myGrad.colors[1] = mGreen; myGrad.colors[2] = mOrange; myGrad.colors[3] = mRed; if(millis()-timer>1) { timer=millis(); val2=0; //этот кусок сперт у Алекса Гайвера val=analogRead(AUDIO_IN); //читаем вход аудио //с ним получается более плавно и красиво if(val2<val)val2=val; val2=map(val2,LOW_VAL,HI_VAL,0,500); val2=constrain(val2,0,500); val3=val2 * SMOOTH + val3 * (1 - SMOOTH); x=map(val3,15,495,0,NUMLEDS); //масштабируем уровень звука в номер светодиода x=constrain(x,0,NUMLEDS); Serial.print(val); //отправляем всякое в порт для мониторинга Serial.print("\t"); Serial.print(val2); Serial.print("\t"); Serial.print(val3); Serial.print("\t"); Serial.println(x); } if(val3>LOW_VAL) //если текущий уровень звука превышает минимальный порог { for(int i=0;i<=x;i++) //для диодов от 1 и до Х (это сама шкала, назовем блок1) { strip.set(i,myGrad.get(i,NUMLEDS)); //заливаем ленту градиентом strip.setBrightness(255); strip.show(); //обновляем ленту } for(int i=NUMLEDS;i>x+1;i--) //вот эта фигня заливает фоном все что не занято самой шкалой и позволяет шкале плавно падать(назовем блок 2) { strip.set(i,mWheel8(200,5)); //заливаем ленту сплошным цветом-подложкой strip.show(); //обновляем ленту } } else { for(int i=0;i<NUMLEDS;i++) //а вот это должно заливать всю шкалу цветом когда сигнала нет(назовем блок 3) { //оно и работает, заливает шкалу цветом при старте strip.set(i,mWheel8(200,5)); //но после прихода сигнала и срабатывания шкалы больше не работает strip.show(); //пробовал и else if(val3<LOW_VAL), и разные числа подставлял вместо LOW_VAL, один фиг //а вот если из кода выкинуть блок 2, то это все работает, но пропадает уменьшение шкалы, она только растет и полностью исчезает } //но фон при этом работает корректно. } }
проблема в том, что когда сигнал ==0, лента гаснет полностью
Пока бывалые не ответили, совет от новичка:
А если сделать всегда сигнал = сигнал + 1 ?
проблема в том, что когда сигнал ==0, лента гаснет полностью
Пока бывалые не ответили, совет от новичка:
А если сделать всегда сигнал = сигнал + 1 ?
Можно конечно поиграться с настройкой LOW_VAL,выставить =0, чтобы фоновый шум зажигал 1 диод в шкале, это вроде должно решить проблему, но пока хочется разобраться.
Поигравшись еще немного, отключил яркость у цвета в блоке 2, убрал задник при работе, а в блоке 3, так сказать задник покоя оставил все как есть и заметил что при работе шкалы задник иногда промигивает, и это задник покоя, т.к задник блока 2 имеет яркость 0. Убрав яркость у задника покоя убрал и всякие промигивания задника. Тоесть код то пытается работать, просто я как то не так все написал, наверняка проблема на поверхности.
Так я и предложил сделать это , чтобы разобраться легче было...выяснить, в этом дело, или ещё в чём
А у гайвера на форуме не помогают с этим поделием бороться?
Я бы, как минимум, вынес show() и пр. из циклов, да обновлял бы страйп только когда уровень действительно изменился, а не долбил беспрестанно в шину.
Ага,спасибо, попробую. От меня как то ускользнула такая очевидная вещь что если .show() в цикле то лента будет обновляться с каждым шагом цикла.
З.Ы. обновлять страйп только когда изменился, как это реализовать? как то так?(код ниже)
strip.setBrightness(255) зачем в лупе? Он уже в сетапе есть.
Обновление по изменению - это когда предыдущее значение уровня звука не равно текущему.
Без настройки яркости в лупе яркость шкалы равна 100, независимо от того, сколько указано в сетапе, уменьшить ниже 100 можно, уменьшается, увеличить никак, все что выше 100 все равно светит как 100. И убрать ее нельзя, кмк это связано с тем,что яркость подложки 5 и она сажает всю ленту на эту яркость. Честно я хз как это работает, экспериментально получилось сделать яркую шкалу и тусклый задник вот так вот, с двумя яркостями. Я только с этим день убил.
Не вижу ничего, что могло бы делать strip.setBrightness(100). Разве что гайверовская библиотека работает, как написана...
Взяли бы FastLed и не страдали ерундой с микроледами этими
Переписал на FastLED, все заработало, правда пока шкала одноцветная. Осталось разобраться как сделать градиент.
Осталось разобраться как сделать градиент.
через цветовое пространство HSV
http://fastled.io/docs/3.1/group___colorutils.html#ga3144bb2bb66aeed33e2...
void fill_gradient_RGB (CRGB *leds, uint16_t numLeds, const CRGB &c1, const CRGB &c2)
Осталось разобраться как сделать градиент.
Ну, ТС же сказал, что разобраться хочет!
Falcon689, в итоге Вы сделаете так, как Вам сказали, ибо это правильный подход. Но чтобы Вам именно на пальцах разобраться, я могу на пальцах рассказать как делается любой плавный переход от одного цвета к другому. И не только цвета.
Итак, у Вас есть три независимые составляющие цвета - r, g и b. Тогда, если Вы представите трёхмерное пространство с осями R, G и B, то любой цвет будет точкой в этом пространстве. Предположим, у нас есть два цвета C1 (равный r1, g1 и b1) и C2 (равный r2, g2 и b2). Нарисуем эти цвета в виде двух точек в пространстве RGB и соединим их отрезком.
Теперь, чтобы сделать плавный переход от цвета C1 к цвету C2 достаточно разбить этот отрезок на нужное количество равных частей и взять получившиеся на нём точки в качестве промежуточных цветов. На рисунке ниже я показал промежуточные цвета от руки, может не очень точно, но, надеюсь, идея понятна.
ну, а вычислить координаты (r, g и b) этих промежуточных цветов не составляет труда, если геометрия за 7-ой класс не совсем выветрилась
http://fastled.io/docs/3.1/group___colorutils.html#ga3144bb2bb66aeed33e2...
void fill_gradient_RGB (CRGB *leds, uint16_t numLeds, const CRGB &c1, const CRGB &c2)
Мне бы еще понять что с этим делать, я потому и использовал библиотеку Гайвера, что не смог понять как в этой воспользоваться градиентами. Кто нибудь может дать реальный пример? Я даже не понимаю в какую часть кода это пихать. В сетап не хочет, отдельный войдом не хочет.
http://fastled.io/docs/3.1/group___colorutils.html#ga3144bb2bb66aeed33e20f4fdd6cc1a98
void fill_gradient_RGB (CRGB *leds, uint16_t numLeds, const CRGB &c1, const CRGB &c2)
Мне бы еще понять что с этим делать, я потому и использовал библиотеку Гайвера, что не смог понять как в этой воспользоваться градиентами. Кто нибудь может дать реальный пример?
судя по вопросу, вы не градиентами пользоваться не умеете, а вообще о программировании на Си имеете очень смутное представление... И что вы предлагаете - начать вас учить с нуля. что такое функции и что такое парметры?
Вы тот код, что пытаетесь исправить - хоть чуть-чуть понимаете? У вас в нем градиент формировался в строке 56. Вот примерно туда и пихайте.
С этим все понятно, градиент с изменяющимися в цикле компонентами RGB вполне работает, но при этом начинает моргать вся лента. Хотелось бы понять как пользоваться инструментами библиотеки для создания градиентов, а я никак не могу понять что куда писать из её документации.(
Хотелось бы понять как пользоваться инструментами библиотеки для создания градиентов, а я никак не могу понять что куда писать из её документации.(
я не разбирался с "инструментами библиотеки". а делал "градиент" вручную с помощью HSV цвета. Если задавать цвет как HSV(color, 255,255). то меняя color от 0 до 255 вы получаете все оттенки радуги от красного до красного. Если для градиента нужна только часть радуги - берете часть диапазона.
Единственный минус - разрешение по цвету получается 8бит на весь цветовой круг. Но для небольших гирлянд этого хватает.
Вы тот код, что пытаетесь исправить - хоть чуть-чуть понимаете? У вас в нем градиент формировался в строке 56. Вот примерно туда и пихайте.
Понимаю, сейчас код поменял, переехал на библиотеку FastLed. там задники работают, все ок. Я хочу для шкалы использовать градиент на 4 цвета, как в варианте у Гайвера, чтобы градиент условно делил участок лента на 4 части и заливал их цветами с переходом(зеленый-зеленый-желтый-красный). Насколько я понимаю мне подойдет вот эта вот функция
понятно что это функция, я ее ставлю в 51 строчку,прописываю цвета, а вот что такое *leds и numleds? Понятно что некоторые переменные для настройки, что конкретно я должен туда написать чтобы компиллятор понял чего я хочу, у него то переменная не обьявлена, то слишком много численных данных, то еще какая то ошибка.
И да, я совершенно не разбираюсь в программировании на С++, я потыюсь хоть как то вникнуть в это, и мне это ппц как трудно дается.
вот эта вот функция
понятно что это функция, я ее ставлю в 51 строчку,прописываю цвета, а вот что такое *leds и numleds?
*leds - ссылка на массив данных для ленты. у вас он называется strip
numleds - очевидно, число ЛЕДов (вы английский также знаете, как и Си)
А вообще. все параметры функции можно посмотреть в исходном коде библиотеки. Ну или в описании. если оно есть. Но довольно часто описаний к библиотекам нет, только код.
Вставил в таком виде, пишет Arduino: 1.8.13 (Linux), Плата:"Arduino Uno"
Функцию же я должен обьявить отдельно, до лупа, а потом просто вызвать ее в нужный момент. Сделал так
жалуется на вторую строчку (#define NUMLEDS 27)
Функцию же я должен обьявить отдельно, до лупа
если это функция библиотеки, то она уже обьявлена в библиотеке. А если вы ее сами придумали - то ее не только обьяывить, в ней еще и действия какие-то прописать надо :)
Про функции мне понятно, у меня в РУ машине все движения написаны функциями. В общем возвращаюсь к варианту с библиотекой Гайвера, там оно было красивее и понятнее, в FastLED все работает пока цвета даны в формате RGB, при попытке задать разную яркость отдельно шкале и задникам ломается к хренам математика и переменная val3 начинает принимать рандомные значения,в том числе и отрицательные.
в FastLED все работает пока цвета даны в формате RGB, при попытке задать разную яркость отдельно шкале и задникам ломается к хренам математика и переменная val3 начинает принимать рандомные значения,в том числе и отрицательные.
это, без сомнения, библиотека FastLED виновата, что ваша переменная val3 принимает отрицательные значения?
Вам надо начать не с правки кода. что вы сейчас делаете наобум - а с чтения учебников, хотя бы самых элементарных. Когда вы перестанете пытаться вызывать функцию подобным образом:
- тогда и приходите.
А пока разговаривать с вами не о чем. Это как младенцу устройство синхрофазотрона обьяснять. я такое не умею, мож кто другой поможет.
градиент с изменяющимися в цикле компонентами RGB вполне работает, но при этом начинает моргать вся лента.
Ну, это вопрос к Вашей программе, а вовсе не к способы получения градиента :-)
Вставил в таком виде
Зачем?
У Вас есть какая-нибудь книжка по С/С++? Или посоветовать?
Пока Вы "вставляете в таком виде" Вам не поможет никакая волшебная библиотека.
Вставил в таком виде
Зачем?
У Вас есть какая-нибудь книжка по С/С++? Или посоветовать?
Пока Вы "вставляете в таком виде" Вам не поможет никакая волшебная библиотека.
Посоветуйте пожалуйста. Начинал с Джереми Блума, ардуино для начинающих, а дальше по наитию)
Вам нужен язык, а не "ардуино для начинающих".
Читать надо вот это. Оно совсем не про ардуино - оно про язык на котором Вы пытаетесь писать не зная его. Но, если Вы совсем никогда не программировали, то, возможно, для Вас это сложновато. Тогда попробуйте начать с вот этого. Это больше про Ардуино, но это совсем примитивно для блондинок и беременных доярок. Но если Вы хотя бы это будете твёрдо знать, то количество бреда, вроде того, который я цитировал, сильно поубавится. Попробуйте
Просмотрел то, что для доярок, все описанное там Джереми Блум вполне неплохо разжевал, и ничего нового я там не нашел. Как бы на этой основе РУ машинка с подвесом камеры на сервах работает. Попробую почитать ту, что посложнее, там реально много для меня нового. Спасибо за совет.
Если Вы там не нашли ничего нового, и Вам известно всё, что там написано, то кто же, простите, написал вот это:
Вставил в таком виде
Там написано как нужно вызывать функции. Хотя, если Вы не изучили а только
Тут достаточно простого скилла гуглопоиска: https://github.com/atuline/FastLED-Demos/blob/master/fill_grad/fill_grad...