Возникли проблемы с назначением цвета моим неопикселям

Привет, мне интересно, может ли кто-нибудь мне помочь! В настоящее время я пытаюсь заставить полосу из 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()

Я даже не знаю, правильный ли это код! Надеюсь, кто-то может мне помочь, потому что я так запутался.

, 👍1

Обсуждение

Что означает «не рандомизированный»? Магическое число равно 2^31 - 1, хотя это не имеет особого смысла, поскольку цвет полосы RGB использует только 24 бита, поэтому случайное число, охватывающее все доступное цветовое пространство RGB, будет иметь 2 ^24 -1 как максимальное значение, @chrisl

Я хотел бы, чтобы он менялся с красного на синий, на зеленый, на желтый каждые 2 секунды, но я хотел бы, чтобы это был случайный пиксель, который меняется, а не заданный., @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