+3 голосов

Есть массив структур:

HSV_t     HSV[];

Где HSV_t структура:

uint16_t   H; //0-360
uint8_t    S; 
uint8_t    V;

Поделитесь эффектами. Например: радуга, плавное нарастание яркости, бегущий огонёк и пр.

(2.7 тыс. баллов) 9 29 55
Эффекты нужны только в HSV цветовом пространстве или есть возможность без серьёзного ущерба производительности преобразовать их из других цветовых пространств?
А в каких цветовых пространствах ещё проще оперировать с яркостью и цветностью раздельно?

2 Ответы

+4 голосов
 
Лучший ответ

Бегущий огонек.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h>
#endif

#define PIN        6 //Пин, к которому подключены светодиоды ws2812

#define NUMPIXELS 16 //Количество подключенных светодиодов

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

#define DELAYVAL 500 //Задержка между переключением светодиодов

void setup() {
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif

  pixels.begin();
}

void loop() {
  pixels.clear();
  
  for(int i=0; i<NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 150, 0));
    pixels.setPixelColor(i-1, pixels.Color(0, 150, 0));

    pixels.show();

    delay(DELAYVAL);
  }
}

Радуга.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define PIN        6 //Пин, к которому подключены светодиоды ws2812

#define NUMPIXELS 16 //Количество подключенных светодиодов

Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show();
}

void loop() {
  rainbow(10);
}

void rainbow(int wait) {
  //Проходим по цветовому кругу...
  for(long firstPixelHue = 0; firstPixelHue < 3*65536; firstPixelHue += 256) {
    //Смещение оттенка пикселя, чтобы сделать один полный оборот цветового круга по длине ленты
    for(int i=0; i<strip.numPixels(); i++) {
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      
      //strip.ColorHSV () может принимать 1 или 3 аргумента:
      //Оттенок (от 0 до 65535)
      //Опционально насыщенность и значение яркость (каждый от 0 до 255)
      //Здесь мы используем только вариант оттенка с одним аргументом
      //Результат передается через strip.gamma32(), чтобы обеспечить более «правильные» цвета перед присвоением каждому пикселю:
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show();
    delay(wait);
  }
}

Нарастание яркости.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h>
#endif

#define PIN        6 //Пин, к которому подключены светодиоды ws2812

#define NUMPIXELS 16 //Количество подключенных светодиодов

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

#define DELAYVAL 500 //Задержка между увеличениями яркости

void setup() {
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif

  pixels.begin();
}

void loop() {
  pixels.clear();

  for(int br=1; br<255; br++) {
    for(int i=0; i<NUMPIXELS; i++) {
      pixels.setPixelColor(i, pixels.Color(0, br, 0));
  
      pixels.show();
    }
    
    delay(DELAYVAL);
  }
}

(1.6 тыс. баллов) 3 9 33
выбран
Вроде хорошо, но я хочу 500 светодиодов.
Меняем значение NUMPIXELS на количество светодиодов и радуемся ;)
мне в HSV  надо. В RGB в другом месте конвертируется.
+2 голосов
  1. Радуга.

Так как H , в данном цветовом пространстве является цветовым тоном, то при фиксированных параметрах s и v, можно просто данный параметр в зависимости от светодиода и/или времени, потому что спектр параметра h почти повторяет радугу.

   P.S. Для увеличения количества цветов радуги можно использовать различные способы. Самый простой из них это расширить полосы жёлтого и голубого за счёт добавления по середине полосы с серединой жёлтого тона по "H" , но синусоидальным изменением насыщенности "S".

   II. Плавное нарастание яркости осуществимо линейной зависимостью параметра V от времени.

     III.Для данной ленты разработано множество библиотек различных эффектов в rgb пространстве т.к. сама лента в нём работает. И шум по их поводу не утехает у Алекса Гайвера больше года :

https://github.com/AlexGyver/WS2812_FX

​​

(3.1 тыс. баллов) 14 20 41
исправил
Например, лента в 500 светодиодов. Как равномерно залить радугой? Естественно, что раз у нас 360 градусов дробится до одного градуса (шаг в 1 градус = 1 светодиод), то после 359 светодиода радуга повториться. Только Си, т.к. это может быть и распберри и любой другой МК.
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. Un_ka

    8 балл(ов)

  2. Eriak

    4 балл(ов)

  3. AlexGorr

    2 балл(ов)

...