26

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

void setup(){
  lcd.init();
   lcd.backlight();
    
  Serial.begin(9600);Wire.begin(); lcd.begin(20,4);irrecv.enableIRIn(); // запускаем модуль IR
  audioChip.initialize(0,true);
  pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
  pinMode(11,INPUT);// ВЫБОР ВХОДА КНОПКА IN
  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
  EEPROM.update(6,gain0);EEPROM.update(7,gain1);EEPROM.update(8,gain0);
  audio();

27

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

Не весь код

28

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

void loop(){
      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, 0b01100};
      byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01100, 0b01100};
      byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01100, 0b01100, 0b01100};
      byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01100, 0b01100, 0b01100, 0b01100};
      byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100};
      byte v6[8] = {0b00000, 0b00000, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100};
      byte v7[8] = {0b00000, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100};
      byte v8[8] = {0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100};
      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(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню
   if(digitalRead(11)==HIGH){in++;;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN

   ////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;if(spek==1){menu=0;cl();}}// IR приемник - чтение, в мониторе порта отображаются коды кнопок

  if(ir.value==0x2FDD02F){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню кнопка вверх
  if(ir.value==0x2FD32CD){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// меню кнопка вниз
  
  if(ir.value==0x2FD708F){in++;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>1){in=0;};gr1=0;gr2=0;audio();}// IN
  
 /////////////////////// VOLUME //////////////
   if(menu==0){
     if(ir.value==0x2FD906F){vol++;gr1=1;gr2=0;cl();w2=1;vol_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){vol--;gr1=0;gr2=1;cl();w2=1;vol_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();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(3,1);lcd.print("Volume  ");
     lcd.setCursor(9,1);lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(15,1);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+2,2);lcd.write((uint8_t)0);lcd.setCursor(z0+1+2,2);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+2,2);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+2,2);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////////  BASS  //////////////
   if(menu==1){
     if(ir.value==0x2FD906F){bass++;gr1=1;gr2=0;cl();w2=1;bass_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl();w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){bass--;gr1=0;gr2=1;cl();w2=1;bass_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl();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(3,1);lcd.print("MegaBass  ");
   lcd.setCursor(11,1);lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(16,1);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+5,2);lcd.write((uint8_t)0);lcd.setCursor(z0+1+5,2);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+5,2);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+5,2);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////// TREBLE //////////////////
   if(menu==2){
     if(ir.value==0x2FD906F){treb++;gr1=1;gr2=0;cl();w2=1;treb_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){treb--;gr1=0;gr2=1;cl();w2=1;treb_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();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(3,1);lcd.print("Treble  ");
   lcd.setCursor(11,1);lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(15,1);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+5,2);lcd.write((uint8_t)0);lcd.setCursor(z0+1+5,2);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+5,2);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+5,2);lcd.write((uint8_t)2);}w2=0;}}
 
  //////////////// BALANSE  +\- 4 dB /////////////
   if(menu==3){
     if(ir.value==0x2FD906F){balans++;gr1=1;gr2=0;cl();balans_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){balans++;gr2=0;cl();balans_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){balans--;gr1=0;gr2=1;cl();balans_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){balans--;gr1=0;cl();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==0x2FD906F){gain++;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain++;gr2=0;cl();time=millis();w=1;;w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){gain--;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;gain_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){gain--;gr1=0;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);
   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){
     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);
 menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
 }

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

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

    lcd.setCursor(pos+2, 1);

    // преобразовать значение величины спектра в диапазон 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+2, 2);          // перейти на нижний квадратик
      lcd.write((uint8_t)7);        // залить его полностью
  } 
    else {                          // если значение меньше 8
      lcd.print(" ");                 // верхний квадратик пустой
      lcd.setCursor(pos+2, 2);          // нижний квадратик
      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;}
  }
  //////////////////////////////////

29

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

}// 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(true);//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();
   {lcd.setCursor(2, 3); lcd.print("----------------");lcd.setCursor(2, 0); lcd.print("----------------");
    lcd.setCursor(1, 1); lcd.print("|");lcd.setCursor(1, 2); lcd.print("|");
    lcd.setCursor(18, 1); lcd.print("|");lcd.setCursor(18, 2); lcd.print("|");
    }
}

30 (2020-01-25 20:14:06 отредактировано roline)

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

liman324 пишет:

Не весь код

весь не дает... только кусками... по порядку

31

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

Пока не вижу ни чего такого, сделал правки, проверьте

#define AUTO_GAIN 1       // автонастройка по громкости
#define VOL_THR 35        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 30      // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 150       // максимальный порог по умолчанию 
#define FHT_N 128        // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h> 
#include <Wire.h>
#include <PT2313.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
  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 menu,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;

 void setup(){
  lcd.init();
   lcd.backlight();
    
  Serial.begin(9600);Wire.begin(); lcd.begin(20,4);irrecv.enableIRIn(); // запускаем модуль IR
  audioChip.initialize(0,true);
  pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
  pinMode(11,INPUT);// ВЫБОР ВХОДА КНОПКА IN
  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
  EEPROM.update(6,gain0);EEPROM.update(7,gain1);EEPROM.update(8,gain0);
  audio();
 }

 void loop(){
      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, 0b01100};
      byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01100, 0b01100};
      byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01100, 0b01100, 0b01100};
      byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01100, 0b01100, 0b01100, 0b01100};
      byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100};
      byte v6[8] = {0b00000, 0b00000, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100};
      byte v7[8] = {0b00000, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100};
      byte v8[8] = {0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100, 0b01100};
      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(digitalRead(10)==LOW){menu++;cl();;time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню
   if(digitalRead(11)==HIGH){in++;;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>2){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN

   ////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;if(spek==1){menu=0;cl();}}// IR приемник - чтение, в мониторе порта отображаются коды кнопок

  if(ir.value==0x2FDD02F){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню кнопка вверх
  if(ir.value==0x2FD32CD){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// меню кнопка вниз
  
  if(ir.value==0x2FD708F){in++;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>1){in=0;};gr1=0;gr2=0;audio();}// IN
  
 /////////////////////// VOLUME //////////////
   if(menu==0){
     if(ir.value==0x2FD906F){vol++;gr1=1;gr2=0;cl();w2=1;vol_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){vol--;gr1=0;gr2=1;cl();w2=1;vol_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();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(3,1);lcd.print("Volume  ");
     lcd.setCursor(9,1);lcd.print(" ");lcd.print(-62+vol);lcd.print(" ");lcd.setCursor(15,1);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+2,2);lcd.write((uint8_t)0);lcd.setCursor(z0+1+2,2);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+2,2);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+2,2);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////////  BASS  //////////////
   if(menu==1){
     if(ir.value==0x2FD906F){bass++;gr1=1;gr2=0;cl();w2=1;bass_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl();w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){bass--;gr1=0;gr2=1;cl();w2=1;bass_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl();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(3,1);lcd.print("MegaBass  ");
   lcd.setCursor(11,1);lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(16,1);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+5,2);lcd.write((uint8_t)0);lcd.setCursor(z0+1+5,2);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+5,2);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+5,2);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////// TREBLE //////////////////
   if(menu==2){
     if(ir.value==0x2FD906F){treb++;gr1=1;gr2=0;cl();w2=1;treb_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){treb--;gr1=0;gr2=1;cl();w2=1;treb_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();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(3,1);lcd.print("Treble  ");
   lcd.setCursor(11,1);lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(15,1);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+5,2);lcd.write((uint8_t)0);lcd.setCursor(z0+1+5,2);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+5,2);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+5,2);lcd.write((uint8_t)2);}w2=0;}}
 
  //////////////// BALANSE  +\- 4 dB /////////////
   if(menu==3){
     if(ir.value==0x2FD906F){balans++;gr1=1;gr2=0;cl();balans_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){balans++;gr2=0;cl();balans_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){balans--;gr1=0;gr2=1;cl();balans_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){balans--;gr1=0;cl();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==0x2FD906F){gain++;gr1=1;gr2=0;cl();time=millis();w=1;w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain++;gr2=0;cl();time=millis();w=1;;w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){gain--;gr1=0;gr2=1;cl();time=millis();w=1;w2=1;gain_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){gain--;gr1=0;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);
   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){
     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);
 menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
 }

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

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

    lcd.setCursor(pos+2, 1);

    // преобразовать значение величины спектра в диапазон 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+2, 2);          // перейти на нижний квадратик
      lcd.write((uint8_t)7);        // залить его полностью
  } 
    else {                          // если значение меньше 8
      lcd.print(" ");                 // верхний квадратик пустой
      lcd.setCursor(pos+2, 2);          // нижний квадратик
      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.initialize(1,true); 
  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(true);//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();
 //  {lcd.setCursor(2, 3); lcd.print("----------------");lcd.setCursor(2, 0); lcd.print("----------------");
  //  lcd.setCursor(1, 1); lcd.print("|");lcd.setCursor(1, 2); lcd.print("|");
 //   lcd.setCursor(18, 1); lcd.print("|");lcd.setCursor(18, 2); lcd.print("|");
 //   }
}

32

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

Попробуйте запустить после подачи питания отключить i2c от аудиопроцессора.

33

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

писк остался,появились щелчки энкодера

34 (2020-01-25 20:27:46 отредактировано roline)

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

liman324 пишет:

Попробуйте запустить после подачи питания отключить i2c от аудиопроцессора.

если откинуть PTшку от шины писк  исчезает. И щелчки энкодера тоже исчезают.

35

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

DGND 26 вывод PT соединен с общим GND?

36

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

да

37

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

А если общий провод разъеденить, DGND от арудино, а GND от источника питания сделать.

38

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

не меняется

39

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

Загрузите первый скетч со другим подключением экрана, Ваш экран работать конечно не будет, но надо убедится что это не он источник помех - http://forum.rcl-radio.ru/viewtopic.php?pid=56#p56

40

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

обратил внимание от ПТшки откидываю CLK- в одном динамике писк пропадает. DT - в дугом

41

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

liman324 пишет:

Загрузите первый скетч со другим подключением экрана, Ваш экран работать конечно не будет, но надо убедится что это не он источник помех - http://forum.rcl-radio.ru/viewtopic.php?pid=56#p56

дык я же вообще без него подключался... писк оставался

42

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

Дело не в подключении экрана, а то что Вы подключили библиотеку экрана которая работает на той же шине что и PT. скетч будет отсылать команды экрану даже если он не подключен.

43

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

афигеть... библиотека шумела,чтоли?откинул дисп полностью, поставил
#include <LiquidCrystal.h> и без дисплея включил... писка нет вообще...

44

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

Я сейчас то же использую дисплеи с i2c, мне просто лень столько проводов подключать в простом подключении (приходится часто разбирать и собирать схемы), но в Вашем случае я заметил такую особенность, что анализатор спектра при i2c подключении начинает притормаживать, работает рывками. Не хватает скорости шины для работы анализатора.
Так что наверное Вам придется использовать простое подключение экрана.
Так же обратите внимание на http://forum.rcl-radio.ru/viewtopic.php?id=104 - анализатор спектра для LCD2004.

45

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

сейчас перекоммутирую дисп.  жаль,хотел юзать меньше проводов, но не судьба.
спасибо за консультацию.
Еще вопрос - если  а0 не подключать, то при переходе в режим анализатора дуинка вешается... на энкодер не отвечает до ресета дуины. так и должно быть?

46

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

roline пишет:

Еще вопрос - если  а0 не подключать, то при переходе в режим анализатора дуинка вешается... на энкодер не отвечает до ресета дуины. так и должно быть?

Нет, так в принципе не должно быть, но эту проблему мне так и не удалось решить. Что то там связано с перегрузкой входа, библиотеку клинит, в ней встроено авто усиления уровня. Наверное как то в этим связано.

Есть конечно вариант применить другой код опроса А0, тогда проблем с этим не будет, но спектр немного станет уже.

http://rcl-radio.ru/?p=42903

47

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

еще раз спасибо! и удачи вам в вашем деле!

48

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

Чуток подправил скетч под экран 2004,загнал надписи и анализатор а рамку.

http://forum.rcl-radio.ru/uploads/images/2020/01/b0e7e16a99e4d7e006ad0b82bf22d5c7.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/7c5b965ac17f80cedf72714495aee774.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/0797d7d39c8436fadc7a959db7736088.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/26ede3090aff31146d4f8a9860d9bed3.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/f5d7edf1b02a1f46d0bb3c0950b38f8a.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/f5834f13085a0919ecd8ce4e49236cd2.jpg

49

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

Красиво получилось!!!

В анализатор спектра можно добавить одну полосу.

Питание на подсветку без резистора подаете?

50 (2020-01-26 01:46:28 отредактировано roline)

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

liman324 пишет:

Красиво получилось!!!

В анализатор спектра можно добавить одну полосу.

когда добавляю, то паразитная полоска анализатора цепляет рамку...и они весело перемигиваются то кусок рамки,то анализатор. где исправить не нашел( ...на 1602 паразитная полоска за пределами экрана.