Arduino и светодиоды ws2811 реально ли?

verhmax
Offline
Зарегистрирован: 21.12.2014

Добрый день, я тут новенький и мало понимаю, но очень интересно научиться.

У меня есть вопрос, на который я не знаю ответа:

Есть гирлянда 50 лампочем ws2811 с питанием 12В. возможно ли подключить её и управлять с помощью Arduino? или гирлянда должна быть только 5В?

PS эта гирлянда имеет 3 контакта: +,- и управление.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

конечно можно. погугли хоть на этом форуме

verhmax
Offline
Зарегистрирован: 21.12.2014

ещё несколько вопросов от новичка:

к примеруму Arduino Uno. в него можно зашить прошивку и использовать без компа? и можно ли в прошибке делать несколько программ и переключать их кнопкой?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

можно и можно

но не несколько программ, а переключать подпрограммы. но чтобы места на все хватило

verhmax
Offline
Зарегистрирован: 21.12.2014

место для кода? т.е. чем грамотнее код (не изобретая колесо) тем меньше весит прошивка?

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

грамотнее да. но все равно под разное железо код разный. скомпилируй код для визнета например. и попробуй несколько таких запихнуть в уно

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

пришла моя лента

http://ru.aliexpress.com/item/WS2811-led-strip-5m-30-leds-m-10-pcs-ws281...

попробовал работает))

a5021
Offline
Зарегистрирован: 07.07.2013

А что из нее сделать планируется?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ничего особенного. над окном за шторами сверху приклеить. как и ожидалось ребенку очень понравилось как цветами переливается

за счет того, что за шторами, свет будет более рассеянный

выбрал самый "спокойный" режим радуга, движение влево и вправо, без морганий из примеров fast_led

#include <FastLED.h>

#define LED_PIN     5

// Information about the LED strip itself
#define NUM_LEDS    20
#define CHIPSET     WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define BRIGHTNESS  64
#define TEMPERATURE_1 Tungsten100W
#define TEMPERATURE_2 OvercastSky

// How many seconds to show each temperature before switching
#define DISPLAYTIME 20
// How many seconds to show black between switches
#define BLACKTIME   3

void setup() {
  delay( 3000 );
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalSMD5050 );
  FastLED.setBrightness( BRIGHTNESS );
}

void loop(){
  static uint8_t starthue = 0;
  fill_rainbow( leds, NUM_LEDS, ++starthue, 40);
  
  FastLED.show();
  FastLED.delay(5);
}

 

Focus
Offline
Зарегистрирован: 05.04.2015

И моя гирлянда пришла. Разобрал старый БП от компа, выпаял лишние провода, впихал туда нану, кнопочки, крутилочки... Мегает! ))

Одна крутилка регулирует яркость гирлянды, вторая скорость еффектов, третью ещё не воткнул, купить надо, но думаю будет менять скорость смены цвета в радуге.

Кнопка из 3х задействована одна. Она переключает эффекты и записывает в ЕЕПРОМ, для того, чтобы при включении показывался ранее выбраный эффект.

Из эффектов пока 6 штук, все они из библтотеки FastLED. И ещё один - это я пробовал чтото своять :)

Зачем запихал в такую большую коробку? Потому что старых БП от компа у меня много :) . И сейчас будут подключаться 100 диодов (4 обрезка по 25шт) это на полной яркости белого цвета почти 6А, К следующему новому году наверно добавлю ещё 4 таких обрезка, будет уже 12А. Тот БП что я использовал выдаёт 18А по 5в линии, тоесть ещё запас на 4 обрезка по 25 диодов останется.

Позже выложу сыроватый скетч, авось кому сгодится, ато до нового года осталось совсем немного времени :)

Нашёл свободное место, подальше от высокочастотных и силовых узлов (разъём 220 не в счет :) )

К тому же будет доступ к USB разъёму.

Для органов управления так же найдено место, подальше от всего опасного

Сверлить тонкую жестянку, так чтобы было аккуратно - неочень получается

Паяем выходы, те что пойдёт на гирлянды. Для безопасности делаем это через резистор. Советуют 470ом, но у меня были в наличии на 330, сойдёт...

Распаял кнопки и переменники. Кнопки замыкают на массу и используется внутренняя подтяжка к плюсу, поэтому лишних резисторов не ставим. Все переменники подключены одним концом на массу, другим все в кучу, кондёрами (100мкф и 0.1мкф) на массу и через 200 ом резистор (ну вдруг там чего замкнёт) на +5в. Ползунки переменников идут в ардуино.

Подаём питание... И поскольку очень много говорят про всякие там помехи, фильтры - поставил пару кондёров (100мкф и 0.1мкф) Не потому что я чегото там просчитал, а просто у меня есть кондёры только 100мкф и 0.1мкф :D

Всё паялось обычным 40вт паялом, без всякого заземления со вставленой в панель ардуиной и как ни странно, всё работает :)

Библиотеку FastLED можно скачать тут

Скетч сырой, чтобы побыстрому справить новый год, а потом чего нибудь доработать. Например, пока совсем не используется раздельное подключение гирлянд, хотя возможность такая присутствует. Если чего свояю, выложу сюда. Если вдруг кто напишет какой красивый эффект - делитесь :)

#include <EEPROM.h>
#include "FastLED.h"
const int bright_rezistor_pin = A7; // Резистор регулировки яркости (10к)
const int rainbowspeed_rezistor_pin = A6; // Резистор регулировки скорости смены цвета в радуге (10к)
const int fps_rezistor_pin = A5; // Общая скорость эффектов (кадров в секунду) (10к)
const int btn_changeeffect_pin = 2; // Кнопка смены эффектов
const int btn_2_pin = 3; // Резерв
const int btn_3_pin = 4; // Резерв

int bright_rezistor = 400; // Стартовое значение резистора яркости
int fps_rezistor = 400; // Стартовое значение резистора скорости еффектов (fps)

int btn_changeeffect_flag = 0;
int btn_changeeffect_state = HIGH;
int last_btn_changeeffect_state = HIGH;
long last_btn_changeeffect_debounce_time = 0;
const int debounceDelay = 80;
int current_effect = 0;

int pos1 = 1;

FASTLED_USING_NAMESPACE
#if FASTLED_VERSION < 3001000
#error "Requires FastLED 3.1 or later; check github for latest code."
#endif

#define DATA_PIN_1  5  // Определяем пин для ленты #1
#define DATA_PIN_2  6  // Определяем пин для ленты #2
#define DATA_PIN_3  7  // Определяем пин для ленты #3
#define DATA_PIN_4  8  // Определяем пин для ленты #4
#define DATA_PIN_5  9  // Определяем пин для ленты #5
#define DATA_PIN_6  10 // Определяем пин для ленты #6
//#define CLK_PIN   4
#define LED_TYPE    WS2811
#define COLOR_ORDER RGB
#define NUM_LEDS    25
CRGB leds[NUM_LEDS];
CRGB leds1[NUM_LEDS];

#define BRIGHTNESS          150 // Стартовое значение яркости
#define FRAMES_PER_SECOND  20   // Стартовое значение скорости эффектов

void setup() {
  //Serial.begin(9600); // Для отладки
  
  pinMode(bright_rezistor_pin, INPUT);
  pinMode(rainbowspeed_rezistor_pin, INPUT);
  pinMode(fps_rezistor_pin, INPUT);
  
  pinMode(btn_changeeffect_pin, INPUT);
  digitalWrite(btn_changeeffect_pin, HIGH); // Используем встроенную верхнюю подтяжку
  pinMode(btn_2_pin, INPUT);
  digitalWrite(btn_2_pin, HIGH); // Используем встроенную верхнюю подтяжку
  pinMode(btn_3_pin, INPUT);
  digitalWrite(btn_3_pin, HIGH); // Используем встроенную верхнюю подтяжку
  
  delay(3000); // 3 second delay for recovery
  
  // tell FastLED about the LED strip configuration
  FastLED.addLeds<LED_TYPE,DATA_PIN_1,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.addLeds<LED_TYPE,DATA_PIN_2,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.addLeds<LED_TYPE,DATA_PIN_3,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.addLeds<LED_TYPE,DATA_PIN_4,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  //FastLED.addLeds<LED_TYPE,DATA_PIN_5,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  //FastLED.addLeds<LED_TYPE,DATA_PIN_6,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  
  //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);

  // set master brightness control
  FastLED.setBrightness(BRIGHTNESS);
  current_effect = EEPROM.read(0);
}


// List of patterns to cycle through.  Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns
  
void loop()
{
  bright_rezistor = map(analogRead(bright_rezistor_pin), 0, 985 ,10 ,255);
  fps_rezistor = map(analogRead(fps_rezistor_pin), 0, 985 ,5 ,255);
  
  // Городим жуткую защиту от дребезга для кнопки переключения эффектов...
  int btn_changeeffect_reading = digitalRead(btn_changeeffect_pin);
  if(btn_changeeffect_reading != last_btn_changeeffect_state){
    last_btn_changeeffect_debounce_time = millis();
  }
  if((millis() - last_btn_changeeffect_debounce_time) > debounceDelay) {
    if(btn_changeeffect_reading != btn_changeeffect_state) {
      btn_changeeffect_state = btn_changeeffect_reading;
      if(btn_changeeffect_state == LOW && btn_changeeffect_flag == 0){ // Если кнопка нажата...
        current_effect ++; // Увиличиваем номер эффекта
        EEPROM.write(0, current_effect); // Записываем номер эффекта в ЭСППЗУ
        btn_changeeffect_flag = 1;
        if(current_effect > 7){      // Если номер эффекта превышает существующее
          current_effect = 0;        // то отсчет начинается с нуля
        }
      }
      if(btn_changeeffect_state == HIGH && btn_changeeffect_flag == 1){
        btn_changeeffect_flag = 0;
      }
    }
  }
  last_btn_changeeffect_state = btn_changeeffect_reading;
  
  FastLED.setBrightness(bright_rezistor);
  //Serial.println(current_effect);
  //delay(1);
  if(current_effect == 0){
    EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
    gPatterns[gCurrentPatternNumber]();
  }
  if(current_effect == 1){
    rainbow();
  }
  if(current_effect == 2){
    rainbowWithGlitter();
  }
  if(current_effect == 3){
    confetti();
  }
  if(current_effect == 4){
    sinelon();
  }
  if(current_effect == 5){
    juggle();
  }
  if(current_effect == 6){
    bpm();
  }
  if(current_effect == 7){
    snowdown();
  }
  // Call the current pattern function once, updating the 'leds' array
  //gPatterns[gCurrentPatternNumber]();
  //sinelon();
  //bpm();
  //juggle();
  //addGlitter(80);
  //snowdown();
  //rainbowWithGlitter();

  // send the 'leds' array out to the actual LED strip
  FastLED.show();  
  // insert a delay to keep the framerate modest
  FastLED.delay(1000/fps_rezistor); 

  // do some periodic updates
  EVERY_N_MILLISECONDS( 1 ) { gHue++; } // slowly cycle the "base color" through the rainbow
}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
  // add one to the current pattern number, and wrap around at the end
  gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}

void rainbow(){
  // FastLED's built-in rainbow generator
  fill_rainbow( leds, NUM_LEDS, gHue, 7);
}

void rainbowWithGlitter(){
  // built-in FastLED rainbow, plus some random sparkly glitter
  rainbow();
  addGlitter(80);
}

void addGlitter( fract8 chanceOfGlitter){
  if( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}

void confetti(){
  // random colored speckles that blink in and fade smoothly
  fadeToBlackBy( leds, NUM_LEDS, 10);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV( gHue + random8(64), 200, 255);
}

void sinelon(){
  // a colored dot sweeping back and forth, with fading trails
  fadeToBlackBy( leds, NUM_LEDS, 20);
  int pos = beatsin16(13,0,NUM_LEDS);
  leds[pos] += CHSV( gHue, 255, 192);
}

void bpm(){
  // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
  uint8_t BeatsPerMinute = 62;
  CRGBPalette16 palette = PartyColors_p;
  uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
  for( int i = 0; i < NUM_LEDS; i++) { //9948
    leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
  }
}

void juggle(){
  // eight colored dots, weaving in and out of sync with each other
  fadeToBlackBy( leds, NUM_LEDS, 20);
  byte dothue = 0;
  for( int i = 0; i < 8; i++) {
    leds[beatsin16(i+7,0,NUM_LEDS)] |= CHSV(dothue, 200, 255);
    dothue += 32;
  }
}

void snowdown(){
  // Просто огонёт со шлейфом бегает в одну сторону
  fadeToBlackBy( leds, NUM_LEDS, 40);
  //fadeToBlackBy( leds1, NUM_LEDS, 40);
  pos1 = pos1+1;
  if(pos1 > NUM_LEDS-1) pos1 = 0;
  leds[pos1] += CHSV( gHue, 255, 192);
  //leds1[pos1] += CRGB(255, 255, 255);
}

 

igreemi
Offline
Зарегистрирован: 28.09.2015

а как сделать, чтоб при нулевом значении диоды не горели?

Focus
Offline
Зарегистрирован: 05.04.2015

igreemi пишет:

а как сделать, чтоб при нулевом значении диоды не горели?

При нулевом значении чего?

igreemi
Offline
Зарегистрирован: 28.09.2015
  if(current_effect == 0){
    EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
    gPatterns[gCurrentPatternNumber]();
  }

вот) на нем эффект висит, а мне нужно, чтоб выключал диоды. никак не могу допереть)

Focus
Offline
Зарегистрирован: 05.04.2015
if(current_effect == 0){
  for( int i = 0; i < NUM_LEDS; i++){
    leds[i] += CRGB::Black;
  }
}

Вроде так. Может есть и более гуманные методы, но я про них не знаю. Да и этот метод неопробован, но вот чую - должно сработать :D

igreemi
Offline
Зарегистрирован: 28.09.2015

да вот что то типо того пробывал, белым загораются и все)

Focus
Offline
Зарегистрирован: 05.04.2015

Ну если блек непрокатит, то  CRGB(0, 0, 0); точно должно прокатить

78963214789
Offline
Зарегистрирован: 04.02.2013

Я тоже играюсь 300 Led лентой и матрицей 10х10 Led. Матрица по сути таже лента - 100 Led. 

Я принципиально не использую крутилки и кнопки, все доллжно работать - включил и забыл.

Все задается случайными параметрами - цвет, яркость, направление, скорость перемещения, скорость нарастания яркости, скорость снижения яркости, длинна нарастающей и длинна спадающей частей волны, время возникновения и начальное полежение следущей волны. С точки зрения математики это один эффект - волна.

Максимальное количество различных одновременно шастающих и стоячих волн на ленте или матрице - это лишь вопрос объема памяти. 

Сейчас пытаюсь определить рамки для всех случайных параметров и наиболее оптимальную цветовую модель вместо RGB для рассчетов.

igreemi
Offline
Зарегистрирован: 28.09.2015

Управление ИК пультом никто не пытался прикрутить?

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

igreemi пишет:
Управление ИК пультом никто не пытался прикрутить?

Пользую не прикручивая такую :)

Правда в выключенном состоянии немного посвистывал преобразователь, пришлось слегка потыкать в него паяльником, теперь все ОК. :)

igreemi
Offline
Зарегистрирован: 28.09.2015

Не, это не подходит) у меня люстра из гитары) вот по сериал порту комманды отлично принимает, эффекты переключает, релюшки щелкает. А с Ик пультом чот беда. Не могу разобраться, так чтоб переключал эффекты) в тестовом скетче для ИК коды с пульта читает нормально, а в моем начинает получать разные коды с одной кнопки)

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

igreemi

Пульт передает посылки не останавливаясь, вероятно в Вашем скетче нужно оталавливать начало последовательности посылки, после чего получать пакет и сравнивать принятый код. У Вас вероятно читает не отслеживая начало пакета, потому всегда разное получает. Нужно скетчи смотреть и сравнивать.

igreemi
Offline
Зарегистрирован: 28.09.2015

Да вот вроде все как у всех в скетчах, но там они используют открытие закрытие пинов. Косяк где то у меня в скетче похоже, но я уже в затупе)http://arduino.ru/forum/proekty/rgb-lyustra-s-nulya

keefa
Offline
Зарегистрирован: 19.06.2015

igreemi пишет:

Да вот вроде все как у всех в скетчах, но там они используют открытие закрытие пинов. Косяк где то у меня в скетче похоже, но я уже в затупе)http://arduino.ru/forum/proekty/rgb-lyustra-s-nulya

Попробуйте другие библиотеки, такая же фигня была.

Logik
Offline
Зарегистрирован: 05.08.2014

igreemi пишет:
Управление ИК пультом никто не пытался прикрутить?

Пробовали, работает, а Вы зачем интересуетесь? 

igreemi
Offline
Зарегистрирован: 28.09.2015

А скетч не остался? Если можно, выложите, может пойму в чем у меня косяк

Logik
Offline
Зарегистрирован: 05.08.2014

Скетч на нестандартных либах с привязкой к конкретному пульту, потому сам он не поможет. Но могу сказать по памяти, что прием команды с ДУ и вывод видеоэффектов на ленту конфликтуют, вывод в ленту занимает время и пропускаются события с ДУ. Потому как только обнаруживается начало команды с пульта, работу с лентой приходится останавливать на доли секунды. Получается замирание, причем и на чужие пульты реагирует. Клацаеш каналы телика, лента в такт замирает на доли сек. 

igreemi
Offline
Зарегистрирован: 28.09.2015

А как это лечить?

Гриша
Offline
Зарегистрирован: 27.04.2014

igreemi пишет:
А как это лечить?

Можно топорно, поставить 2 арды, одна на пульт, другая на гирлянду, соединить  несколько ног и кодировать выставляя уровни на ногах. Получится типа модуль обработчик приемника ИК и модуль управления светиков.

:)))))))))))))) ценник увеличится примерно на 150руб

igreemi
Offline
Зарегистрирован: 28.09.2015

Ну это менее интересно) ардуинка то еще одна есть, но хотелось бы получить весь комплекс от одной) там всего то надо управлять одной лентой и двумя релюхами)

Гриша
Offline
Зарегистрирован: 27.04.2014

Значит, ловить начало пакета, принимать 1 пакет, и следующий раз проверять пакет позже… Все равно, ИК сильно на долго занимает МК. Как не крути, алгоритм нужно продумывать и минимизировать работу с ИК.

igreemi
Offline
Зарегистрирован: 28.09.2015

Одну беду победил) команды стабильно принимает с пульиа, теперь другая, при поступлении команды срабатывает только один кадр эффекта)

parovoZZ
Offline
Зарегистрирован: 15.02.2016

А обязательно использовать

FastLED.h

С ней же скучно?

igreemi
Offline
Зарегистрирован: 28.09.2015

Ну вроде самая распространенная) мне щас не это важно, мне важно чтоб на одном контроллере запускались с ик пульта эффекты и переключались)

keefa
Offline
Зарегистрирован: 19.06.2015

Решил не создавать новой темы.

Есть лента с диодами WS2811 Есть код:

#include "FastLED.h"
// How many leds in your strip?
#define NUM_LEDS 10
// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 5
#define BRIGHTNESS  30

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(  BRIGHTNESS );
}

void loop() {
  // Turn the LED on, then pause
  leds[0] = CRGB::Green;
  FastLED.show();
  delay(500);
  // Now turn the LED off, then pause
  leds[0] = CRGB::Black;
  FastLED.show();
  delay(500);
}

Вот в чем вопрос: Свтодиод, первый по счету, не регулируется яркость зеленого цвета. В коде яркость 30 едениц, красный и синий работают нормально, зеленый моргает в полную яркость. Следующие по счету диоды работают нормально, зеленый тоже. Где то в глубине души знаю что проблема, скорее всего, в библиотеке, но знаний не хватает что бы разобраться. Если кто подскажет, заранее спасибо.

 

Гриша
Offline
Зарегистрирован: 27.04.2014

keefa пишет:

Вот в чем вопрос: Свтодиод, первый по счету, не регулируется яркость зеленого цвета... зеленый моргает в полную яркость. Следующие по счету диоды работают нормально, зеленый тоже. ... скорее всего, в библиотеке, ...

маловероятно, код отправляется всем и одинаковый (тестовый), очень вероятно контроллер диода с браком.

А сколько диодов в ленте??? в коде их 10, если я правильно код понял, сам не работал с такими контроллерами.

да и ссылку на исходник кода, плиз, вы ведь не сами его писали...

keefa
Offline
Зарегистрирован: 19.06.2015

Гриша пишет:

маловероятно, код отправляется всем и одинаковый (тестовый), очень вероятно контроллер диода с браком.

А сколько диодов в ленте??? в коде их 10, если я правильно код понял, сам не работал с такими контроллерами.

да и ссылку на исходник кода, плиз, вы ведь не сами его писали...

В первую очередь подумал на брак контроллера. Отрезал от ленты первый диод. подпаялся заново, опять не регулируется зеленый. получается отрезал исправный. по поводу количества, это лента на 300 диодов, использую только 10, хоть 60 хоть 100, без разницы. 

Код из примеров библиотеки FastLed.h, писал не сам.

 

keefa
Offline
Зарегистрирован: 19.06.2015

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

Гриша, все равно спасибо. Если кому будет нужна рабочая библиотека ссылка.

Focus
Offline
Зарегистрирован: 05.04.2015

Скоро новый год! Заказал и уже получил ещё одну, такую же 100-диодную гирлянду, купил разъёмы типа-джек. Получилось 8 полос по 25 диодов. Кончились провода - как куплю допаяю, фотки выложу.

Кстати по поводу цены и 11.11 распродажи - заказывал гирлянду за 1788 без распродаж всяких. Сейчас она 2421р и типа распродажа! цена снижена до 1815 :D

Надо хотябы простецких горизонтальных (тоесть между лентами) эффектов запилить.

Никто чотких эффектов незапрограммил? :)

Focus
Offline
Зарегистрирован: 05.04.2015

Дописал пару-тройку горизонтальных эффектов, в том числе "падающий снег" выложил всё в отдельной теме