Arduino и RGB лента WS2812B(вопрос)
- Войдите на сайт для отправки комментариев
Такой вопрос, у меня есть одна лента на которой 239 светодиодов, можно ли на эту ленту разделить, и например на первые 200 светодиодов сделать один эффект, а на другие 39 другой. Да, можно просто соединить скрипты самих эффектов и загрузить. Но конкретно в моем случае, так на вряд ли получится. Ибо на первую половину хочу заливать любой эффект, а вторую отдать под контроль музакальной визуалиции. https://github.com/CalcProgrammer1/KeyboardVisualizer
Можно конечно просто взять, обрезать, и раскидать по портам. Но может есть какой-то параметр, который вписав в код, я назначу одному скрипту использовать светодиоды в конце, а другому в начале ленты. И чтобы при этом они не мешали друг другу. Надеюсь понятно объяснил.
Можно, но придется все эхфекты модифицировать. Т.е. занятие гораздо сложнее, чем взять и обрезать.
А что с этим можно сделать? Чтобы он использовал определенноe количество ПОСЛЕДНИХ светодиодов на конце ленты и был обособлен от других?
/*---------------------------------------------------------*\ | | | WS2812B (FastLED) Serial Controlled LED Strip Driver | | for use with Keyboard Visualizer VCUI | | | | Adam Honse (calcprogrammer1) 12/9/2016 | | | \*---------------------------------------------------------*/ #include "FastLED.h" #ifdef __AVR__ #include <avr/power.h> #endif #define PIN 6 #define LEDS 30 #define PACKET_SZ ( (LEDS * 3) + 3 ) CRGB leds[LEDS]; unsigned char serial_buffer[PACKET_SZ]; unsigned int head = 0; unsigned int start; unsigned int checksum_1; unsigned int checksum_0; void setup() { FastLED.addLeds<WS2812B, PIN, RGB>(leds, LEDS); for( int i = 0; i < LEDS; i++ ) { leds[i] = CRGB::Black; } FastLED.show(); Serial.begin(115200); } void loop() { if( Serial.available() ) { serial_buffer[head] = Serial.read(); if( head >= (PACKET_SZ - 1) ) { start = 0; checksum_1 = head; checksum_0 = head - 1; head = 0; } else { start = head + 1; checksum_1 = head; if( head == 0 ) { checksum_0 = PACKET_SZ - 1; } else { checksum_0 = head - 1; } head++; } if( serial_buffer[start] == 0xAA ) { unsigned short sum = 0; for( int i = 0; i < checksum_0; i++ ) { sum += serial_buffer[i]; } if( start > 0 ) { for( int i = start; i < PACKET_SZ; i++ ) { sum += serial_buffer[i]; } } //Test if valid write packet if( ( ( (unsigned short)serial_buffer[checksum_0] << 8 ) | serial_buffer[checksum_1] ) == sum ) { noInterrupts(); for( int i = 0; i < LEDS; i++ ) { int idx = start + 1 + ( 3 * i ); if( idx >= (PACKET_SZ - 1) ) { idx = idx - PACKET_SZ; } leds[i].g = serial_buffer[idx]; leds[i].r = serial_buffer[idx+1]; leds[i].b = serial_buffer[idx+2]; } FastLED.show(); interrupts(); } } } }Т.е. вы не верите, что обрезать проще?
Хорошо. У вас есть массив led[] размером LEDS. В первые N элементов этого массива помещайте цвета пикселей, которые генерирует первый эффект. Начиная с (LEDS-N) - цвета пикселей, выдаваемые вторым эффектом. Потом делайте show().
А код я разбирать не буду. Сможете на человеческом языке объяснить, что там происходит?
что там разбирать буфер на 30 диодов + 3 байта, начало посылки "АА" и КС.
если КС верна все это отправляется на диоды (ТС - ВЕСЬ БУФЕР, ВЕСЬ)
ТС как вы не можете понять для того что нибудь из жопы вылезло, это надо положить в рот.
Что? Я не программист. Режем таки да?
Режем таки да?
Та, не дожидаясь перитонита. (с).)))))
Что? Я не программист. Режем таки да?
Есть поговорка "семь раз отмерь, один раз отрежь". Управлять лентой можно и так и так (решать вам). Но если уж решили резать, то может и вторую Ардуину подключить (тогда точно независимо будет).