Функция NeoPixel Gradient Sweep

Я пытаюсь создать функцию, которая принимает два цвета и создает между ними плавный градиент: один цвет в начале и один в конце

Я просто не могу сообразить, как их равномерно смешать

Я использую библиотеку neopixel

, 👍0


1 ответ


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);
}
,

Очень умный Однако горит только один светодиод, извините, сам не могу отладить :<, @Shiba-inu

Мой скетч: https://pastebin.com/0fYD6w3y, @Shiba-inu

Скетч относится к вашему вопросу как текст, а не как ссылка ... пожалуйста, отредактируйте свой вопрос ... правильно отформатируйте код, используя кнопку {}, @jsotola

«50» в моем примере кода — это количество светодиодов. Очевидно, вам нужно настроить это на фактическое количество светодиодов в вашей установке., @Majenko

Я пробовал и 8 светодиодов, и 50, и 7, считая от 0, но я думаю, что даже с большим количеством светодиодов в скетче загорится более 1 светодиода., @Shiba-inu

Я считаю, что во втором блоке кода этого ответа все вхождения 50 должны быть ссылкой на переменную, содержащую количество светодиодов. Без него вы можете не заметить разницу между 8 светодиодами в зависимости от вашего первоначального выбора цвета. Кроме того, и я думаю, что это может быть вашей основной проблемой - я использую другую библиотеку NeoPixel, но я предполагаю, что она, вероятно, похожа. После установки значений пикселей я должен вызвать strip.show(), прежде чем светодиоды отобразят нужные мне значения., @PRS