Скетч
Первое, с чем я столкнулся и что пришлось решать в первую очередь - КАК я буду задавать спецэффекты.
Вторая проблема "вытекла" из первой - в процессе разработки мне перестало хватать оперативной памяти. Пришлось весь текст переместить во флеш, о чем я НЕ ЖАЛЕЮ и рекомендую это делать СРАЗУ ЖЕ.
Освобождение ОЗУ и работу без глюков в дальнейшем гарантирую!
Прошу НАСТОЯЩИХ программистов сильно не пинать!
Для практического применения требуется скачать 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);
}