126

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

удалите строчку:

if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}

посмотрите что изменилось

127 (2021-10-05 18:41:27 отредактировано Radioman)

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

удалите строчку:

if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}

посмотрите что изменилось


Тут видимо проблема или в пульте или ИК приемнике , в порте какая то дичь . Всегда разные коды , пробовал другой пульт и все так же.

как бэ вызов нужных меню работает , но коды нужные не идут и по этому вообще не вызывается нужные менюшки.

128

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

У меня последний код отлично работал, я открыл монитор порта и смотрел чтобы при нажатии на кнопку появлялся только один код (что бы не было двойного нажатия кнопки). Все работало как положено, без вызова меню громкости (при выходе из анализатора).

Датчик ИК очень чувствителен к наводкам, не любит когда близко подносят пульт. На него могут влиять внешние источника света, например светодиодные лампы.

Возможно импульсные помехи по питанию.

129

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

У меня последний код отлично работал, я открыл монитор порта и смотрел чтобы при нажатии на кнопку появлялся только один код (что бы не было двойного нажатия кнопки). Все работало как положено, без вызова меню громкости (при выходе из анализатора).

Датчик ИК очень чувствителен к наводкам, не любит когда близко подносят пульт. На него могут влиять внешние источника света, например светодиодные лампы.

Возможно импульсные помехи по питанию.

У меня нет нужного щупа для осциллографа , дабы проверить шум по питанию ЮСБ . Так то я питаю весь набор от 2х18650 в послед (8.2 В).
Так жэ у меня освещение это лампа накала 100 Вт , возможно Сам монитор ПК или лцд наводит , но как бэ ИК привемник отвернут от них . И в комнате темно.

Все прошлые скетчи работали нормально и по порту все хорошо , ну бывали редко мусорные коды в порте. И сама проблема  с Volume. Я нажимал ВЧ+ или ВЧ- , а оно мне вызывало Volume  , а затем ВЧ .

А вот последний скетч стал дубовым на вызовы любых меню и в порте летит мусор .

Вот код который работает , но только проблема с Volume  , что лезет вперед очереди .

#define VOLUME_MAX  0xFF50AF  // громкость прибавить
#define VOLUME_MIN  0xFF10EF  // громкость убавить
#define BASS_MAX    0xFF8877  // НЧ прибавить
#define BASS_MIN    0xFFA857  // НЧ убавить
#define TREB_MAX    0xFF08F7   // ВЧ прибавить
#define TREB_MIN    0xFF28D7   // ВЧ убавить
#define BALL_R      0x731A3E02 // баланс вправо
#define BALL_L      0x6825E53E // баланс влево

#define IN1         0xFF20DF  // выбор вход 1
#define IN2         0xFF609F  // выбор вход 2
#define IN3         0xFF30CF  // выбор вход 3

#define LEFT        0xFF6897   // убавить в любом меню
#define RIGHT       0xFF48B7   // прибавить в любом меню

#define MENU_DOWN   0xFFB04F  // навигация по меню
#define MENU_UP     0xFFA05F  // навигация по меню

#define LOUD        0xFF708F   // Loudness

#define POWER       0xFF00FF   // POWER
#define MUTE        0xFF40BF   // MUTE



#define AUTO_GAIN 1       // автонастройка по громкости
#define VOL_THR 25        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 85       // максимальный порог по умолчанию 
#define FHT_N 256         // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h> 
#include <Wire.h>
#include <PT2313.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
  //LiquidCrystal_I2C lcd(0x27,16,2); 
  LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
  PT2313 audioChip;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
 byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
 byte in,w,w2,gr1,gr2,www,z,z0,z1;
 int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2;
 unsigned long time,oldPosition  = -999,newPosition;
 unsigned long gainTimer;
 byte maxValue, maxValue_f,spek;
 float k = 0.1;
 byte gain_sp = DEF_GAIN;  
 int i1,yyy,vol_old;
 bool loud,k1,k2,k3,k4,k5,power,mute;
 int menu, a3;

 
void setup(){
  Serial.begin(9600);Wire.begin(); 
 //lcd.init();lcd.backlight();
 lcd.begin(16, 2);
  irrecv.enableIRIn(); // запускаем модуль IR
  audioChip.initialize(0,true);
  pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера
  pinMode(11,OUTPUT);// OUTPUT MUTE
  pinMode(13,OUTPUT);// OUTPUT STANDBY 
  pinMode(A3,INPUT);//  5 BUTTON
  ADMUX  = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
  MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass eeprom
  treb = EEPROM.read(3)-7;// treb eeprom
  balans = EEPROM.read(4)-4;// balans eeprom
  in = EEPROM.read(5);// in eeprom
  gain0 = EEPROM.read(6);
  gain1 = EEPROM.read(7);
  gain2 = EEPROM.read(8);
  loud = EEPROM.read(9);
  switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }
  audio();
}
void loop(){
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;
  if(spek==1&&ir.value!=POWER&&ir.value!=MUTE&&ir.value!=VOLUME_MAX&&ir.value!=VOLUME_MIN&&ir.value!=BASS_MAX&&ir.value!=BASS_MIN&&ir.value!=TREB_MAX&&ir.value!=TREB_MIN&&ir.value!=BALL_R&&ir.value!=BALL_L&&ir.value!=LOUD){
   menu=0;cl();}}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта 
  
/////////////// POWER //////////////////////////////////////////////  
  if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);}
 if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old;
  lcd.setCursor(3,0);lcd.print(F("POWER  ON"));audio();delay(2000);cl();} 
  if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
  if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);}
  
////////////// MUTE /////////////////////////////////////////////////
if(power==0){
 if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("   MUTE   "));audio();}
 if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();}
}  
////////////////////////////////////////////////////////////////////
 
     // a3 = 1023;
      a3 = (analogRead(A3));
      if(a3 < 50){k1=1;}
      if(a3 > 50 && a3 < 150){k2=1;}
      if(a3 > 150 && a3 < 250){k3=1;}
      if(a3 > 250 && a3 < 350){k4=1;}
      if(a3 > 350 && a3 < 500){k5=1;}   
  
      if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
  if(spek==0){
      byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
      byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
      byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
      lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
    }else{
      byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
      byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
      byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
      byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      }
  ///////////////////// управление ////////////////////////////////////////////////////
  if(power==0){
   if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню
   if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN

  
  if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max
  if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min
  if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max
  if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min
  if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max
  if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min 
  if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right
  if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left 
  
  if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1
  if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2
  if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3

  if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down
  if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up

  if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness  ON");audio();delay(2000);}// loud_on
  if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);}// loud_off
  }
  
 /////////////////////// VOLUME //////////////
   if(menu==0){
     if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print(F("Volume  "));
     lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////////  BASS  //////////////
   if(menu==1){
     if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;bass_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<  
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Bass    "));
   lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////// TREBLE //////////////////
   if(menu==2){
     if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;treb_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Treble  "));
   lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  //////////////// BALANSE  +\- 4 dB /////////////
   if(menu==3){
     if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка > 
     if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка < 
    
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
  lcd.setCursor(0,0);
   if(balans>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans));lcd.print(" dB ");
  if(balans==0){lcd.print(" <>  ");}
  if(balans<0){lcd.print(" <   ");}
  if(balans>0){lcd.print("  >  ");}
   if(balans>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans));lcd.print(" dB ");
  lcd.setCursor(0,1);lcd.print("L");
  lcd.setCursor(15,1);lcd.print("R");
   if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
   if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
   if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}}
 
 /////////////////////////////////////////////////////////////

  /////////// input + gain /////////////////////////////////////////
 if(menu==4){
        switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }

     if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;gain_func();audio();}// кнопка < 
     
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} 
    
   switch(in){
     case 0: gain0 = gain;break;
     case 1: gain1 = gain;break;
     case 2: gain2 = gain;break;
     } 
   lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
   lcd.setCursor(0,1);lcd.print(" GAIN ");
      switch(gain){
        case 3: lcd.print(" +11.25 dB");break;
        case 2: lcd.print("   +7.5 dB");break;
        case 1: lcd.print("  +3.75 dB");break;
        case 0: lcd.print("      0 dB");break;
        }
  }
 /////////////////////////////////////////////////////////////
 
 // запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
 // если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
   if(millis()-time>10000 && w==1 && power==0 && mute==0){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass+7);
     EEPROM.update(3,treb+7);
     EEPROM.update(5,in);
     EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2);
     EEPROM.update(9,loud);
 menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
 }

 if(spek==1){
  analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

  for (int pos = 0; pos < 16; pos++) {   // для окошек дисплея с 0 по 15
    // найти максимум из пачки тонов
    if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];

    lcd.setCursor(pos, 0);

    // преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
    int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
    posLevel = constrain(posLevel, 0, 15);
  while(yyy<2){yyy++;
    if (posLevel > 7) {               // если значение больше 7 (значит нижний квадратик будет полный)
      lcd.write((uint8_t)posLevel - 8);    // верхний квадратик залить тем что осталось
      lcd.setCursor(pos, 1);          // перейти на нижний квадратик
      lcd.write((uint8_t)7);        // залить его полностью
  } 
    else {                          // если значение меньше 8
      lcd.print(" ");                 // верхний квадратик пустой
      lcd.setCursor(pos, 1);          // нижний квадратик
      lcd.write((uint8_t)posLevel);        // залить полосками
    }} yyy=0;
  }  

  if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {      // каждые 1500 мс
      // если максимальное значение больше порога, взять его как максимум для отображения
      if (maxValue_f > VOL_THR) gain_sp = maxValue_f;

      // если нет, то взять порог побольше, чтобы шумы вообще не проходили
      else gain_sp = 100;
      gainTimer = millis();
    }
  }else{gain_sp = DEF_GAIN;}
  }
  //////////////////////////////////
 
}// LOOP

void audio(){  
  audioChip.source(in);//select your source 1...3  вход 3...1
  audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
  audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ
  audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
  audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
  audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
  audioChip.loudness(loud);//true or false // тонкомпенсация
}

void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}}
void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} 
void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
void to_Timer(){newPosition = myEnc.read()/4;}

void analyzeAudio() {  
  cli(); 
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
  sei();
}

А вот этот проблемный , тут в порте мусор и я жму по 8 раз на кнопку пульта .

#define VOLUME_MAX  0xFF50AF  // громкость прибавить
#define VOLUME_MIN  0xFF10EF  // громкость убавить
#define BASS_MAX    0xFF8877  // НЧ прибавить
#define BASS_MIN    0xFFA857  // НЧ убавить
#define TREB_MAX    0xFF08F7   // ВЧ прибавить
#define TREB_MIN    0xFF28D7   // ВЧ убавить
#define BALL_R      0x731A3E02 // баланс вправо
#define BALL_L      0x6825E53E // баланс влево

#define IN1         0xFF20DF  // выбор вход 1
#define IN2         0xFF609F  // выбор вход 2
#define IN3         0xFF30CF  // выбор вход 3

#define LEFT        0xFF6897   // убавить в любом меню
#define RIGHT       0xFF48B7   // прибавить в любом меню

#define MENU_DOWN   0xFFB04F  // навигация по меню
#define MENU_UP     0xFFA05F  // навигация по меню

#define LOUD        0xFF708F   // Loudness

#define POWER       0xFF00FF   // POWER
#define MUTE        0xFF40BF   // MUTE


#define AUTO_GAIN 1       // автонастройка по громкости
#define VOL_THR 25        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 85       // максимальный порог по умолчанию 
#define FHT_N 256         // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h> 
#include <Wire.h>
#include <PT2313.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
  //LiquidCrystal_I2C lcd(0x27,16,2); 
  LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
  PT2313 audioChip;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
 byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
 byte in,w,w2,gr1,gr2,www,z,z0,z1;
 int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2;
 unsigned long time,oldPosition  = -999,newPosition;
 unsigned long gainTimer;
 byte maxValue, maxValue_f,spek;
 float k = 0.1;
 byte gain_sp = DEF_GAIN;  
 int i1,yyy,vol_old;
 bool loud,k1,k2,k3,k4,k5,power,mute;
 int menu, a3;

 
void setup(){
  Serial.begin(9600);Wire.begin(); 
 //lcd.init();lcd.backlight();
 lcd.begin(16, 2);
  irrecv.enableIRIn(); // запускаем модуль IR
  audioChip.initialize(0,true);
  pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера
  pinMode(11,OUTPUT);// OUTPUT MUTE
  pinMode(13,OUTPUT);// OUTPUT STANDBY 
  pinMode(A3,INPUT);//  5 BUTTON
  ADMUX  = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
  MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass eeprom
  treb = EEPROM.read(3)-7;// treb eeprom
  balans = EEPROM.read(4)-4;// balans eeprom
  in = EEPROM.read(5);// in eeprom
  gain0 = EEPROM.read(6);
  gain1 = EEPROM.read(7);
  gain2 = EEPROM.read(8);
  loud = EEPROM.read(9);
  switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }
  audio();
}
void loop(){
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;
  if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
  }// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта 
  
/////////////// POWER //////////////////////////////////////////////  
  if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);}
 if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old;
  lcd.setCursor(3,0);lcd.print(F("POWER  ON"));audio();delay(2000);cl();} 
  if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
  if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);}
  
////////////// MUTE /////////////////////////////////////////////////
if(power==0){
 if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("   MUTE   "));audio();}
 if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();}
}  
////////////////////////////////////////////////////////////////////
 
     // a3 = 1023;
      a3 = (analogRead(A3));
      if(a3 < 50){k1=1;}
      if(a3 > 50 && a3 < 150){k2=1;}
      if(a3 > 150 && a3 < 250){k3=1;}
      if(a3 > 250 && a3 < 350){k4=1;}
      if(a3 > 350 && a3 < 500){k5=1;}   
  
      if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
  if(spek==0){
      byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
      byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
      byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
      lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
    }else{
      byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
      byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
      byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
      byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      }
  ///////////////////// управление ////////////////////////////////////////////////////
  if(power==0){
   if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню
   if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN

  
  if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max
  if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min
  if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max
  if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min
  if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max
  if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min 
  if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right
  if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left 
  
  if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1
  if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2
  if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3

  if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down
  if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up

  if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness  ON");audio();delay(2000);}// loud_on
  if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);}// loud_off
  }
  
 /////////////////////// VOLUME //////////////
   if(menu==0){
     if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print(F("Volume  "));
     lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////////  BASS  //////////////
   if(menu==1){
     if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<  
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Bass    "));
   lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////// TREBLE //////////////////
   if(menu==2){
     if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Treble  "));
   lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  //////////////// BALANSE  +\- 4 dB /////////////
   if(menu==3){
     if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка > 
     if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка < 
    
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
  lcd.setCursor(0,0);
   if(balans>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans));lcd.print(" dB ");
  if(balans==0){lcd.print(" <>  ");}
  if(balans<0){lcd.print(" <   ");}
  if(balans>0){lcd.print("  >  ");}
   if(balans>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans));lcd.print(" dB ");
  lcd.setCursor(0,1);lcd.print("L");
  lcd.setCursor(15,1);lcd.print("R");
   if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
   if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
   if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}}
 
 /////////////////////////////////////////////////////////////

  /////////// input + gain /////////////////////////////////////////
 if(menu==4){
        switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }

     if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка < 
     
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} 
    
   switch(in){
     case 0: gain0 = gain;break;
     case 1: gain1 = gain;break;
     case 2: gain2 = gain;break;
     } 
   lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
   lcd.setCursor(0,1);lcd.print(" GAIN ");
      switch(gain){
        case 3: lcd.print(" +11.25 dB");break;
        case 2: lcd.print("   +7.5 dB");break;
        case 1: lcd.print("  +3.75 dB");break;
        case 0: lcd.print("      0 dB");break;
        }
  }
 /////////////////////////////////////////////////////////////
 
 // запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
 // если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
   if(millis()-time>10000 && w==1 && power==0 && mute==0){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass+7);
     EEPROM.update(3,treb+7);
     EEPROM.update(5,in);
     EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2);
     EEPROM.update(9,loud);
 menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
 }

 if(spek==1){
  analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

  for (int pos = 0; pos < 16; pos++) {   // для окошек дисплея с 0 по 15
    // найти максимум из пачки тонов
    if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];

    lcd.setCursor(pos, 0);

    // преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
    int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
    posLevel = constrain(posLevel, 0, 15);
  while(yyy<2){yyy++;
    if (posLevel > 7) {               // если значение больше 7 (значит нижний квадратик будет полный)
      lcd.write((uint8_t)posLevel - 8);    // верхний квадратик залить тем что осталось
      lcd.setCursor(pos, 1);          // перейти на нижний квадратик
      lcd.write((uint8_t)7);        // залить его полностью
  } 
    else {                          // если значение меньше 8
      lcd.print(" ");                 // верхний квадратик пустой
      lcd.setCursor(pos, 1);          // нижний квадратик
      lcd.write((uint8_t)posLevel);        // залить полосками
    }} yyy=0;
  }  

  if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {      // каждые 1500 мс
      // если максимальное значение больше порога, взять его как максимум для отображения
      if (maxValue_f > VOL_THR) gain_sp = maxValue_f;

      // если нет, то взять порог побольше, чтобы шумы вообще не проходили
      else gain_sp = 100;
      gainTimer = millis();
    }
  }else{gain_sp = DEF_GAIN;}
  }
  //////////////////////////////////
 
}// LOOP

void audio(){  
  audioChip.source(in);//select your source 1...3  вход 3...1
  audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
  audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ
  audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
  audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
  audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
  audioChip.loudness(loud);//true or false // тонкомпенсация
}

void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}}
void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} 
void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
void cl1(){ir.value=0;delay(300);spek=0;}
void to_Timer(){newPosition = myEnc.read()/4;}

void analyzeAudio() {  
  cli(); 
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
  sei();
}

130

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

Загрузите этот скетч:

#define VOLUME_MAX  0xFF50AF  // громкость прибавить
#define VOLUME_MIN  0xFF10EF  // громкость убавить
#define BASS_MAX    0xFF8877  // НЧ прибавить
#define BASS_MIN    0xFFA857  // НЧ убавить
#define TREB_MAX    0xFF08F7   // ВЧ прибавить
#define TREB_MIN    0xFF28D7   // ВЧ убавить
#define BALL_R      0x731A3E02 // баланс вправо
#define BALL_L      0x6825E53E // баланс влево

#define IN1         0xFF20DF  // выбор вход 1
#define IN2         0xFF609F  // выбор вход 2
#define IN3         0xFF30CF  // выбор вход 3

#define LEFT        0xFF6897   // убавить в любом меню
#define RIGHT       0xFF48B7   // прибавить в любом меню

#define MENU_DOWN   0xFFB04F  // навигация по меню
#define MENU_UP     0xFFA05F  // навигация по меню

#define LOUD        0xFF708F   // Loudness

#define POWER       0xFF00FF   // POWER
#define MUTE        0xFF40BF   // MUTE


#define AUTO_GAIN 1       // автонастройка по громкости
#define VOL_THR 25        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 85       // максимальный порог по умолчанию 
#define FHT_N 256         // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h> 
#include <Wire.h>
#include <PT2313.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
  //LiquidCrystal_I2C lcd(0x27,16,2); 
  LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
  PT2313 audioChip;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
 byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
 byte in,w,w2,gr1,gr2,www,z,z0,z1;
 int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2;
 unsigned long time,oldPosition  = -999,newPosition;
 unsigned long gainTimer;
 byte maxValue, maxValue_f,spek;
 float k = 0.1;
 byte gain_sp = DEF_GAIN;  
 int i1,yyy,vol_old;
 bool loud,k1,k2,k3,k4,k5,power,mute;
 int menu, a3;

 
void setup(){
  Serial.begin(9600);Wire.begin(); 
 //lcd.init();lcd.backlight();
 lcd.begin(16, 2);
  irrecv.enableIRIn(); // запускаем модуль IR
  audioChip.initialize(0,true);
  pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера
  pinMode(11,OUTPUT);// OUTPUT MUTE
  pinMode(13,OUTPUT);// OUTPUT STANDBY 
  pinMode(A3,INPUT);//  5 BUTTON
  ADMUX  = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
  MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass eeprom
  treb = EEPROM.read(3)-7;// treb eeprom
  balans = EEPROM.read(4)-4;// balans eeprom
  in = EEPROM.read(5);// in eeprom
  gain0 = EEPROM.read(6);
  gain1 = EEPROM.read(7);
  gain2 = EEPROM.read(8);
  loud = EEPROM.read(9);
  switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }
  audio();
}
void loop(){
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;delay(200);
  if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
  }// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта 
  
/////////////// POWER //////////////////////////////////////////////  
  if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);}
 if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old;
  lcd.setCursor(3,0);lcd.print(F("POWER  ON"));audio();delay(2000);cl();} 
  if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
  if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);}
  
////////////// MUTE /////////////////////////////////////////////////
if(power==0){
 if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("   MUTE   "));audio();}
 if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();}
}  
////////////////////////////////////////////////////////////////////
 
     // a3 = 1023;
      a3 = (analogRead(A3));
      if(a3 < 50){k1=1;}
      if(a3 > 50 && a3 < 150){k2=1;}
      if(a3 > 150 && a3 < 250){k3=1;}
      if(a3 > 250 && a3 < 350){k4=1;}
      if(a3 > 350 && a3 < 500){k5=1;}   
  
      if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
  if(spek==0){
      byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
      byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
      byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
      lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
    }else{
      byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
      byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
      byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
      byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      }
  ///////////////////// управление ////////////////////////////////////////////////////
  if(power==0){
   if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню
   if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN

  
  if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max
  if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min
  if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max
  if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min
  if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max
  if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min 
  if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right
  if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left 
  
  if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1
  if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2
  if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3

  if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down
  if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up

  if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness  ON");audio();delay(2000);}// loud_on
  if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);}// loud_off
  }
  
 /////////////////////// VOLUME //////////////
   if(menu==0){
     if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print(F("Volume  "));
     lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////////  BASS  //////////////
   if(menu==1){
     if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<  
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Bass    "));
   lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////// TREBLE //////////////////
   if(menu==2){
     if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Treble  "));
   lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  //////////////// BALANSE  +\- 4 dB /////////////
   if(menu==3){
     if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка > 
     if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка < 
    
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
  lcd.setCursor(0,0);
   if(balans>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans));lcd.print(" dB ");
  if(balans==0){lcd.print(" <>  ");}
  if(balans<0){lcd.print(" <   ");}
  if(balans>0){lcd.print("  >  ");}
   if(balans>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans));lcd.print(" dB ");
  lcd.setCursor(0,1);lcd.print("L");
  lcd.setCursor(15,1);lcd.print("R");
   if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
   if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
   if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}}
 
 /////////////////////////////////////////////////////////////

  /////////// input + gain /////////////////////////////////////////
 if(menu==4){
        switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }

     if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка < 
     
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} 
    
   switch(in){
     case 0: gain0 = gain;break;
     case 1: gain1 = gain;break;
     case 2: gain2 = gain;break;
     } 
   lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
   lcd.setCursor(0,1);lcd.print(" GAIN ");
      switch(gain){
        case 3: lcd.print(" +11.25 dB");break;
        case 2: lcd.print("   +7.5 dB");break;
        case 1: lcd.print("  +3.75 dB");break;
        case 0: lcd.print("      0 dB");break;
        }
  }
 /////////////////////////////////////////////////////////////
 
 // запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
 // если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
   if(millis()-time>10000 && w==1 && power==0 && mute==0){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass+7);
     EEPROM.update(3,treb+7);
     EEPROM.update(5,in);
     EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2);
     EEPROM.update(9,loud);
 menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
 }

 if(spek==1){
  analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

  for (int pos = 0; pos < 16; pos++) {   // для окошек дисплея с 0 по 15
    // найти максимум из пачки тонов
    if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];

    lcd.setCursor(pos, 0);

    // преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
    int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
    posLevel = constrain(posLevel, 0, 15);
  while(yyy<2){yyy++;
    if (posLevel > 7) {               // если значение больше 7 (значит нижний квадратик будет полный)
      lcd.write((uint8_t)posLevel - 8);    // верхний квадратик залить тем что осталось
      lcd.setCursor(pos, 1);          // перейти на нижний квадратик
      lcd.write((uint8_t)7);        // залить его полностью
  } 
    else {                          // если значение меньше 8
      lcd.print(" ");                 // верхний квадратик пустой
      lcd.setCursor(pos, 1);          // нижний квадратик
      lcd.write((uint8_t)posLevel);        // залить полосками
    }} yyy=0;
  }  

  if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {      // каждые 1500 мс
      // если максимальное значение больше порога, взять его как максимум для отображения
      if (maxValue_f > VOL_THR) gain_sp = maxValue_f;

      // если нет, то взять порог побольше, чтобы шумы вообще не проходили
      else gain_sp = 100;
      gainTimer = millis();
    }
  }else{gain_sp = DEF_GAIN;}
  }
  //////////////////////////////////
 
}// LOOP

void audio(){  
  audioChip.source(in);//select your source 1...3  вход 3...1
  audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
  audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ
  audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
  audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
  audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
  audioChip.loudness(loud);//true or false // тонкомпенсация
}

void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}}
void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} 
void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
void cl1(){ir.value=0;delay(300);spek=0;}
void to_Timer(){newPosition = myEnc.read()/4;}

void analyzeAudio() {  
  cli(); 
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
  sei();
}

131

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

Загрузите этот скетч:

#define VOLUME_MAX  0xFF50AF  // громкость прибавить
#define VOLUME_MIN  0xFF10EF  // громкость убавить
#define BASS_MAX    0xFF8877  // НЧ прибавить
#define BASS_MIN    0xFFA857  // НЧ убавить
#define TREB_MAX    0xFF08F7   // ВЧ прибавить
#define TREB_MIN    0xFF28D7   // ВЧ убавить
#define BALL_R      0x731A3E02 // баланс вправо
#define BALL_L      0x6825E53E // баланс влево

#define IN1         0xFF20DF  // выбор вход 1
#define IN2         0xFF609F  // выбор вход 2
#define IN3         0xFF30CF  // выбор вход 3

#define LEFT        0xFF6897   // убавить в любом меню
#define RIGHT       0xFF48B7   // прибавить в любом меню

#define MENU_DOWN   0xFFB04F  // навигация по меню
#define MENU_UP     0xFFA05F  // навигация по меню

#define LOUD        0xFF708F   // Loudness

#define POWER       0xFF00FF   // POWER
#define MUTE        0xFF40BF   // MUTE


#define AUTO_GAIN 1       // автонастройка по громкости
#define VOL_THR 25        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 85       // максимальный порог по умолчанию 
#define FHT_N 256         // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h> 
#include <Wire.h>
#include <PT2313.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
  //LiquidCrystal_I2C lcd(0x27,16,2); 
  LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
  PT2313 audioChip;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
 byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
 byte in,w,w2,gr1,gr2,www,z,z0,z1;
 int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2;
 unsigned long time,oldPosition  = -999,newPosition;
 unsigned long gainTimer;
 byte maxValue, maxValue_f,spek;
 float k = 0.1;
 byte gain_sp = DEF_GAIN;  
 int i1,yyy,vol_old;
 bool loud,k1,k2,k3,k4,k5,power,mute;
 int menu, a3;

 
void setup(){
  Serial.begin(9600);Wire.begin(); 
 //lcd.init();lcd.backlight();
 lcd.begin(16, 2);
  irrecv.enableIRIn(); // запускаем модуль IR
  audioChip.initialize(0,true);
  pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера
  pinMode(11,OUTPUT);// OUTPUT MUTE
  pinMode(13,OUTPUT);// OUTPUT STANDBY 
  pinMode(A3,INPUT);//  5 BUTTON
  ADMUX  = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
  MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass eeprom
  treb = EEPROM.read(3)-7;// treb eeprom
  balans = EEPROM.read(4)-4;// balans eeprom
  in = EEPROM.read(5);// in eeprom
  gain0 = EEPROM.read(6);
  gain1 = EEPROM.read(7);
  gain2 = EEPROM.read(8);
  loud = EEPROM.read(9);
  switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }
  audio();
}
void loop(){
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;delay(200);
  if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
  }// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта 
  
/////////////// POWER //////////////////////////////////////////////  
  if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);}
 if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old;
  lcd.setCursor(3,0);lcd.print(F("POWER  ON"));audio();delay(2000);cl();} 
  if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
  if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);}
  
////////////// MUTE /////////////////////////////////////////////////
if(power==0){
 if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("   MUTE   "));audio();}
 if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();}
}  
////////////////////////////////////////////////////////////////////
 
     // a3 = 1023;
      a3 = (analogRead(A3));
      if(a3 < 50){k1=1;}
      if(a3 > 50 && a3 < 150){k2=1;}
      if(a3 > 150 && a3 < 250){k3=1;}
      if(a3 > 250 && a3 < 350){k4=1;}
      if(a3 > 350 && a3 < 500){k5=1;}   
  
      if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
  if(spek==0){
      byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
      byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
      byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
      lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
    }else{
      byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
      byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
      byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
      byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      }
  ///////////////////// управление ////////////////////////////////////////////////////
  if(power==0){
   if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню
   if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN

  
  if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max
  if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min
  if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max
  if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min
  if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max
  if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min 
  if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right
  if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left 
  
  if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1
  if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2
  if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3

  if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down
  if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up

  if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness  ON");audio();delay(2000);}// loud_on
  if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);}// loud_off
  }
  
 /////////////////////// VOLUME //////////////
   if(menu==0){
     if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print(F("Volume  "));
     lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////////  BASS  //////////////
   if(menu==1){
     if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<  
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Bass    "));
   lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////// TREBLE //////////////////
   if(menu==2){
     if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Treble  "));
   lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  //////////////// BALANSE  +\- 4 dB /////////////
   if(menu==3){
     if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка > 
     if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка < 
    
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
  lcd.setCursor(0,0);
   if(balans>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans));lcd.print(" dB ");
  if(balans==0){lcd.print(" <>  ");}
  if(balans<0){lcd.print(" <   ");}
  if(balans>0){lcd.print("  >  ");}
   if(balans>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans));lcd.print(" dB ");
  lcd.setCursor(0,1);lcd.print("L");
  lcd.setCursor(15,1);lcd.print("R");
   if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
   if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
   if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}}
 
 /////////////////////////////////////////////////////////////

  /////////// input + gain /////////////////////////////////////////
 if(menu==4){
        switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }

     if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка < 
     
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} 
    
   switch(in){
     case 0: gain0 = gain;break;
     case 1: gain1 = gain;break;
     case 2: gain2 = gain;break;
     } 
   lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
   lcd.setCursor(0,1);lcd.print(" GAIN ");
      switch(gain){
        case 3: lcd.print(" +11.25 dB");break;
        case 2: lcd.print("   +7.5 dB");break;
        case 1: lcd.print("  +3.75 dB");break;
        case 0: lcd.print("      0 dB");break;
        }
  }
 /////////////////////////////////////////////////////////////
 
 // запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
 // если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
   if(millis()-time>10000 && w==1 && power==0 && mute==0){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass+7);
     EEPROM.update(3,treb+7);
     EEPROM.update(5,in);
     EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2);
     EEPROM.update(9,loud);
 menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
 }

 if(spek==1){
  analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

  for (int pos = 0; pos < 16; pos++) {   // для окошек дисплея с 0 по 15
    // найти максимум из пачки тонов
    if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];

    lcd.setCursor(pos, 0);

    // преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
    int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
    posLevel = constrain(posLevel, 0, 15);
  while(yyy<2){yyy++;
    if (posLevel > 7) {               // если значение больше 7 (значит нижний квадратик будет полный)
      lcd.write((uint8_t)posLevel - 8);    // верхний квадратик залить тем что осталось
      lcd.setCursor(pos, 1);          // перейти на нижний квадратик
      lcd.write((uint8_t)7);        // залить его полностью
  } 
    else {                          // если значение меньше 8
      lcd.print(" ");                 // верхний квадратик пустой
      lcd.setCursor(pos, 1);          // нижний квадратик
      lcd.write((uint8_t)posLevel);        // залить полосками
    }} yyy=0;
  }  

  if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {      // каждые 1500 мс
      // если максимальное значение больше порога, взять его как максимум для отображения
      if (maxValue_f > VOL_THR) gain_sp = maxValue_f;

      // если нет, то взять порог побольше, чтобы шумы вообще не проходили
      else gain_sp = 100;
      gainTimer = millis();
    }
  }else{gain_sp = DEF_GAIN;}
  }
  //////////////////////////////////
 
}// LOOP

void audio(){  
  audioChip.source(in);//select your source 1...3  вход 3...1
  audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
  audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ
  audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
  audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
  audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
  audioChip.loudness(loud);//true or false // тонкомпенсация
}

void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}}
void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} 
void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
void cl1(){ir.value=0;delay(300);spek=0;}
void to_Timer(){newPosition = myEnc.read()/4;}

void analyzeAudio() {  
  cli(); 
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
  sei();
}

В порте мусор

132

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

Не могу понять в чем причина, у меня отлично определяется код кнопок:

http://forum.rcl-radio.ru/uploads/images/2021/10/e7a90e925a7d894cadb322502de2f1d5.png

133

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

У Вас ИК датчик в виде модуля?

http://forum.rcl-radio.ru/uploads/images/2021/10/748a64a843c0fe108e586657bcbd8a01.png

134

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

У Вас ИК датчик в виде модуля?

http://forum.rcl-radio.ru/uploads/images/2021/10/748a64a843c0fe108e586657bcbd8a01.png

У меня ИК датчик на проводах к плате через разъём подключен , на плате разводка выполнена .
Может надо подтяжку сделать на D12 ? Как на энкодере , по 10к Ом стоят сопротивления .

135

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

Да, подтягивающий резистор нужен.

136

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

Да, подтягивающий резистор нужен.

поставил на 3.3к и впаял провода ИК на плату ардуино , добавил на 100 Ом в разрыв GND . В порте мусор

137

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

Загрузите тестовый скетч ИК

#include <IRremote.h>

int RECV_PIN = 12;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

Так же проверьте установлена ли верная библиотека ИК, библиотека должна быть установлена с этого источника - http://rcl-radio.ru/wp-content/uploads/ … remote.zip

138

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

Загрузите тестовый скетч ИК

#include <IRremote.h>

int RECV_PIN = 12;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

Так же проверьте установлена ли верная библиотека ИК, библиотека должна быть установлена с этого источника - http://rcl-radio.ru/wp-content/uploads/ … remote.zip

Проскакивает мусор , библиотека установлена эта .

139

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

Что не то с датчиком или пульты не поддерживают протокол NEC (стартовые импульсы у разных протоков разные, данные передаются с другой частотой следования импульсов, протокол NEC это самый распространенный протокол который используется в бытовой аппаратуре)

Тестовый скетч 100 % рабочий (он расположен в библиотеке как пример).

Возможно что то по питанию не то, Вы подключали через транзисторные ключи реле?

140

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

Возможно вход d12 немного подпален, перенесите его на d11 в тестовом скетче

int RECV_PIN = 11;

141

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

Что не то с датчиком или пульты не поддерживают протокол NEC (стартовые импульсы у разных протоков разные, данные передаются с другой частотой следования импульсов, протокол NEC это самый распространенный протокол который используется в бытовой аппаратуре)

Тестовый скетч 100 % рабочий (он расположен в библиотеке как пример).

Возможно что то по питанию не то, Вы подключали через транзисторные ключи реле?

Я ужэ убрал пин с реле , запитал от лбп . Повторил обвязку как на картинке . Но в порт показывает
0x3FD0
0xFFFFFFFF
0xFFA05
0xFFFFFFFF
0xFFA05F
0xFFFFFFFF

Правильное предпоследнее.

142

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

А если пульт использовать на расстоянии 2 метра от датчика?

143 (2021-10-05 23:51:46 отредактировано Radioman)

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

А если пульт использовать на расстоянии 2 метра от датчика?

Видимо подпален , на 11 пине работает без мусора , но как ? Ведь на другом скетче работал на 12

144

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

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

Перенесите датчик на вход датчика на D16, это вход A2, вроде он не занят

IRrecv irrecv(16); // указываем вывод модуля IR приемника
или
IRrecv irrecv(A2);

145

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

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

Перенесите датчик на вход датчика на D16, это вход A2, вроде он не занят

IRrecv irrecv(16); // указываем вывод модуля IR приемника
или
IRrecv irrecv(A2);


0xFF
0xFFFFFFFF
0xFD04F
0xFFFFFFFF
0xFFB07
0xEE02AEEC
0xFF
0xFFFFFFFF
0xFFB04
0x8E3A8FA
0xF0C41643


Все получено когда на дисплее анализатор . Когда в меню то мусорный код редко проскакивает

146

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

замените код

void analyzeAudio() {  
  cli(); 
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
  sei();
}

на

void analyzeAudio() {  
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
}

147

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

liman324 пишет:

замените код

void analyzeAudio() {  
  cli(); 
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
  sei();
}

на

void analyzeAudio() {  
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
}

Вполне хорошо работает , срабатывает нажатие и все нужное вызывает сразу.

После заливки скетча впорте был мусор 0xFAE26E38

0xFFFFFFFF
0xFF40BF
0xFFFFFFFF
0xFF8877
0xA3C8EDDB
0xFF
0xFFFFFFFF
0xFFA857
0xFFA857
0xA3C8EDDB
0xFFFFFFFF
0xFFA857

Но потом все стабилизировалось , возможно не прямой угол был между ИК .

0xFF08F7
0xFFFFFFFF
0xFF28D7
0xFFFFFFFF
0xFFA05F
0xF0C41643
0xFFFFFFFF
0xFFB04F
0xFFFFFFFF
0xFF08F7
0xFF
0xFFFFFFFF
0xFF08F7
0x13549BDF
0xFFFFFFFF
0xFF28D7
0xFFFFFFFF
0xFF8877
0xFFFFFFFF
0xFFA857
0xFFFFFFFF

На D11 еще проверю , возможно лучше будет .
Выхода можно и переназначить , это не сложно . Вместо 11 сделать 12 , если он подпален то для вывода 1 он же сгодится ?

148 (2021-10-06 19:56:40 отредактировано Radioman)

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

На 11 пине работает аналогично А2 , мусор возникает только если нет прямой видимости , изменяя угол можно это обнаружить.

Использовать реле плохая идея , от включения\выключения щелчёк в одном канале . Лучше мощный полевик .

Если нажать IN 1 с пульта , потом LOUDLESS есть баг отображения. После автоматической перехода в меню IN  останется ss OFF

Еще вот что заметил , микросхема пропускает звук когда POWER OFF , в этом случае лучше использовать еще и MUTE или выдавать лог. 1 с выхода D11 . За счет ключей происходит замыкание GND на OUT микросхемы . По Факту там вход УНЧ замыкает на землю и это создает тишину.





У вас анализатор работает ?

149

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

Еще вот что заметил , микросхема пропускает звук когда POWER OFF ,

В режиме MUTE и POWER OFF звук должен устанавливать на 0. У Вас происходит в этих режимах снижение уровня громкости?

Если нажать IN 1 с пульта , потом LOUDLESS есть баг отображения. После автоматической перехода в меню IN  останется ss OFF

Исправил

#define VOLUME_MAX  0xFF50AF // громкость прибавить
#define VOLUME_MIN  0xFF10EF // громкость убавить
#define BASS_MAX    0xFF8877 // НЧ прибавить
#define BASS_MIN    0xFFA857 // НЧ убавить
#define TREB_MAX    0xFF08F7 // ВЧ прибавить
#define TREB_MIN    0xFF28D7 // ВЧ убавить
#define BALL_R      0xFF40BF // баланс вправо
#define BALL_L      0xFF807F // баланс влево

#define IN1         0xFF20DF  // выбор вход 1
#define IN2         0xFF609F  // выбор вход 2
#define IN3         0xFF30CF  // выбор вход 3

#define LEFT        0xFF6897  // убавить в любом меню
#define RIGHT       0xFF48B7  // прибавить в любом меню

#define MENU_DOWN   0xFFB04F  // навигация по меню
#define MENU_UP     0xFFA05F  // навигация по меню

#define LOUD        0xFF708F  // Loudness

#define POWER       0xFF00FF  // POWER
#define MUTE        0xFF906F  // MUTE
/*
#define MUTE        0x33B8946B  // MUTE
#define POWER       0x33B800FF  // STANDBY

#define VOLUME_MAX  0x33B85AA5 // громкость прибавить
#define VOLUME_MIN  0x33B8D42B // громкость убавить
#define BASS_MAX    0x33B87A85 // НЧ прибавить
#define BASS_MIN    0x33B854AB // НЧ убавить
#define TREB_MAX    0x33B8BA45 // ВЧ прибавить
#define TREB_MIN    0x33B832CD // ВЧ убавить
#define BALL_R      0x33B83AC5 // баланс вправо
#define BALL_L      0x33B8827D // баланс влево

#define IN1         0x33B88877  // выбор вход 1
#define IN2         0x33B848B7  // выбор вход 2
#define IN3         0x33B8C837  // выбор вход 3

#define LEFT        0x33B8E01F  // убавить в любом меню
#define RIGHT       0x33B810EF  // прибавить в любом меню

#define MENU_DOWN   0x33B8609F  // навигация по меню
#define MENU_UP     0x33B8A05F  // навигация по меню

#define LOUD        0x33B844BB  // Loudness
*/


#define AUTO_GAIN 1       // автонастройка по громкости
#define VOL_THR 25        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 85       // максимальный порог по умолчанию 
#define FHT_N 256         // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h> 
#include <Wire.h>
#include <PT2313.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
  //LiquidCrystal_I2C lcd(0x27,16,2); 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
  PT2313 audioChip;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
 byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
 byte in,w,w2,gr1,gr2,www,z,z0,z1;
 int vol,vol_d,bass,bass_d,treb,treb_d,balans,gain,gain0,gain1,gain2;
 unsigned long time,oldPosition  = -999,newPosition;
 unsigned long gainTimer;
 byte maxValue, maxValue_f,spek;
 float k = 0.1;
 byte gain_sp = DEF_GAIN;  
 int i1,yyy,vol_old;
 bool loud,k1,k2,k3,k4,k5,power,mute;
 int menu, a3;

 
void setup(){
  Serial.begin(9600);Wire.begin(); 
 //lcd.init();lcd.backlight();
 lcd.begin(16, 2);
  irrecv.enableIRIn(); // запускаем модуль IR
  audioChip.initialize(0,true);
  pinMode(10,INPUT_PULLUP);// МЕНЮ КНОПКА SW энкодера
  pinMode(11,OUTPUT);// OUTPUT MUTE
  pinMode(13,OUTPUT);// OUTPUT STANDBY 
  pinMode(A3,INPUT);//  5 BUTTON
  ADMUX  = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
  MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass eeprom
  treb = EEPROM.read(3)-7;// treb eeprom
  balans = EEPROM.read(4)-4;// balans eeprom
  in = EEPROM.read(5);// in eeprom
  gain0 = EEPROM.read(6);
  gain1 = EEPROM.read(7);
  gain2 = EEPROM.read(8);
  loud = EEPROM.read(9);
  switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }
  audio();
}
void loop(){
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;delay(200);
  if(spek==1 && (ir.value==MENU_DOWN||ir.value==MENU_UP)){cl();menu=0;}
  }// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта 
  
/////////////// POWER //////////////////////////////////////////////  
  if(ir.value==POWER&&power==0){power=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("POWER OFF"));audio();delay(2000);}
 if(ir.value==POWER&&power==1){power=0;gr1=0;gr2=0;cl();w=1;w2=1;menu=0;myEnc.write(0);vol=vol_old;
  lcd.setCursor(3,0);lcd.print(F("POWER  ON"));audio();delay(2000);cl();} 
  if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
  if(mute==1){digitalWrite(11,HIGH);}else{digitalWrite(11,LOW);}
  
////////////// MUTE /////////////////////////////////////////////////
if(power==0){
 if(ir.value==MUTE && mute==0){mute=1;gr1=0;gr2=0;w=1;w2=1;menu=100;cl();myEnc.write(0);vol_old=vol;vol=0;
  lcd.setCursor(3,0);lcd.print(F("   MUTE   "));audio();}
 if(ir.value==MUTE && mute==1){mute=0;gr1=0;gr2=0;w=1;w2=1;menu=0;cl();myEnc.write(0);vol=vol_old;audio();}
}  
////////////////////////////////////////////////////////////////////
 
    //  a3 = 1023;
      a3 = (analogRead(A3));
      if(a3 < 50){k1=1;}
      if(a3 > 50 && a3 < 150){k2=1;}
      if(a3 > 150 && a3 < 250){k3=1;}
      if(a3 > 250 && a3 < 350){k4=1;}
      if(a3 > 350 && a3 < 500){k5=1;}   
  
      if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
  if(spek==0){
      byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
      byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
      byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
      lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
    }else{
      byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
      byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
      byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
      byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      }
  ///////////////////// управление ////////////////////////////////////////////////////
  if(power==0){
   if(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню
   if(k5==1){in++;k5=0;;cl();delay(200);time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN

  
  if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_max
  if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;vol_func();audio();}// vol_min
  if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_max
  if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;bass_func();audio();}// bass_min
  if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_max
  if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;treb_func();audio();}// treb_min 
  if(ir.value==BALL_R && menu!=3){balans++;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_right
  if(ir.value==BALL_L && menu!=3){balans--;menu=3;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;balans_func();audio();}// balans_left 
  
  if(ir.value==IN1){in=0;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN1
  if(ir.value==IN2){in=1;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN2
  if(ir.value==IN3){in=2;cl();time=millis()-7000;w=1;time=millis();w=1;w2=1;www=1;menu=4;gr1=0;gr2=0;audio();}// IN3

  if(ir.value==MENU_DOWN || k1==1){menu++;k1=0;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// menu_down
  if(ir.value==MENU_UP || k2==1){menu--;k2=0;cl();time=millis();w=1;w2=1;if(menu<0||menu>3){menu=3;}}// menu_up

  if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness  ON");audio();delay(2000);cl();}// loud_on
  if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w2=1;lcd.setCursor(2,0);lcd.print("Loudness OFF");audio();delay(2000);cl();}// loud_off
  }
  
 /////////////////////// VOLUME //////////////
   if(menu==0){
     if(ir.value==VOLUME_MAX || ir.value==RIGHT || k4==1){vol++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){vol++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==VOLUME_MIN || ir.value==LEFT || k3==1){vol--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){vol--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print(F("Volume  "));
     lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-14;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////////  BASS  //////////////
   if(menu==1){
     if(ir.value==BASS_MAX || ir.value==RIGHT || k4==1){bass++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){bass++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==BASS_MIN || ir.value==LEFT || k3==1){bass--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){bass--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<  
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Bass    "));
   lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////// TREBLE //////////////////
   if(menu==2){
     if(ir.value==TREB_MAX || ir.value==RIGHT || k4==1){treb++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
     if((ir.value==0xFFFFFFFF || k3==1) and gr1==1){treb++;k3=0;gr2=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==TREB_MIN || ir.value==LEFT || k3==1){treb--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка < 
     if((ir.value==0xFFFFFFFF || k4==1) and gr2==1){treb--;k4=0;gr1=0;cl1();time=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
    
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print(F("Treble  "));
   lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  //////////////// BALANSE  +\- 4 dB /////////////
   if(menu==3){
     if(ir.value==BALL_R || ir.value==RIGHT || k4==1){balans++;k4=0;gr1=1;gr2=0;cl();time=millis();w=1;balans_func();audio();}// кнопка > 
     if(ir.value==BALL_L || ir.value==LEFT || k3==1){balans--;k3=0;gr1=0;gr2=1;cl();time=millis();w=1;balans_func();audio();}// кнопка < 
    
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
  lcd.setCursor(0,0);
   if(balans>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans));lcd.print(" dB ");
  if(balans==0){lcd.print(" <>  ");}
  if(balans<0){lcd.print(" <   ");}
  if(balans>0){lcd.print("  >  ");}
   if(balans>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans));lcd.print(" dB ");
  lcd.setCursor(0,1);lcd.print("L");
  lcd.setCursor(15,1);lcd.print("R");
   if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
   if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
   if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}}
 
 /////////////////////////////////////////////////////////////

  /////////// input + gain /////////////////////////////////////////
 if(menu==4){
        switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     case 2: gain = gain2;break;
     }

     if(ir.value==RIGHT || k4==1){gain++;k4=0;gr1=1;gr2=0;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==LEFT || k3==1){gain--;k3=0;gr1=0;gr2=1;cl1();time=millis();w=1;w2=1;gain_func();audio();}// кнопка < 
     
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} 
    
   switch(in){
     case 0: gain0 = gain;break;
     case 1: gain1 = gain;break;
     case 2: gain2 = gain;break;
     } 
   lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
   lcd.setCursor(0,1);lcd.print(" GAIN ");
      switch(gain){
        case 3: lcd.print(" +11.25 dB");break;
        case 2: lcd.print("   +7.5 dB");break;
        case 1: lcd.print("  +3.75 dB");break;
        case 0: lcd.print("      0 dB");break;
        }
  }
 /////////////////////////////////////////////////////////////
 
 // запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
 // если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
   if(millis()-time>10000 && w==1 && power==0 && mute==0){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass+7);
     EEPROM.update(3,treb+7);
     EEPROM.update(5,in);
     EEPROM.update(6,gain0); EEPROM.update(7,gain1); EEPROM.update(8,gain2);
     EEPROM.update(9,loud);
 menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
 }

 if(spek==1){
  analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру

  for (int pos = 0; pos < 16; pos++) {   // для окошек дисплея с 0 по 15
    // найти максимум из пачки тонов
    if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];

    lcd.setCursor(pos, 0);

    // преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
    int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
    posLevel = constrain(posLevel, 0, 15);
  while(yyy<2){yyy++;
    if (posLevel > 7) {               // если значение больше 7 (значит нижний квадратик будет полный)
      lcd.write((uint8_t)posLevel - 8);    // верхний квадратик залить тем что осталось
      lcd.setCursor(pos, 1);          // перейти на нижний квадратик
      lcd.write((uint8_t)7);        // залить его полностью
  } 
    else {                          // если значение меньше 8
      lcd.print(" ");                 // верхний квадратик пустой
      lcd.setCursor(pos, 1);          // нижний квадратик
      lcd.write((uint8_t)posLevel);        // залить полосками
    }} yyy=0;
  }  

  if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {      // каждые 1500 мс
      // если максимальное значение больше порога, взять его как максимум для отображения
      if (maxValue_f > VOL_THR) gain_sp = maxValue_f;

      // если нет, то взять порог побольше, чтобы шумы вообще не проходили
      else gain_sp = 100;
      gainTimer = millis();
    }
  }else{gain_sp = DEF_GAIN;}
  }
  //////////////////////////////////
 
}// LOOP

void audio(){  
  audioChip.source(in);//select your source 1...3  вход 3...1
  audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
  audioChip.gain(gain);//gain 0...3 шаг 3.75 дБ
  audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
  audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
  audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
  audioChip.loudness(loud);//true or false // тонкомпенсация
}

void gain_func(){if(gain<0){gain=3;}if(gain>3){gain=0;}}
void balans_func(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} 
void vol_func(){if(vol<0){vol=0;}if(vol>62){vol=62;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
void cl1(){ir.value=0;delay(300);spek=0;}
void to_Timer(){newPosition = myEnc.read()/4;}

void analyzeAudio() {  
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
}

150

Re: PT2313 + энкодер + ИК пульт + анализатор спектра

У вас анализатор работает ?

Работает, но звук я на вход анализатора не подаю, просто шум и видны полосы