Возникли проблемы с назначением цвета моим неопикселям
Привет, мне интересно, может ли кто-нибудь мне помочь! В настоящее время я пытаюсь заставить полосу из 10 неопикселей изменить цвет. Я хочу иметь возможность закодировать случайный неопиксель в полосе, чтобы он последовательно менялся на красный, синий, зеленый и желтый через 2 секунды. Я относительно новичок в Arduino, поэтому я все еще учусь. Я использовал приведенный ниже код, и он делает все, что я хочу, но я хотел бы установить цвет, чтобы они не были случайными. Я нашел этот код в Интернете.
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define LED_COUNT 50
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN, NEO_RGB + NEO_KHZ800);
void setup() {
strip.begin();
strip.show(); // Инициализируем все пиксели выключенными
}
void loop()
{
randomPixelColor(100);
}
void randomPixelColor(int wait)
{
int i= random(strip.numPixels());
uint32_t c = random(2147483647); // Я понятия не имею, что делает это сумасшедшее число.
strip.setPixelColor(i, c);
strip.show();
delay(1000);
} // конец void randomPixelColor()
Я даже не знаю, правильный ли это код! Надеюсь, кто-то может мне помочь, потому что я так запутался.
@Erin Shankland, 👍1
Обсуждение1 ответ
Вы уже выбираете случайный индикатор. Теперь вам нужно только определить и использовать те цвета, которые вам нужны. Определите массив с цветами:
#define COLOR_N 4
uint32_t colors[COLOR_N] = {0x00FF0000, 0x000000FF, 0x0000FF00, 0x00FFFF00};
Также определите статическую или глобальную переменную для хранения текущего цвета:
uint8_t current_color = 0;
Затем используйте этот массив в strip.setPixelColor()
с переменной current_color
в качестве индекса:
strip.setPixelColor(i, colors[current_color]);
Теперь увеличьте current_color
для следующего цвета. Чтобы снова перейти от желтого к красному, вы можете использовать оператор по модулю %
:
current_color = (current_color + 1) % COLOR_N;
Вы можете легко увеличить количество цветов, записав новые цвета в массив colors
и задав для COLOR_N
соответствующее значение.
О значениях цвета. Неопиксели используют цветовую модель RGB с глубиной цвета 8 бит. Это означает, что каждый компонент (красный, зеленый и синий) занимает ровно 1 байт. Таким образом, для каждого компонента имеется 256 шагов. Чтобы описать полный цвет, вам нужны все три компонента, то есть 3 байта или 24 бита. Тип данных, который соответствует этому uint32_t
(целое число без знака с 32 битами), хотя старший байт здесь не используется (если вы используете полосу RGBW, этот байт является компонентом для белых светодиодов).
Мы можем записать число, представляющее полный цвет, в виде шестнадцатеричного значения. Каждый компонент занимает 2 шестнадцатеричных цифры:
0x00RRGGBB
где 0x
— это префикс, обозначающий шестнадцатеричное число, а RR
, GG
и BB
— это компоненты красного, зеленого и синего цвета. Таким образом, полностью красный — это 0x00FF0000
, полностью синий — 0x000000FF
(начальные нули не обязательны, но я думаю, что они помогают удобочитаемости и сопоставимости).
Здесь смешивание цветов работает аддитивно, как и свет. Все компоненты, смешанные вместе в одном и том же соотношении, дают вам белый цвет, все компоненты, равные нулю, означают черный цвет. Таким образом, вы получаете желтый цвет, смешивая красный и зеленый в одинаковом соотношении. Таким образом, полный желтый цвет — это 0x00FFFF00
.
Хороший ответ. Однако вы должны объяснить, откуда берутся ваши цветовые значения., @Duncan C
Что-то вроде: «RGB может быть выражен как 3 2-значных шестнадцатеричных (шестнадцатеричных) числа плюс 2 начальных нуля. (Шестнадцатеричные числа варьируются от 0 до F, поэтому 2-значное шестнадцатеричное число находится в диапазоне от 00 до FF или от 0 до 255 десятичных. ) Возьмите 8-символьное шестнадцатеричное число. Цифры будут такими: 00RdGrBl, где "Rd" — это цифры для красного цвета, "Gr" — это цифры для зеленого, а "Bl" — это цифры для зеленого. По соглашению вы пишете шестнадцатеричные числа. с префиксом "0x", который сообщает читателю (и компилятору), что число находится в шестнадцатеричном формате. Таким образом, цвет 0x00FF0000 имеет FF, или 255, для красного, и 0 для зеленого и синего. Этот цвет ярко-красный., @Duncan C
Цвет 0x00FFFF00 имеет FF (255) для красного и зеленого и не имеет синего. В аддитивных цветах красный + зеленый = желтый. (Светодиоды и дисплеи используют аддитивные цвета. Краски и штампы используют субтрактивные цвета, которые мы выучили в школе, где синий + желтый = зеленый), @Duncan C
@DuncanC Я добавил абзац на эту тему, @chrisl
Выдающийся. Возможно, вы захотите добавить немного о разнице между аддитивными и субтрактивными цветами, так как это чертовски сбивает с толку почти всех, поскольку мы учим на уроках рисования, что синий + желтый = зеленый., @Duncan C
@DuncanC Я бы предпочел не отвечать на этот вопрос. Смешение цветов не входило в вопрос, и ОП не задавал вопросов по этому поводу. Также есть много ресурсов, которые объясняют, что очень хорошо, @chrisl
- Управлять несколькими полосками WS2812B с разным количеством светодиодов.
- Светодиодная лента WS2812B + First Pixel продолжает ломаться
- Использование кольца NeoPixel без Arduino
- Странное поведение со светодиодной лентой WS2812B RGB
- Какая хорошая альтернатива Arduino Nano, которую можно использовать с Neopixels?
- Как сгладить переход на другой цвет NEOPIXELS
- Как запрограммировать кнопку на цвет для полоски неопикселей?
- Реструктурировать код для многозадачности Neopixel + ИК-пульт + ардуино
Что означает «не рандомизированный»? Магическое число равно 2^31 - 1, хотя это не имеет особого смысла, поскольку цвет полосы RGB использует только 24 бита, поэтому случайное число, охватывающее все доступное цветовое пространство RGB, будет иметь 2 ^24 -1 как максимальное значение, @chrisl
Я хотел бы, чтобы он менялся с красного на синий, на зеленый, на желтый каждые 2 секунды, но я хотел бы, чтобы это был случайный пиксель, который меняется, а не заданный., @Erin Shankland