26

Re: TDA8425 + энкодер + пульт + STANDBY

С этой прошивкой

#include <IRremote.h>



   IRrecv irrecv(9); // указываем вывод модуля IR приемника
   decode_results ir;
   
void setup() {
  Serial.begin(9600);  
  irrecv.enableIRIn();
}



void loop() {
  if (irrecv.decode(&ir)) {  Serial.println(ir.value, HEX);
    irrecv.resume();
  }

}

Сигналы получаю вот такие

FF11E
FF11EE
FFFFFFFF
FF11EE
FF11EE
FFFFFFFF
FF11EE
FF
FF11EE
FF11EE
FFFFFFFF
FF
FF
FF11EE
FF11EE
FFFFFFFF
FF11EE
FF11EE
FF
FF11EE
FF
FF
FF
FF11EE
FF
FF11EE
FFFFFFFF
FF
FF11EE
FF11E

намного лучше декодирование происходит.

27

Re: TDA8425 + энкодер + пульт + STANDBY

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

Не подносите близко пульт, не ближе чем 1-2 метра, или поставьте фильтр (затемненный пластик)

28

Re: TDA8425 + энкодер + пульт + STANDBY

Спасибо за совет попробую, плюс еще приемник найду другой попробую, а анализатор звука сложно добавить? в эту версию прошивки?   или проше там где есть анализатор добавить пульт и стенд бай?  я про последний код из основной статьи говорю. http://rcl-radio.ru/?p=51737&cpage=1#comments

29

Re: TDA8425 + энкодер + пульт + STANDBY

Анализатор проще добавить

30

Re: TDA8425 + энкодер + пульт + STANDBY

liman324 пишет:

В Вашем скетче :

void loop() {

а было

void loop() {delay(10);

да я это пробывал, убирал , не на что не повлияло

31

Re: TDA8425 + энкодер + пульт + STANDBY

liman324 пишет:

Анализатор проще добавить

Попробовал добавить, зависает на заставке POWER OFF 

//анализатор
  #define FHT_N 128          // ширина спектра х2
  #define LOG_OUT 1
  #include <FHT.h>  
//анализатор

 #include "IRremote.h"
 #include <Wire.h>
  #include <TDA8425.h>
  #include <Encoder.h>
  #include <LiquidCrystal_I2C.h> // 
  #include <EEPROM.h>
  #include <MsTimer2.h>
  #include <boarddefs.h>
   IRrecv irrecv(9); // указываем вывод модуля IR приемника  
   Encoder myEnc(11, 10);//CLK, DT
   TDA8425 tda;
   decode_results ir;
   LiquidCrystal_I2C lcd(0x3F,16,2);
   
    byte a1[8]={0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101};
    byte a2[8]={0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100};
    byte a3[8]={0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000};
   int menu,vol,vol_d,balans,bass,bass_d,treb,treb_d,in,mute,sss;
   byte w,w2,standby=1,www,z,z0,z1,gr1,gr2;
  unsigned long time,gainTimer,oldPosition  = -999,newPosition;

 int i,sp,graf,k_us,gain,i2,sped,db;

   byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30};
   int AUTO_GAIN;    // автонастройка по громкости (экспериментальная функция)
   int VOL_THR;       // порог тишины (ниже него отображения на экране не будет)
   int LOW_PASS;        // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
   int DEF_GAIN;     // максимальный порог по умолчанию (при GAIN_CONTROL игнорируется)
    byte maxValue, maxValue_f,www1,spek,w1,y;
   float k = 0.1,k_usil;

void setup() {
   Serial.begin(9600);
   ADMUX  = 0b11100000; 
   irrecv.enableIRIn(); // запускаем модуль IR
   lcd.init();
   lcd.backlight();
   pinMode(12,INPUT);// меню кнопка энкодера SW
   pinMode(A0,INPUT);// кнопка POWER
   pinMode(8,OUTPUT);// выход управления STANDBY
   pinMode(A1,INPUT);// MUTE
   digitalWrite(8,LOW);
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
   vol = EEPROM.read(0);// vol eeprom
   bass = EEPROM.read(1);// bass eeprom
   treb = EEPROM.read(2);// treb eeprom
   in = EEPROM.read(3);// in eeprom
   balans = EEPROM.read(4)-4;// balans eeprom


     ADMUX  = 0b11100000; 

   if(EEPROM.read(0)>100){ // используется только один раз при первом запуске, если ячейка памяти для громкости вне диапазона регулирования
     EEPROM.update(0,40);  // установка всех настроек по умолчанию
     EEPROM.update(4,0);
     EEPROM.update(1,0);
     EEPROM.update(2,0);
     EEPROM.update(3,0);
     EEPROM.update(5,1);
     EEPROM.update(6,30);
     EEPROM.update(7,35);
     EEPROM.update(8,80);
     EEPROM.update(9,0);
     EEPROM.update(10,10);
     EEPROM.update(11,0);
   }
   pinMode(12,INPUT);// меню кнопка энкодера SW
   vol = EEPROM.read(0);// vol eeprom
   bass = EEPROM.read(1);// bass eeprom
   treb = EEPROM.read(2);// treb eeprom
   in = EEPROM.read(3);// in eeprom
   balans = EEPROM.read(4)-4;// balans eeprom
   AUTO_GAIN = EEPROM.read(5);
   VOL_THR = EEPROM.read(6);
   LOW_PASS = EEPROM.read(7);
   DEF_GAIN = EEPROM.read(8);
   graf = EEPROM.read(9);
   k_us = EEPROM.read(10);
   sped = EEPROM.read(11);
   audio();
   lcd.setCursor(4,0);lcd.print("TDA8425");delay(500);
   MsTimer2::set(1, to_Timer);MsTimer2::start();
}



void loop() {delay(10);





  
   if(standby==1){menu=100;lcd.setCursor(0,0);lcd.print("     Pover     "); lcd.setCursor(0,1);lcd.print("      Off    ");}
   if(analogRead(A0)>900&&standby==1){standby=0;lcd.clear();lcd.setCursor(0,0);lcd.print("     Pover      ");lcd.setCursor(0,1);lcd.print("      On     ");digitalWrite(8,HIGH);delay(1000);menu=0;w2=1;}
   if(analogRead(A0)>900&&standby==0){standby=1;lcd.clear();digitalWrite(8,LOW);delay(500);menu=100;}

   if(analogRead(A1)>900&&mute==0&&standby==0){mute=1;cl();menu=100;lcd.setCursor(0,0);lcd.print("      MUTE      ");delay(500);}
   if(analogRead(A1)>900&&mute==1&&standby==0){mute=0;cl();delay(100);menu=0;w2=1;}
   
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);time=millis();w=1;w2=1;irrecv.resume();}// IR приемник
   if(digitalRead(12)==LOW&&standby==0){menu++;cl();myEnc.write(0);time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню
 
    if(ir.value==0xE01F9A65&&standby==0){menu++;gr1=0;gr2=0;cl1();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// IR меню кнопка вверх
    if(ir.value==0xE01F3AC5&&standby==0){menu--;gr1=0;gr2=0;cl1();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// IR меню кнопка вниз
    
    if(ir.value==0xE01F807F&&standby==1){standby=0;gr1=0;gr2=0;cl();lcd.setCursor(0,0);lcd.print("     Pover      ");lcd.setCursor(0,1);lcd.print("      On     ");digitalWrite(8,HIGH);delay(500);menu=0;w2=1;}//IR power on
    if(ir.value==0xE01F807F&&standby==0){standby=1;gr1=0;gr2=0;cl();digitalWrite(8,LOW);delay(500);menu=100;}//IR power off

    if(ir.value==0xE01FBA45&&mute==0&&standby==0){mute=1;cl();menu=100;lcd.setCursor(0,0);lcd.print("      MUTE      ");delay(500);}// IR MUTE
    if(ir.value==0xE01FBA45&&mute==1&&standby==0){mute=0;cl();menu=0;w2=1;}//IR MUTE









//анализатор

 if(spek==1){
 
  if(www==1){
             if(graf==0){
             byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11011};
             byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11011, 0b11011};
             byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011};
             byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b11011};
             byte v5[8] = {0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011};
             byte v6[8] = {0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011};
             byte v7[8] = {0b00000, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011};
             byte v8[8] = {0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011};
             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(graf==1){
             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(graf==2){
             byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01010};
             byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01010, 0b01010};
             byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01010, 0b01010, 0b01010};
             byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01010, 0b01010, 0b01010, 0b01010};
             byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010};
             byte v6[8] = {0b00000, 0b00000, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010};
             byte v7[8] = {0b00000, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010};
             byte v8[8] = {0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010};
             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(graf==3){
             byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b10101};
             byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b10101, 0b10101};
             byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b10101, 0b10101, 0b10101};
             byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b10101, 0b10101, 0b10101, 0b10101};
             byte v5[8] = {0b00000, 0b00000, 0b00000, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101};
             byte v6[8] = {0b00000, 0b00000, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101};
             byte v7[8] = {0b00000, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101};
             byte v8[8] = {0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101};
             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(graf==4){
             byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111};
             byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
             byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111};
             byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111};
             byte v5[8] = {0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
             byte v6[8] = {0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
             byte v7[8] = {0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
             byte v8[8] = {0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
             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);}
  www=0;
  }
  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, 0, 15);
    posLevel = constrain(posLevel, 0, 15);
  while(y<3){y++;
    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);        // залить полосками
    }} y=0;
}
 
 
   k_usil=k_us;k_usil=k_usil*0.1;
  if (AUTO_GAIN==1) {
    maxValue_f = maxValue*k_usil * k + maxValue_f * (1 - k);
   if (millis() - gainTimer > 1500) {      // каждые 1500 мс
      // если максимальное значение больше порога, взять его как максимум для отображения
      if (maxValue_f > VOL_THR) gain = maxValue_f;
      // если нет, то взять порог побольше, чтобы шумы вообще не проходили
      else gain = 100;
      gainTimer = millis();
    }}else{gain=DEF_GAIN;
  }// spektr
  } 
 
   if(digitalRead(12)==LOW&&menu<3){sss++;if(spek==1){menu==0;}else{menu++;}www1=0;spek=0;myEnc.write(0);oldPosition  = -999;delay(300);time=millis();w1=1;if(menu>2){menu=0;}if(sss>2){menu=3;delay(300);}}// меню
   if(digitalRead(12)==HIGH){sss=0;}
   if(menu==3&&digitalRead(12)==LOW&&sss==0){menu=4;oldPosition  = -999;delay(300);time=millis();w1=1;lcd.clear();}
   if(menu==4&&digitalRead(12)==LOW&&sss==0){menu=5;oldPosition  = -999;delay(300);time=millis();w1=1;lcd.clear();}
   if(menu==5&&digitalRead(12)==LOW){menu=0;time=millis();w1=1;delay(300);lcd.clear();}
   if (newPosition != oldPosition&&spek==1) {oldPosition = newPosition;menu=0,www1=0;spek=0;w1=1;time=millis();lcd.clear();}
 
    if(spek==0){
      if(www1==0){byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
                  byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000};
                  lcd.createChar(0,a1); lcd.createChar(1,a2); www1=1; }
 
 
 
 
 
 
 
   ///////////////////////// spectrum analyzer /////////////////////////////
  if(menu==5){  
    if(digitalRead(9)==HIGH){sp++;myEnc.write(0);oldPosition  = -999;delay(300);time=millis();if(sp>6){sp=0;}}
     lcd.setCursor(0,0);lcd.print("Spectrum analyzer");
if (newPosition != oldPosition) {
    oldPosition = newPosition;
    switch(sp){ w1=0;
    case 0: AUTO_GAIN=AUTO_GAIN+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(AUTO_GAIN>1){AUTO_GAIN=0;}if(AUTO_GAIN<0){AUTO_GAIN=1;};
    lcd.setCursor(0,1);lcd.print("AUTO_GAIN ");lcd.print(AUTO_GAIN);break;
    case 1: VOL_THR=VOL_THR+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(VOL_THR>100){VOL_THR=100;}if(VOL_THR<10){VOL_THR=10;};
    lcd.setCursor(0,1);lcd.print("VOL_THR ");lcd.print(VOL_THR);break;
    case 2: LOW_PASS=LOW_PASS+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(LOW_PASS>100){LOW_PASS=100;}if(LOW_PASS<10){LOW_PASS=10;};
    lcd.setCursor(0,1);lcd.print("LOW_PASS ");lcd.print(LOW_PASS);break;
    case 3: DEF_GAIN=DEF_GAIN+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(DEF_GAIN>200){DEF_GAIN=200;}if(DEF_GAIN<30){DEF_GAIN=30;};
    lcd.setCursor(0,1);lcd.print("DEF_GAIN ");lcd.print(DEF_GAIN);break;
    case 4: k_us=k_us+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(k_us>15){k_us=15;}if(k_us<5){k_us=5;}; k_usil=k_us;k_usil=k_usil*0.1;
    lcd.setCursor(0,1);lcd.print("GRAPH_ATT ");lcd.print(k_usil,1);break;
    case 5: graf=graf+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(graf>4){graf=4;}if(graf<0){graf=0;};
    lcd.setCursor(0,1);lcd.print("GRAPHICS ");lcd.print(graf);break;
    case 6: sped=sped+newPosition;w2=0;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(sped>5){sped=5;}if(sped<0){sped=0;};
    lcd.setCursor(0,1);lcd.print("Conv. speed ");lcd.print(sped);break;
 
  }}}
 /////////////////////////////////////////////////////////////////////////
    }// spek = 0
  if(w2==0){
    switch(sped){
      case 0: ADCSRA = 0b11110010;break;
      case 1: ADCSRA = 0b11110011;break;
      case 2: ADCSRA = 0b11110100;break;
      case 3: ADCSRA = 0b11110101;break;
      case 4: ADCSRA = 0b11110110;break;
      case 5: ADCSRA = 0b11110111;break;
    }w2=1;}
 
 

 //анализатор











    
/////////////////////// VOLUME ///////////////////////////////////
  if(menu==0){ 
     if(ir.value==0xE01F7A85){vol++;gr1=1;gr2=0;cl();w2=1;ogr_vol();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();w2=1;ogr_vol();audio();}// кнопка >>>>>>
     if(ir.value==0xE01F1AE5){vol--;gr1=0;gr2=1;cl();w2=1;ogr_vol();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();w2=1;ogr_vol();audio();}// кнопка <<<<<<
     
    if (newPosition != oldPosition){oldPosition = newPosition;
    vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;ogr_vol();audio();} 
    
   lcd.setCursor(0,0);lcd.print("VOLUME  ");
   lcd.print(" ");lcd.print((-60+vol)*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-15;
   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==0xE01F7A85){bass++;gr1=1;gr2=0;cl();w2=1;ogr_bass();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl();w2=1;ogr_bass();audio();}// кнопка >>>>>>
     if(ir.value==0xE01F1AE5){bass--;gr1=0;gr2=1;cl();w2=1;ogr_bass();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl();w2=1;ogr_bass();audio();}// кнопка <<<<<<
     
    if (newPosition != oldPosition){oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;ogr_bass();audio();} 

     lcd.setCursor(0,0);lcd.print("BASS      ");
  switch(bass){
    case 11: bass_d=15;break;
    case 10: bass_d=12;break;
    case 9:  bass_d=9;break;
    case 8:  bass_d=6;break;
    case 7:  bass_d=3;break;
    case 6:  bass_d=0;break;
    case 5:  bass_d=-3;break;
    case 4:  bass_d=-6;break;
    case 3:  bass_d=-9;break;
    case 2:  bass_d=-12;break;
    }
   if(bass_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}}
  lcd.print(abs(bass_d));lcd.print(" dB   ");
    if(w2==1){bass_d=bass_d+12;
    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+3+1,1);lcd.print("   ");}}
    if(bass_d==0){lcd.setCursor(0,1);lcd.print("                ");}w2=0;}}

/////////////////////// TREBLE //////////////////////////////////////////////////////
  if(menu==2){ 
     if(ir.value==0xE01F7A85){treb++;gr1=1;gr2=0;cl();w2=1;ogr_treb();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();w2=1;ogr_treb();audio();}// кнопка >>>>>>
     if(ir.value==0xE01F1AE5){treb--;gr1=0;gr2=1;cl();w2=1;ogr_treb();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();w2=1;ogr_treb();audio();}// кнопка <<<<<<
     
    if (newPosition != oldPosition){oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;ogr_treb();audio();} 

     lcd.setCursor(0,0);lcd.print("TREBLE    ");
  switch(treb){
    case 10: treb_d=12;break;
    case 9:  treb_d=9;break;
    case 8:  treb_d=6;break;
    case 7:  treb_d=3;break;
    case 6:  treb_d=0;break;
    case 5:  treb_d=-3;break;
    case 4:  treb_d=-6;break;
    case 3:  treb_d=-9;break;
    case 2:  treb_d=-12;break;
    }
   if(treb_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}}
  lcd.print(abs(treb_d));lcd.print(" dB   ");
    if(w2==1){treb_d=treb_d+12;
    for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
    if(z1==1){lcd.setCursor(z0+4,1);lcd.write((uint8_t)0);lcd.setCursor(z0+4+1,1);lcd.print("   ");}}
    if(treb_d==0){lcd.setCursor(0,1);lcd.print("                ");}w2=0;}}

//////////////// BALANCE /////////////////////////////////////
   if(menu==3){ 
     if(ir.value==0xE01F7A85){balans++;gr1=1;gr2=0;cl();w2=1;ogr_balans();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){balans++;gr2=0;cl();w2=1;ogr_balans();audio();}// кнопка >>>>>>
     if(ir.value==0xE01F1AE5){balans--;gr1=0;gr2=1;cl();w2=1;ogr_balans();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){balans--;gr1=0;cl();w2=1;ogr_balans();audio();}// кнопка <<<<<<
     
    if (newPosition != oldPosition){oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;lcd.clear();ogr_balans();audio();} 

    lcd.setCursor(0,0);
   if(balans*2>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(balans*2>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans*2));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 /////////////////////////////
  if(menu==4){
     if(ir.value==0xE01F7A85){in++;gr1=1;gr2=0;cl1();w2=1;ogr_in();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){in++;gr2=0;cl1();w2=1;ogr_in();audio();}// кнопка >>>>>>
     if(ir.value==0xE01F1AE5){in--;gr1=0;gr2=1;cl1();w2=1;ogr_in();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){in--;gr1=0;cl1();w2=1;ogr_in();audio();}// кнопка <<<<<<
    
if (newPosition != oldPosition) {
    oldPosition = newPosition;
    in=in+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w=1;ogr_in();audio();}
 
  lcd.setCursor(0,0);lcd.print("Source selector");
  lcd.setCursor(0,1);lcd.print("INPUT: ");
  if(in==0){lcd.print("Aux in  ");}
  if(in==1){lcd.print("Bluetooth");}
 }
////////////////////////////////////////////////////////////////

    if(millis()-time>10000 && w==1){// сохранение всех настроек в eeprom через 10 сек неактивности
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass);
     EEPROM.update(2,treb);
     EEPROM.update(3,in);
     EEPROM.update(5,AUTO_GAIN);
     EEPROM.update(6,VOL_THR);
     EEPROM.update(7,LOW_PASS);
     EEPROM.update(8,DEF_GAIN);
     EEPROM.update(9,graf);
     EEPROM.update(10,k_us);
     EEPROM.update(11,sped);
     w1=0;menu=0;lcd.clear();spek=1;www=1; sp=0;}

}//loop
void ogr_in(){if(in>1){in=0;}if(in<0){in=1;}}
void ogr_balans(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void ogr_treb(){if(treb>10){treb=10;}if(treb<2){treb=2;}}
void ogr_bass(){if(bass>11){bass=11;}if(bass<2){bass=2;}}
void ogr_vol(){if(vol<0){vol=0;}if(vol>63){vol=63;}}
void cl(){ir.value=0;delay(200);lcd.clear();}
void cl1(){ir.value=0;delay(400);lcd.clear();}
void to_Timer(){newPosition = myEnc.read()/4;}
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
 }


// анализатор  
void analyzeAudio() { 
 
   cli(); 
 while( i < FHT_N ) {  i++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i] = (ADCL|ADCH << 8); 
    }i=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();
}

//анализатор

не понимаю как анализатор снять с порта A0 и поставить на A3,  на А0 весит кнопка включения, можете подсказать?   или сами встроить анализатор? За ранее благодарю.

32

Re: TDA8425 + энкодер + пульт + STANDBY

#define IR1 0x2FDD02F // IR меню кнопка вверх
#define IR2 0x2FD32CD // IR меню кнопка вниз
#define IR3 0x2FD00FF // POWER
#define IR4 0x2FD708F // MUTE
#define IR5 0x2FD906F // >>>>>
#define IR6 0x2FDF20D // <<<<<

#define AUTO_GAIN 1       // автонастройка по громкости
#define VOL_THR 45        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 40       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 100       // максимальный порог по умолчанию 
#define FHT_N 128         // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h> 

  #include <Wire.h>
  #include <TDA8425.h>
  #include <Encoder.h>
  #include <LiquidCrystal.h>
  #include <EEPROM.h>
  #include <MsTimer2.h>
  #include <boarddefs.h>
  #include <IRremote.h>
   IRrecv irrecv(9); // указываем вывод модуля IR приемника
   Encoder myEnc(11, 10);//CLK, DT
   decode_results ir;
   TDA8425 tda;
   LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7

    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выш
   
   int menu,vol,vol_d,balans,bass,bass_d,treb,treb_d,in,mute,sss;
   byte w,w2,standby=1,www,z,z0,z1,gr1,gr2;
   unsigned long time,oldPosition  = -999,newPosition;
   byte maxValue, maxValue_f,spek;
   float k = 0.1;
   byte gain_sp = DEF_GAIN;  
   int i1,yyy,bbb=1;
   unsigned long gainTimer;
 
void setup() {
   Serial.begin(9600);lcd.begin(16, 2);
   irrecv.enableIRIn(); // запускаем модуль IR
   pinMode(12,INPUT);// меню кнопка энкодера SW
   pinMode(0,INPUT_PULLUP);// кнопка POWER  - нажатие замыкание на GND
   pinMode(8,OUTPUT);// выход управления STANDBY
   pinMode(1,INPUT_PULLUP);// MUTE  - нажатие замыкание на GND
   
   digitalWrite(8,LOW);
   
   sbi(ADCSRA, ADPS2);
   cbi(ADCSRA, ADPS1);
   sbi(ADCSRA, ADPS0);
  analogReference(INTERNAL);
  pinMode(A0,INPUT); // A0 вход анализатора спектра
  
   vol = EEPROM.read(0);// vol eeprom
   bass = EEPROM.read(1);// bass eeprom
   treb = EEPROM.read(2);// treb eeprom
   in = EEPROM.read(3);// in eeprom
   balans = EEPROM.read(4)-4;// balans eeprom
   lcd.setCursor(4,0);lcd.print("TDA8425");delay(1000);
   MsTimer2::set(3, to_Timer);MsTimer2::start();
   audio();
}

void loop() {
     if (newPosition != oldPosition) {if(spek==1){spek=0;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(standby==1){spek=0;menu=100;lcd.setCursor(0,0);lcd.print("   POWER OFF    ");}
   if(digitalRead(0)==LOW&&standby==1){standby=0;lcd.clear();lcd.setCursor(0,0);lcd.print("   POWER ON     ");digitalWrite(8,HIGH);delay(2000);menu=0;w2=1;}
   if(digitalRead(0)==LOW&&standby==0){standby=1;lcd.clear();digitalWrite(8,LOW);delay(500);menu=100;}

   if(digitalRead(1)==LOW&&mute==0&&standby==0){spek=0;mute=1;cl();menu=100;lcd.setCursor(0,0);lcd.print("      MUTE      ");delay(500);}
   if(digitalRead(1)==LOW&&mute==1&&standby==0){mute=0;cl();delay(100);menu=0;w2=1;}
   
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);time=millis();w=1;w2=1;if(spek==1){spek=0;menu=0;cl();}irrecv.resume();}// IR приемник
   if(digitalRead(12)==LOW&&standby==0){menu++;cl();myEnc.write(0);time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню
 
    if(ir.value==IR1&&standby==0){menu++;gr1=0;gr2=0;cl1();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// IR меню кнопка вверх
    if(ir.value==IR2&&standby==0){menu--;gr1=0;gr2=0;cl1();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// IR меню кнопка вниз
    
    if(ir.value==IR3&&standby==1){standby=0;gr1=0;gr2=0;cl();lcd.setCursor(0,0);lcd.print("   POWER ON     ");digitalWrite(8,HIGH);delay(2000);menu=0;w2=1;}//IR power on
    if(ir.value==IR3&&standby==0){standby=1;gr1=0;gr2=0;cl();digitalWrite(8,LOW);delay(500);menu=100;}//IR power off

    if(ir.value==IR4&&mute==0&&standby==0){mute=1;cl();menu=100;lcd.setCursor(0,0);lcd.print("      MUTE      ");delay(500);}// IR MUTE
    if(ir.value==IR4&&mute==1&&standby==0){mute=0;cl();menu=0;w2=1;}//IR MUTE

    
/////////////////////// VOLUME ///////////////////////////////////
  if(menu==0){ 
     if(ir.value==IR5){vol++;gr1=1;gr2=0;cl();w2=1;ogr_vol();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();w2=1;ogr_vol();audio();}// кнопка >>>>>>
     if(ir.value==IR6){vol--;gr1=0;gr2=1;cl();w2=1;ogr_vol();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();w2=1;ogr_vol();audio();}// кнопка <<<<<<
     
    if (newPosition != oldPosition){oldPosition = newPosition;
    vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;ogr_vol();audio();} 
    
   lcd.setCursor(0,0);lcd.print("VOLUME  ");
   lcd.print(" ");lcd.print((-60+vol)*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-15;
   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==IR5){bass++;gr1=1;gr2=0;cl();w2=1;ogr_bass();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl();w2=1;ogr_bass();audio();}// кнопка >>>>>>
     if(ir.value==IR6){bass--;gr1=0;gr2=1;cl();w2=1;ogr_bass();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl();w2=1;ogr_bass();audio();}// кнопка <<<<<<
     
    if (newPosition != oldPosition){oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;ogr_bass();audio();} 

     lcd.setCursor(0,0);lcd.print("BASS      ");
  switch(bass){
    case 11: bass_d=15;break;
    case 10: bass_d=12;break;
    case 9:  bass_d=9;break;
    case 8:  bass_d=6;break;
    case 7:  bass_d=3;break;
    case 6:  bass_d=0;break;
    case 5:  bass_d=-3;break;
    case 4:  bass_d=-6;break;
    case 3:  bass_d=-9;break;
    case 2:  bass_d=-12;break;
    }
   if(bass_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}}
  lcd.print(abs(bass_d));lcd.print(" dB   ");
    if(w2==1){bass_d=bass_d+12;
    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+3+1,1);lcd.print("   ");}}
    if(bass_d==0){lcd.setCursor(0,1);lcd.print("                ");}w2=0;}}

/////////////////////// TREBLE //////////////////////////////////////////////////////
  if(menu==2){ 
     if(ir.value==IR5){treb++;gr1=1;gr2=0;cl();w2=1;ogr_treb();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();w2=1;ogr_treb();audio();}// кнопка >>>>>>
     if(ir.value==IR6){treb--;gr1=0;gr2=1;cl();w2=1;ogr_treb();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();w2=1;ogr_treb();audio();}// кнопка <<<<<<
     
    if (newPosition != oldPosition){oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;ogr_treb();audio();} 

     lcd.setCursor(0,0);lcd.print("TREBLE    ");
  switch(treb){
    case 10: treb_d=12;break;
    case 9:  treb_d=9;break;
    case 8:  treb_d=6;break;
    case 7:  treb_d=3;break;
    case 6:  treb_d=0;break;
    case 5:  treb_d=-3;break;
    case 4:  treb_d=-6;break;
    case 3:  treb_d=-9;break;
    case 2:  treb_d=-12;break;
    }
   if(treb_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}}
  lcd.print(abs(treb_d));lcd.print(" dB   ");
    if(w2==1){treb_d=treb_d+12;
    for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
    if(z1==1){lcd.setCursor(z0+4,1);lcd.write((uint8_t)0);lcd.setCursor(z0+4+1,1);lcd.print("   ");}}
    if(treb_d==0){lcd.setCursor(0,1);lcd.print("                ");}w2=0;}}

//////////////// BALANCE /////////////////////////////////////
   if(menu==3){ 
     if(ir.value==IR5){balans++;gr1=1;gr2=0;cl();w2=1;ogr_balans();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){balans++;gr2=0;cl();w2=1;ogr_balans();audio();}// кнопка >>>>>>
     if(ir.value==IR6){balans--;gr1=0;gr2=1;cl();w2=1;ogr_balans();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){balans--;gr1=0;cl();w2=1;ogr_balans();audio();}// кнопка <<<<<<
     
    if (newPosition != oldPosition){oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;lcd.clear();ogr_balans();audio();} 

    lcd.setCursor(0,0);
   if(balans*2>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(balans*2>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans*2));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 /////////////////////////////
  if(menu==4){
     if(ir.value==IR5){in++;gr1=1;gr2=0;cl1();w2=1;ogr_in();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){in++;gr2=0;cl1();w2=1;ogr_in();audio();}// кнопка >>>>>>
     if(ir.value==IR6){in--;gr1=0;gr2=1;cl1();w2=1;ogr_in();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){in--;gr1=0;cl1();w2=1;ogr_in();audio();}// кнопка <<<<<<
    
if (newPosition != oldPosition) {
    oldPosition = newPosition;
    in=in+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w=1;ogr_in();audio();}
 
  lcd.setCursor(0,0);lcd.print("Source selector");
  lcd.setCursor(0,1);lcd.print("INPUT: ");lcd.print(in);
 }
////////////////////////////////////////////////////////////////

    if(millis()-time>10000 && w==1){// сохранение всех настроек в eeprom через 10 сек неактивности
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass);
     EEPROM.update(2,treb);
     EEPROM.update(3,in);
     lcd.clear();w=0;w2=1;menu=100;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 ogr_in(){if(in>1){in=0;}if(in<0){in=1;}}
void ogr_balans(){if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void ogr_treb(){if(treb>10){treb=10;}if(treb<2){treb=2;}}
void ogr_bass(){if(bass>11){bass=11;}if(bass<2){bass=2;}}
void ogr_vol(){if(vol<0){vol=0;}if(vol>63){vol=63;}}
void cl(){ir.value=0;delay(200);lcd.clear();}
void cl1(){ir.value=0;delay(400);lcd.clear();}
void to_Timer(){newPosition = myEnc.read()/4;}
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
 }

  void analyzeAudio() {   
    cli();
for (int i = 0 ; i < FHT_N ; i++) {
    int sample = analogRead(A0);
    fht_input[i] = sample; // put real data into bins
  }
    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();
}

33

Re: TDA8425 + энкодер + пульт + STANDBY

Спасибо,  запустил скетч, поменял в нем только i2c подключение дисплея, кнопки переделал Power  -0 mute -1  они работают, плюс прописал коды из своего ик-пульта они тоже работают.

Проблема с ик-приемником решилась заменуй и пульта и приемника одновременно

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

34 (2020-10-20 07:10:23 отредактировано djozes)

Re: TDA8425 + энкодер + пульт + STANDBY

Еще заметил баг если, включить и выключить питание кнопкой повер, то в выключенном состоянии все равно появляется анализатор и надпись повер офф.  Но если не нажимань ничего после запуска платы такого нет.

И если включить режим мут все равно появляется анализатор.

35

Re: TDA8425 + энкодер + пульт + STANDBY

скетч я поправил. i2c подключение экрана не желательно, анализатор спектра будет сильно тормозить, у экрана низкая скорость обновления.

36

Re: TDA8425 + энкодер + пульт + STANDBY

Пока не получилось запустить экран без i2C, разобраться в чем причина пока не могу, надеюсь я его не убил статикой. Протестить скетч пока не могу.

37

Re: TDA8425 + энкодер + пульт + STANDBY

привет всем! подскажите пожалуйста в чем причина скетч залил с http://rcl-radio.ru/?p=51737&cpage=1#comments все запускается только на экране постоянно моргают данные как будто постоянно кручу энкодер даже при отключенном энкодере 3 вечер мучаюсь не пойму что не так сделал

38

Re: TDA8425 + энкодер + пульт + STANDBY

Проверьте на плате энкодера 3 подтягивающих резистора по 10 К

39

Re: TDA8425 + энкодер + пульт + STANDBY

так даже при отключенном физически энкодере

40

Re: TDA8425 + энкодер + пульт + STANDBY

Подтягивающие резисторы подключены к +5В, без энкодера запускать нельзя.

41

Re: TDA8425 + энкодер + пульт + STANDBY

энкодер с али hv040 на нем всего 2 резистора третьего нет

42

Re: TDA8425 + энкодер + пульт + STANDBY

но могу впаять место под него есть по дорожке sw

43

Re: TDA8425 + энкодер + пульт + STANDBY

Надо впаять.

44

Re: TDA8425 + энкодер + пульт + STANDBY

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

45

Re: TDA8425 + энкодер + пульт + STANDBY

Подробнее, как моргает громкость? Постоянно переключается меню?

46

Re: TDA8425 + энкодер + пульт + STANDBY

надпись вол моргает с частотой в пол секунды если нажать и удерживать кнопку то быстро листаются пункты меню

47

Re: TDA8425 + энкодер + пульт + STANDBY

Опубликуйте скетч который используете.

48

Re: TDA8425 + энкодер + пульт + STANDBY

если есть вайцап могу видео скинуть

49

Re: TDA8425 + энкодер + пульт + STANDBY

Данный контент доступен только зарегистрированным пользователям.

50

Re: TDA8425 + энкодер + пульт + STANDBY

Я поправил для lcd2002, надо тестировать:

 #define FHT_N 256          // ширина спектра х2
  #define LOG_OUT 1
  #include <FHT.h>          
  #include <LiquidCrystal.h>
  #include <Wire.h>
  #include <TDA8425.h>
  #include <Encoder.h>
  #include <EEPROM.h>
 // #include <EEPROMex.h>
  #include <MsTimer2.h>
   LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
   Encoder myEnc(11, 10);//CLK, DT
   TDA8425 tda;
  // вручную забитый массив тонов, сначала плавно, потом круче
   byte posOffset[20] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38};
   int AUTO_GAIN;    // автонастройка по громкости (экспериментальная функция)
   int VOL_THR;       // порог тишины (ниже него отображения на экране не будет)
   int LOW_PASS;        // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
   int DEF_GAIN;     // максимальный порог по умолчанию (при GAIN_CONTROL игнорируется)
   unsigned long gainTimer,time;
   byte maxValue, maxValue_f,www,www1,spek,menu,w1,w2,y;
   float k = 0.1,k_usil;
   int z,vol,vol_d,balans,bass,bass_d,treb,treb_d,in,mute,sss,i,sp,graf,k_us,gain,i2,sped,db;
   long oldPosition  = -999,newPosition;
 
    void to_Timer(){ //функция таймера
    newPosition = myEnc.read()/4;}
 
void setup() { Serial.begin(9600);
  lcd.begin(20, 2);// LCD 16X2
  ADMUX  = 0b11100000; 
  //ADCSRA = 0b11110011;
   if(EEPROM.read(0)>100){ // используется только один раз при первом запуске, если ячейка памяти для громкости вне диапазона регулирования
     EEPROM.update(0,40);  // установка всех настроек по умолчанию
     EEPROM.update(4,0);
     EEPROM.update(1,0);
     EEPROM.update(2,0);
     EEPROM.update(3,0);
     EEPROM.update(5,1);
     EEPROM.update(6,30);
     EEPROM.update(7,35);
     EEPROM.update(8,80);
     EEPROM.update(9,0);
     EEPROM.update(10,10);
     EEPROM.update(11,0);
   }
   pinMode(12,INPUT);// меню кнопка энкодера SW
   vol = EEPROM.read(0);// vol eeprom
   bass = EEPROM.read(1);// bass eeprom
   treb = EEPROM.read(2);// treb eeprom
   in = EEPROM.read(3);// in eeprom
   balans = EEPROM.read(4)-4;// balans eeprom
   AUTO_GAIN = EEPROM.read(5);
   VOL_THR = EEPROM.read(6);
   LOW_PASS = EEPROM.read(7);
   DEF_GAIN = EEPROM.read(8);
   graf = EEPROM.read(9);
   k_us = EEPROM.read(10);
   sped = EEPROM.read(11);
   audio();
   lcd.setCursor(4,0);lcd.print("TDA8425");delay(500);
   MsTimer2::set(1, to_Timer);MsTimer2::start();
}
 
void loop() {
  if(spek==1){
 
  if(www==1){
             if(graf==0){
             byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11011};
             byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11011, 0b11011};
             byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011};
             byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b11011};
             byte v5[8] = {0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011};
             byte v6[8] = {0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011};
             byte v7[8] = {0b00000, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011};
             byte v8[8] = {0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011, 0b11011};
             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(graf==1){
             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(graf==2){
             byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01010};
             byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01010, 0b01010};
             byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01010, 0b01010, 0b01010};
             byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01010, 0b01010, 0b01010, 0b01010};
             byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010};
             byte v6[8] = {0b00000, 0b00000, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010};
             byte v7[8] = {0b00000, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010};
             byte v8[8] = {0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010, 0b01010};
             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(graf==3){
             byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b10101};
             byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b10101, 0b10101};
             byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b10101, 0b10101, 0b10101};
             byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b10101, 0b10101, 0b10101, 0b10101};
             byte v5[8] = {0b00000, 0b00000, 0b00000, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101};
             byte v6[8] = {0b00000, 0b00000, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101};
             byte v7[8] = {0b00000, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101};
             byte v8[8] = {0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101, 0b10101};
             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(graf==4){
             byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111};
             byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
             byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111};
             byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111};
             byte v5[8] = {0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
             byte v6[8] = {0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
             byte v7[8] = {0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
             byte v8[8] = {0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111};
             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);}
  www=0;
  }
  analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру
 
  for (int pos = 0; pos < 20; 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, 0, 19);
    posLevel = constrain(posLevel, 0, 19);
  while(y<3){y++;
    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);        // залить полосками
    }} y=0;
}
 
 
   k_usil=k_us;k_usil=k_usil*0.1;
  if (AUTO_GAIN==1) {
    maxValue_f = maxValue*k_usil * k + maxValue_f * (1 - k);
   if (millis() - gainTimer > 1500) {      // каждые 1500 мс
      // если максимальное значение больше порога, взять его как максимум для отображения
      if (maxValue_f > VOL_THR) gain = maxValue_f;
      // если нет, то взять порог побольше, чтобы шумы вообще не проходили
      else gain = 100;
      gainTimer = millis();
    }}else{gain=DEF_GAIN;
  }// spektr
  } 
 
   if(digitalRead(12)==LOW&&menu<3){sss++;if(spek==1){menu==0;}else{menu++;}www1=0;spek=0;myEnc.write(0);oldPosition  = -999;delay(300);time=millis();w1=1;if(menu>2){menu=0;}if(sss>2){menu=3;delay(300);}}// меню
   if(digitalRead(12)==HIGH){sss=0;}
   if(menu==3&&digitalRead(12)==LOW&&sss==0){menu=4;oldPosition  = -999;delay(300);time=millis();w1=1;lcd.clear();}
   if(menu==4&&digitalRead(12)==LOW&&sss==0){menu=5;oldPosition  = -999;delay(300);time=millis();w1=1;lcd.clear();}
   if(menu==5&&digitalRead(12)==LOW){menu=0;time=millis();w1=1;delay(300);lcd.clear();}
   if (newPosition != oldPosition&&spek==1) {oldPosition = newPosition;menu=0,www1=0;spek=0;w1=1;time=millis();lcd.clear();}
 
    if(spek==0){
      if(www1==0){byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
                  byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000};
                  lcd.createChar(0,a1); lcd.createChar(1,a2); www1=1; }
 
   ///////////////////////// громкость /////////////////////////////
   if(menu==0){
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol=vol+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(vol>63){vol=63;}if(vol<16){vol=16;}}
 
  lcd.setCursor(0,0);lcd.print("Volume    ");
  vol_d=vol*2-120;
   if(vol_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(vol_d>-10){{lcd.print(" ");}}
  lcd.print(abs(vol_d));lcd.print(" dB   ");
 // ползунок громкости начинает работать с -56 дБ
   if(vol-32>0){for(z=0;z<=vol-33;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol-32)%2==0&&vol-32>=0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
  audio();
  }
   ///////////////////////// баланс /////////////////////////////
  if(menu==3){
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
 
  lcd.setCursor(0,0);
   if(balans*2>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(balans*2>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans*2));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);}
  audio();
}
  ///////////////////////// тембр нч /////////////////////////////
  if(menu==1){
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(bass>11){bass=11;}if(bass<2){bass=2;}}
 
  lcd.setCursor(0,0);lcd.print("Bass      ");
  bass_d=bass*3-18;
   if(bass_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}}
  lcd.print(abs(bass_d));lcd.print(" dB   ");
   if(bass>1){for(z=3;z<=bass+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
  audio();
 }
   ///////////////////////// тембр вч /////////////////////////////
  if(menu==2){
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(treb>11){treb=11;}if(treb<2){treb=2;}}
 
   if(treb>10){treb=10;}if(treb<2||treb==255){treb=2;}
  lcd.setCursor(0,0);lcd.print("Treble    ");
  treb_d=treb*3-18;
   if(treb_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}}
  lcd.print(abs(treb_d));lcd.print(" dB   ");
   if(treb>1){for(z=3;z<=treb+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
  audio();
 }
  ///////////////////////// input /////////////////////////////
  if(menu==4){
if (newPosition != oldPosition) {
    oldPosition = newPosition;
    in=in+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(in>1){in=0;}if(in<0){in=1;}}
 
  lcd.setCursor(0,0);lcd.print("Source selector");
  lcd.setCursor(0,1);lcd.print("Input: ");lcd.print(in);
  audio();
 }
///////////////////////////////////////////////////////////
 
  ///////////////////////// spectrum analyzer /////////////////////////////
  if(menu==5){  
    if(digitalRead(9)==HIGH){sp++;myEnc.write(0);oldPosition  = -999;delay(300);time=millis();if(sp>6){sp=0;}}
     lcd.setCursor(0,0);lcd.print("Spectrum analyzer");
if (newPosition != oldPosition) {
    oldPosition = newPosition;
    switch(sp){ w1=0;
    case 0: AUTO_GAIN=AUTO_GAIN+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(AUTO_GAIN>1){AUTO_GAIN=0;}if(AUTO_GAIN<0){AUTO_GAIN=1;};
    lcd.setCursor(0,1);lcd.print("AUTO_GAIN ");lcd.print(AUTO_GAIN);break;
    case 1: VOL_THR=VOL_THR+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(VOL_THR>100){VOL_THR=100;}if(VOL_THR<10){VOL_THR=10;};
    lcd.setCursor(0,1);lcd.print("VOL_THR ");lcd.print(VOL_THR);break;
    case 2: LOW_PASS=LOW_PASS+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(LOW_PASS>100){LOW_PASS=100;}if(LOW_PASS<10){LOW_PASS=10;};
    lcd.setCursor(0,1);lcd.print("LOW_PASS ");lcd.print(LOW_PASS);break;
    case 3: DEF_GAIN=DEF_GAIN+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(DEF_GAIN>200){DEF_GAIN=200;}if(DEF_GAIN<30){DEF_GAIN=30;};
    lcd.setCursor(0,1);lcd.print("DEF_GAIN ");lcd.print(DEF_GAIN);break;
    case 4: k_us=k_us+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(k_us>15){k_us=15;}if(k_us<5){k_us=5;}; k_usil=k_us;k_usil=k_usil*0.1;
    lcd.setCursor(0,1);lcd.print("GRAPH_ATT ");lcd.print(k_usil,1);break;
    case 5: graf=graf+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(graf>4){graf=4;}if(graf<0){graf=0;};
    lcd.setCursor(0,1);lcd.print("GRAPHICS ");lcd.print(graf);break;
    case 6: sped=sped+newPosition;w2=0;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(sped>5){sped=5;}if(sped<0){sped=0;};
    lcd.setCursor(0,1);lcd.print("Conv. speed ");lcd.print(sped);break;
 
  }}}
 /////////////////////////////////////////////////////////////////////////
    }// spek = 0
  if(w2==0){
    switch(sped){
      case 0: ADCSRA = 0b11110010;break;
      case 1: ADCSRA = 0b11110011;break;
      case 2: ADCSRA = 0b11110100;break;
      case 3: ADCSRA = 0b11110101;break;
      case 4: ADCSRA = 0b11110110;break;
      case 5: ADCSRA = 0b11110111;break;
    }w2=1;}
 
////////////////// mute //////////////////////////////////
   if(digitalRead(9)==HIGH&&menu!=5){mute++;if(mute>1){mute=0;}
   if(mute==1){menu=-1;w1=0;spek=0;www1=0;}else{oldPosition  = -999;menu=0;}
  audio();delay(300);lcd.clear();
  lcd.setCursor(6,0);lcd.print("MUTE");
 }
///////////////////////////////////////////////////////////
 
///////////////////  -20 dB ///////////////////////////////
 if(digitalRead(8)==HIGH&&db==0){vol=vol-10;db=1;delay(500);audio();myEnc.write(0);menu=0;lcd.clear();}
 if(digitalRead(8)==HIGH&&db==1){vol=vol+10;db=0;delay(500);audio();myEnc.write(0);menu=0;lcd.clear();}
//////////////////////////////////////////////////////////
 
 
   if(millis()-time>10000 && w1==1){// сохранение всех настроек в eeprom через 60 сек неактивности
     //myEnc.write(0);
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass);
     EEPROM.update(2,treb);
     EEPROM.update(3,in);
     EEPROM.update(5,AUTO_GAIN);
     EEPROM.update(6,VOL_THR);
     EEPROM.update(7,LOW_PASS);
     EEPROM.update(8,DEF_GAIN);
     EEPROM.update(9,graf);
     EEPROM.update(10,k_us);
     EEPROM.update(11,sped);
     w1=0;menu=0;lcd.clear();spek=1;www=1; sp=0;}
 
 }// loop
 
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);  }
 
void analyzeAudio() {  
   cli(); 
 while( i < FHT_N ) {  i++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i] = (ADCL|ADCH << 8); 
    }i=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();
}