Цвет хранится в трех байтах, вне зависимости от представления CRGB или CHSV - поглядите библиотеку. Менять же только байт H без байтов SV можно, но естественно при этом диапазон смены цвета будет сильно ограничен.и хранение цвета превращается в 2 байта
Все те же три байта CHSV(Hue, Sat, Val) - три байта, так же как CRGB(r, g, b).В FastLED 0-360 сжаты в 0-255 (1 байт) двумя разными способами и хранение цвета превращается в 2 байта. Использованная функция учитывает только сжатую hue-составляющую, saturation=255, потому и тип переменной - байт.
Я не совсем в курсе о каком коде вы говорите, но к примеру в коде лампы для генерации используются все три состовляющие CHSV, пусть даже для насыщенности и яркости заданы - 255, а меняется лишь оттенок. Впрочем это не мешает доработать код таким образом, чтобы менять и их также.Что касается отсутствия SV в определении цвета: функция предназначена для генерации радуги, то есть не предполагается ненасыщенных цветов.
CHSV thisColor = CHSV(((hue + i * scale) * micCoef), 255, 255);
Да, рекомендую вам сначала поглядеть код библиотеки, прежде чем утверждать что-либо про хранение в одном или двух байтах. Если же вы про реализацию радуги, то уж поверьте - добавить мигалку той же яркостью или насыщенностью дело пары минут, в лампе же микрофон влияет на скорость смещения цвета в радуге и на наклон радуги (т.к. используется матрица, а не лента). Впрочем код тоже можете поглядеть, если вам это нужно.@kDn, так, может, сначала код посмотреть? Смысл добавлять управление насыщенностью и яркостью, если в данном применении они не нужны?
Для информации, и понимания - определить цвет воспользовавшись только H и положив хрен на SV нельзя. Нужно в обязательном порядке определить все ТРИ параметра. Если используется статическая переменная где вся структура нулевая, то при задании лишь H будет всегда черный цвет, т.к. и насыщенность и яркость - в 0. Если же насыщенность увести в 0, а яркость в максимум - то всегда будет белый цвет. Если же возьмете переменную на стеке и не инициализируете ее, то потенциально в SV окажется мусор и итоговый цвет будет произвольным.что в RGB невозможно определить цвет (как длину волны), воспользовавшись только одной составляющей, а в HSV - можно.
Уберите цветовую коррекцию ленты, и вы наверное увидите, что "долго красный" это оттенки красного, их в палитре действительно очень много. Имхо.Плавная смена цвета всей ленты - долго сидит на красном. потом сменяется все как надо. и опять долго красный.
Так HUE в CHSV это как раз с красного до красного1. Плавная смена цвета всей ленты - долго сидит на красном. потом сменяется все как надо. и опять долго красный.
Немного непонятно нафига использовать встроенные функции для данной задачи, но даже если так - то всегда можно поглядеть ее исходник...if (timer_func(RUNNING_SPEED)) {
this_color -= 1;
}
fill_rainbow( leds, 50, this_color, RAINBOW_STEP ); // RAINBOW_STEP 1 - 30
визуально ничего не изменилось. вернул обратно.Уберите цветовую коррекцию ленты, и вы наверное увидите, что "долго красный" это оттенки красного, их в палитре действительно очень много. Имхо.
применял четыре разных вариант для радуги. везде одинаково.Так HUE в CHSV это как раз с красного до красного
Немного непонятно нафига использовать встроенные функции для данной задачи, но даже если так - то всегда можно поглядеть ее исходник...
Я не совсем понимаю чего вы добиваетесь меняя шаг преращения цвета для каждого последующего светодиода... И какого результата ждете, когда этот шаг делаете 50, что равнозначно 5 шагам для байта, может вам проще инкремент или декремент this_color увеличить на сколько надо, ну и шаг сильно не задирать.
* Зачем лимит тока отключали непонятно... 50 светюликов может БП и не перегрузят, но пару сотен - легко![]()
RAINBOW_STEP - это дельта-оттенок между светодиодами
void fill_rainbow( struct CHSV * targetArray, int numToFill,
uint8_t initialhue,
uint8_t deltahue )
{
CHSV hsv;
hsv.hue = initialhue;
hsv.val = 255;
hsv.sat = 240;
for( int i = 0; i < numToFill; ++i) {
targetArray[i] = hsv;
hsv.hue += deltahue;
}
}
Это не цвет, а оттенок, от которого идет приращение шагаа цвет тут как раз this_color. он и изменяется.
И что вы хотели сказать этим кодом? К примеру если подставить значения:if (timer_func(RUNNING_SPEED)) {
rainbow_steps -= 1; // rainbow_steps++ counter меняется от 0 до 255 (тип данных byte)
}
for (int i = 0; i < NUM_LEDS; i++ ) {
leds = CHSV(rainbow_steps + i * RAINBOW_STEP, thissat, 255); // HSV. Увеличивать HUE (цвет)// умножение i уменьшает шаг радуги
}
if (timer_func(RUNNING_SPEED)) {
rainbow_steps -= 1; // rainbow_steps++ counter меняется от 0 до 255 (тип данных byte)
}
EVERY_N_SECONDS(5){ // отладка, раз в 5 секунд, доп. вызовом
for (int i = 0; i < NUM_LEDS; i++ ) {
uint8_t hue = rainbow_steps + i * RAINBOW_STEP;
leds = CHSV(hue, thissat, 255); // HSV. Увеличивать HUE (цвет)// умножение i уменьшает шаг радуги
Serial.println(hue);
}
}
// это остается как есть
for (int i = 0; i < NUM_LEDS; i++ ) {
leds = CHSV(rainbow_steps + i * RAINBOW_STEP, thissat, 255); // HSV. Увеличивать HUE (цвет)// умножение i уменьшает шаг радуги
}
как по мне, правильная логика как раз в первом случае. Если во втором выражении раскрыть скобки, то получится что первое это 250 + 5*i, а второе превращается в 250*5 + 5*iесли подставить значения:
250 + 49 * 5 = , то вы же понимаете, что это совсем не то же самое, что (250 + 49) * 5 ? В первом случае будет хз что, во втором - правильная логика.
вот с этого места поподробнее. Вы в параметрах функции радуги указываете 50 диодов и потом удивляетесь, что только 50 диодов и светятся?э... так. 50 это вообще то кол-во светодиодов! в документации
В общем-то да, вы правы, хоть оба варианта и дают аналогичное смещение, но первый правильнее, это меня проглючилокак по мне, правильная логика как раз в первом случае.
Мне прислали ленту WS8212 . Не совсем понятно про радугу, что тут обсуждали, смещение, шаг и т.д. Не сочтите за труд подсказать , где можно про это прочитать. Тоже возьму карандаш, тетрадку, калькулятор и посчитаю.
@technotrasher,
Не поверите, иногда, работая над эффектами для лампы, именно так и делаю, бумажка в клеточку, карандаш и калькулятор. Сижу рисую, пересчитываю...
нет, конечно.вот с этого места поподробнее. Вы в параметрах функции радуги указываете 50 диодов и потом удивляетесь, что только 50 диодов и светятся?
а что так не работает, что так. все равно 50 светодиодов и все. ставлю больше и пропадают цвета. а по числам все как бы должно работать! и!!! если сделать отдельный скетч - все отлично работает. это где то что то на что то влияет где то внезапно именно в данном скетче.как по мне, правильная логика как раз в первом случае. Если во втором выражении раскрыть скобки, то получится что первое это 250 + 5*i, а второе превращается в 250*5 + 5*i
Как видим, и то и то выражение дают радугу с шагом 5. Разница только в смещении , в первом случае это 250, как мы и хотели, а во втором смещение 1250%256 = 226, то есть несколько иное.
а вот по фаст лед документации внятной мало. есть много на английском языке в которой глаза сломать, если новичок. есть пару примеров. есть пару зарубежных форумов, где тоже народ жалуется на невнятную документацию и помогают друг другу разбираться.Мне прислали ленту WS8212 . Не совсем понятно про радугу, что тут обсуждали, смещение, шаг и т.д. Не сочтите за труд подсказать , где можно про это прочитать. Тоже возьму карандаш, тетрадку, калькулятор и посчитаю.
по факту фастлед самая навороченная и раскрученная либа для ленты, и вряд ли для какой библиотеки больше информации чем для фастледа. А что до английского - то вообщето любой программист и электронщик без него никудаа вот по фаст лед документации внятной мало. есть много на английском языке в которой глаза сломать
если в отдельном скетче работает - то начинайте постепенно добавлять к нему другие функции и эффекты. Ваша задача поймать момент, когда вот это - еще работает, а сдобавлением вот той строчки - уже нет. А дальше копайте, что же там такое в последней добавленной строке, что она все портита что так не работает, что так. все равно 50 светодиодов и все. ставлю больше и пропадают цвета. а по числам все как бы должно работать! и!!! если сделать отдельный скетч - все отлично работает