26

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

Ну да. Согласен.
Вот главное: Пульт. тоже самое: 

После регулировки громкости  пультом, программа начинает реагировать на любые последующие команды  0xFFFFFFFF, в том числе конечно и от других пультов (например от телевизора). То есть если я нажимал на громкость  +, то нажатие любой другой не запрограммированной кнопки вызывает повтор действия, и громкость опять увеличится, пока на ir не поступит код который занесён в программу.

У меня тоже самое было в версии 2.0. Можете нам подправить не мне уже одному ?

27

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

Я код уже поправил, обновите прошивку, у меня сейчас нормально работает, на другие кнопки после прибавления громкости не реагирует.

28

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

Вся правка состоит из одной строки:
if(ir.value==0){gr1=0;gr2=0;}

Как только перестаете удерживать кнопку (FFFFFFFF), следует код 0х0, после него идет запрет на код FFFFFFF, соотведственно на другие не обозначенные кнопки аудиопроцессор не реагирует.

29

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

Понял. Благодарю. Завтра уже буду "гонять по полной".

30

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

1. Не разберусь с пультом: Нет кодов в мониторе порта и естественно не реагирует.  Загружаю  проверочный код из примеров (IRremote: IRrecvDemo)- коды есть.
Загружал  предыдущие TDA7313 v2.0 - нет скетча в мониторе порта (хотя работало). Pin 12 указываю естественно.
  2. С анализатором: работает (регулировал строчки  #define VOL_THR 35;  #define LOW_PASS 30;  #define DEF_GAIN 80; - когда поработает 2-3 минуты  - затухает (просто внизу чёрточки). Какая у него закономерность 16 уровней - по частоте или ... (не разобрал) ?
3.  Регулировка звука:  уменьшаем до -60 дБ - остается 1 риска. Затем риска исчезает - звук на выходе есть. Регулятор крутим вниз - звук уменьшается до минимума, но индикации нет.

31

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

1. Установите скорость в мониторе порта 9600
2. Здесь я не понял - 2-3 минуты работает а  потом нет?
3. Так было задумано, 1 дБ  1 черточка, экран 16 символов по три черточки на символ, на весь диапазон не хватает

32

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

С пультом: скорость 9600 установлена. В скетчах из примеров код идет (много версий:  просто просмотр,установка уровней и т.д.),  предыдущие TDA7313 v2.0 и v. 2.2 не  работает. Не хрена не пойму в чем дело.
Анализатор работает 1-2 минуты, затем просто внизу чёрточки и не реагирует (подключил как я хотел). Пойду перепаяю на вывод 7 (17).

33

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

У меня в мониторе порта при нажатии на кнопки пульта коды отображаются. Возможно нехватка памяти:
#define FHT_N 256          // ширина спектра х2
поменять на
#define FHT_N 128          // ширина спектра х2

#define VOL_THR 35        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 30       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 120       // максимальный порог по умолчанию

увеличьте разницу между VOL_THR и DEF_GAIN
VOL_THR всегда чуть больше LOW_PASS

34

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

Анализатор работает отлично при  #define DEF_GAIN 150 -170.  Отличие #define FHT_N 256  или 128 не определил, только объем занимаемой памяти  уменьшается.
С пультом буду разбираться в V.2.0 (в ней работал пульт точно).

35

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

Никак не удается возобновить работу ик пульта.  В какой версии IDE вы компилируете скетч ?  В 1,8,5 и 1,8,10 не получается у меня.

36

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

Тестовый скетч проверки ИК пульта

#include <IRremote.h>
#include <boarddefs.h>
  IRrecv irrecv(10); // указываем вывод модуля IR приемника
  decode_results ir;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // запускаем модуль IR

}

void loop() {
if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();}
delay(200);

}

37

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

Проверьте версии библиотек, возможно IRremote скачана со стороннего ресурса, эта библиотека изменена, скачайте ее с форума.

http://rcl-radio.ru/wp-content/uploads/ … remote.zip

38

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

Это тестовый скетч работает.http://forum.rcl-radio.ru/uploads/images/2019/11/5102dbbe1511dfe9eea0ebfcf1a4ec9e.jpg

39

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

Он и будет работать, ИК датчик и энкодер используют один и тот же таймер, я поправил библиотеку boarddefs.h чтобы энкодер и ИК пульт не конфликтовали.

Удалите библиотеку ИК пульта и установите - http://rcl-radio.ru/wp-content/uploads/ … remote.zip

40 (2019-11-02 01:37:04 отредактировано andrys)

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

Вce пошло. Удалил библиотеки <IRremote.h> так что была ошибка компиляции. Затем добавил заново скачанную с форума и все заработало. Спасибо.

41

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

Пользуюсь проектом, все работает.  Возможно ли добавить на  PIN 9 (поддерживает  ШИМ) следующий алгоритм? При регу-лировках уровней (энкодер, пульт) экран включается на 100%, через 5-10 сек светиться на 40-60 %. Аппаратно все выполнено.
И ещё:  В анализаторе "Добавлено 5 режимов отображения полос, управление кнопкой D12 (10 К на GND, управление +5 В). Сигнал подается на вход А0 через разделительный конденсатор 0,1 мкФ." - это в этом скетче учтено ? И что за 5 режимов ? Если можно поясните и добавьте. Спасибо.

42

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

Если вы имеете в виду статью просто анализатор спектра с 5-ю режимами, то там просто меняется отображение полосок, что касается входа А0 , то это оговаривается настройками регистров:
  ADMUX  = 0b01100000; ADCSRA = 0b11010100;

С ШИМ возможно не получится, ИК датчик и энкодер используют таймер который конфликтует с ШИМ.

Но можно проверить, в Ваш скетч в setup вставьте:

pinMode(9,OUTPUT);
analogWrite(9,127);

на выходе 9 должен быть меандр с частотой 500 Гц, если есть то то тогда можно сделать ШИМ подсветку.

43

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

Добавлю, правильно  ? В итоге только  заставка "TDA7313 v. 2.2" - больше ничего не работает.http://forum.rcl-radio.ru/uploads/images/2019/12/f289ddfaccac2a26c15e12f89a49a48c.jpg

44

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

Значит ШИМ работать не будет.

45

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

Я в нужное место вставил строчки для проверки ШИМ ?

46

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

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

47

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

Тогда с этим проектом закончено. Спасибо за поддержку.

48

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

Возможно ли добавить скетч следующей функцией:  Подключить к выводу 9 датчик температуры 18B20 с выводом значения на экран (может в меню 1) и как вариант при достижении температуры +45 С предел громкости до -30дБ, а при снижении до +40 С как было ранее.

49

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

С датчиком 18b20 могут возникнут много сложностей, время измерения температуры может достигнуть 1 сек в зависимости от битности. Возникнет задержка, во время ее экран и органы управления будут не доступны.
Надо либо мерить температуру редко и не вовремя регулировки параметров (громк, тембр и тд), а так же понизить битность датчика температуры до 9 Бит.

50 (2020-01-27 17:00:42 отредактировано roline)

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

Подогнал скетч v2.1(теперь v3.0) под экран 2004.
что поменял:
весь текст загнал в рамку
разные режимы анализатора спектра по кнопке
pinMode(10,INPUT);// КНОПКА ЭНКОДЕРA
pinMode(12,INPUT);// КНОПКА IN
pinMode(13,INPUT);// КНОПКА РЕЖИМОВ АНАЛИЗАТОРА
IRrecv irrecv(11); // указываем вывод модуля IR приемника
Анализатор спектра висит на А0

#define AUTO_GAIN 1       // автонастройка по громкости
#define VOL_THR 35        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 30        // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 80       // максимальный порог по умолчанию 
#define FHT_N 128          // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h>    
#include <Wire.h>
#include <MsTimer2.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <EEPROM.h>
#include <TDA7313.h>
#include <boarddefs.h>
#include <IRremote.h>
  IRrecv irrecv(11); // указываем вывод модуля IR приемника
  TDA7313 tda;decode_results ir;
  Encoder myEnc(9, 8);//CLK, DT подключение энкодера
  LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 подключение LCD
  byte posOffset[20] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 40}; // вч выше
 // byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 20, 25, 30, 35, 60, 80, 100};// вч ниже
   unsigned long newPosition,time,time1,oldPosition  = -999;
   int vol,w1,w2=1,gr1,gr2,vol_d,menu,w,z,z0,z1,bass_d,bass,treb_d,treb,i,menu1,in,gain,gain1,gain2,gain3,loud,lr,rr,lf,rf; 
   unsigned long gainTimer;
   byte maxValue, maxValue_f,spek;
   float k = 0.1;
   byte gain_sp = DEF_GAIN;  
   int i1,yyy;
   int ek;

void setup(){ 
  Serial.begin(9600);Wire.begin();irrecv.enableIRIn(); // запускаем модуль IR
  lcd.begin(20, 4);
   pinMode(10,INPUT);// КНОПКА ЭНКОДЕРA
   pinMode(12,INPUT);// КНОПКА IN
   pinMode(13,INPUT);
     ADMUX  = 0b01100000; ADCSRA = 0b11010100;
     MsTimer2::set(3, to_Timer);MsTimer2::start();
     vol = EEPROM.read(0);
     bass = EEPROM.read(1)-7
     ;treb = EEPROM.read(2)-7;
     in = EEPROM.read(3);
     gain1 = EEPROM.read(4);
     gain2 = EEPROM.read(5);
     gain3 = EEPROM.read(6);
     loud = EEPROM.read(7);
     lr = EEPROM.read(8);
     rr = EEPROM.read(9);
     lf = EEPROM.read(10);
     rf = EEPROM.read(11);
     ek = EEPROM.read(12);
      if(in==0){gain=gain1;}
      if(in==1){gain=gain2;}
      if(in==2){gain=gain3;}
      lcd.setCursor(0,0);lcd.print("    TDA7313    ");
      lcd.setCursor(0,1);lcd.print("      V3.0      ");
      delay(1000);lcd.clear();audio();
}
 
void to_Timer(){newPosition = myEnc.read()/4;}
 
void loop(){
  if(digitalRead(13)==HIGH){ek++;time=millis();w=1;delay(300);if(ek>5){ek=0;}}
    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{
             if(ek==0){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 4};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 4, 4};
      byte v3[8] = {0, 0, 0, 0, 0, 4, 4, 4};
      byte v4[8] = {0, 0, 0, 0, 4, 4, 4, 4};
      byte v5[8] = {0, 0, 0, 4, 4, 4, 4, 4};
      byte v6[8] = {0, 0, 4, 4, 4, 4, 4, 4};
      byte v7[8] = {0, 4, 4, 4, 4, 4, 4, 4};
      byte v8[8] = {4, 4, 4, 4, 4, 4, 4, 4};
      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(ek==1){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 14};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 14, 14};
      byte v3[8] = {0, 0, 0, 0, 0, 14, 14, 14};
      byte v4[8] = {0, 0, 0, 0, 14, 14, 14, 14};
      byte v5[8] = {0, 0, 0, 14, 14, 14, 14, 14};
      byte v6[8] = {0, 0, 14, 14, 14, 14, 14, 14};
      byte v7[8] = {0, 14, 14, 14, 14, 14, 14, 14};
      byte v8[8] = {14, 14, 14, 14, 14, 14, 14, 14};
      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(ek==2){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 10};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 10, 10};
      byte v3[8] = {0, 0, 0, 0, 0, 10, 10, 10};
      byte v4[8] = {0, 0, 0, 0, 10, 10, 10, 10};
      byte v5[8] = {0, 0, 0, 10, 10, 10, 10, 10};
      byte v6[8] = {0, 0, 10, 10, 10, 10, 10, 10};
      byte v7[8] = {0, 10, 10, 10, 10, 10, 10, 10};
      byte v8[8] = {10, 10, 10, 10, 10, 10, 10, 10};
      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(ek==3){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 27};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 27, 27};
      byte v3[8] = {0, 0, 0, 0, 0, 27, 27, 27};
      byte v4[8] = {0, 0, 0, 0, 27, 27, 27, 27};
      byte v5[8] = {0, 0, 0, 27, 27, 27, 27, 27};
      byte v6[8] = {0, 0, 27, 27, 27, 27, 27, 27};
      byte v7[8] = {0, 27, 27, 27, 27, 27, 27, 27};
      byte v8[8] = {27, 27, 27, 27, 27, 27, 27, 27};
      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(ek==4){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 31};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 31, 31};
      byte v3[8] = {0, 0, 0, 0, 0, 31, 31, 31};
      byte v4[8] = {0, 0, 0, 0, 31, 31, 31, 31};
      byte v5[8] = {0, 0, 0, 31, 31, 31, 31, 31};
      byte v6[8] = {0, 0, 31, 31, 31, 31, 31, 31};
      byte v7[8] = {0, 31, 31, 31, 31, 31, 31, 31};
      byte v8[8] = {31, 31, 31, 31, 31, 31, 31, 31};
      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(ek==5){
      byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 21};
      byte v2[8] = {0, 0, 0, 0, 0, 0, 21, 21};
      byte v3[8] = {0, 0, 0, 0, 0, 21, 21, 21};
      byte v4[8] = {0, 0, 0, 0, 21, 21, 21, 21};
      byte v5[8] = {0, 0, 0, 21, 21, 21, 21, 21};
      byte v6[8] = {0, 0, 21, 21, 21, 21, 21, 21};
      byte v7[8] = {0, 21, 21, 21, 21, 21, 21, 21};
      byte v8[8] = {21, 21, 21, 21, 21, 21, 21, 21};
      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 ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);time1=millis();time=millis();w=1;w1=1;if(spek==1){menu=0;cl();};irrecv.resume();}// IR приемник
  if((digitalRead(10)==LOW)&&menu1==0){menu++;cl();myEnc.write(0);i++;time=millis();w=1;w2=1;if(menu>2){menu=0;}}// меню
  if((digitalRead(10)==HIGH)){i=0;}if(i>3){cl();lcd.setCursor(5,1);lcd.print("*SETTINGS*");delay(500);cl();menu1=1;menu=100;}
  if((digitalRead(10)==LOW)&&menu1>0){menu1++;cl();myEnc.write(0);time=millis();w=1;w2=1;if(menu1>6){cl();menu1=0;menu=0;}}// меню 1
  
     if(ir.value==0x2FDD02F){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu>2){menu=0;}}// меню кнопка вверх
     if(ir.value==0x2FD32CD){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu<0){menu=2;}}// меню кнопка вниз
     
     if(ir.value==0x2FDEA15){in++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(in>2){in=0;}audio();lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);delay(1000);}//  кнопка IN
     
  //////////////////////////////////////// Volume 0...63 дБ //////////////////////////////////////
 if(menu==0){
     if(ir.value==0x2FD906F){vol++;gr1=1;gr2=0;cl1();w2=1;if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();w2=1;if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){vol--;gr1=0;gr2=1;cl1();w2=1;if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();w2=1;if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка <<<<<<
   
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol>63){vol=63;}if(vol<0){vol=0;}audio();}
 
  lcd.setCursor(2,1);lcd.print("Volume ");
  lcd.setCursor(9,1);lcd.print(-78.75+(float)vol*1.25,2);lcd.print(" ");lcd.setCursor(16,1);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+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;}
    {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("|");
    }
   }
//////////////////////////////////////////////////////////////////////////////////////////////////////
 
 /////////////////////// индикация тембр НЧ -14...14 дБ ///////////////////
   if(menu==1){ 
     if(ir.value==0x2FD906F){bass++;gr1=1;gr2=0;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){bass--;gr1=0;gr2=1;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка <<<<<<
   
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();} 
   lcd.setCursor(3,1);lcd.print("Bass   ");
   lcd.setCursor(10,1);lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(15,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;}
   {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("|");
    }
   }
/////////////////////////////////////////////////////////////////////////////////////
 
 /////////////////////// индикация тембр ВЧ -14...14 дБ ///////////////////
   if(menu==2){
 if(ir.value==0x2FD906F){treb++;gr1=1;gr2=0;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){treb--;gr1=0;gr2=1;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка <<<<<<
   
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();} 
   lcd.setCursor(3,1);lcd.print("Treble ");
   lcd.setCursor(10,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;}
   {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("|");
    }
   }
/////////////////////////////////////////////////////////////////////////////////////
 
  if(digitalRead(12)==HIGH){in++;cl();myEnc.write(0);time=millis();w=1;w2=1;if(in>2){in=0;}if(in<0){in=2;}audio();lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);delay(1000);if(menu<100){menu=0;}}
 
///////////////////////////////////// GAIN //////////////////////////////////////////
 
 if(menu1==1){
      if(in==0){gain=gain1;}
      if(in==1){gain=gain2;}
      if(in==2){gain=gain3;}
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;w2=1;if(gain>3){gain=3;}if(gain<0){gain=0;}audio();} 
 
      if(in==0){gain1=gain;}
      if(in==1){gain2=gain;}
      if(in==2){gain3=gain;}
    
  lcd.setCursor(4,1);lcd.print("INPUT CH.  ");lcd.print(in+1);
  lcd.setCursor(3,2);lcd.print("Gain  ");lcd.print((float)gain*3.75);lcd.setCursor(14,2);lcd.print(" dB ");
 {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("|");
    }
 }
 /////////////////////////////// LOUDNESS //////////////////////////////////////////
 
  if(menu1==2){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    loud=loud+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;w2=1;if(loud>1){loud=0;}if(loud<0){loud=1;}audio();}
    lcd.setCursor(4,1);lcd.print("LOUDNESS ");if(loud==1){lcd.print("ON ");}else{lcd.print("OFF");}
    {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("|");
    }
} 
////////////////////////////////// att  LR //////////////////////////////////////////////
 
  if(menu1==3){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lr=lr-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lr>31){lr=31;}if(lr<0){lr=0;}audio();} 
    lcd.setCursor(2,1);lcd.print("Speaker   ");lcd.print((float)-lr*1.25,2);lcd.print("  ");
    lcd.setCursor(2,2);lcd.print("LR");lcd.setCursor(16,2);lcd.print("dB");
     if(w2==1){
   for(z=0,z0=0,z1=0;z<=-lr+31;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;}
   {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("|");
    }
   }
 ////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////// att  LF //////////////////////////////////////////////
 
   if(menu1==4){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lf=lf-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lf>31){lf=31;}if(lf<0){lf=0;}audio();} 
    lcd.setCursor(2,1);lcd.print("Speaker   ");lcd.print((float)-lf*1.25,2);lcd.print("  ");
    lcd.setCursor(2,2);lcd.print("LF");lcd.setCursor(16,2);lcd.print("dB");
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=-lf+31;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;}
   {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("|");
    }
   }
 ////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////// att  RF //////////////////////////////////////////////
 
   if(menu1==5){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    rf=rf-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(rf>31){rf=31;}if(rf<0){rf=0;}audio();} 
    lcd.setCursor(2,1);lcd.print("Speaker   ");lcd.print((float)-rf*1.25,2);lcd.print("  ");
    lcd.setCursor(2,2);lcd.print("RF");lcd.setCursor(16,2);lcd.print("dB");
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=-rf+31;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;}
   {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("|");
    }}
 ////////////////////////////////////////////////////////////////////////////////////////
   ////////////////////////////////// att  RR //////////////////////////////////////////////
 
   if(menu1==6){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    rr=rr-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(rr>31){rr=31;}if(rr<0){rr=0;}audio();} 
    lcd.setCursor(2,1);lcd.print("Speaker   ");lcd.print((float)-rr*1.25,2);lcd.print(" ");
    lcd.setCursor(2,2);lcd.print("RR");lcd.setCursor(16,2);lcd.print("dB");
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=-rr+31;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;}
   {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("|");
    }
   }
 ////////////////////////////////////////////////////////////////////////////////////////
 
 
 if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol);
     EEPROM.update(1,bass+7);
     EEPROM.update(2,treb+7);
     EEPROM.update(3,in);
     EEPROM.update(4,gain1);EEPROM.update(5,gain2);EEPROM.update(6,gain3);
     EEPROM.update(7,loud);
     EEPROM.update(8,lr)
     ;EEPROM.update(9,rr);
     EEPROM.update(10,lf);
     EEPROM.update(11,rf);
     EEPROM.update(12,ek);
     menu1=0;lcd.clear();w=0,w2=1;menu=100;spek=1;}
//////////////////////////////////////////////////////////

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

      for (int pos = 0; pos < 20; pos++) {  
        if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];
        
        
        
        int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 31);
        posLevel = constrain(posLevel, 0, 31);

   if(posLevel<7){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 2);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)posLevel);}
   
   if(posLevel>7&&posLevel<15){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 1);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);lcd.setCursor(pos, 2);lcd.write((uint8_t)posLevel-8);}

   if(posLevel>15&&posLevel<23){
    lcd.setCursor(pos, 0);lcd.print(" ");
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);lcd.setCursor(pos, 1);lcd.write((uint8_t)posLevel-16);}    

   if(posLevel>23&&posLevel<31){
    lcd.setCursor(pos, 3);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 2);lcd.write((uint8_t)7);
    lcd.setCursor(pos, 1);lcd.write((uint8_t)7);lcd.setCursor(pos, 0);lcd.write((uint8_t)posLevel-24);}           
      }

  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;}
  }
  //////////////////////////////////
}
 
 void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
 void cl1(){ir.value=0;delay(100);spek=0;}
 void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(lr);   // аттенюатор LR 0...31
  tda.setAttRR(rr);   // аттенюатор RR 0...31
  tda.setAttLF(lf);   // аттенюатор LF 0...31
  tda.setAttRF(rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(bass);    // тембр НЧ -7...+7
  tda.setTreble(treb);  // тембр ВЧ -7...+7
}
void analyzeAudio() { 
 while(i1 < FHT_N){i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);fht_input[i1] = (ADCL|ADCH << 8);}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
}

Вдруг кому пригодится)))

выглядит сие примерно так
http://forum.rcl-radio.ru/uploads/images/2020/01/fcc6c74333b90a48ea9f1251ee136b63.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/5940031e2942985bd686db92ce254390.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/233321d50c1a634814d2f32233f64476.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/3bc8328e8d41d0672bc2de2f8f33a25f.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/614a25590baa37a42bdb00fa1a734e40.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/db8139f01d3f3b76415f158f8a0b56dd.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/582962d46e351fb3c35a09b4ce0df2b3.jpg
http://forum.rcl-radio.ru/uploads/images/2020/01/97dcfbd5a48b19108be32a0dd3624772.jpg