Скетч
Первое, с чем я столкнулся и что пришлось решать в первую очередь - КАК я буду задавать спецэффекты.
Вторая проблема "вытекла" из первой - в процессе разработки мне перестало хватать оперативной памяти. Пришлось весь текст переместить во флеш, о чем я НЕ ЖАЛЕЮ и рекомендую это делать СРАЗУ ЖЕ.
Освобождение ОЗУ и работу без глюков в дальнейшем гарантирую!
Прошу НАСТОЯЩИХ программистов сильно не пинать!
Для практического применения требуется скачать zip-файл - lampa7.zip - с сайта. Ниже код ТОЛЬКО для ознакомления!
#include < avr/pgmspace.h> // библиотека IRremote отключает шим на 3 пине ! int maxrejef = 10; // количество эффектов цвета, на 1 меньше реального const char string_0[] PROGMEM = "AzZzAZAnZnAZAaZaAZANZNAZ@NAZAzZzAZAnZnAZAaZaAZANZ@ANZNAZAzZzAZAn ZnAZAaZaAZ@ANZNAZAAZ@AAZANZNAZ@NAZAAZANZ"; const char string_1[] PROGMEM = "zzyAAyAAyAAyAAyAAy@AAyAAyzzyAAyAAyAAy@AAyAAyAAyAAyzzyAAy@AAyAAyAAyzzyA AyAAy@AAyAAyAAyAAyAAyzzy@AAyzzyAAyAAyAAyAAy"; const char string_2[] PROGMEM = "At}tA}@RAUAt}tRi@cAiAt}tcU@ZtGtZG@ZtGtZG@ZtGtZG"; const char string_3[] PROGMEM = "AtUttUtAUAA‘@AAUAtUttUtAUAA}@AAiAtUttUtAUAAi @AAiAtUtt}tAU@AAUAtUtt}tAUAAU@AtUtt}tAUAAi"; const char string_4[] PROGMEM = "ttUAAi@AAUttUAAU@AAittU@AAittU@AAUttUAAU@ttUAAi"; const char string_5[] PROGMEM = "zzyAAyANyNAyANyNAy@ANyNAyzzyAAyANyNAy@ANyNAyANyNAyzzyAAy@ANyNAyAAyAAy @AAyANyNAyAAy@AAyAAyANyNAy"; const char string_6[] PROGMEM = "AzZAAZAzyAAZAzZzzyAAZ@AAZzzZAAZAzyAAZAzZzzy@zzZAAZzzZAAZAzyAAZAzZzzZ @NayaNyNNy@NNyNayaNy@aNyNNyNay"; const char string_7[] PROGMEM = "ANMNAlAzMzAlAAy@AAMANMNAlAzMzAlAAl @AAZANMNAlAzMzAlAAZ@MZyZMy@MZyZMy@MZyZMy"; const char string_8[] PROGMEM = "azzzaz@azzzaz@azzzaz@zzKAAy@AAUzzKAAe@AAozzKAAK"; const char string_9[] PROGMEM = "zzyzzyzZyZMyAAyAAyAAyAAyAAyAAyAAyAAy@AAyAAyAAyAAyzzyzzyzZyZMyAAyAAyAAyAAy @AAyAAyAAyAAyAAyAAyAAyAAyzzyzzyzZyZMy"; const char string_10[] PROGMEM = "zzZAAyAAyAAZ@AAyzzZAAyAAZ@AAyAAyzzZAAZ @AAZzzZAAyAAy@AAyAAZzzZAAy@AAyAAyAAZzzZ"; // Теперь создаем таблицу с отсылками к этим строкам: const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5, string_6, string_7, string_8, string_9, string_10}; char bufferi[170]; // и буфер - длиной 170 символов volatile unsigned long IR_KEY; //код кнопки на пульте // включаем функцию для логарифмического формата #define LOG_OUT 1 // задаем количество выходных отсчетов #define FFT_N 128 // подключаем библиотеку FFT — быстрое преобразование Фурье #include #define irPin 2 //Пин инфракрасный #define MIC_PIN A0 //char* myRGB[] = { // "AAZ@AAazza@AAZ", // "At}tA}@RAUAt}tRi@cAiAt}tcU@ZtGtZG@ZtGtZG@ZtGtZG", // "AtUttUtAUAA‘@AAUAtUttUtAUAA}@AAiAtUttUtAUAAi@AAiAtUtt}tAU@AAUAtUtt}tAUAAU@AtUtt}tAUAAi", // "ttUAAi@AAUttUAAU@AAittU", // "At}tA}@RAUAt}tRi@cAiAt}tcU@ZtGtZG@ZtGtZG@ZtGtZG" //}; char im[65], data[65]; char data_avgs[14]; int i = 0, u, val, z, ciclic, msec, minim, maxim, otrez, rgbma, rgbin, cislo, rgbprd; int rgb1[3][18][2]; int rgb2[3][18][2]; int dlrgb[3][18][2]; int dl[3][2], dlt[3][2]; int rrggbb[3][2]; //результирующий локально byte notrandom = 0; // 1- следующий цветовой эффект не выбирается рандомно. int rejim = 4; // 0-cвеча,1-всполохи, 2-светомузыка, 3-ЭФФЕКТЫ ЦВЕТА 4-рандом эффект цвета int threshold = 250; // Порог срабатывания микрофона int massthreshold = 265; int volume; // Громкость микрофона int rejef = 0; // режим эффекта цвета int cvetomuz = 0; // для режима цветомузыка //int maxrejef = 8; // количество эффектов цвета, на 1 меньше реального int smenarej = 1; // 0 - продолжение режима эффекта, 1 - смена режима int dlinastr = 0; // длина строки при смене режима эффекта - ЛОКАЛЬНО int cenkra = 0; // 0-край по краю и центр в центре, 1-центр и край -край и край, центр и центр, к эффекту цвета int vibor_rasp = 0; // выбор центра или края, 1-центра, 2-выбор края, 3- ОДНОВРЕМЕННО центр с краем (еще один коэффициент регулировки ОБЩЕЙ скорости и ОБЩЕЙ яркостью) , 0 - НИЧЕГО не выбрано, + - НЕ РАБОТАЮТ к эффекту цвета int viborR = 0; // выбор режима - 0 - НИЧЕГО не выбрано, + - НЕ РАБОТАЮТ, 1-корректировка яркости света, 2-корректировка скорости к эффекту цвета int nomereff = -1; // "порядковый номер" в списке случайных эффектов. при НЕСОВПАДЕНИИ - генерируется новый эффект с новым порядковым номером int smesen = 0; // смещение от начала каждого цикла по 15 секунд float skcnkr[3] = {1, 1, 1}; // скорость края центра и ВСЕГО к эффекту цвета float dskcnkr = 1; // динамическая скорость - зависит от микрофона, чем шумнее - тем быстрее //int nackonkf[2] = {1, 1}; // начальная и конечные скорости рандомного эффекта int sluc = 0; // постэффект рандома float kfcnkr[3] = {1, 1, 1}; // яркость края, центра и всего к эффекту цвета int DD = 0; // при =0 загрузка край и центр, 1 - центр String myStr; char bukva; #define REDPIN 3 #define YELOPIN 6 #define BLUEPIN 5 // 9 10 11 #define RED_LED 10 // 10-правильный #define GREEN_LED 9 // 11 #define BLUE_LED 11 //9 int shume = 0; // средний уровень шума int nacshume = 0; // уровень шума по умолчанию при переключении режимов int shag = 10; // шаг свечи, при =10 - свеча горит как обычно, при меньшей - колеблется от тусклого к яркому int mode = 0; int localMode = 0; int knopka = 0; int cvet; unsigned long times, tektimes; void setup() { randomSeed(analogRead(2)); times = millis(); Serial.begin(9600); pinMode(REDPIN, OUTPUT); pinMode(YELOPIN, OUTPUT); pinMode(BLUEPIN, OUTPUT); pinMode(RED_LED , OUTPUT); pinMode(GREEN_LED , OUTPUT); pinMode(BLUE_LED , OUTPUT); pinMode(irPin, INPUT); // ИК приемник подключим сюда IR_KEY = 0; attachInterrupt(0, IRinterrupt, FALLING); // назначим прерывание shume = 0; for (i = 0; i < 5; i++) { shume = shume + analogRead(MIC_PIN); delay (100); } shume = shume / 5 - 5; nacshume = shume; threshold = shume; massthreshold = threshold + 15; } int soundColor(int inVolume) { int intensive = 255 / (massthreshold - threshold) * (inVolume - threshold); if (intensive > 255) { intensive = 255; } return intensive; } void loop() { int fff; //int nactimes; //Serial.println(volume); if (IR_KEY) { knopka = IR_KEY; IR_KEY = 0; Serial.println(knopka); switch (knopka) { case 17085: // 7 - отключение/включение рандомной генерации null_rgb(); if (notrandom == 0) { notrandom = 1; } else { notrandom = 0; } null_rgb(); null_rgb(); null_rgb(); break; // case -28561: case -7651: //CH+ // case 3772794553: // case 33720439: //EQ // я задрался искать - ПОЧЕМУ увеличивается на 1 rejim = rejim + 0; if (rejim > 4) rejim = 0; rejef = 0; smenarej = 1; setup_rgb(); delay(1000); delay(1000); null_rgb(); break; case 4335: //4 - узнать! setup_rgb; rejef = 0; smenarej = 1; rejim=0; null_rgb(); break; case 14535: //5 - ! setup_rgb; rejef = 0; smenarej = 1; rejim=1; null_rgb(); break; case 23205: //6 - ! setup_rgb; rejef = 0; smenarej = 1; rejim=2; null_rgb(); break; case 19125: //8 - ! setup_rgb; rejef = 0; smenarej = 1; rejim=3; null_rgb(); break; case 21165: // 9 setup_rgb; rejef = 0; smenarej = 1; rejim=4; null_rgb(); break; case -8161: //- if (rejim < 3) { if (rejim != 2) { shume = shume - 5; threshold = shume; massthreshold = threshold + 15; null_rgb(); //delay(5); } else { cvetomuz++; if (cvetomuz > 20) cvetomuz = 20; null_rgb(); } } else { if (viborR > 0 && vibor_rasp > 0 ) { switch (viborR) { case 1: kfcnkr[vibor_rasp] = kfcnkr[vibor_rasp] - 0.1; if (kfcnkr[vibor_rasp] <= 0) kfcnkr[vibor_rasp] = 0; break; case 2: skcnkr[vibor_rasp] = skcnkr[vibor_rasp] - 0.1; if (skcnkr[vibor_rasp] <= 0.1) skcnkr[vibor_rasp] = 0.1; break; } null_rgb(); //delay(300); } } // Serial.println(shume); break; // for (u = 0; u < 2 ; u++) // { // for (z = 0; z < 3 ; z++) // { // Serial.println( "-----------"); // Serial.println( dl[z][u]); // Serial.println( dlt[z][u]); // for (i = 0; i < 5 ; i++) // { // Serial.println( rgb1[z][i][u]); // Serial.println( rgb2[z][i][u]); // Serial.println( dlrgb[z][i][u]); // } // } // } // delay(1000); // break; case -22441: //+ // skorost = skorost + 1; //Serial.println(rejim ); if (rejim < 3) { //Serial.println(rejim ); if (rejim != 2) { //Serial.println("--" ); shume = shume + 5; threshold = shume; massthreshold = threshold + 15; null_rgb(); // delay(5); } else { // null_rgb; //Serial.println(cvetomuz ); cvetomuz--; if (cvetomuz < -20) cvetomuz = -20; delay(100); null_rgb; delay(100); } } else { if (viborR > 0 && vibor_rasp > 0 ) { switch (viborR) { case 1: kfcnkr[vibor_rasp] = kfcnkr[vibor_rasp] + 0.1; if (kfcnkr[vibor_rasp] > 1) kfcnkr[vibor_rasp] = 1; break; case 2: skcnkr[vibor_rasp] = skcnkr[vibor_rasp] + 0.1; if (skcnkr[vibor_rasp] > 5) skcnkr[vibor_rasp] = 5; break; } null_rgb(); //delay(300); } } // Serial.println(shume); break; case 8925: // << setup_rgb(); null_rgb(); rejef = rejef - 1; if (rejef < 0) rejef = maxrejef; smenarej = 1; //delay(5); // Serial.println(shume); break; case 765: // >> setup_rgb(); null_rgb(); rejef = rejef + 1; if (rejef > maxrejef) rejef = 0; smenarej = 1; //delay(5); // Serial.println(shume); break; case -26521: vibor_rasp = 1; // центр //delay(500); null_rgb(); break; case -20401: // край vibor_rasp = 2; //delay(500); null_rgb(); break; case 31365: // 3 - выбор скорости viborR = 2; //delay(500); null_rgb(); break; case 6375: //2 - выбор яркости viborR = 1; //delay(500); null_rgb(); break; case 26775: // 0 - управляется СРАЗУ и центр и край vibor_rasp = 2; //delay(500); null_rgb(); break; case -15811: // >II сброс эффектов по умолчанию // skcnkr[1] = 1; // skcnkr[0] = 1; // kfcn = 1; // kfkr = 1; // cenkra = 0; setup_rgb(); null_rgb(); // delay(1000); break; case 12495: // 1 - переключение края и центра cenkra++; if (cenkra > 3) cenkra = 0; //delay(1000); null_rgb(); break; } } switch (rejim) { case 0: volume = analogRead(MIC_PIN); if (volume < shume) { shag = 0; } if (shag != 10) { analogWrite (YELOPIN, 255 - random(shag * 12) + 13 * shag); analogWrite (REDPIN, 255 - random(shag * 12) + 13 * shag); cvet = random(shag * 12) + 13 * shag; analogWrite (RED_LED, 255 - cvet / 2); analogWrite (GREEN_LED, 255 - cvet / 10); delay (random(100)); shag = shag + 1; } else { analogWrite (YELOPIN, 255 - (random(120) + 135)); analogWrite (REDPIN, 255 - (random(120) + 135)); cvet = random(120) + 135; analogWrite (RED_LED, 255 - cvet / 2); analogWrite (GREEN_LED, 255 - cvet / 10); delay (random(100)); } break; case 1: //всполохи volume = analogRead(MIC_PIN); if (volume < threshold) { threshold = volume + 2; } if (volume >= threshold) { setColor(soundColor(volume) / 4, soundColor(volume), soundColor(volume) / 4); // setColor(255, 255, 255); } else { setColor(0, 0, 0); //digitalWrite(led, LOW); // Turn OFF Led } if (volume > threshold) { threshold = volume + 2; massthreshold = threshold + 15; } //конец всполохов break; case 2: //светомузыка // считываем заданное количество отсчётов for (i = 0; i < 64; i++) { val = analogRead(MIC_PIN); data[i] = val; im[i] = 0; }; fix_fft(data, im, 7, 0); for (i = 0; i < 64; i++) { //data[i] = sqrt(data[i] * data[i] + im[i] * im[i]); // this gets the absolute value of the v alues in the array, so we're only dealing with positive numbers data[i] = (data[i] * data[i] + im[i] * im[i]); // this gets the absolute value of the value s in the array, so we're only dealing with positive numbers }; // average bars together for (i = 0; i < 4; i++) { data_avgs[i] = data[i * 4] + data[i * 4 + 1] + data[i * 4 + 2] + data[i * 4 + 3] + data[i * 4 + 4] + data[i * 4 + 5] + data[i * 4 + 6] + data[i * 4 + 7] + data[i * 4 + 8] + data[i * 4 + 9] + data[i * 4 + 10] + data[i * 4 + 11] + data[i * 4 + 12] + data[i * 4 + 13] + data[i * 4 + 14] + data[i * 4 + 15]; // вычисляем среднее } if ( data_avgs[0] > 25 + cvetomuz) { // digitalWrite(RED_LED, HIGH); // digitalWrite(GREEN_LED, HIGH); // digitalWrite(BLUE_LED, HIGH); digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, LOW); digitalWrite(BLUE_LED, LOW); } else { // digitalWrite(RED_LED, LOW); // digitalWrite(GREEN_LED, LOW); // digitalWrite(BLUE_LED, LOW); digitalWrite(RED_LED, HIGH); digitalWrite(GREEN_LED, HIGH); digitalWrite(BLUE_LED, HIGH); } if ( data_avgs[1] > 25 + cvetomuz) { // digitalWrite(YELOPIN, HIGH); digitalWrite(YELOPIN, LOW); } else { // digitalWrite(YELOPIN, LOW); digitalWrite(YELOPIN, HIGH); } if ( data_avgs[2] > 25 + cvetomuz) { // digitalWrite(BLUEPIN, HIGH); digitalWrite(BLUEPIN, LOW); } else { // digitalWrite(BLUEPIN, LOW); digitalWrite(BLUEPIN, HIGH); } if ( data_avgs[3] > 20 + cvetomuz) { // digitalWrite(REDPIN, HIGH); digitalWrite(REDPIN, LOW); // digitalWrite(RED_LED, HIGH); // digitalWrite(GREEN_LED, HIGH); // digitalWrite(BLUE_LED, HIGH); } else { // digitalWrite(REDPIN, LOW); digitalWrite(REDPIN, HIGH); // digitalWrite(RED_LED, LOW); // digitalWrite(GREEN_LED, LOW); // digitalWrite(BLUE_LED, LOW); } // конец светомузыка break; case 4: // СЛУЧАЙНОЕ переключение на другой эффект - с выбором case 3: // обычное переключение на другой эффект tektimes = millis(); //////////////////////// режим случайного выбора с эфектом if (rejim == 4) { //smesen ciclic = (tektimes ) / 15000; if (ciclic != nomereff) { // if (smenarej == 0) // { // smenarej = 1; // break; // } if (notrandom != 1) { smenarej = 1; setup_rgb(); nomereff = tektimes / 15000; // порядковый "номер" - если выяснится, что время эффекта прошло - будет запущен ДРУГОЙ эффект //maxrejef - кол-во эффектов - на 1 меньше реального rejef = random(0, maxrejef + 1); cenkra = random(0, 2); // 0-край по краю и центр в центре, 1-центр и край -край и край, центр и центр, к эффекту цвета //float skcnkr[3] = {1, 1, 1}; // скорость края центра и ВСЕГО к эффекту цвета skcnkr[0] = (float)random(0, 420) / 100 + 0.2; skcnkr[1] = (float)random(0, 420) / 100 + 0.2; //float kfcnkr[3] = {1, 1, 1}; // яркость края, центра и всего к эффекту цвета kfcnkr[0] = (float)random(0, 31) / 100 + 0.8; kfcnkr[1] = (float)random(0, 31) / 100 + 0.8; sluc = random(0, 9); } else { nomereff = tektimes / 15000; // порядковый "номер" - если выяснится, что время эффекта прошло - будет запущен ДРУГОЙ эффект } //nackonkf // nackonkf[0] = random(0, 151) + 50; // начальная общая скорость и // nackonkf[1] = random(0, 151) + 50; // конечная общая скорость Serial.println(cenkra); // Serial.println(nackonkf[0]); // Serial.println(nackonkf[1]); Serial.println(sluc); Serial.println(skcnkr[0]); Serial.println(skcnkr[1]); Serial.println(kfcnkr[0]); Serial.println(kfcnkr[1]); } kfcnkr[2] = 1.00; ciclic = tektimes / 15000; msec = tektimes - (ciclic * 15000); // Serial.println(msec/1000); if (msec < 5000) { kfcnkr[2] = (float)msec / 5000; } if (msec > 10000) { kfcnkr[2] = 1 - (float)(msec - 10000) / 5000; } //skcnkr[2] = 1; switch (sluc) { case 0: skcnkr[2] = ((float)msec / 15000) + 0.8 ; break; case 1: skcnkr[2] = (-(float)msec / 15000) + 1.8 ; break; case 2: skcnkr[2] = ((float)msec / 15000) + 2.5 ; break; case 3: skcnkr[2] = (-(float)msec / 15000) + 2.5 ; break; case 4: if (msec < 7500) { skcnkr[2] = ((float)msec / 7500) + 1.8 ; } else { skcnkr[2] = (-(float)(msec - 7500) / 7500) + 2.8 ; } break; case 5: if (msec < 7500) { skcnkr[2] = (-(float)msec / 7500) + 2.8 ; } else { skcnkr[2] = ((float)(msec - 7500) / 7500) + 1.8 ; } break; case 6: skcnkr[2] = 1; break; case 7: skcnkr[0] = 1; skcnkr[1] = 1; skcnkr[2] = 1; break; case 8: break; } // Serial.println(skcnkr[2]); // Serial.println(msec); //skcnkr[2] = (float) (0.1)+(1 + 100) / 100 * (msec / 15000)*5 ; // if (msec < 7500) // { // if (nackonkf[1] > nackonkf[0]) // { // fff = nackonkf[1] - nackonkf[0]; // skcnkr[2] = (fff + nackonkf[0]) / 100 * (msec / 7500) ; // } // else // { // fff = nackonkf[0] - nackonkf[1]; // skcnkr[2] = ((fff + nackonkf[0]) / 100) * (1 - msec / 7500) ; // } // } // if (msec > 7500) // { // if (nackonkf[1] > nackonkf[0]) // { // fff = nackonkf[1] - nackonkf[0]; // skcnkr[2] = (float)((fff + nackonkf[0]) / 100 * (msec - 7500) / 7500); // } // else // { // fff = nackonkf[0] - nackonkf[1]; // skcnkr[2] = (float)((fff + nackonkf[0]) / 100 * (1 - (msec - 7500) / 7500)); // } // } } ///////////////////////// КОНЕЦ режим случайного выбора с эффектом // эффект if (smenarej == 1) { // null_rgb; //null_rgb; // Serial.println("!"); //null_rgb; // Serial.println("!!"); //null_rgb; // Serial.println("!!!"); // смена режима - загрузка новых данных в массив эффекта //strk=myRGB[rejef]; //myStr = myRGB[rejef]; setup_rgb(); // myStr = strokargb(rejef); ////////////////////////////////// strcpy_P(bufferi, (char*)pgm_read_word(&(string_table[rejef]))); //Serial.println(bufferi); //Serial.println(sizeof(bufferi)); myStr = bufferi; ////////////////////////////////// Serial.println(myStr); rgbma = 0; // начальный массив - R rgbin = 0; // шаг - 0 в массиве rgbprd = 0; // 0-rgb1 1-rgb2 2-dlrgb DD = 0; //0 - край и центр, 1-центр dl[0][0] = 0; dl[1][0] = 0; dl[2][0] = 0; dlt[0][0] = 0; dlt[1][0] = 0; dlt[2][0] = 0; dl[0][1] = 0; dl[1][1] = 0; dl[2][1] = 0; dlt[0][1] = 0; dlt[1][1] = 0; dlt[2][1] = 0; dlinastr = myStr.length(); for (i = 0; i < dlinastr && rgbin < 20 && rgbma < 3 ; i++) { bukva = myStr.charAt(i); if (bukva == '@') { rgbma = rgbma + 1; if (rgbma > 2) { // загрузка эффекта для центра rgbma = 0; DD = 1; dl[0][1] = 0; dl[1][1] = 0; dl[2][1] = 0; dlt[0][1] = 0; dlt[1][1] = 0; dlt[2][1] = 0; } rgbin = 0; rgbprd = 0; } else { // Serial.println(bukva); cislo = (int)bukva; cislo = cislo - 65; if (cislo > 21 + 6) cislo = cislo - 6; //if (cislo <= 0) cislo = cislo + 292 - 65; switch (rgbprd) { case 0: if (DD == 0) { rgb1[rgbma][rgbin][0] = cislo * 5; rgb1[rgbma][rgbin][1] = cislo * 5; } else { rgb1[rgbma][rgbin][1] = cislo * 5; } rgbprd++; break; case 1: if (DD == 0) { rgb2[rgbma][rgbin][0] = cislo * 5; rgb2[rgbma][rgbin][1] = cislo * 5; } else { rgb2[rgbma][rgbin][1] = cislo * 5; } rgbprd++; break; case 2: if (DD == 0) { dlrgb[rgbma][rgbin][0] = cislo * 20; dl[rgbma][0] = dl[rgbma][0] + 1; dlt[rgbma][0] = dlt[rgbma][0] + dlrgb[rgbma][rgbin][0]; dlrgb[rgbma][rgbin][1] = cislo * 20; dl[rgbma][1] = dl[rgbma][1] + 1; dlt[rgbma][1] = dlt[rgbma][1] + dlrgb[rgbma][rgbin][1]; } else { dlrgb[rgbma][rgbin][1] = cislo * 20; dl[rgbma][1] = dl[rgbma][1] + 1; dlt[rgbma][1] = dlt[rgbma][1] + dlrgb[rgbma][rgbin][1]; } rgbin = rgbin + 1; rgbprd = 0; break; } } } smenarej = 0; } //rgb1[2][2][]=255; //rgb2[2][2][]=170; //dlrgb[2][2][]=1000; //dl[2][]=3; //dlt[2][]=6000; // tektimes = millis(); for (u = 0; u < 2; u++) { for (i = 0; i < 3; i++) { rrggbb[i][u] = 0; ciclic = tektimes / ((float)dlt[i][u] * skcnkr[u] * skcnkr[2] * dskcnkr); msec = tektimes - (ciclic * ((float)dlt[i][u] * skcnkr[u] * skcnkr[2] * dskcnkr)); //Serial.println(msec); minim = 0; for (z = 0; z < dl[i][u]; z++) { maxim = minim + (float)dlrgb[i][z][u] * skcnkr[u] * skcnkr[2] * dskcnkr; if (msec >= minim && msec < maxim) { if (rgb2[i][z][u] > rgb1[i][z][u]) { otrez = msec - minim; rrggbb[i][u] = rgb1[i][z][u] + (rgb2[i][z][u] - rgb1[i][z][u]) * ( (float)otrez / dlrgb[i][z][u]); } else { otrez = msec - minim; //otrez = dlrgb[i][z]-(msec - minim); rrggbb[i][u] = rgb1[i][z][u] - (rgb1[i][z][u] - rgb2[i][z][u]) * ( (float)otrez / dlrgb[i][z][u]); } } minim = maxim; }; }; }; int krared; int krayelo; int krablue; int cenred; int cengreen; int cenblue; switch (cenkra) { case 0: krared = rrggbb[0][0] * kfcnkr[0] * kfcnkr[2]; krayelo = rrggbb[1][0] * kfcnkr[0] * kfcnkr[2]; krablue = rrggbb[2][0] * kfcnkr[0] * kfcnkr[2]; cenred = rrggbb[0][1] * kfcnkr[1] * kfcnkr[2]; cengreen = rrggbb[1][1] * kfcnkr[1] * kfcnkr[2]; cenblue = rrggbb[2][1] * kfcnkr[1] * kfcnkr[2]; break; case 2: krared = rrggbb[0][0] * kfcnkr[0] * kfcnkr[2]; krayelo = rrggbb[1][0] * kfcnkr[0] * kfcnkr[2]; krablue = rrggbb[2][0] * kfcnkr[0] * kfcnkr[2]; cenred = rrggbb[0][0] * kfcnkr[0] * kfcnkr[2]; cengreen = rrggbb[1][0] * kfcnkr[0] * kfcnkr[2]; cenblue = rrggbb[2][0] * kfcnkr[0] * kfcnkr[2]; break; case 3: krared = rrggbb[0][1] * kfcnkr[1] * kfcnkr[2]; krayelo = rrggbb[1][1] * kfcnkr[1] * kfcnkr[2]; krablue = rrggbb[2][1] * kfcnkr[1] * kfcnkr[2]; cenred = rrggbb[0][1] * kfcnkr[1] * kfcnkr[2]; cengreen = rrggbb[1][1] * kfcnkr[1] * kfcnkr[2]; cenblue = rrggbb[2][1] * kfcnkr[1] * kfcnkr[2]; break; case 1: krared = rrggbb[0][1] * kfcnkr[1] * kfcnkr[2]; krayelo = rrggbb[1][1] * kfcnkr[1] * kfcnkr[2]; krablue = rrggbb[2][1] * kfcnkr[1] * kfcnkr[2]; cenred = rrggbb[0][0] * kfcnkr[0] * kfcnkr[2]; cengreen = rrggbb[1][0] * kfcnkr[0] * kfcnkr[2]; cenblue = rrggbb[2][0] * kfcnkr[0] * kfcnkr[2]; break; } if (krared > 255) krared = 255; if (krayelo > 255) krayelo = 255; if (krablue > 255) krablue = 255; if (cenred > 255) cenred = 255; if (cengreen > 255) cengreen = 255; if (cenblue > 255) cenblue = 255; analogWrite (REDPIN, 255 - krared ); analogWrite (YELOPIN, 255 - krayelo); analogWrite (BLUEPIN, 255 - krablue); analogWrite (RED_LED, 255 - cenred); analogWrite (GREEN_LED, 255 - cengreen); analogWrite (BLUE_LED, 255 - cenblue); // volume = analogRead(MIC_PIN); // if (volume < shume) { // dskcnkr = dskcnkr - 0.01; // if (dskcnkr < 0.7) dskcnkr = 0.7; // } // else // { // dskcnkr = dskcnkr + 0.0001; // if (dskcnkr > 1) dskcnkr = 1; // } dskcnkr = 1; //Serial.println(5555555); break; } if (knopka != 0) { knopka = 0; //irrecv.resume(); } } void setColor(int red, int green, int blue) { //#ifdef COMMON_ANODE // red = 255 - red; // green = 255 - green; // blue = 255 - blue; //#endif //analogWrite(REDPIN, 255-red); analogWrite(REDPIN, 255 - red); analogWrite(YELOPIN, 255 - green); analogWrite(BLUEPIN, 255 - blue); analogWrite(RED_LED, 255 - red); analogWrite(GREEN_LED, 255 - green); analogWrite(BLUE_LED, 255 - blue); //Serial.println(red); // Serial.println(green, HEX); // Serial.println(blue, HEX); // Serial.println("-------"); } void IRinterrupt() { static unsigned long key, prevTime; unsigned long currTime, d; currTime = micros(); d = currTime - prevTime; if (d < 1100) return; // "дребезг" if (d < 1400) { // "0" key = key << 1; prevTime = currTime; return; } if (d < 2400) { // "1" key = key << 1; key++; prevTime = currTime; return; } if (d < 13000) IR_KEY = key; // код кнопки получен prevTime = currTime; } void setup_rgb() { analogWrite (REDPIN, 0 ); analogWrite (YELOPIN, 0); analogWrite (BLUEPIN, 0); analogWrite (RED_LED, 0 ); analogWrite (GREEN_LED, 0); analogWrite (BLUE_LED, 0); shume = nacshume; threshold = shume; massthreshold = threshold + 15; skcnkr[1] = 1; skcnkr[0] = 1; skcnkr[2] = 1; dskcnkr = 1; kfcnkr[0] = 1; kfcnkr[1] = 1; kfcnkr[2] = 1; cenkra = 0; cvetomuz = 0; notrandom = 0; } void null_rgb() { analogWrite (REDPIN, 255 - 255 ); analogWrite (YELOPIN, 255 - 0); analogWrite (BLUEPIN, 255 - 0); analogWrite (RED_LED, 255 - 255 ); analogWrite (GREEN_LED, 255 - 0); analogWrite (BLUE_LED, 255 - 0); delay(50); analogWrite (REDPIN, 255 - 0 ); analogWrite (YELOPIN, 255 - 255); analogWrite (BLUEPIN, 255 - 0); analogWrite (RED_LED, 255 - 0 ); analogWrite (GREEN_LED, 255 - 255); analogWrite (BLUE_LED, 255 - 0); delay(50); analogWrite (REDPIN, 255 - 0 ); analogWrite (YELOPIN, 255 - 0); analogWrite (BLUEPIN, 255 - 255); analogWrite (RED_LED, 255 - 0 ); analogWrite (GREEN_LED, 255 - 0); analogWrite (BLUE_LED, 255 - 255); delay(50); analogWrite (REDPIN, 255 - 0 ); analogWrite (YELOPIN, 255 - 0); analogWrite (BLUEPIN, 255 - 0); analogWrite (RED_LED, 255 - 0 ); analogWrite (GREEN_LED, 255 - 0); analogWrite (BLUE_LED, 255 - 0); delay(50); }