Функция NeoPixel Gradient Sweep
Я пытаюсь создать функцию, которая принимает два цвета и создает между ними плавный градиент: один цвет в начале и один в конце
Я просто не могу сообразить, как их равномерно смешать
Я использую библиотеку neopixel
@Shiba-inu, 👍0
1 ответ
Я могу придумать два способа сделать это.
Один – использовать канал H цветового пространства HSV (как показано в ответе на этот вопрос). Это даст вам плавный переход между двумя цветами через предопределенный спектр диапазона оттенков.
Во-вторых, нужно просто указать два цвета, а затем смешать их в разном процентном соотношении в зависимости от того, насколько далеко вы продвинулись по длине.
Например, вот небольшая (непроверенная) функция, которая "смешивает" два отдельных цветовых канала вместе и возвращает результат:
uint8_t mix(uint8_t a, uint8_t b, int pct, int range) {
if (pct <= 0) return a;
if (pct >= range) return b;
return (((uint32_t)a * (range-pct)) / range) + (((uint32_t)b * pct) / range);
}
pct
— это номер светодиода в вашей цепочке, а range
— это общее количество светодиодов.
Таким образом, вы могли бы (гипотетически):
uint8_t red1 = 0, green1 = 255, blue1 = 0;
uint8_t red2 = 255, green2 = 100, blue2 = 100;
for (int i = 0; i < 50; i++) {
uint8_t red = mix(red1, red2, i, 50);
uint8_t green = mix(green1, green2, i, 50);
uint8_t blue = mix(blue1, blue2, i, 50);
setLedColor(i, red, green, blue);
}
- Управлять несколькими полосками WS2812B с разным количеством светодиодов.
- Как определить, какой номинал резистора использовать для светодиодной ленты
- NodeMCU сгорел, я что-то сделал не так?
- Проблема с HTML-кодом в ESP8266 WebServer
- Strip.clear() не очищает/отключает полосу NeoPixel после сброса ESP8266.
- WS2812b - Интерполировать пиксели на неопиксельной матрице с маской
- Преобразование идентификаторов WS2812-LED-Strip-ID при разрезании полосы на несколько параллельных
- Назначение идентификаторов светодиодам WS2812b | NanoLeaf replica
Очень умный Однако горит только один светодиод, извините, сам не могу отладить :<, @Shiba-inu
Мой скетч: https://pastebin.com/0fYD6w3y, @Shiba-inu
Скетч относится к вашему вопросу как текст, а не как ссылка ... пожалуйста, отредактируйте свой вопрос ... правильно отформатируйте код, используя кнопку
{}
, @jsotola«50» в моем примере кода — это количество светодиодов. Очевидно, вам нужно настроить это на фактическое количество светодиодов в вашей установке., @Majenko
Я пробовал и 8 светодиодов, и 50, и 7, считая от 0, но я думаю, что даже с большим количеством светодиодов в скетче загорится более 1 светодиода., @Shiba-inu
Я считаю, что во втором блоке кода этого ответа все вхождения 50 должны быть ссылкой на переменную, содержащую количество светодиодов. Без него вы можете не заметить разницу между 8 светодиодами в зависимости от вашего первоначального выбора цвета. Кроме того, и я думаю, что это может быть вашей основной проблемой - я использую другую библиотеку NeoPixel, но я предполагаю, что она, вероятно, похожа. После установки значений пикселей я должен вызвать
strip.show()
, прежде чем светодиоды отобразят нужные мне значения., @PRS