Управление яркостью отдельного светодиода в адресной ленте?

Chernoslav
Offline
Зарегистрирован: 31.03.2020

Хочу сделать вспышки случайными диодами в адресной ленте.
Сейчас лента умеет гореть одним цветом, при этом управление яркостью всей ленты реализовано через
FastLED.setBrightness( brightness )
при таком исполнении все диоды горят одинаково и сделать так, чтобы 1 диод вспыхнул ярче не получится.

хочу переделать скетч, чтобы яркость ленты задавалась отдельно для каждого диода, тогда на отдельный диод можно задать бОльшую яркость, чем у остальных.

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

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

 // Reduce color to 75% (192/256ths) of its previous value
 // using "video" scaling, meaning: never fading to full black
  leds[i] %= 192;

значение яркости, понятно буду назначать через переменную.

при этом обратного метода, для увеличения яркости я не нашел.
это не удобно, т.к. хочется просто задавать яркость пикселя, а не считать ее от текущей.
в данном случае придумался "изврат" - задать яркость на максимум, а потом ослабить ее до требуемой, после чего передать значение в ленту.

 // Reduce color to 75% (192/256ths) of its previous value
 // using "video" scaling, meaning: never fading to full black
  leds[i].maximizeBrightness();   
  leds[i] %= 192;

Есть еще вариант работать в палитре CHSV и менять последнее значение в параметрах переменной, но это тоже не удобно, т.к. цвета ленты назначены в RGB и переходить в другую палитру для изменения яркости диодов не очень удобно и громоздко.

leds[i] = CHSV( 224, 187, 255);

нет ли более простого способа просто задавать яркость для leds[i], как это реализовано с яркостью пина Ардуины, к которому подключен отдельный диод, а не лента?

  analogWrite(9, brightness);   

Хочу так же, но для диода в адресной ленте.

sadman41
Offline
Зарегистрирован: 19.10.2016

Работать в HSV - самое простое решение.

Chernoslav
Offline
Зарегистрирован: 31.03.2020

а я могу задать цвет ленты выше в программе в RGB

leds[i] = 0x640СFF;    

а потом поменять яркость пикселя таким образом?

leds[i].setHue( 160);

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

в фастледе есть готовый эффект - глиттер - это ровно то и есть - случайно вспыхивают диоды в разных местах.

Можно бы и посмотреть, ДО того как писать вопросы на форум.

sadman41
Offline
Зарегистрирован: 19.10.2016

Менять в RGB-пространстве цвет можно, можно гнать его к белому, к черному, но вернуться обратно к исходному без перерасхода памяти - невозможно.

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

https://github.com/FastLED/FastLED/wiki/Basic-usage

Вот Вики по фастледу. там все есть.

https://github.com/FastLED/FastLED/wiki/Pixel-reference

конкретно по оперированию цветами точек по любой модели

sadman41
Offline
Зарегистрирован: 19.10.2016

Глитчи у фастледа - это просто замена цвета в случайной позиции на белый, если правильно помню. А потом полная перегенерация картинки на страйпе. Так что, если генерация на математике основана, то способ канает. А если нет, то не очень.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

sadman41 пишет:
если генерация на математике основана, то способ канает. А если нет, то не очень.

1. я не знаю "не на математике" это не "наезд" - просто в голову ничего не приходит.

2. а что мешает запомнить номера и значения пикселей на время вспышки? 10-20 точек по три байта - это вот прям жуткий расход памяти! ;))

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Никто никому не мешает запоминать изменённые цвета и даже держать вторую копию страйпа в памяти. Я лишь написал о том, что в HSV проще откатиться на исходную.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Chernoslav пишет:

хочу переделать скетч, чтобы яркость ленты задавалась отдельно для каждого диода...

хочется просто задавать яркость пикселя, а не считать ее от текущей.

Что-то не понял, чем не годится самый простой и дубовый способ: установить в массиве для каждого светодиода нужный цвет, после чего весь массив целиком гнать на ленту.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Подниму тему, вдруг кому понадобиться. Я про управление яркостью в цветовой схеме RGB.

Код для node ncu, через delay т.к. пример.

У меня работает. Думаю можно создать массив со значениями яркости и вносить изменения там, а потом выводить на ленту.

#define FASTLED_ESP8266_RAW_PIN_ORDER

#include <FastLED.h>
#define NUM_LEDS 50
#define PIN D8
#define COLOR_ORDER RGB

CRGB leds[NUM_LEDS];

void setup() {
    FastLED.addLeds<WS2811, PIN>(leds, NUM_LEDS);
    FastLED.setBrightness(255);
}

void loop() {
    leds[0] = CRGB(0, 255, 0);
    leds[0].fadeLightBy(250);
    FastLED.show();
    delay(1000);
    leds[0] = CRGB(0, 255, 0);
    leds[0].fadeLightBy(25);
    FastLED.show();
    delay(1000);
}

 

Chernoslav
Offline
Зарегистрирован: 31.03.2020

я всё-же решил вопрос с изменением яркости 1 пикселя в ленте через установку на него максимальной яркости и уменьшением на заданное значение.
работает.
посмотреть результат работы эффекта с изменением яркости отдельных пикселей можно по ссылочке с тайм кодом.
https://youtu.be/cms0qPa9EHA?t=100
 

  // LedNumber - номер пикселя в ленте
  // Передаем цвет и яркость на текущий диод ленты
  strip[LedNumber] = LedColor[mode];  // назначаем цвет в формате 0x00FFFF
  strip[LedNumber].maximizeBrightness();  // устанавливаем макс. яркость
  strip[LedNumber] %= LedBright[LedNumber] ;  // назначаем нужную яркость