БИБЛИОТЕКИ
Ни для кого не секрет, что для управления адресными светодиодами с Ардуины существует две популярные библиотеки: FastLED (независимый разработчик) и NeoPixel (Adafruit). Для одного из проектов мне нужна была максимальная скорость обновления изображения на ленте, и я решил проверить, какая библиотека в итоге обеспечивает максимальную скорость работы. В интернете чёткого ответа на этот вопрос не нашлось.
Сравнить решил очень простым способом: включать светодиоды, затем выключать. И проходя один такой цикл дёргать пин на Ардуине, а затем просто взять и измерить на нём частоту. Можно было программно замерить время, но дело было вечером, и увидеть частоту в герцах на осциллографе было как то проще =)
Итак, скачать библиотеки можно по ссылкам: FastLED и NeoPixel. Далее в Ардуину были загружены следующие прошивки:
FastLED
#define NUM_LEDS 200
#include "FastLED.h"
#define PIN 6
CRGB leds[NUM_LEDS];
void setup() {
  FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(50);
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, 1);
  FastLED.clear();
  for (int i = 0; i < NUM_LEDS; i++ ) {
    leds[i] = CRGB::White;
  }
  digitalWrite(13, 0);
  FastLED.show();
}								NeoPixel
#define PIN 6
#define NUM_LEDS 16
#include "Adafruit_NeoPixel.h"
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
  strip.begin();
  strip.setBrightness(50);
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, 1);
  strip.clear();
  for (int i = 0; i < NUM_LEDS; i++ ) {
    strip.setPixelColor(i, 0xffffff);
  }
  digitalWrite(13, 0);
  strip.show();
}								LightWS2812
Далее я наткнулся на библиотеку LightWS2812 и решил тоже её испытать:#define NUM_LED 16
#define PIN 6
#include "WS2812.h"
WS2812 LED(NUM_LED); 
cRGB value;
void setup() {
  LED.setOutput(PIN);
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, 1);
  for (int i = 0; i < NUM_LED; i++ ) {
    value.b = 0; value.g = 30; value.r = 30;
    LED.set_crgb_at(i, value);
  }  
  digitalWrite(13, 0);
  LED.sync();
  // задержка, по даташиту рекомендуется 50 мкс, но лента 
  // перестаёт стабильно работать ниже 20 мкс. 30, я выбираю тебя!
  delayMicroseconds(30);
}								РЕЗУЛЬТАТЫ ТЕСТА
| Количество светодиодов | FastLED, Гц | NeoPixel, Гц | Light_WS2812, Гц | 
| 512 | 59 | 55 | 54 | 
| 400 | 74 | 71 | 69 | 
| 300 | 95 | 95 | 91 | 
| 256 | 108 | 110 | 107 | 
| 200 | 133 | 142 | 137 | 
| 144 | 182 | 196 | 190 | 
| 100 | 220 | 283 | 273 | 
| 60 | 300 | 469 | 452 | 
| 30 | 400 | 822 | 887 | 
| 16 | 400 | 1261 | 1614 | 
| 8 | 400 | 1813 | 3000 | 
По результатам видно, что FastLED медленнее NeoPixel при любом количестве светодиодов, а LightWS2812 показывает просто безумную скорость на маленьком количестве светодиодов. Если в проекте используется более 100 светодиодов, то без разницы, какую библиотеку использовать. FastLED предлагает кучу удобных инструментов и быструю 8-битную математику, чего нет в NeoPixel, а в LightWS2812 нет вообще ничего вспомогательного. Но если вам важна скорость на небольшом количестве светодиодов (например какой-то POV проект), то однозначно используем LightWS2812 , она показывает в несколько раз лучший результат.
Что касается объёмов занимаемой памяти:
| Память | FastLED | NeoPixel | Light_WS2812 | 
| Флэш | 12% | 8% | 5% | 
| Динамическая | 25% | 1% | 1% | 
ОБНОВЛЕНИЕ 01.01.2020
Мы сделали свою библиотеку для адресной ленты – microLED. Подробнее о ней читайте в этой статье. Библиотека предназначена для работы с адресной лентой на чипах WS2811/2812/2813 на платформе AVR. Ключевые особенности: скорость вывода в 1.5 раза выше других библиотек, занимаемая память в разы меньше благодаря сжатию цветового пространства и оптимальному коду самой библиотеки.
Частота обновления (Гц) от количества светодиодов (сравнение с другими библиотеками), включая минимальное время между отправками (40 мкс).
| Кол-во диодов | FastLED 24-bit | NeoPixel 24-bit | WS2812 24-bit | microLED 24-bit | microLED 16-bit | microLED 8-bit | 
|---|---|---|---|---|---|---|
| 8 | 400 | 1818 | 3260 | 4782 | 4420 | 4460 | 
| 16 | 400 | 1264 | 1751 | 2663 | 2437 | 2462 | 
| 50 | 333 | 554 | 589 | 923 | 840 | 848 | 
| 100 | 220 | 301 | 298 | 472 | 428 | 432 | 
| 500 | 60 | 65 | 61 | 96 | 87 | 88 | 
Занимаемая память (байт) от количества диодов, где LED – количество светодиодов (сравнение с другими библиотеками)
| Память | FastLED 24-bit | NeoPixel 24-bit | WS2812 24-bit | microLED 24-bit | microLED 16-bit | microLED 8-bit | 
|---|---|---|---|---|---|---|
| Flash | 2786 | 1984 | 946 | 306 | 346 | 324 | 
| SRAM | 90+3*LED | 40+3*LED | 31+3*LED | 20+3*LED | 20+2*LED | 20+1*LED | 



