151

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

Здравствуйте, liman324! Режим MUTE я так или иначе допилил как хотел, с помощью Всевышнего. Но есть еще одна проблемка, до которой дошел черёд: изначально присутствует постоянный шум на 17 ноге TDA 7419 при работе ардуинки, на частоте ок. 15 кГц. Различимы изменение тона шума при выполнении разных операций ардуиной. На других выходах всё чисто. На прошивке из предыдущей ветки http://rcl-radio.ru/?p=57700 (версия без спектроанализ-ра) шума нет. Печатку проверял, промывал. Подключение TDA стандартное- по даташиту. Что может быть причиной шума и как его устранить?

152

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

Александр?!

153

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

Причин шума может быть много, может шуметь шина i2c , попробуйте изменить частоту шины i2C, поставьте:

Wire.setClock(100000L);  // максимум Wire.setClock(400000L); 

перед:

Wire.begin();

Поменяйте частоту от 100000 до 400000 , возможно это поможет.

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

154

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

Спасибо за ответ. Пробовал изменять частоту шины, ничего не меняется, да и шум лакализован только в одном канале, остальные каналы чистые. С первого взгляда - похоже на дефект аудиопроцессора, но почему тогда на другой прошивке (вар. без спектроанализатора) шум отсутствует, не понятно.
Не может такого быть, что в первом варианте используется пакетная передача данных (т.е пакет передан, шина замолчала до следующего пакета данных), а во втором варианте шина тактируется и данные передаются постоянно?
"Для анализатора спектра не рекомендуют использовать подключение экрана через i2c, только параллельное параллельное подключение." - пробовал физически отключать дисплейный модуль от ардуины, шум такой же.

155

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

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

Это не поможет, шина все равно будет постоянно передавать данные

156

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

liman324 пишет:

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

Это не поможет, шина все равно будет постоянно передавать данные

Да хз, тут, как вы сказали, причин может быть много. Нужно все проверять, в т.ч. и дисплей с его модулем i2с.

157

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

Александр, здравствуйте!
Изменение частоты шины эффекта не возымело. А у Вас тоже есть шум в канале аудио? Почитал форумы в интернете, пишут, что это особенность ардуинки шуметь через шину i2c. И возникла идея, что если активировать шину не в постоянном режиме. а временно, в только момент передачи информации, т.с. только при нажатии каких либо кнопок. Что думаете по этому поводу?
PS:  Вы извините, что одолеваю Вас своими сообщениями, просто создавать что то подобное с высоким качеством звучания одолевает меня уже лет тридцать, наверное, а тут еще и на основе цифровой техники, вот и загорелся, и хочу довести это дело до конца.

158

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

Запустите аудиопроцессор с ардуино, отключите питание только с ардуино, аудиопроцессор должен продолжать работать, проверьте шум. Если шум не исчезнет, значить аудиопроцессор неисправен, если исчезнет, то можно подумать что дальше делать.

159

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

Попробую еще заменить TDA7419, может он сам по себе с браком и пробивает ВЧ с шины в канал аудио. Вот плата АП и схема.http://forum.rcl-radio.ru/uploads/images/2022/05/9bc691ff53aba1a5d153f0de960c7c5f.jpg http://forum.rcl-radio.ru/uploads/images/2022/05/6ea431b9d6aa8b477b7a81575d245752.jpg Может в них какой косяк?

160

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

Александр, здравствуйте! Спасибо за ответ!
Может кому то пригодится данная информация, докладываю о результатах:
Удалось частично снизить шум. Причин было две:
первая - дорожки шины i2c под корпусом TDA7419 - обвёл линию i2c за корпусом процессора, дорожки, идущие к выводам 23, 22, 21 разорвал под А/П и соединил с "-". наводки существенно снизились.
и вторая - шумел подключенный ко входу аудиопроцессора блютус модуль. Вероятно в следствии образования земляной петли по питанию от одного источника. - решилось добавлением дополнительного емкостно-индуктивного фильтра по питанию BT модуля, состоящий из малогабаритного дросселя из фильтра питания импульсного БП, с двумя обмотками и электролита на 2200мкф. в параллель.
В данный момент на громкости, близкой к максимальной, высокочастотные писки в диапазоне 8-15 кГц отсутствуют, остался только небольшой шум на макс громкости. Но тут, я так понял, шумит сам А/процессор, поскольку при отключении питания Ардуины и BT шум остается.
Вопрос: имеется ли в данном А/процессоре функция шумопонижения?

PS: темы http://rcl-radio.ru/?p=57700 уже не существует?

161

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

Вопрос: имеется ли в данном А/процессоре функция шумопонижения?

PS: темы https://rcl-radio.ru/?p=57700 уже не существует?

Шумопонижения в аудипроцессоре нет

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

162

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

Спасибо, а то я этой веткой тоже руководствуюсь)

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

163

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

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

164

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

Опубликуйте скетч

165

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

#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 <TDA7419.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
  TDA7419 tda;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
  LiquidCrystal_I2C lcd(0x27,16,2);// A4,A5
  byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
  boolean  w,w2,www,mute=1,gr1,gr2;
  byte z,z0,z1,gain1,gain2,gain3,gain_d,rf,lf,rt,lt,sab, in_d,lon_f,lon_d,vol_d, bass_d,treb_d,middle_d;
  int menu,vol,bass,treb,middle,in,gain0;
  int lon,out,vol_out,treb_c,mid_c,bas_c,sab_f;
  unsigned long time,oldPosition  = -999,newPosition;
  unsigned long gainTimer;
  byte maxValue, maxValue_f,spek;
  float k = 0.1;
  byte gain_sp = DEF_GAIN; 
  byte i1,yyy;
 
 
void setup(){ Serial.begin(9600);Wire.begin(); lcd.begin(16, 2);irrecv.enableIRIn(); // запускаем модуль IR
     lcd.setCursor(0,0);lcd.print("    TDA7419    ");delay(1000);// ЗАСТАВКА
     pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
     pinMode(11,INPUT);// ВЫБОР ВХОДА КНОПКА IN
     pinMode(13,INPUT);// КНОПКА SET
     ADMUX  = 0b01100000; ADCSRA = 0b11010100; // http://rcl-radio.ru/?p=57478
     MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
  /// считываем все настройки с памяти при включении
   vol = EEPROM.read(0);treb = EEPROM.read(1)-15;middle = EEPROM.read(3)-15;bass = EEPROM.read(3)-15;
   in = EEPROM.read(4);gain1 = EEPROM.read(5);gain2 = EEPROM.read(6);gain3 = EEPROM.read(7);
   lon = EEPROM.read(8);lon_f = EEPROM.read(9);rf = EEPROM.read(10);lf = EEPROM.read(11);
   rt = EEPROM.read(12);lt = EEPROM.read(13);sab = EEPROM.read(14);treb_c = EEPROM.read(15);
   mid_c = EEPROM.read(16);bas_c = EEPROM.read(17);sab_f = EEPROM.read(18);
   switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
   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, 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(digitalRead(10)==LOW){menu++;cl();time=millis();w=1;w2=1;www=1;if(menu>4){menu=0;}}// меню
  if(digitalRead(11)==HIGH&&menu<5){in++;;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
  if(digitalRead(13)==HIGH&&menu<5){menu=5;cl();time=millis();w=1;w2=1;}// меню 2 включение меню 2
  if(digitalRead(13)==HIGH&&menu>=5){menu++;cl();time=millis();w=1;w2=1;if(menu>11){menu=0;}}// перебор меню 2 и выход в меню громкости

   ////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  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&&menu<5){in++;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};gr1=0;gr2=0;audio();}// IN
/////////////////////////////// VOLUME -80 ... 0 дБ ////////////////////////////////////////////////
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(0,0);lcd.print("Volume  ");
     lcd.print(" ");lcd.print(-80+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-32;
   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;}}

///////////////////////// TREBLE +/-15 dB /////////////////////////////////////////////////////////
   if(menu==1){
     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(0,0);lcd.print("Treble  ");
   lcd.print(" ");lcd.print(treb);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////////// MIDDLE +/-15 dB ////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==0x2FD906F){middle++;gr1=1;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){middle++;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){middle--;gr1=0;gr2=1;cl();w2=1;middle_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){middle--;gr1=0;cl();w2=1;middle_func();audio();}// кнопка <<<<<<
   
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    middle=middle+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;middle_func();audio();}
   lcd.setCursor(0,0);lcd.print("Middle  ");
   lcd.print(" ");lcd.print(middle);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");middle_d=middle+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=middle_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////// BASS +/-15 dB ///////////////////////////////////////////////////////////
   if(menu==3){
     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(0,0);lcd.print("Bass    ");
   lcd.print(" ");lcd.print(bass);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
   
//////////////// IN + GAIN /////////////////////////////////////////////////////////////
   if(menu==4){
       switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
     if(ir.value==0x2FD906F){gain0++;gr1=1;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){gain0--;gr1=0;gr2=1;cl();w2=1;gain_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl();w2=1;gain_func();audio();}// кнопка <<<<<<

    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();}
   switch(in){
     case 1: gain1 = gain0;break;
     case 2: gain2 = gain0;break;
     case 3: gain3 = gain0;break;
     }
    if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print("Gain IN ");lcd.print(in);
      lcd.setCursor(10,0);lcd.print(" ");lcd.print(gain0);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");gain_d=gain0*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=gain_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}}w2=0;}

////////////////////////////// loudness ////////////////////////////////////////////////////
if(menu==5){ 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lon_f=lon_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon_f>3){lon_f=0;}if(lon_f<0){lon_f=3;}audio();}

    lcd.setCursor(0,0);lcd.print("Loudness: ");
      switch(lon_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("400Hz ");break;
         case 2: lcd.print("800Hz ");break;
         case 3: lcd.print("2400Hz");break;}}

//////////////////////////// loudness Att ////////////////////////////////////////////////
if(menu==6){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      lon=lon+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon>15){lon=15;}if(lon<0){lon=0;}audio();}

   lcd.setCursor(0,0);lcd.print("Loud att");
   lcd.print(" ");lcd.print(-lon);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");lon_d=lon*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=lon_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

////////////////////////////////////////// out /////////////////////////////////////////////////
if(menu==7){ 
   if(digitalRead(11)==HIGH){out++;cl();www=1;w=1;if(out>4){out=0;}audio();} // перебор выходов кнопкой IN
       switch(out){
          case 0:vol_out=rf;break;
          case 1:vol_out=lf;break;
          case 2:vol_out=rt;break;
          case 3:vol_out=lt;break;
          case 4:vol_out=sab;break;
          }
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      vol_out=vol_out+newPosition;myEnc.write(0);newPosition=0;time=millis();www=1;w=1;w2=1;if(vol_out>15){vol_out=15;}if(vol_out<0){vol_out=0;}audio();}
     
   lcd.setCursor(0,0);lcd.print("Volume OUT");lcd.setCursor(0,1);
      switch(out){
   case 0:rf=vol_out;lcd.print("RF:  +");lcd.print(rf);break;
   case 1:lf=vol_out;lcd.print("LF:  +");lcd.print(lf);break;
   case 2:rt=vol_out;lcd.print("RT:  +");lcd.print(rt);break;
   case 3:lt=vol_out;lcd.print("LT:  +");lcd.print(lt);break;
   case 4:sab=vol_out;lcd.print("SUBW:  +");lcd.print(sab);break;
   }
    if(www==1){audio();www=0;}
  lcd.print(" dB      ");}
 
   /////////////////////////////////treble center//////////////////////////////////////////////////
if(menu==8){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      treb_c=treb_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(treb_c>3){treb_c=0;}if(treb_c<0){treb_c=3;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Treble Center ");
  lcd.setCursor(1,6);
    switch(treb_c){
      case 0: lcd.print("10.0 kHz");break;
      case 1: lcd.print("12.5 kHz");break;
      case 2: lcd.print("15.0 kHz");break;
      case 3: lcd.print("17.5 kHz");break;}} 
     
   /////////////////////////////////middle center//////////////////////////////////////////////////
if(menu==9){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      mid_c=mid_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(mid_c>3){mid_c=0;}if(mid_c<0){mid_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Middle Center ");
    lcd.setCursor(1,6);
      switch(mid_c){
        case 0: lcd.print("0.5 kHz");break;
        case 1: lcd.print("1.0 kHz");break;
        case 2: lcd.print("1.5 kHz");break;
        case 3: lcd.print("2.5 kHz");break;}}
       
////////////////////////////////////bass center///////////////////////////////////////////
if(menu==10){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      bas_c=bas_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(bas_c>3){bas_c=0;}if(bas_c<0){bas_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Bass Center ");
    lcd.setCursor(1,6);
      switch(bas_c){
         case 0: lcd.print("60 Hz ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("100 Hz");break;
         case 3: lcd.print("200 Hz");break;}}
         
//////////////////////////////////////subw////////////////////////////////////////////////
if(menu==11){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      sab_f=sab_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(sab_f>3){sab_f=0;}if(sab_f<0){sab_f=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Subwoofer Freq.");
    lcd.setCursor(1,6);
      switch(sab_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("120 Hz");break;
         case 3: lcd.print("160 Hz");break;}}
//////////////////////////////////////////////////////////////////////////////////////

Serial.println(time);

if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol);EEPROM.update(1,treb+15);EEPROM.update(2,middle+15);EEPROM.update(3,bass+15);
     EEPROM.update(4,in);EEPROM.update(5,gain1);EEPROM.update(6,gain2);EEPROM.update(7,gain3);
     EEPROM.update(8,lon);EEPROM.update(9,lon_f);
     EEPROM.update(10,rf);EEPROM.update(11,lf);EEPROM.update(12,rt);EEPROM.update(13,lt);
     EEPROM.update(14,sab);EEPROM.update(15,treb_c);EEPROM.update(16,mid_c);EEPROM.update(17,bas_c);
     EEPROM.update(18,sab_f);
     menu=100;lcd.clear();w=0;w2=1;cl();spek=1;}


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

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

    lcd.setCursor(pos, 0);

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

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

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

void gain_func(){if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}
void bass_func(){if(bass>15){bass=15;}if(bass<-15){bass=-15;}}
void middle_func(){if(middle>15){middle=15;}if(middle<-15){middle=-15;}}
void treb_func(){if(treb>15){treb=15;}if(treb<-15){treb=-15;}}
void vol_func(){if(vol<0){vol=0;}if(vol>80){vol=80;}}

void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}

void to_Timer(){newPosition = myEnc.read()/4;}

void audio(){
tda.setInput(in,gain0,0);    //вх1=1, вх2=2, вх3=3
tda.setInput2(0,0,0);   // не используется
tda.setAtt_loudness(lon,lon_f,0,0);
tda.setSoft(mute,0,0,0,0);//mute off (не менять)
tda.setVolume(vol-79,0);   // общая громкость от 0 до 79 макс
tda.setAtt_LF(64+lf,0);   // гром. лк фронт
tda.setAtt_RF(64+rf,0);   // гром. пк фронт
tda.setAtt_LT(64+lt,0);   // гром. лк тыл
tda.setAtt_RT(64+rt,0);   // гром. пк тыл
tda.setAtt_SUB(64+sab,0);  // гром. савбуфер
tda.setAtt_Mix(79,0);   // не использует
tda.setFilter_Treble(treb,treb_c,0);
tda.setFilter_Middle(middle,0,0);
tda.setFilter_Bass(bass,0,0);
tda.setSub_M_B(sab_f,mid_c,bas_c,0,0);
tda.setMix_Gain_Eff(1,0,0,0,0); // не используется
tda.setSpektor(0,0,1,0,1,0,0);
}

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();
}

166 (2022-07-11 17:01:34 отредактировано bobrusev11)

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

Ещё при регулировании горомкости заполняется экран черточками и зависает,в volume out только FR больше нет выходов

167

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

#include <Wire.h>
#include <TDA7419.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
  TDA7419 tda;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
  LiquidCrystal_I2C lcd(0x27,16,2);// A4,A5
  boolean  w,w2,www,mute=1,gr1,gr2;
  byte z,z0,z1,gain1,gain2,gain3,gain_d,rf,lf,rt,lt,sab, in_d,lon_f,lon_d,vol_d, bass_d,treb_d,middle_d;
  int menu,vol,bass,treb,middle,in,gain0;
  int lon,out,vol_out,treb_c,mid_c,bas_c,sab_f;
  unsigned long time,oldPosition  = -999,newPosition;
  unsigned long gainTimer;

      
      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};
 
 
void setup(){ Serial.begin(9600);Wire.begin(); lcd.begin(16, 2);irrecv.enableIRIn(); // запускаем модуль IR
     lcd.setCursor(0,0);lcd.print("    TDA7419    ");delay(1000);// ЗАСТАВКА
     lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
     pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
     pinMode(11,INPUT);// ВЫБОР ВХОДА КНОПКА IN
     pinMode(13,INPUT);// КНОПКА SET
     MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
     if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  /// считываем все настройки с памяти при включении
   vol = EEPROM.read(0);treb = EEPROM.read(1)-15;middle = EEPROM.read(3)-15;bass = EEPROM.read(3)-15;
   in = EEPROM.read(4);gain1 = EEPROM.read(5);gain2 = EEPROM.read(6);gain3 = EEPROM.read(7);
   lon = EEPROM.read(8);lon_f = EEPROM.read(9);rf = EEPROM.read(10);lf = EEPROM.read(11);
   rt = EEPROM.read(12);lt = EEPROM.read(13);sab = EEPROM.read(14);treb_c = EEPROM.read(15);
   mid_c = EEPROM.read(16);bas_c = EEPROM.read(17);sab_f = EEPROM.read(18);
   switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
   audio();
}

void loop(){
  if(digitalRead(10)==LOW){menu++;cl();time=millis();w=1;w2=1;www=1;if(menu>4){menu=0;}}// меню
  if(digitalRead(11)==HIGH&&menu<5){in++;;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
  if(digitalRead(13)==HIGH&&menu<5){menu=5;cl();time=millis();w=1;w2=1;}// меню 2 включение меню 2
  if(digitalRead(13)==HIGH&&menu>=5){menu++;cl();time=millis();w=1;w2=1;if(menu>11){menu=0;}}// перебор меню 2 и выход в меню громкости

   ////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;}// 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&&menu<5){in++;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};gr1=0;gr2=0;audio();}// IN
/////////////////////////////// VOLUME -80 ... 0 дБ ////////////////////////////////////////////////
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(0,0);lcd.print("Volume  ");
     lcd.print(" ");lcd.print(-80+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-32;
   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;}}

///////////////////////// TREBLE +/-15 dB /////////////////////////////////////////////////////////
   if(menu==1){
     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(0,0);lcd.print("Treble  ");
   lcd.print(" ");lcd.print(treb);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////////// MIDDLE +/-15 dB ////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==0x2FD906F){middle++;gr1=1;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){middle++;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){middle--;gr1=0;gr2=1;cl();w2=1;middle_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){middle--;gr1=0;cl();w2=1;middle_func();audio();}// кнопка <<<<<<
   
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    middle=middle+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;middle_func();audio();}
   lcd.setCursor(0,0);lcd.print("Middle  ");
   lcd.print(" ");lcd.print(middle);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");middle_d=middle+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=middle_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////// BASS +/-15 dB ///////////////////////////////////////////////////////////
   if(menu==3){
     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(0,0);lcd.print("Bass    ");
   lcd.print(" ");lcd.print(bass);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
   
//////////////// IN + GAIN /////////////////////////////////////////////////////////////
   if(menu==4){
       switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
     if(ir.value==0x2FD906F){gain0++;gr1=1;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){gain0--;gr1=0;gr2=1;cl();w2=1;gain_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl();w2=1;gain_func();audio();}// кнопка <<<<<<

    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();}
   switch(in){
     case 1: gain1 = gain0;break;
     case 2: gain2 = gain0;break;
     case 3: gain3 = gain0;break;
     }
    if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print("Gain IN ");lcd.print(in);
      lcd.setCursor(10,0);lcd.print(" ");lcd.print(gain0);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");gain_d=gain0*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=gain_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}}w2=0;}

////////////////////////////// loudness ////////////////////////////////////////////////////
if(menu==5){ 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lon_f=lon_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon_f>3){lon_f=0;}if(lon_f<0){lon_f=3;}audio();}

    lcd.setCursor(0,0);lcd.print("Loudness: ");
      switch(lon_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("400Hz ");break;
         case 2: lcd.print("800Hz ");break;
         case 3: lcd.print("2400Hz");break;}}

//////////////////////////// loudness Att ////////////////////////////////////////////////
if(menu==6){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      lon=lon+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon>15){lon=15;}if(lon<0){lon=0;}audio();}

   lcd.setCursor(0,0);lcd.print("Loud att");
   lcd.print(" ");lcd.print(-lon);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");lon_d=lon*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=lon_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

////////////////////////////////////////// out /////////////////////////////////////////////////
if(menu==7){ 
   if(digitalRead(11)==HIGH){out++;cl();www=1;w=1;if(out>4){out=0;}audio();} // перебор выходов кнопкой IN
       switch(out){
          case 0:vol_out=rf;break;
          case 1:vol_out=lf;break;
          case 2:vol_out=rt;break;
          case 3:vol_out=lt;break;
          case 4:vol_out=sab;break;
          }
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      vol_out=vol_out+newPosition;myEnc.write(0);newPosition=0;time=millis();www=1;w=1;w2=1;if(vol_out>15){vol_out=15;}if(vol_out<0){vol_out=0;}audio();}
     
   lcd.setCursor(0,0);lcd.print("Volume OUT");lcd.setCursor(0,1);
      switch(out){
   case 0:rf=vol_out;lcd.print("RF:  +");lcd.print(rf);break;
   case 1:lf=vol_out;lcd.print("LF:  +");lcd.print(lf);break;
   case 2:rt=vol_out;lcd.print("RT:  +");lcd.print(rt);break;
   case 3:lt=vol_out;lcd.print("LT:  +");lcd.print(lt);break;
   case 4:sab=vol_out;lcd.print("SUBW:  +");lcd.print(sab);break;
   }
    if(www==1){audio();www=0;}
  lcd.print(" dB      ");}
 
   /////////////////////////////////treble center//////////////////////////////////////////////////
if(menu==8){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      treb_c=treb_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(treb_c>3){treb_c=0;}if(treb_c<0){treb_c=3;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Treble Center ");
  lcd.setCursor(1,6);
    switch(treb_c){
      case 0: lcd.print("10.0 kHz");break;
      case 1: lcd.print("12.5 kHz");break;
      case 2: lcd.print("15.0 kHz");break;
      case 3: lcd.print("17.5 kHz");break;}} 
     
   /////////////////////////////////middle center//////////////////////////////////////////////////
if(menu==9){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      mid_c=mid_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(mid_c>3){mid_c=0;}if(mid_c<0){mid_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Middle Center ");
    lcd.setCursor(1,6);
      switch(mid_c){
        case 0: lcd.print("0.5 kHz");break;
        case 1: lcd.print("1.0 kHz");break;
        case 2: lcd.print("1.5 kHz");break;
        case 3: lcd.print("2.5 kHz");break;}}
       
////////////////////////////////////bass center///////////////////////////////////////////
if(menu==10){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      bas_c=bas_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(bas_c>3){bas_c=0;}if(bas_c<0){bas_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Bass Center ");
    lcd.setCursor(1,6);
      switch(bas_c){
         case 0: lcd.print("60 Hz ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("100 Hz");break;
         case 3: lcd.print("200 Hz");break;}}
         
//////////////////////////////////////subw////////////////////////////////////////////////
if(menu==11){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      sab_f=sab_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(sab_f>3){sab_f=0;}if(sab_f<0){sab_f=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Subwoofer Freq.");
    lcd.setCursor(1,6);
      switch(sab_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("120 Hz");break;
         case 3: lcd.print("160 Hz");break;}}
//////////////////////////////////////////////////////////////////////////////////////

Serial.println(time);

if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol);EEPROM.update(1,treb+15);EEPROM.update(2,middle+15);EEPROM.update(3,bass+15);
     EEPROM.update(4,in);EEPROM.update(5,gain1);EEPROM.update(6,gain2);EEPROM.update(7,gain3);
     EEPROM.update(8,lon);EEPROM.update(9,lon_f);
     EEPROM.update(10,rf);EEPROM.update(11,lf);EEPROM.update(12,rt);EEPROM.update(13,lt);
     EEPROM.update(14,sab);EEPROM.update(15,treb_c);EEPROM.update(16,mid_c);EEPROM.update(17,bas_c);
     EEPROM.update(18,sab_f);
     menu=0;lcd.clear();w=0;w2=1;cl();}


  
     
}//loop

void gain_func(){if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}
void bass_func(){if(bass>15){bass=15;}if(bass<-15){bass=-15;}}
void middle_func(){if(middle>15){middle=15;}if(middle<-15){middle=-15;}}
void treb_func(){if(treb>15){treb=15;}if(treb<-15){treb=-15;}}
void vol_func(){if(vol<0){vol=0;}if(vol>80){vol=80;}}

void cl(){ir.value=0;delay(300);lcd.clear();}

void to_Timer(){newPosition = myEnc.read()/4;}

void audio(){
tda.setInput(in,gain0,0);    //вх1=1, вх2=2, вх3=3
tda.setInput2(0,0,0);   // не используется
tda.setAtt_loudness(lon,lon_f,0,0);
tda.setSoft(mute,0,0,0,0);//mute off (не менять)
tda.setVolume(vol-79,0);   // общая громкость от 0 до 79 макс
tda.setAtt_LF(64+lf,0);   // гром. лк фронт
tda.setAtt_RF(64+rf,0);   // гром. пк фронт
tda.setAtt_LT(64+lt,0);   // гром. лк тыл
tda.setAtt_RT(64+rt,0);   // гром. пк тыл
tda.setAtt_SUB(64+sab,0);  // гром. савбуфер
tda.setAtt_Mix(79,0);   // не использует
tda.setFilter_Treble(treb,treb_c,0);
tda.setFilter_Middle(middle,0,0);
tda.setFilter_Bass(bass,0,0);
tda.setSub_M_B(sab_f,mid_c,bas_c,0,0);
tda.setMix_Gain_Eff(1,0,0,0,0); // не используется
tda.setSpektor(0,0,1,0,1,0,0);
}

168

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

при регулировании горомкости заполняется экран черточками и зависает,в volume out только FR больше нет выходов

liman324 пишет:
#include <Wire.h>
#include <TDA7419.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
  TDA7419 tda;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
  LiquidCrystal_I2C lcd(0x27,16,2);// A4,A5
  boolean  w,w2,www,mute=1,gr1,gr2;
  byte z,z0,z1,gain1,gain2,gain3,gain_d,rf,lf,rt,lt,sab, in_d,lon_f,lon_d,vol_d, bass_d,treb_d,middle_d;
  int menu,vol,bass,treb,middle,in,gain0;
  int lon,out,vol_out,treb_c,mid_c,bas_c,sab_f;
  unsigned long time,oldPosition  = -999,newPosition;
  unsigned long gainTimer;

      
      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};
 
 
void setup(){ Serial.begin(9600);Wire.begin(); lcd.begin(16, 2);irrecv.enableIRIn(); // запускаем модуль IR
     lcd.setCursor(0,0);lcd.print("    TDA7419    ");delay(1000);// ЗАСТАВКА
     lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
     pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
     pinMode(11,INPUT);// ВЫБОР ВХОДА КНОПКА IN
     pinMode(13,INPUT);// КНОПКА SET
     MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
     if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  /// считываем все настройки с памяти при включении
   vol = EEPROM.read(0);treb = EEPROM.read(1)-15;middle = EEPROM.read(3)-15;bass = EEPROM.read(3)-15;
   in = EEPROM.read(4);gain1 = EEPROM.read(5);gain2 = EEPROM.read(6);gain3 = EEPROM.read(7);
   lon = EEPROM.read(8);lon_f = EEPROM.read(9);rf = EEPROM.read(10);lf = EEPROM.read(11);
   rt = EEPROM.read(12);lt = EEPROM.read(13);sab = EEPROM.read(14);treb_c = EEPROM.read(15);
   mid_c = EEPROM.read(16);bas_c = EEPROM.read(17);sab_f = EEPROM.read(18);
   switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
   audio();
}

void loop(){
  if(digitalRead(10)==LOW){menu++;cl();time=millis();w=1;w2=1;www=1;if(menu>4){menu=0;}}// меню
  if(digitalRead(11)==HIGH&&menu<5){in++;;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
  if(digitalRead(13)==HIGH&&menu<5){menu=5;cl();time=millis();w=1;w2=1;}// меню 2 включение меню 2
  if(digitalRead(13)==HIGH&&menu>=5){menu++;cl();time=millis();w=1;w2=1;if(menu>11){menu=0;}}// перебор меню 2 и выход в меню громкости

   ////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;}// 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&&menu<5){in++;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};gr1=0;gr2=0;audio();}// IN
/////////////////////////////// VOLUME -80 ... 0 дБ ////////////////////////////////////////////////
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(0,0);lcd.print("Volume  ");
     lcd.print(" ");lcd.print(-80+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol-32;
   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;}}

///////////////////////// TREBLE +/-15 dB /////////////////////////////////////////////////////////
   if(menu==1){
     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(0,0);lcd.print("Treble  ");
   lcd.print(" ");lcd.print(treb);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////////// MIDDLE +/-15 dB ////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==0x2FD906F){middle++;gr1=1;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){middle++;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){middle--;gr1=0;gr2=1;cl();w2=1;middle_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){middle--;gr1=0;cl();w2=1;middle_func();audio();}// кнопка <<<<<<
   
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    middle=middle+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;middle_func();audio();}
   lcd.setCursor(0,0);lcd.print("Middle  ");
   lcd.print(" ");lcd.print(middle);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");middle_d=middle+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=middle_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////// BASS +/-15 dB ///////////////////////////////////////////////////////////
   if(menu==3){
     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(0,0);lcd.print("Bass    ");
   lcd.print(" ");lcd.print(bass);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
   
//////////////// IN + GAIN /////////////////////////////////////////////////////////////
   if(menu==4){
       switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
     if(ir.value==0x2FD906F){gain0++;gr1=1;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){gain0--;gr1=0;gr2=1;cl();w2=1;gain_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl();w2=1;gain_func();audio();}// кнопка <<<<<<

    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();}
   switch(in){
     case 1: gain1 = gain0;break;
     case 2: gain2 = gain0;break;
     case 3: gain3 = gain0;break;
     }
    if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print("Gain IN ");lcd.print(in);
      lcd.setCursor(10,0);lcd.print(" ");lcd.print(gain0);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");gain_d=gain0*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=gain_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}}w2=0;}

////////////////////////////// loudness ////////////////////////////////////////////////////
if(menu==5){ 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lon_f=lon_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon_f>3){lon_f=0;}if(lon_f<0){lon_f=3;}audio();}

    lcd.setCursor(0,0);lcd.print("Loudness: ");
      switch(lon_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("400Hz ");break;
         case 2: lcd.print("800Hz ");break;
         case 3: lcd.print("2400Hz");break;}}

//////////////////////////// loudness Att ////////////////////////////////////////////////
if(menu==6){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      lon=lon+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon>15){lon=15;}if(lon<0){lon=0;}audio();}

   lcd.setCursor(0,0);lcd.print("Loud att");
   lcd.print(" ");lcd.print(-lon);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");lon_d=lon*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=lon_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

////////////////////////////////////////// out /////////////////////////////////////////////////
if(menu==7){ 
   if(digitalRead(11)==HIGH){out++;cl();www=1;w=1;if(out>4){out=0;}audio();} // перебор выходов кнопкой IN
       switch(out){
          case 0:vol_out=rf;break;
          case 1:vol_out=lf;break;
          case 2:vol_out=rt;break;
          case 3:vol_out=lt;break;
          case 4:vol_out=sab;break;
          }
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      vol_out=vol_out+newPosition;myEnc.write(0);newPosition=0;time=millis();www=1;w=1;w2=1;if(vol_out>15){vol_out=15;}if(vol_out<0){vol_out=0;}audio();}
     
   lcd.setCursor(0,0);lcd.print("Volume OUT");lcd.setCursor(0,1);
      switch(out){
   case 0:rf=vol_out;lcd.print("RF:  +");lcd.print(rf);break;
   case 1:lf=vol_out;lcd.print("LF:  +");lcd.print(lf);break;
   case 2:rt=vol_out;lcd.print("RT:  +");lcd.print(rt);break;
   case 3:lt=vol_out;lcd.print("LT:  +");lcd.print(lt);break;
   case 4:sab=vol_out;lcd.print("SUBW:  +");lcd.print(sab);break;
   }
    if(www==1){audio();www=0;}
  lcd.print(" dB      ");}
 
   /////////////////////////////////treble center//////////////////////////////////////////////////
if(menu==8){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      treb_c=treb_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(treb_c>3){treb_c=0;}if(treb_c<0){treb_c=3;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Treble Center ");
  lcd.setCursor(1,6);
    switch(treb_c){
      case 0: lcd.print("10.0 kHz");break;
      case 1: lcd.print("12.5 kHz");break;
      case 2: lcd.print("15.0 kHz");break;
      case 3: lcd.print("17.5 kHz");break;}} 
     
   /////////////////////////////////middle center//////////////////////////////////////////////////
if(menu==9){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      mid_c=mid_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(mid_c>3){mid_c=0;}if(mid_c<0){mid_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Middle Center ");
    lcd.setCursor(1,6);
      switch(mid_c){
        case 0: lcd.print("0.5 kHz");break;
        case 1: lcd.print("1.0 kHz");break;
        case 2: lcd.print("1.5 kHz");break;
        case 3: lcd.print("2.5 kHz");break;}}
       
////////////////////////////////////bass center///////////////////////////////////////////
if(menu==10){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      bas_c=bas_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(bas_c>3){bas_c=0;}if(bas_c<0){bas_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Bass Center ");
    lcd.setCursor(1,6);
      switch(bas_c){
         case 0: lcd.print("60 Hz ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("100 Hz");break;
         case 3: lcd.print("200 Hz");break;}}
         
//////////////////////////////////////subw////////////////////////////////////////////////
if(menu==11){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      sab_f=sab_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(sab_f>3){sab_f=0;}if(sab_f<0){sab_f=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Subwoofer Freq.");
    lcd.setCursor(1,6);
      switch(sab_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("120 Hz");break;
         case 3: lcd.print("160 Hz");break;}}
//////////////////////////////////////////////////////////////////////////////////////

Serial.println(time);

if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol);EEPROM.update(1,treb+15);EEPROM.update(2,middle+15);EEPROM.update(3,bass+15);
     EEPROM.update(4,in);EEPROM.update(5,gain1);EEPROM.update(6,gain2);EEPROM.update(7,gain3);
     EEPROM.update(8,lon);EEPROM.update(9,lon_f);
     EEPROM.update(10,rf);EEPROM.update(11,lf);EEPROM.update(12,rt);EEPROM.update(13,lt);
     EEPROM.update(14,sab);EEPROM.update(15,treb_c);EEPROM.update(16,mid_c);EEPROM.update(17,bas_c);
     EEPROM.update(18,sab_f);
     menu=0;lcd.clear();w=0;w2=1;cl();}


  
     
}//loop

void gain_func(){if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}
void bass_func(){if(bass>15){bass=15;}if(bass<-15){bass=-15;}}
void middle_func(){if(middle>15){middle=15;}if(middle<-15){middle=-15;}}
void treb_func(){if(treb>15){treb=15;}if(treb<-15){treb=-15;}}
void vol_func(){if(vol<0){vol=0;}if(vol>80){vol=80;}}

void cl(){ir.value=0;delay(300);lcd.clear();}

void to_Timer(){newPosition = myEnc.read()/4;}

void audio(){
tda.setInput(in,gain0,0);    //вх1=1, вх2=2, вх3=3
tda.setInput2(0,0,0);   // не используется
tda.setAtt_loudness(lon,lon_f,0,0);
tda.setSoft(mute,0,0,0,0);//mute off (не менять)
tda.setVolume(vol-79,0);   // общая громкость от 0 до 79 макс
tda.setAtt_LF(64+lf,0);   // гром. лк фронт
tda.setAtt_RF(64+rf,0);   // гром. пк фронт
tda.setAtt_LT(64+lt,0);   // гром. лк тыл
tda.setAtt_RT(64+rt,0);   // гром. пк тыл
tda.setAtt_SUB(64+sab,0);  // гром. савбуфер
tda.setAtt_Mix(79,0);   // не использует
tda.setFilter_Treble(treb,treb_c,0);
tda.setFilter_Middle(middle,0,0);
tda.setFilter_Bass(bass,0,0);
tda.setSub_M_B(sab_f,mid_c,bas_c,0,0);
tda.setMix_Gain_Eff(1,0,0,0,0); // не используется
tda.setSpektor(0,0,1,0,1,0,0);
}

169

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

170

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

перебор выходов кнопкой IN

171

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

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

liman324 пишет:

перебор выходов кнопкой IN

172

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

Изменил кнопки - нажатие замыкание на gnd

Полосу громкости поправил

http://forum.rcl-radio.ru/uploads/images/2022/07/4bb959d69ed99e6a0b45f6b26383e23c.png


#include <Wire.h>
#include <TDA7419.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
  TDA7419 tda;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
  LiquidCrystal_I2C lcd(0x27,16,2);// A4,A5
  boolean  w,w2,www,mute=1,gr1,gr2;
  byte z,z0,z1,gain1,gain2,gain3,gain_d,rf,lf,rt,lt,sab, in_d,lon_f,lon_d,vol_d, bass_d,treb_d,middle_d;
  int menu,vol,bass,treb,middle,in,gain0;
  int lon,out,vol_out,treb_c,mid_c,bas_c,sab_f;
  unsigned long time,oldPosition  = -999,newPosition;
  unsigned long gainTimer;

      
      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};
 
 
void setup(){ 
     Serial.begin(9600);Wire.begin(); 
     lcd.init();lcd.backlight();
     irrecv.enableIRIn(); // запускаем модуль IR
     lcd.setCursor(0,0);lcd.print("    TDA7419    ");delay(1000);// ЗАСТАВКА
     lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
     pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
     pinMode(11,INPUT_PULLUP);// ВЫБОР ВХОДА КНОПКА IN
     pinMode(13,INPUT_PULLUP);// КНОПКА SET
     MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
     if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  /// считываем все настройки с памяти при включении
   vol = EEPROM.read(0);treb = EEPROM.read(1)-15;middle = EEPROM.read(3)-15;bass = EEPROM.read(3)-15;
   in = EEPROM.read(4);gain1 = EEPROM.read(5);gain2 = EEPROM.read(6);gain3 = EEPROM.read(7);
   lon = EEPROM.read(8);lon_f = EEPROM.read(9);rf = EEPROM.read(10);lf = EEPROM.read(11);
   rt = EEPROM.read(12);lt = EEPROM.read(13);sab = EEPROM.read(14);treb_c = EEPROM.read(15);
   mid_c = EEPROM.read(16);bas_c = EEPROM.read(17);sab_f = EEPROM.read(18);
   switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
   audio();
}

void loop(){
  if(digitalRead(10)==LOW){menu++;cl();time=millis();w=1;w2=1;www=1;if(menu>4){menu=0;}}// меню
  if(digitalRead(11)==LOW&&menu<5){in++;;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
  if(digitalRead(13)==LOW&&menu<5){menu=5;cl();time=millis();w=1;w2=1;}// меню 2 включение меню 2
  if(digitalRead(13)==LOW&&menu>=5){menu++;cl();time=millis();w=1;w2=1;if(menu>11){menu=0;}}// перебор меню 2 и выход в меню громкости

   ////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;}// 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&&menu<5){in++;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};gr1=0;gr2=0;audio();}// IN
/////////////////////////////// VOLUME -80 ... 0 дБ ////////////////////////////////////////////////
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(0,0);lcd.print("Volume  ");
     lcd.print(" ");lcd.print(-80+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=map(vol, 0, 80, 0,48);
   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;}}

///////////////////////// TREBLE +/-15 dB /////////////////////////////////////////////////////////
   if(menu==1){
     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(0,0);lcd.print("Treble  ");
   lcd.print(" ");lcd.print(treb);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////////// MIDDLE +/-15 dB ////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==0x2FD906F){middle++;gr1=1;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){middle++;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){middle--;gr1=0;gr2=1;cl();w2=1;middle_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){middle--;gr1=0;cl();w2=1;middle_func();audio();}// кнопка <<<<<<
   
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    middle=middle+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;middle_func();audio();}
   lcd.setCursor(0,0);lcd.print("Middle  ");
   lcd.print(" ");lcd.print(middle);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");middle_d=middle+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=middle_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////// BASS +/-15 dB ///////////////////////////////////////////////////////////
   if(menu==3){
     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(0,0);lcd.print("Bass    ");
   lcd.print(" ");lcd.print(bass);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
   
//////////////// IN + GAIN /////////////////////////////////////////////////////////////
   if(menu==4){
       switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
     if(ir.value==0x2FD906F){gain0++;gr1=1;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){gain0--;gr1=0;gr2=1;cl();w2=1;gain_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl();w2=1;gain_func();audio();}// кнопка <<<<<<

    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();}
   switch(in){
     case 1: gain1 = gain0;break;
     case 2: gain2 = gain0;break;
     case 3: gain3 = gain0;break;
     }
    if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print("Gain IN ");lcd.print(in);
      lcd.setCursor(10,0);lcd.print(" ");lcd.print(gain0);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");gain_d=gain0*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=gain_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}}w2=0;}

////////////////////////////// loudness ////////////////////////////////////////////////////
if(menu==5){ 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lon_f=lon_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon_f>3){lon_f=0;}if(lon_f<0){lon_f=3;}audio();}

    lcd.setCursor(0,0);lcd.print("Loudness: ");
      switch(lon_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("400Hz ");break;
         case 2: lcd.print("800Hz ");break;
         case 3: lcd.print("2400Hz");break;}}

//////////////////////////// loudness Att ////////////////////////////////////////////////
if(menu==6){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      lon=lon+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon>15){lon=15;}if(lon<0){lon=0;}audio();}

   lcd.setCursor(0,0);lcd.print("Loud att");
   lcd.print(" ");lcd.print(-lon);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");lon_d=lon*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=lon_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

////////////////////////////////////////// out /////////////////////////////////////////////////
if(menu==7){ 
   if(digitalRead(11)==HIGH){out++;cl();www=1;w=1;if(out>4){out=0;}audio();} // перебор выходов кнопкой IN
       switch(out){
          case 0:vol_out=rf;break;
          case 1:vol_out=lf;break;
          case 2:vol_out=rt;break;
          case 3:vol_out=lt;break;
          case 4:vol_out=sab;break;
          }
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      vol_out=vol_out+newPosition;myEnc.write(0);newPosition=0;time=millis();www=1;w=1;w2=1;if(vol_out>15){vol_out=15;}if(vol_out<0){vol_out=0;}audio();}
     
   lcd.setCursor(0,0);lcd.print("Volume OUT");lcd.setCursor(0,1);
      switch(out){
   case 0:rf=vol_out;lcd.print("RF:  +");lcd.print(rf);break;
   case 1:lf=vol_out;lcd.print("LF:  +");lcd.print(lf);break;
   case 2:rt=vol_out;lcd.print("RT:  +");lcd.print(rt);break;
   case 3:lt=vol_out;lcd.print("LT:  +");lcd.print(lt);break;
   case 4:sab=vol_out;lcd.print("SUBW:  +");lcd.print(sab);break;
   }
    if(www==1){audio();www=0;}
  lcd.print(" dB      ");}
 
   /////////////////////////////////treble center//////////////////////////////////////////////////
if(menu==8){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      treb_c=treb_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(treb_c>3){treb_c=0;}if(treb_c<0){treb_c=3;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Treble Center ");
  lcd.setCursor(1,6);
    switch(treb_c){
      case 0: lcd.print("10.0 kHz");break;
      case 1: lcd.print("12.5 kHz");break;
      case 2: lcd.print("15.0 kHz");break;
      case 3: lcd.print("17.5 kHz");break;}} 
     
   /////////////////////////////////middle center//////////////////////////////////////////////////
if(menu==9){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      mid_c=mid_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(mid_c>3){mid_c=0;}if(mid_c<0){mid_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Middle Center ");
    lcd.setCursor(1,6);
      switch(mid_c){
        case 0: lcd.print("0.5 kHz");break;
        case 1: lcd.print("1.0 kHz");break;
        case 2: lcd.print("1.5 kHz");break;
        case 3: lcd.print("2.5 kHz");break;}}
       
////////////////////////////////////bass center///////////////////////////////////////////
if(menu==10){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      bas_c=bas_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(bas_c>3){bas_c=0;}if(bas_c<0){bas_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Bass Center ");
    lcd.setCursor(1,6);
      switch(bas_c){
         case 0: lcd.print("60 Hz ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("100 Hz");break;
         case 3: lcd.print("200 Hz");break;}}
         
//////////////////////////////////////subw////////////////////////////////////////////////
if(menu==11){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      sab_f=sab_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(sab_f>3){sab_f=0;}if(sab_f<0){sab_f=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Subwoofer Freq.");
    lcd.setCursor(1,6);
      switch(sab_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("120 Hz");break;
         case 3: lcd.print("160 Hz");break;}}
//////////////////////////////////////////////////////////////////////////////////////

Serial.println(time);

if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol);EEPROM.update(1,treb+15);EEPROM.update(2,middle+15);EEPROM.update(3,bass+15);
     EEPROM.update(4,in);EEPROM.update(5,gain1);EEPROM.update(6,gain2);EEPROM.update(7,gain3);
     EEPROM.update(8,lon);EEPROM.update(9,lon_f);
     EEPROM.update(10,rf);EEPROM.update(11,lf);EEPROM.update(12,rt);EEPROM.update(13,lt);
     EEPROM.update(14,sab);EEPROM.update(15,treb_c);EEPROM.update(16,mid_c);EEPROM.update(17,bas_c);
     EEPROM.update(18,sab_f);
     menu=0;lcd.clear();w=0;w2=1;cl();}


  
     
}//loop

void gain_func(){if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}
void bass_func(){if(bass>15){bass=15;}if(bass<-15){bass=-15;}}
void middle_func(){if(middle>15){middle=15;}if(middle<-15){middle=-15;}}
void treb_func(){if(treb>15){treb=15;}if(treb<-15){treb=-15;}}
void vol_func(){if(vol<0){vol=0;}if(vol>80){vol=80;}}

void cl(){ir.value=0;delay(300);lcd.clear();}

void to_Timer(){newPosition = myEnc.read()/4;}

void audio(){
tda.setInput(in,gain0,0);    //вх1=1, вх2=2, вх3=3
tda.setInput2(0,0,0);   // не используется
tda.setAtt_loudness(lon,lon_f,0,0);
tda.setSoft(mute,0,0,0,0);//mute off (не менять)
tda.setVolume(vol-79,0);   // общая громкость от 0 до 79 макс
tda.setAtt_LF(64+lf,0);   // гром. лк фронт
tda.setAtt_RF(64+rf,0);   // гром. пк фронт
tda.setAtt_LT(64+lt,0);   // гром. лк тыл
tda.setAtt_RT(64+rt,0);   // гром. пк тыл
tda.setAtt_SUB(64+sab,0);  // гром. савбуфер
tda.setAtt_Mix(79,0);   // не использует
tda.setFilter_Treble(treb,treb_c,0);
tda.setFilter_Middle(middle,0,0);
tda.setFilter_Bass(bass,0,0);
tda.setSub_M_B(sab_f,mid_c,bas_c,0,0);
tda.setMix_Gain_Eff(1,0,0,0,0); // не используется
tda.setSpektor(0,0,1,0,1,0,0);
}

173

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

Старое подключение кнопок с подтягивающими резисторами

#include <Wire.h>
#include <TDA7419.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
  TDA7419 tda;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
  LiquidCrystal_I2C lcd(0x27,16,2);// A4,A5
  boolean  w,w2,www,mute=1,gr1,gr2;
  byte z,z0,z1,gain1,gain2,gain3,gain_d,rf,lf,rt,lt,sab, in_d,lon_f,lon_d,vol_d, bass_d,treb_d,middle_d;
  int menu,vol,bass,treb,middle,in,gain0;
  int lon,out,vol_out,treb_c,mid_c,bas_c,sab_f;
  unsigned long time,oldPosition  = -999,newPosition;
  unsigned long gainTimer;

      
      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};
 
 
void setup(){ 
     Serial.begin(9600);Wire.begin(); 
     lcd.init();lcd.backlight();
     irrecv.enableIRIn(); // запускаем модуль IR
     lcd.setCursor(0,0);lcd.print("    TDA7419    ");delay(1000);// ЗАСТАВКА
     lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
     pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
     pinMode(11,INPUT);// ВЫБОР ВХОДА КНОПКА IN
     pinMode(13,INPUT);// КНОПКА SET
     MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
     if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  /// считываем все настройки с памяти при включении
   vol = EEPROM.read(0);treb = EEPROM.read(1)-15;middle = EEPROM.read(3)-15;bass = EEPROM.read(3)-15;
   in = EEPROM.read(4);gain1 = EEPROM.read(5);gain2 = EEPROM.read(6);gain3 = EEPROM.read(7);
   lon = EEPROM.read(8);lon_f = EEPROM.read(9);rf = EEPROM.read(10);lf = EEPROM.read(11);
   rt = EEPROM.read(12);lt = EEPROM.read(13);sab = EEPROM.read(14);treb_c = EEPROM.read(15);
   mid_c = EEPROM.read(16);bas_c = EEPROM.read(17);sab_f = EEPROM.read(18);
   switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
   audio();
}

void loop(){
  if(digitalRead(10)==LOW){menu++;cl();time=millis();w=1;w2=1;www=1;if(menu>4){menu=0;}}// меню
  if(digitalRead(11)==HIGH&&menu<5){in++;;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
  if(digitalRead(13)==HIGH&&menu<5){menu=5;cl();time=millis();w=1;w2=1;}// меню 2 включение меню 2
  if(digitalRead(13)==HIGH&&menu>=5){menu++;cl();time=millis();w=1;w2=1;if(menu>11){menu=0;}}// перебор меню 2 и выход в меню громкости

   ////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;}// 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&&menu<5){in++;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>3){in=1;};gr1=0;gr2=0;audio();}// IN
/////////////////////////////// VOLUME -80 ... 0 дБ ////////////////////////////////////////////////
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(0,0);lcd.print("Volume  ");
     lcd.print(" ");lcd.print(-80+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=map(vol, 0, 80, 0,48);
   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;}}

///////////////////////// TREBLE +/-15 dB /////////////////////////////////////////////////////////
   if(menu==1){
     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(0,0);lcd.print("Treble  ");
   lcd.print(" ");lcd.print(treb);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////////// MIDDLE +/-15 dB ////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==0x2FD906F){middle++;gr1=1;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){middle++;gr2=0;cl();w2=1;middle_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){middle--;gr1=0;gr2=1;cl();w2=1;middle_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){middle--;gr1=0;cl();w2=1;middle_func();audio();}// кнопка <<<<<<
   
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    middle=middle+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;middle_func();audio();}
   lcd.setCursor(0,0);lcd.print("Middle  ");
   lcd.print(" ");lcd.print(middle);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");middle_d=middle+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=middle_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

/////////////////////// BASS +/-15 dB ///////////////////////////////////////////////////////////
   if(menu==3){
     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(0,0);lcd.print("Bass    ");
   lcd.print(" ");lcd.print(bass);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
   
//////////////// IN + GAIN /////////////////////////////////////////////////////////////
   if(menu==4){
       switch(in){
     case 1: gain0 = gain1;break;
     case 2: gain0 = gain2;break;
     case 3: gain0 = gain3;break;
     }
     if(ir.value==0x2FD906F){gain0++;gr1=1;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){gain0--;gr1=0;gr2=1;cl();w2=1;gain_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl();w2=1;gain_func();audio();}// кнопка <<<<<<

    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();}
   switch(in){
     case 1: gain1 = gain0;break;
     case 2: gain2 = gain0;break;
     case 3: gain3 = gain0;break;
     }
    if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print("Gain IN ");lcd.print(in);
      lcd.setCursor(10,0);lcd.print(" ");lcd.print(gain0);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");gain_d=gain0*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=gain_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}}w2=0;}

////////////////////////////// loudness ////////////////////////////////////////////////////
if(menu==5){ 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lon_f=lon_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon_f>3){lon_f=0;}if(lon_f<0){lon_f=3;}audio();}

    lcd.setCursor(0,0);lcd.print("Loudness: ");
      switch(lon_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("400Hz ");break;
         case 2: lcd.print("800Hz ");break;
         case 3: lcd.print("2400Hz");break;}}

//////////////////////////// loudness Att ////////////////////////////////////////////////
if(menu==6){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      lon=lon+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lon>15){lon=15;}if(lon<0){lon=0;}audio();}

   lcd.setCursor(0,0);lcd.print("Loud att");
   lcd.print(" ");lcd.print(-lon);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");lon_d=lon*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=lon_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}

////////////////////////////////////////// out /////////////////////////////////////////////////
if(menu==7){ 
   if(digitalRead(11)==HIGH){out++;cl();www=1;w=1;if(out>4){out=0;}audio();} // перебор выходов кнопкой IN
       switch(out){
          case 0:vol_out=rf;break;
          case 1:vol_out=lf;break;
          case 2:vol_out=rt;break;
          case 3:vol_out=lt;break;
          case 4:vol_out=sab;break;
          }
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      vol_out=vol_out+newPosition;myEnc.write(0);newPosition=0;time=millis();www=1;w=1;w2=1;if(vol_out>15){vol_out=15;}if(vol_out<0){vol_out=0;}audio();}
     
   lcd.setCursor(0,0);lcd.print("Volume OUT");lcd.setCursor(0,1);
      switch(out){
   case 0:rf=vol_out;lcd.print("RF:  +");lcd.print(rf);break;
   case 1:lf=vol_out;lcd.print("LF:  +");lcd.print(lf);break;
   case 2:rt=vol_out;lcd.print("RT:  +");lcd.print(rt);break;
   case 3:lt=vol_out;lcd.print("LT:  +");lcd.print(lt);break;
   case 4:sab=vol_out;lcd.print("SUBW:  +");lcd.print(sab);break;
   }
    if(www==1){audio();www=0;}
  lcd.print(" dB      ");}
 
   /////////////////////////////////treble center//////////////////////////////////////////////////
if(menu==8){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      treb_c=treb_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(treb_c>3){treb_c=0;}if(treb_c<0){treb_c=3;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Treble Center ");
  lcd.setCursor(1,6);
    switch(treb_c){
      case 0: lcd.print("10.0 kHz");break;
      case 1: lcd.print("12.5 kHz");break;
      case 2: lcd.print("15.0 kHz");break;
      case 3: lcd.print("17.5 kHz");break;}} 
     
   /////////////////////////////////middle center//////////////////////////////////////////////////
if(menu==9){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      mid_c=mid_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(mid_c>3){mid_c=0;}if(mid_c<0){mid_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Middle Center ");
    lcd.setCursor(1,6);
      switch(mid_c){
        case 0: lcd.print("0.5 kHz");break;
        case 1: lcd.print("1.0 kHz");break;
        case 2: lcd.print("1.5 kHz");break;
        case 3: lcd.print("2.5 kHz");break;}}
       
////////////////////////////////////bass center///////////////////////////////////////////
if(menu==10){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      bas_c=bas_c+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(bas_c>3){bas_c=0;}if(bas_c<0){bas_c=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Bass Center ");
    lcd.setCursor(1,6);
      switch(bas_c){
         case 0: lcd.print("60 Hz ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("100 Hz");break;
         case 3: lcd.print("200 Hz");break;}}
         
//////////////////////////////////////subw////////////////////////////////////////////////
if(menu==11){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      sab_f=sab_f+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(sab_f>3){sab_f=0;}if(sab_f<0){sab_f=3;}audio();}   
    lcd.setCursor(0,0);lcd.print("Subwoofer Freq.");
    lcd.setCursor(1,6);
      switch(sab_f){
         case 0: lcd.print("FLAT  ");break;
         case 1: lcd.print("80 Hz ");break;
         case 2: lcd.print("120 Hz");break;
         case 3: lcd.print("160 Hz");break;}}
//////////////////////////////////////////////////////////////////////////////////////

Serial.println(time);

if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol);EEPROM.update(1,treb+15);EEPROM.update(2,middle+15);EEPROM.update(3,bass+15);
     EEPROM.update(4,in);EEPROM.update(5,gain1);EEPROM.update(6,gain2);EEPROM.update(7,gain3);
     EEPROM.update(8,lon);EEPROM.update(9,lon_f);
     EEPROM.update(10,rf);EEPROM.update(11,lf);EEPROM.update(12,rt);EEPROM.update(13,lt);
     EEPROM.update(14,sab);EEPROM.update(15,treb_c);EEPROM.update(16,mid_c);EEPROM.update(17,bas_c);
     EEPROM.update(18,sab_f);
     menu=0;lcd.clear();w=0;w2=1;cl();}


  
     
}//loop

void gain_func(){if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}
void bass_func(){if(bass>15){bass=15;}if(bass<-15){bass=-15;}}
void middle_func(){if(middle>15){middle=15;}if(middle<-15){middle=-15;}}
void treb_func(){if(treb>15){treb=15;}if(treb<-15){treb=-15;}}
void vol_func(){if(vol<0){vol=0;}if(vol>80){vol=80;}}

void cl(){ir.value=0;delay(300);lcd.clear();}

void to_Timer(){newPosition = myEnc.read()/4;}

void audio(){
tda.setInput(in,gain0,0);    //вх1=1, вх2=2, вх3=3
tda.setInput2(0,0,0);   // не используется
tda.setAtt_loudness(lon,lon_f,0,0);
tda.setSoft(mute,0,0,0,0);//mute off (не менять)
tda.setVolume(vol-79,0);   // общая громкость от 0 до 79 макс
tda.setAtt_LF(64+lf,0);   // гром. лк фронт
tda.setAtt_RF(64+rf,0);   // гром. пк фронт
tda.setAtt_LT(64+lt,0);   // гром. лк тыл
tda.setAtt_RT(64+rt,0);   // гром. пк тыл
tda.setAtt_SUB(64+sab,0);  // гром. савбуфер
tda.setAtt_Mix(79,0);   // не использует
tda.setFilter_Treble(treb,treb_c,0);
tda.setFilter_Middle(middle,0,0);
tda.setFilter_Bass(bass,0,0);
tda.setSub_M_B(sab_f,mid_c,bas_c,0,0);
tda.setMix_Gain_Eff(1,0,0,0,0); // не используется
tda.setSpektor(0,0,1,0,1,0,0);
}

174

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

тоесть подключения кнопок надо поменять замыкание не на + а на - и резисторы убрать?

175

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

тоесть подключения кнопок надо поменять замыкание не на + а на - и резисторы убрать?

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