Цветомузыка на WS2812 и arduino для ПК. Заключение.

Опубликовал | 23.11.2017
Здравствуйте.

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

Внимание! Новая программа не совместима со старыми скетчами.

Внешний вид новой программу ЦМУ

Программа поддерживает цветомузыкальные и динамические режимы работы.
В цветомузыкальном режиме для формирования цветовых эффектов используются выходы 19 цифровых полосовых фильтров. Значения на выходе цифровых фильтров в постоянном темпе передаются персональным компьютером и содержатся в массиве readData[].
В динамическом режиме цветовые эффекты выполняются в темпе задаваемом программируемой задержкой. Для выполнения динамических программ подключение к ПК не требуется.
В программе можно выбрать одну из 4-х цветомузыкальных программ или одну из 8-ми динамических. Не все программы реализованы в прилагаемом скетче контроллера ленты. Я реализовал 3 цветомузыкальные и 4 динамические подпрограммы. Остальные программы вы можете составить сами.

Цветомузыкальные программы:
Радуга;
МИКС;
Двутавр;
Новая — оставлена под вашу реализацию.

Динамические программы:
1 — белый с регулировкой яркости, яркость задается ползунком;
2 — установка цвета всей ленты, цвет задается ползунком;
3 — theaterChaseRainbow — из примеров к библиотеке Adafruit_NeoPixel, темп задается ползунком;
4 — rainbowCycle — из примеров к библиотеке Adafruit_NeoPixel, темп задается ползунком;
5..8 — оставлены под вашу реализацию.

Внимание! При выполнении динамической программы переход к следующей программе осуществляется после завершения текущей и может выполняться со значительной задержкой во времени.

Динамические программы могут выполняться автономно, без подключения к ПК. Если вы хотите использовать контроллер ленты автономно вам будет необходимо подключить к одному или нескольким цифровым входам платы arduino кнопки, а к одному из аналоговых входов потенциометр. Кнопки будут использоваться для переключения номера программы, а потенциометр для изменения параметра программы (темп, яркость, цвет). Подключение кнопок и потенциометра к arduino можно найти в стандартных примерах. Напишите и внесите в скетч контроллера ленты код, изменяющий номер подпрограммы prog и значения параметра param, в зависимости от нажатых кнопок и положения потенциометра. Можно для переключения динамических программ использовать ИК приёмник и пульт от телевизора. Подключение ИК приёмника к arduino также можно найти в стандартных примерах.

Для реализации цветомузыкальных программ у вас есть выходы 19 полосовых фильтров. Вы можете обрабатывать их как вам угодно для получения красивой цветомузыкальной программы. Вы можете увеличить количество программ используя ползунок изменения параметра (250 состояний) для изменения цветовой программы.

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

Творите, выдумывайте, пишите, делитесь и каждый сможет сделать такое устройство, какое пожелает.

Скетч для варианта подключения к компьютеру «COMtoLED.ino»:

  #include <Adafruit_NeoPixel.h>     #define ledPin 13       // светодиод на плате arduino  #define stripPin 2      // выход управления светодиодной лентой  #define stripLed 60     // количество светодиодов в ленте  #define bandPass 15     // число полос ЦМУ (используемых светодиодов)  #define ledDist 4  #define LedtoColor 4    // Parameter 1 = number of pixels in strip  // Parameter 2 = Arduino pin number (most are valid)  // Parameter 3 = pixel type flags, add together as needed:  //   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)  //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)  //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)  //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)  Adafruit_NeoPixel strip = Adafruit_NeoPixel(stripLed, stripPin, NEO_GRB + NEO_KHZ800);    const uint32_t PROGMEM    colorTab[]={        0xFF0000,0xFF1100,0xFF2200,0xFF3300,0xFF4400,0xFF5500,0xFF6600,0xFF7700,0xFF8800,0xFF9900,0xFFAA00,0xFFBB00,0xFFCC00,0xFFDD00,0xFFEE00,0xFFFF00,  //красный - жёлтый        0xFFFF00,0xEEFF00,0xDDFF00,0xCCFF00,0xBBFF00,0xAAFF00,0x99FF00,0x88FF00,0x77FF00,0x66FF00,0x55FF00,0x44FF00,0x33FF00,0x22FF00,0x11FF00,0x00FF00,  //жёлтый — зелёный        0x00FF00,0x00FF11,0x00FF22,0x00FF33,0x00FF44,0x00FF55,0x00FF66,0x00FF77,0x00FF88,0x00FF99,0x00FFAA,0x00FFBB,0x00FFCC,0x00FFDD,0x00FFEE,0x00FFFF,  //зелёный — циан (голубой)        0x00FFFF,0x00EEFF,0x00DDFF,0x00CCFF,0x00BBFF,0x00AAFF,0x0099FF,0x0088FF,0x0077FF,0x0066FF,0x0055FF,0x0044FF,0x0033FF,0x0022FF,0x0011FF,0x0000FF,  //голубой — синий        0x0000FF,0x1100FF,0x2200FF,0x3300FF,0x4400FF,0x5500FF,0x6600FF,0x7700FF,0x8800FF,0x9900FF,0xAA00FF,0xBB00FF,0xCC00FF,0xDD00FF,0xEE00FF,0xFF00FF,  //синий — пурпур (маджента)        0xFF00FF,0xFF00EE,0xFF00DD,0xFF00CC,0xFF00BB,0xFF00AA,0xFF0099,0xFF0088,0xFF0077,0xFF0066,0xFF0055,0xFF0044,0xFF0033,0xFF0022,0xFF0011,0xFF0000}; //маджента — красный    typedef union{      struct {        uint8_t b,g,r,w;      };      uint32_t dw;  } TColor;    typedef union{      struct {        uint8_t b0,b1;      };      uint16_t w;  } TWord;    uint8_t inCounter = 0;  boolean stringComplete = false;  // whether the string is complete  char prog = '4';  uint8_t param = 10;  char inStr[32];       // a string to hold incoming data  char readData[32];    // a string to hold incoming data    void setup() {    // initialize serial:    strip.begin();    strip.show(); // Initialize all pixels to 'off'    Serial.begin(115200);    // reserve 32 bytes for the inputString:    pinMode(ledPin, OUTPUT);  }    void loop() {    // print the string when a newline arrives:    if (stringComplete) {      stringComplete = false;      cmdExecute();      readData[1]=0;      Serial.println(readData); // Подтверждение - команда выполнена    }    else {      switch (prog) {        case '3': { theaterChaseRainbow(param); break; }        case '4': { rainbowCycle(param); break; }        case '5': { sub1(param); break; }        case '6': { sub2(param); break; }  //      case '7': { sub3(param); break; }  //      case '8': { sub4(param); break; }      }    }  }    void cmdExecute() {            prog = readData[0];      param = readData[1];      switch (prog) {        case 'r': { zmu();  break; }        case 's': { zmu2(); break; }        case 't': { zmu3(); break; }        case 'u': { zmu4(); break; }        case '1': { white(param); break; }        case '2': { color(param); break; }        case '3': { theaterChaseRainbow(param); break; }        case '4': { rainbowCycle(param); break; }        case '5': { sub1(param); break; }        case '6': { sub2(param); break; }  //      case '7': { sub3(param); break; }  //      case '8': { sub4(param); break; }        case 'c': { strip.clear(); strip.show(); break; }      }  }    void sub1(uint8_t wait) {  // Напишите свой код      }    void sub2(uint8_t wait) {  // Напишите свой код     }    void zmu4() {    TColor cl;    TWord akk;    uint8_t i,k;      for(i=0; i<bandPass; i++) {        cl.dw = pgm_read_dword(&colorTab[96*i/bandPass]);        // Ваш код          // .....        cl.dw = strip.Color(cl.r, cl.g, cl.b);        for(k=0; k<LedtoColor; k++) strip.setPixelColor(i*LedtoColor+k, cl.dw);        // Ваш код      }    strip.show();  }    void zmu3() {    TColor cl;    TWord akk;    uint8_t i,k,j,n;      for(i=0; i<15; i++) {        cl.dw = pgm_read_dword(&colorTab[96*i/15]);        j=readData[i+2];        akk.w = cl.r * j;        akk.w = akk.b1 * akk.b1;         cl.r = akk.b1;        akk.w = cl.g * j;        akk.w = akk.b1 * akk.b1;         cl.g = akk.b1;        akk.w = cl.b * j;        akk.w = akk.b1 * akk.b1;         cl.b = akk.b1;        cl.dw = strip.Color(cl.r, cl.g, cl.b);        n=i*4;        for(k=0; k<4; k++) {          strip.setPixelColor(n+k, cl.dw);          strip.setPixelColor(stripLed-(n+k)-1, cl.dw);        }    }    strip.show();  }    void zmu2() {    TColor cl;    TWord akk;    uint8_t i,k,j;      for(i=0; i<bandPass; i++) {        cl.dw = pgm_read_dword(&colorTab[96*i/bandPass]);        j=readData[i+2];        akk.w = cl.r * j;        akk.w = akk.b1 * akk.b1;         cl.r = akk.b1;        akk.w = cl.g * j;        akk.w = akk.b1 * akk.b1;         cl.g = akk.b1;        akk.w = cl.b * j;        akk.w = akk.b1 * akk.b1;         cl.b = akk.b1;        cl.dw = strip.Color(cl.r, cl.g, cl.b);        for(k=0; k<LedtoColor; k++) strip.setPixelColor(i+k*bandPass, cl.dw);    }    strip.show();  }    void zmu() {    TColor cl;    TWord akk;    uint8_t n,i,k,j;      for(i=0; i<bandPass; i++) {        cl.dw = pgm_read_dword(&colorTab[96*i/bandPass]);        j=readData[i+2];        akk.w = cl.r * j;        akk.w = akk.b1 * akk.b1;         cl.r = akk.b1;        akk.w = cl.g * j;        akk.w = akk.b1 * akk.b1;         cl.g = akk.b1;        akk.w = cl.b * j;        akk.w = akk.b1 * akk.b1;         cl.b = akk.b1;        cl.dw = strip.Color(cl.r, cl.g, cl.b);        n=i*ledDist;        for(k=0; k<LedtoColor; k++) strip.setPixelColor(n+k, cl.dw);    }    strip.show();  }    void white(uint8_t brigth) {    uint8_t i;    uint32_t c;      c=strip.Color(brigth, brigth, brigth);    for(i=0; i<stripLed; i++) strip.setPixelColor(i, c);    strip.show();  }    void color(uint8_t colorNumber) {    uint8_t i;    TColor cl;      if (colorNumber>95) colorNumber=95;     cl.dw = pgm_read_dword(&colorTab[colorNumber]);    cl.dw = strip.Color(cl.r, cl.g, cl.b);    for(i=0; i<stripLed; i++) strip.setPixelColor(i, cl.dw);    strip.show();  }    void rainbow(uint8_t wait) {    uint16_t i, j;      for(j=0; j<256; j++) {      for(i=0; i<strip.numPixels(); i++) {        strip.setPixelColor(i, Wheel((i+j) & 255));      }      strip.show();      delay(wait);    }  }    // Slightly different, this makes the rainbow equally distributed throughout  void rainbowCycle(uint8_t wait) {    uint16_t i, j;      for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel      for(i=0; i< strip.numPixels(); i++) {        strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));      }      strip.show();      delay(wait);    }  }    //Theatre-style crawling lights.  void theaterChase(uint32_t c, uint8_t wait) {    for (int j=0; j<10; j++) {  //do 10 cycles of chasing      for (int q=0; q < 3; q++) {        for (int i=0; i < strip.numPixels(); i=i+3) {          strip.setPixelColor(i+q, c);    //turn every third pixel on        }        strip.show();          delay(wait);          for (int i=0; i < strip.numPixels(); i=i+3) {          strip.setPixelColor(i+q, 0);        //turn every third pixel off        }      }    }  }    //Theatre-style crawling lights with rainbow effect  void theaterChaseRainbow(uint8_t wait) {    for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel      for (int q=0; q < 3; q++) {        for (int i=0; i < strip.numPixels(); i=i+3) {          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on        }        strip.show();          delay(wait);          for (int i=0; i < strip.numPixels(); i=i+3) {          strip.setPixelColor(i+q, 0);        //turn every third pixel off        }      }    }  }    // Input a value 0 to 255 to get a color value.  // The colours are a transition r - g - b - back to r.  uint32_t Wheel(byte WheelPos) {    WheelPos = 255 - WheelPos;    if(WheelPos < 85) {      return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);    }    if(WheelPos < 170) {      WheelPos -= 85;      return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);    }    WheelPos -= 170;    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);  }    //  SerialEvent  void serialEvent() {    uint8_t i;        while (Serial.available()) {      // get the new byte:      char inChar = (char)Serial.read();      if (inChar != char(254)) {       inStr[inCounter++] = inChar;       if (inChar == char(255)) {         i=0;         while (inStr[i]!=char(255)) {           readData[i]=inStr[i];           i++;         }         readData[i]=inStr[i];         inCounter = 0;          // Устанавливаем счётчик принятых символов на начало входного буфера         stringComplete = true;      }      } else inCounter = 0;      // Устанавливаем счётчик принятых символов на начало входного буфера    }  }  

Скетчи для беспроводного варианта:
Скетч для модуля подключаемого к компьютеру «COMtoRF.ino»:

  #include <SPI.h>        // Подключаем библиотеку для работы с шиной SPI  #include <nRF24L01.h>   // Подключаем файл настроек из библиотеки RF24  #include <RF24.h>       // Подключаем библиотеку для работы с nRF24L01+  RF24    radio(9, 10);   // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)    char    rfData[22];     // Создаём массив для передачи данных  uint8_t rfCounter = 0;  char    serData[32];    // a string to hold incoming data  uint8_t serCounter = 0;  boolean stringComplete = false;    void setup(){      Serial.begin(115200);      radio.begin();                             // Инициируем работу nRF24L01+      radio.setChannel(5);                       // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)      radio.setDataRate     (RF24_1MBPS);        // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек      radio.setPALevel      (RF24_PA_HIGH);      // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)      radio.openWritingPipe (0x1234567890LL);    // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)  }    void loop(){    uint8_t i;          if (rfCounter>0) {        radio.write(&rfData[0],22);        rfCounter=0;        Serial.write(rfData,22);      }  }    //  SerialEvent  void serialEvent() {    uint8_t i;        while (Serial.available()) {      // get the new byte:      char inChar = (char)Serial.read();      if (inChar != char(254)) {       if (inChar == char(255)) {         for(i=0; i<22; i++) rfData[i]=serData[i];         rfCounter = 22;         serCounter = 0;          // clear the input string:       }       else {        serData[serCounter++] = inChar;        serCounter &= 0x1F;       }      } else serCounter = 0;      // clear the input string:     }  }  

Скетч для модуля ленты «RFtoLED.ino»:

  #include <SPI.h>                   // Подключаем библиотеку  для работы с шиной SPI  #include <nRF24L01.h>              // Подключаем файл настроек из библиотеки RF24  #include <RF24.h>                  // Подключаем библиотеку  для работы с nRF24L01+  #include <Adafruit_NeoPixel.h>    #define stripLed 120     // количество светодиодов в ленте  #define bandPass 17      // полос (групп светодиодов)  #define stripPin 2       // выход управления светодиодной лентой  #define ledDist 7  #define LedtoColor 7    // Parameter 1 = number of pixels in strip  // Parameter 2 = Arduino pin number (most are valid)  // Parameter 3 = pixel type flags, add together as needed:  //   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)  //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)  //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)  //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)  Adafruit_NeoPixel strip = Adafruit_NeoPixel(stripLed, stripPin, NEO_GRB + NEO_KHZ800);    RF24      radio(9, 10);    // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)    const uint32_t PROGMEM    colorTab[]={        0xFF0000,0xFF1100,0xFF2200,0xFF3300,0xFF4400,0xFF5500,0xFF6600,0xFF7700,0xFF8800,0xFF9900,0xFFAA00,0xFFBB00,0xFFCC00,0xFFDD00,0xFFEE00,0xFFFF00,  //красный - жёлтый        0xFFFF00,0xEEFF00,0xDDFF00,0xCCFF00,0xBBFF00,0xAAFF00,0x99FF00,0x88FF00,0x77FF00,0x66FF00,0x55FF00,0x44FF00,0x33FF00,0x22FF00,0x11FF00,0x00FF00,  //жёлтый — зелёный        0x00FF00,0x00FF11,0x00FF22,0x00FF33,0x00FF44,0x00FF55,0x00FF66,0x00FF77,0x00FF88,0x00FF99,0x00FFAA,0x00FFBB,0x00FFCC,0x00FFDD,0x00FFEE,0x00FFFF,  //зелёный — циан (голубой)        0x00FFFF,0x00EEFF,0x00DDFF,0x00CCFF,0x00BBFF,0x00AAFF,0x0099FF,0x0088FF,0x0077FF,0x0066FF,0x0055FF,0x0044FF,0x0033FF,0x0022FF,0x0011FF,0x0000FF,  //голубой — синий        0x0000FF,0x1100FF,0x2200FF,0x3300FF,0x4400FF,0x5500FF,0x6600FF,0x7700FF,0x8800FF,0x9900FF,0xAA00FF,0xBB00FF,0xCC00FF,0xDD00FF,0xEE00FF,0xFF00FF,  //синий — пурпур (маджента)        0xFF00FF,0xFF00EE,0xFF00DD,0xFF00CC,0xFF00BB,0xFF00AA,0xFF0099,0xFF0088,0xFF0077,0xFF0066,0xFF0055,0xFF0044,0xFF0033,0xFF0022,0xFF0011,0xFF0000}; //маджента — красный          typedef union{      struct {        uint8_t b,g,r,w;      };      uint32_t dw;  } TColor;    typedef union{      struct {        uint8_t b0,b1;      };      uint16_t w;  } TWord;          char readData[22];           // Буфер команды  char prog = '3';  uint8_t param = 0;    void setup(){      // initialize serial:      Serial.begin(115200);      strip.begin();      strip.show(); // Initialize all pixels to 'off'        radio.begin();                              // Инициируем работу nRF24L01+  //    radio.setAutoAck(false);        radio.setChannel(5);                        // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)      radio.setDataRate     (RF24_1MBPS);         // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек      radio.setPALevel      (RF24_PA_HIGH);       // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)      radio.openReadingPipe (1, 0x1234567890LL);  // Открываем 1 трубу с идентификатором 0x1234567890 для приема данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)        radio.startListening  ();                   // Включаем приемник, начинаем прослушивать открытые трубы  }    void loop(){        if(radio.available()){        // Если в буфере имеются принятые данные, то получаем номер трубы, по которой они пришли, по ссылке на переменную pipe        radio.read(&readData, 22);  // Приём команды        cmdExecute();             }      else {        switch (prog) {          case '3': { theaterChaseRainbow(param); break; }          case '4': { rainbowCycle(param); break; }          case '5': { sub1(param); break; }          case '6': { sub2(param); break; }  //        case '7': { sub3(param); break; }  //        case '8': { sub4(param); break; }        }      }  }    void cmdExecute() {      prog = readData[0];      param = readData[1];      switch (prog) {        case 'r': { zmu();  break; }        case 's': { zmu2(); break; }        case 't': { zmu3(); break; }        case 'u': { zmu4(); break; }        case '1': { white(param); break; }        case '2': { color(param); break; }        case '3': { theaterChaseRainbow(param); break; }        case '4': { rainbowCycle(param); break; }        case '5': { sub1(param); break; }        case '6': { sub2(param); break; }  //      case '7': { sub3(param); break; }  //      case '8': { sub4(param); break; }        case 'c': { strip.clear(); strip.show(); break; }      }  }    void sub1(uint8_t wait) {  // Напишите свой код      }    void sub2(uint8_t wait) {  // Напишите свой код     }    void zmu4() {    TColor cl;    uint8_t i,k;      for(i=0; i<bandPass; i++) {        cl.dw = pgm_read_dword(&colorTab[96*i/bandPass]);        // Ваш код          // .....        cl.dw = strip.Color(cl.r, cl.g, cl.b);        for(k=0; k<LedtoColor; k++) strip.setPixelColor(i*LedtoColor+k, cl.dw);        // Ваш код      }    strip.show();  }    void zmu3() {    TColor cl;    TWord akk;    uint16_t r,g,b;    uint8_t i,k,j,n;      for(i=0; i<15; i++) {        cl.dw = pgm_read_dword(&colorTab[96*i/15]);        j=readData[i+2];        akk.w = cl.r * j;        akk.w = akk.b1 * akk.b1;         cl.r = akk.b1;        akk.w = cl.g * j;        akk.w = akk.b1 * akk.b1;         cl.g = akk.b1;        akk.w = cl.b * j;        akk.w = akk.b1 * akk.b1;         cl.b = akk.b1;        cl.dw = strip.Color(cl.r, cl.g, cl.b);        n=i*4;        for(k=0; k<4; k++) {          strip.setPixelColor(n+k, cl.dw);          strip.setPixelColor(stripLed-(n+k)-1, cl.dw);        }    }    strip.show();  }    void zmu2() {    TColor cl;    TWord akk;    uint16_t r,g,b;    uint8_t i,k,j;      for(i=0; i<bandPass; i++) {        cl.dw = pgm_read_dword(&colorTab[96*i/bandPass]);        j=readData[i+2];        akk.w = cl.r * j;        akk.w = akk.b1 * akk.b1;         cl.r = akk.b1;        akk.w = cl.g * j;        akk.w = akk.b1 * akk.b1;         cl.g = akk.b1;        akk.w = cl.b * j;        akk.w = akk.b1 * akk.b1;         cl.b = akk.b1;        cl.dw = strip.Color(cl.r, cl.g, cl.b);        for(k=0; k<LedtoColor; k++) strip.setPixelColor(i+k*bandPass, cl.dw);    }    strip.show();  }    void zmu() {    TColor cl;    TWord akk;    uint16_t r,g,b;    uint8_t n,i,k,j;      for(i=0; i<bandPass; i++) {        cl.dw = pgm_read_dword(&colorTab[96*i/bandPass]);        j=readData[i+2];        akk.w = cl.r * j;        akk.w = akk.b1 * akk.b1;         cl.r = akk.b1;        akk.w = cl.g * j;        akk.w = akk.b1 * akk.b1;         cl.g = akk.b1;        akk.w = cl.b * j;        akk.w = akk.b1 * akk.b1;         cl.b = akk.b1;        cl.dw = strip.Color(cl.r, cl.g, cl.b);        n=i*ledDist;        for(k=0; k<LedtoColor; k++) strip.setPixelColor(n+k, cl.dw);    }    strip.show();  }    void white(uint8_t brigth) {    uint8_t i;    uint32_t c;      c=strip.Color(brigth, brigth, brigth);    for(i=0; i<stripLed; i++) strip.setPixelColor(i, c);    strip.show();  }    void color(uint8_t colorNumber) {    uint8_t i;    TColor cl;      if (colorNumber>95) colorNumber=95;     cl.dw = pgm_read_dword(&colorTab[colorNumber]);    cl.dw = strip.Color(cl.r, cl.g, cl.b);    for(i=0; i<stripLed; i++) strip.setPixelColor(i, cl.dw);    strip.show();  }    void rainbow(uint8_t wait) {    uint16_t i, j;      for(j=0; j<256; j++) {      for(i=0; i<strip.numPixels(); i++) {        strip.setPixelColor(i, Wheel((i+j) & 255));      }      strip.show();      delay(wait);    }  }    // Slightly different, this makes the rainbow equally distributed throughout  void rainbowCycle(uint8_t wait) {    uint16_t i, j;      for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel      for(i=0; i< strip.numPixels(); i++) {        strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));      }      strip.show();      delay(wait);    }  }    //Theatre-style crawling lights.  void theaterChase(uint32_t c, uint8_t wait) {    for (int j=0; j<10; j++) {  //do 10 cycles of chasing      for (int q=0; q < 3; q++) {        for (int i=0; i < strip.numPixels(); i=i+3) {          strip.setPixelColor(i+q, c);    //turn every third pixel on        }        strip.show();          delay(wait);          for (int i=0; i < strip.numPixels(); i=i+3) {          strip.setPixelColor(i+q, 0);        //turn every third pixel off        }      }    }  }    //Theatre-style crawling lights with rainbow effect  void theaterChaseRainbow(uint8_t wait) {    for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel      for (int q=0; q < 3; q++) {        for (int i=0; i < strip.numPixels(); i=i+3) {          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on        }        strip.show();          delay(wait);          for (int i=0; i < strip.numPixels(); i=i+3) {          strip.setPixelColor(i+q, 0);        //turn every third pixel off        }      }    }  }    // Input a value 0 to 255 to get a color value.  // The colours are a transition r - g - b - back to r.  uint32_t Wheel(byte WheelPos) {    WheelPos = 255 - WheelPos;    if(WheelPos < 85) {      return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);    }    if(WheelPos < 170) {      WheelPos -= 85;      return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);    }    WheelPos -= 170;    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);  }  

Работа программ Радуга, МИКС, Двутавр:

Добавить в избранное +1 +1

(c) 2017 Источник материала

Рекламные ссылки