Arduino и RGB лента WS2812B(вопрос)

DimakSerpg
Offline
Зарегистрирован: 19.02.2018

Такой вопрос, у меня есть одна лента на которой 239 светодиодов, можно ли на эту ленту разделить, и например на первые 200 светодиодов сделать один эффект, а на другие 39 другой. Да, можно просто соединить скрипты самих эффектов и загрузить. Но конкретно в моем случае, так на вряд ли получится. Ибо на первую половину хочу заливать любой эффект, а вторую отдать под контроль музакальной визуалиции. https://github.com/CalcProgrammer1/KeyboardVisualizer

Можно конечно просто взять, обрезать, и раскидать по портам. Но может есть какой-то параметр, который вписав в код, я назначу одному скрипту использовать светодиоды в конце, а другому в начале ленты. И чтобы при этом они не мешали друг другу. Надеюсь понятно объяснил. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно, но придется все эхфекты модифицировать. Т.е. занятие гораздо сложнее, чем взять и обрезать.

DimakSerpg
Offline
Зарегистрирован: 19.02.2018

А что с этим можно сделать? Чтобы он использовал определенно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();
      }
    }
  }
}
sadman41
Offline
Зарегистрирован: 19.10.2016

Т.е. вы не верите, что обрезать проще?

Хорошо. У вас есть массив led[] размером LEDS. В первые N элементов этого массива помещайте цвета пикселей, которые генерирует первый эффект. Начиная с (LEDS-N) - цвета пикселей, выдаваемые вторым эффектом. Потом делайте show().

А код я разбирать не буду. Сможете на человеческом языке объяснить, что там происходит?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

что там разбирать буфер на 30 диодов + 3 байта, начало посылки "АА" и КС.

если КС верна все это отправляется на диоды (ТС - ВЕСЬ БУФЕР, ВЕСЬ)

ТС как вы не можете понять для того что нибудь из жопы вылезло, это надо положить в рот.

DimakSerpg
Offline
Зарегистрирован: 19.02.2018

Что? Я не программист. Режем таки да?

bwn
Offline
Зарегистрирован: 25.08.2014

DimakSerpg пишет:

Режем таки да?

Та, не дожидаясь перитонита. (с).)))))

arduinec
Offline
Зарегистрирован: 01.09.2015

DimakSerpg пишет:

Что? Я не программист. Режем таки да?

Есть поговорка "семь раз отмерь, один раз отрежь". Управлять лентой можно и так и так (решать вам). Но если уж решили резать, то может и вторую Ардуину подключить (тогда точно независимо будет).