Анимация WS2812b

Следующая программа заставит радугу двигаться! Даже переливаться.

#include <Adafruit_NeoPixel.h>

#define PIN            6 // это контакт, к которму подключен DIN
#define NUMPIXELS      8 // количество светодиодов, которыми мы хотим управлять
#define NUMCOLORS      24 // количество цветов в палитре

byte start_pixel = 0; // номер светодиода, с которого начинает строиться радуга

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

// расширенная палитра радуги
byte rainbow[NUMCOLORS][3] = {
  {128,0,0},
  {128,32,0},
  {128,64,0},
  {128,96,0},
  {128,128,0},
  {96,128,0},
  {64,128,0},
  {32,128,0},
  {0,128,0},
  {0,128,32},
  {0,128,64},
  {0,128,96},
  {0,128,128},
  {0,96,128},
  {0,64,128},
  {0,32,128},
  {0,0,128},
  {32,0,128},
  {64,0,128},
  {96,0,128},
  {128,0,128},
  {128,0,96},
  {128,0,64},
  {128,0,32}
};

void setup() {
    // инициализации модуля Adafruit_NeoPixel
    pixels.begin();
}

void loop() {
    byte k = start_pixel;
    for(int i=0; i<NUMPIXELS; i++){
        // вычисляем текущий номер цвета k в палитре rainbow для i-го светодиода
        k ++;
        if( k == NUMCOLORS )
            k = 0;
        pixels.setPixelColor(i, rainbow[k][0],rainbow[k][1],rainbow[k][2]);
    }

    pixels.show();

    // увеличиваем точку старта на единицу
    // при достижении края палитры - обнуляем
    start_pixel ++;
    if( start_pixel == NUMCOLORS )
        start_pixel = 0;

    delay(50);
}

Большую палитру нерационально хранить в массиве, ведь оперативной памяти у Ардуино не так много. Имеет смысл генерировать каждый последующий цвет радуги на лету, прямо перед выводом на WS2812b. Однако, в этой программе мы как и раньше явно задали весь градиент радуги.

Результат — плавно пробегающая по модулю радуга.

1+

Изменено:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.