#include "FastLED.h" #define NUM_STRIP 24 // количество лент #define NUM_LEDS 30 // количество светодиодов в каждой ленте #define NUM_METEORS 15 // длина МЕТЕОРА #define INCREASE_BRIGHTNESS (256/NUM_METEORS) #define TIME_MIN 5 // максимальная скорость метеора #define TIME_MAX 65 // минимальная скорость метеора // #define DATA_PIN1 1 // 41//ноги по АРДУИНО ПРО МИНИ для каждой ленты #define DATA_PIN2 2 // 42//подключать через резистор 470 Ом #define DATA_PIN3 3 // 43/питание лент от отдельного стабилизированного #define DATA_PIN4 4 // 44//источника постоянного напряжения 5V #define DATA_PIN5 8 // 9//Земля общая с блоком питания Ардуино #define DATA_PIN6 9 // 10// #define DATA_PIN7 10 // 11//ВНИМАНИЕ: потребление каждого кусочка ленты #define DATA_PIN8 11 // 12//из 20 светтодиодов = 6 Ватт (ток 1,2А на канал) #define DATA_PIN9 12 // 13//из 12 лент = 72 Ватт, что равно току почти 15А #define DATA_PIN10 13 // 14//если предполагается одновременное включение всех #define DATA_PIN11 14 // 15//практика показала что максимальное потребление #define DATA_PIN12 15 // 16//одного отрезка ленты в режиме сосульки не более 200мА #define DATA_PIN13 16 //19 #define DATA_PIN14 17 //20 #define DATA_PIN15 18 //21 #define DATA_PIN16 19 //22 #define DATA_PIN17 20 //23 #define DATA_PIN18 21 //24 #define DATA_PIN19 22 //25 #define DATA_PIN20 23 //26 #define DATA_PIN21 28 //33 #define DATA_PIN22 29 //32 #define DATA_PIN23 30 //31 #define DATA_PIN24 31 //30 CRGB leds1[NUM_LEDS]; // первая лента CRGB leds2[NUM_LEDS]; // вторая лента CRGB leds3[NUM_LEDS]; // третья лента CRGB leds4[NUM_LEDS]; // четвертая лента CRGB leds5[NUM_LEDS]; // пятая лента CRGB leds6[NUM_LEDS]; // шестая лента CRGB leds7[NUM_LEDS]; // седьмая лента CRGB leds8[NUM_LEDS]; // восьмая лента CRGB leds9[NUM_LEDS]; // девятая лента CRGB leds10[NUM_LEDS]; // десятая лента CRGB leds11[NUM_LEDS]; // одиннадцатая лента CRGB leds12[NUM_LEDS]; // двенадцатая лента CRGB leds13[NUM_LEDS]; CRGB leds14[NUM_LEDS]; CRGB leds15[NUM_LEDS]; CRGB leds16[NUM_LEDS]; CRGB leds17[NUM_LEDS]; CRGB leds18[NUM_LEDS]; CRGB leds19[NUM_LEDS]; CRGB leds20[NUM_LEDS]; CRGB leds21[NUM_LEDS]; CRGB leds22[NUM_LEDS]; CRGB leds23[NUM_LEDS]; CRGB leds24[NUM_LEDS]; CRGB meteors[NUM_METEORS]; // метеор CRGB etalone[NUM_METEORS+NUM_LEDS]; // эталонный массив метеор+лента CRGB rabochiy[NUM_METEORS+NUM_LEDS]; // рабочий массив для расчета лент byte LENTA[NUM_STRIP]; // массив признаков работы лент (1-выполняется метеор, 0-выкл) byte PHASE[NUM_STRIP]; // массив значений состояния сдвига для каждой ленты 0 - NUM_METEORS+NUM_LEDS byte PAUSE[NUM_STRIP]; // массив значений циклов задержки между метеорами для каждой ленты byte COLOR[NUM_STRIP]; // массив значений цвета лент int i,j,n = 0; int HSV, STAY_TIME; // цвет и скорость метеора если число + то скорость - void setup() { // В случае управление питанием чрез клю нужен этот кусок кода, чтобы включить ленту // и дождаться окончания переходных процессов // pinMode( POWER_PIN, OUTPUT ); // digitalWrite( A0, HIGH ); // delay(2000); // инициализируем ленты FastLED.addLeds(leds1, NUM_LEDS); FastLED.addLeds(leds2, NUM_LEDS); FastLED.addLeds(leds3, NUM_LEDS); FastLED.addLeds(leds4, NUM_LEDS); FastLED.addLeds(leds5, NUM_LEDS); FastLED.addLeds(leds6, NUM_LEDS); FastLED.addLeds(leds7, NUM_LEDS); FastLED.addLeds(leds8, NUM_LEDS); FastLED.addLeds(leds9, NUM_LEDS); FastLED.addLeds(leds10, NUM_LEDS); FastLED.addLeds(leds11, NUM_LEDS); FastLED.addLeds(leds12, NUM_LEDS); FastLED.addLeds(leds13, NUM_LEDS); FastLED.addLeds(leds14, NUM_LEDS); FastLED.addLeds(leds15, NUM_LEDS); FastLED.addLeds(leds16, NUM_LEDS); FastLED.addLeds(leds17, NUM_LEDS); FastLED.addLeds(leds18, NUM_LEDS); FastLED.addLeds(leds19, NUM_LEDS); FastLED.addLeds(leds20, NUM_LEDS); FastLED.addLeds(leds21, NUM_LEDS); FastLED.addLeds(leds22, NUM_LEDS); FastLED.addLeds(leds23, NUM_LEDS); FastLED.addLeds(leds24, NUM_LEDS); // включение аналогового входа настройка диапазона цветов метеора pinMode( A0, INPUT); pinMode( A1, INPUT); pinMode( A2, INPUT_PULLUP); HSV = GETCOLOR(); STAY_TIME = map(analogRead(A1), 0, 1023, TIME_MIN, TIME_MAX); // стартовая инициализация всех массивов for ( i = 0; i < NUM_STRIP; i++) { LENTA[i] = 1; PHASE[i] = 0; PAUSE[i] = 0; COLOR[i] = HSV;} } void loop() { for ( n = 0; n < NUM_STRIP; n++) { // поочередно перебираем все ленты if ( LENTA[n] == 1) { // если на ленте есть МЕТЕОР то обрабатываем if ( PHASE[n] == (NUM_LEDS+NUM_METEORS)){ // если МЕТЕОР "вылетел" то PHASE[n] = 0; // сброс ленты на НОЛЬ LENTA[n] = 0; // выключение ленты if (digitalRead(A2)==HIGH) { // если тумблер выключен, то работаем с резистором цвета HSV = GETCOLOR(); // подготовка нового цвета к следующему включению COLOR[n] = random(HSV-5,HSV+5);} // и установка коридора флюктуации цвета else {COLOR[n]++;} // если тумблер включен, то плавно меняем цвет PAUSE[n] = random(10,50); } // и задание паузы до следующего включения (в циклах) SHIFT(n,PHASE[n]); // если нормальный цикл обработки, то засвечиваем Метеор на ленте PHASE[n]++;} // и сдвигаем фазу if (LENTA[n]==0) { // Если лента выключена if (PAUSE[n]>0) PAUSE[n]--; // то считаем длительность паузы if (PAUSE[n]==0) LENTA[n]=1;} // и по окончании включаем ленту снова } FastLED.show(); // засветка лвсех лент STAY_TIME = map(analogRead(A1), 0, 1023, TIME_MIN, TIME_MAX); // снятие показателя задержки delay(STAY_TIME); // задержка по уровню скорости МЕТЕОРА } // Подпрограмма настройки диапазона цвета метеора по регулятору, подключенному к A0 int GETCOLOR() { int val = map(analogRead(A0), 0, 1023, 5, 250); // цветовой ряд HSV описывается в диапазоне от 0 до 255 return val; // поскольку корридор +-45 то масштабирование аналогового входа } // делается в диапазоне от 45 до 315 // подпрограмма формирование метеора заданной длины и цвета и заливка его в эталонный массив void METEOR(int color) { i,j = 0; for( i = INCREASE_BRIGHTNESS - 1; i < 256; i += INCREASE_BRIGHTNESS ) // создание МЕТЕОРА meteors[j++].setHSV( color, 255, i ); // заданного цвета for( i = 0; i < NUM_METEORS; i++) // и сброс его в эталонный массив etalone[i] = meteors[i]; for( i = NUM_METEORS; i < (NUM_LEDS + NUM_METEORS); i ++ ) // остальное заполняем "черным" etalone[i] = CRGB::Black; } // подпрограмма копирования эталонного массива со сдвигом в рабочую область void SHIFT(int LED, int shift) { // подготовка своего цвета для каждой ленты if (LED==0) METEOR(COLOR[0]); if (LED==1) METEOR(COLOR[1]); if (LED==2) METEOR(COLOR[2]); if (LED==3) METEOR(COLOR[3]); if (LED==4) METEOR(COLOR[4]); if (LED==5) METEOR(COLOR[5]); if (LED==6) METEOR(COLOR[6]); if (LED==7) METEOR(COLOR[7]); if (LED==8) METEOR(COLOR[8]); if (LED==9) METEOR(COLOR[9]); if (LED==10) METEOR(COLOR[10]); if (LED==11) METEOR(COLOR[11]); if (LED==12) METEOR(COLOR[12]); if (LED==13) METEOR(COLOR[13]); if (LED==14) METEOR(COLOR[14]); if (LED==15) METEOR(COLOR[15]); if (LED==16) METEOR(COLOR[16]); if (LED==17) METEOR(COLOR[17]); if (LED==18) METEOR(COLOR[18]); if (LED==19) METEOR(COLOR[19]); if (LED==20) METEOR(COLOR[20]); if (LED==21) METEOR(COLOR[21]); if (LED==22) METEOR(COLOR[22]); if (LED==23) METEOR(COLOR[23]); // переписываем эталон с указанным сдвигом в рабочий массив for( i = (NUM_LEDS+NUM_METEORS-1); i > shift; i-- ) rabochiy[i] = etalone[i-shift]; for ( i = shift; i > 0; i--) rabochiy[i] = CRGB::Black; // и заливаем его на соответствующую ленту if (LED==0) for( i = 0; i < NUM_LEDS; i++ ) leds1[i] = rabochiy[i+NUM_METEORS]; if (LED==1) for( i = 0; i < NUM_LEDS; i++ ) leds2[i] = rabochiy[i+NUM_METEORS]; if (LED==2) for( i = 0; i < NUM_LEDS; i++ ) leds3[i] = rabochiy[i+NUM_METEORS]; if (LED==3) for( i = 0; i < NUM_LEDS; i++ ) leds4[i] = rabochiy[i+NUM_METEORS]; if (LED==4) for( i = 0; i < NUM_LEDS; i++ ) leds5[i] = rabochiy[i+NUM_METEORS]; if (LED==5) for( i = 0; i < NUM_LEDS; i++ ) leds6[i] = rabochiy[i+NUM_METEORS]; if (LED==6) for( i = 0; i < NUM_LEDS; i++ ) leds7[i] = rabochiy[i+NUM_METEORS]; if (LED==7) for( i = 0; i < NUM_LEDS; i++ ) leds8[i] = rabochiy[i+NUM_METEORS]; if (LED==8) for( i = 0; i < NUM_LEDS; i++ ) leds9[i] = rabochiy[i+NUM_METEORS]; if (LED==9) for( i = 0; i < NUM_LEDS; i++ ) leds10[i] = rabochiy[i+NUM_METEORS]; if (LED==10) for( i = 0; i < NUM_LEDS; i++ ) leds11[i] = rabochiy[i+NUM_METEORS]; if (LED==11) for( i = 0; i < NUM_LEDS; i++ ) leds12[i] = rabochiy[i+NUM_METEORS]; if (LED==12) for( i = 0; i < NUM_LEDS; i++ ) leds13[i] = rabochiy[i+NUM_METEORS]; if (LED==13) for( i = 0; i < NUM_LEDS; i++ ) leds14[i] = rabochiy[i+NUM_METEORS]; if (LED==14) for( i = 0; i < NUM_LEDS; i++ ) leds15[i] = rabochiy[i+NUM_METEORS]; if (LED==15) for( i = 0; i < NUM_LEDS; i++ ) leds16[i] = rabochiy[i+NUM_METEORS]; if (LED==16) for( i = 0; i < NUM_LEDS; i++ ) leds17[i] = rabochiy[i+NUM_METEORS]; if (LED==17) for( i = 0; i < NUM_LEDS; i++ ) leds18[i] = rabochiy[i+NUM_METEORS]; if (LED==18) for( i = 0; i < NUM_LEDS; i++ ) leds19[i] = rabochiy[i+NUM_METEORS]; if (LED==19) for( i = 0; i < NUM_LEDS; i++ ) leds20[i] = rabochiy[i+NUM_METEORS]; if (LED==20) for( i = 0; i < NUM_LEDS; i++ ) leds21[i] = rabochiy[i+NUM_METEORS]; if (LED==21) for( i = 0; i < NUM_LEDS; i++ ) leds22[i] = rabochiy[i+NUM_METEORS]; if (LED==22) for( i = 0; i < NUM_LEDS; i++ ) leds23[i] = rabochiy[i+NUM_METEORS]; if (LED==23) for( i = 0; i < NUM_LEDS; i++ ) leds24[i] = rabochiy[i+NUM_METEORS]; }