Скетч

Первое, с чем я столкнулся и что пришлось решать в первую очередь - КАК я буду задавать спецэффекты.

Вторая проблема "вытекла" из первой - в процессе разработки мне перестало хватать оперативной памяти. Пришлось весь текст переместить во флеш, о чем я НЕ ЖАЛЕЮ и рекомендую это делать СРАЗУ ЖЕ.

 Освобождение ОЗУ и работу без глюков в дальнейшем гарантирую!

Прошу НАСТОЯЩИХ программистов сильно не пинать!

Для практического применения требуется скачать 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);
}



Рейтинг@Mail.ru