Запоминание цвета
Привет, ребята, у меня есть светодиодная сетка. это 8 сторон, которые адресуются байтами от '1'
до '8'
. (Kinect отправляет эти байты через обработку) Я также создал три кнопки в процессе обработки, которые меняют цвет светодиодов. ('R'
,'G'
,'B'
).
Я застрял в коде, мой код теперь при получении байтов: 'R'
, 'G'
или 'B'
меняет все светодиоды на этот цвет. вместо того, чтобы запоминать цвет и подсвечивать только стороны, определенные '1'
, '2'
, '3'
, '4'
, '5'
, '6'
, '7'
, '8'
> значения.
Мне нужно, чтобы он помнил выбранный цвет R, G, B до тех пор, пока не будет выбран другой цвет, и использовал только байты '1'
, '2'
, '3'
, '4'
, '5'
, '6'
, '7'
, '8'
, чтобы выбрать, какая сторона сетки будет подсвечиваться.
Вот мой код:
#include <FastLED.h>
#define LED_PIN 6
#define NUM_LEDS 360
CRGB leds[NUM_LEDS];
CRGB saved_color;
void setup()
{
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(50);
Serial.begin(9600);
FastLED.clear();
FastLED.show();
}
void loop()
{
if (Serial.available() > 1)
{
int incomingByte = Serial.read();
if (incomingByte > '0' && incomingByte < '9')
{
FastLED.clear();
}
if (incomingByte == 'R') {
saved_color = CRGB(255, 0, 0);
}
else if (incomingByte == 'G') {
saved_color = CRGB(0, 255, 0);
}
else if (incomingByte == 'B') {
saved_color = CRGB(0, 0, 255);
}
if (incomingByte == '1')
for (int i = 0; i <= 44; i++) {
leds[i] = saved_color;
}
else if (incomingByte == '2')
for (int i = 44; i <= 89; i++) {
leds[i] = saved_color;
}
else if (incomingByte == '3')
for (int i = 90; i <= 134; i++) {
leds[i] = saved_color;
}
else if (incomingByte == '4')
for (int i = 135; i <= 179; i++) {
leds[i] = saved_color;
}
else if (incomingByte == '5')
for (int i = 180; i <= 224; i++) {
leds[i] = saved_color;
}
else if (incomingByte == '6')
for (int i = 225; i <= 269; i++) {
leds[i] = saved_color;
}
else if (incomingByte == '7')
for (int i = 270; i <= 314; i++) {
leds[i] = saved_color;
}
else if (incomingByte == '8')
for (int i = 315; i <= 359; i++) {
leds[i] = saved_color;
}
FastLED.show();
}
}
Я опишу проект немного подробнее. Это лампа (в форме восьмиугольника) с 45 светодиодами с 8 сторон. каждая сторона активируется движением и отправляет байт ('1'
, '2'
, '3'
, '4'
, '5'
, '6'
, '7'
, '8'
) до включите одну сторону лампы.
Я хочу иметь возможность выбирать цвет перед отправкой байтов. поэтому мне нужно, чтобы Arduino запоминал байты 'R'
, 'G'
, 'B'
и менялся только при отправке другого байта.
@Juriaan , 👍0
Обсуждение1 ответ
Лучший ответ:
Массив CRGB leds[NUM_LEDS]
содержит только текущее состояние светодиодов. Он используется для передачи данных на светодиоды. Если вы хотите, чтобы код сохранял один цвет для последующего использования, вам нужна дополнительная переменная, которая может хранить цвет.
Добавить переменную в глобальном масштабе:
CRGB saved_color;
В операторах if
для R, G и B вы можете установить для этой переменной соответствующее значение, например:
if(incomingByte == 'R'){
saved_color = CRGB(255,0,0);
}
И в операторах if
от 1 до 8 вы можете использовать это значение, например:
if (incomingByte == '1'){
for (int i = 0; i <= 44; i++) {
leds[i] = saved_color;
}
}
Примечание. Приведенный выше код не меняет светодиоды на R, G или B. Они просто устанавливают цвет для будущих операций с 1 по 8.
Хорошо, и как мне заставить его переключаться? будет ли это с оператором else if? Я обновил свой пост, чтобы показать свой код с вашими советами., @Juriaan
Что ты имеешь в виду? Вы должны отправить R, G или B, чтобы выбрать соответствующий цвет (красный, зеленый, синий) для будущего действия с 1 по 8. Таким образом, если вы отправите R, лампа будет иметь предустановленный красный цвет (не загорается). Если вы затем отправите 4, сторона 4 загорится красным. Если вы затем отправите 2, сторона 2 загорится красным. Если вы затем отправите G, внутренний пресет будет установлен на зеленый (пока не меняет свет). Если вы затем отправите 5, сторона 5 загорится зеленым цветом., @chrisl
неважно, сэр, я говорил слишком рано. теперь работает бро!!! большое спасибо, @Juriaan
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
вы получаете байты, а не «сериалы», @Juraj
Я отправляю «байты» из обработки в arduino. 1,2,3,4,5,6,7,8. @jsotola я отредактировал свой код, @Juriaan
во-первых, вам нужно четко определить проблему .... arduino правильно получает данные, поэтому kinect и обработка не имеют значения .... затем прочитайте листинг вашей программы .... что произойдет, если будет получен
R
? ... что должно произойти? .... что произойдет, если будет получено3
? ... что должно произойти?, @jsotola@jsotola явно проблема в коде Arduino. Я хочу знать, как запомнить байты R, G, B и как переключаться между ними., @Juriaan
Я не совсем понимаю, что ожидается и какое поведение наблюдается. Код изменит все светодиоды на один цвет на RG или B. Это то, что вы запрограммировали. На 8 только светодиоды с 315 по 359 будут настроены на красный цвет, остальные останутся нетронутыми. Это неожиданно?, @chrisl
@chrisl нет, 1,2,3,4,5,6,7,8 каждый делает свою работу. они активируют 45 светодиодов на одной стороне восьмиугольника. но перед запуском сторон я хочу выбрать цвет, которым они станут. Я хочу использовать байты RGB для отправки в Arduino, а Arduino запоминать их и иметь возможность переключаться между ними. Я также отредактировал свой пост, @Juriaan
я не понимаю, почему вы не можете установить переменную в какое-то выбранное значение, когда, например, получено
R
, @jsotola