Re: Минималистичное переключение меню TDA7419

Для 2005 года, это просто пушка микросхема, да это не аудиопроцессор по типу adau, но в ней производитель столько всего совместил, что её тоже можно тонко настроить, и подрезать немного по частоте и сверху для сабвуфера, и снизу для фронта, тыл играет в полную полосу. Также эквалайзер есть, который можно покрутить. Вообщем отличная микра, были бы у меня такие знания в программировании, а то только умею даташиты читать, да платы печатные паять.

27

Re: Минималистичное переключение меню TDA7419

tda.setMix_Gain_Eff(1,0,0,0,0); // не используется

вот эта функция

void TDA7419::setMix_Gain_Eff(int mix_l, int mix_r, int mix_en, int sub_en, int gain_eff){
        switch (mix_l) {   
        case  0: mix_l = 0b00000000;break;
        case  1: mix_l = 0b00000001;break;
        }
        switch (mix_r) {   
        case  0: mix_r = 0b00000000;break;
        case  1: mix_r = 0b00000010;break;
        }
        switch (mix_en) {   
        case  0: mix_en = 0b00000000;break;
        case  1: mix_en = 0b00000100;break;
        }
        switch (sub_en) {   
        case  0: sub_en = 0b00000000;break;
        case  1: sub_en = 0b00001000;break;
        }
        switch (gain_eff) {   
        case  0: gain_eff = 0b11000000;break;
        case  1: gain_eff = 0b00000000;break;
        case  2: gain_eff = 0b00010000;break;
        case  3: gain_eff = 0b00100000;break;
        case  4: gain_eff = 0b00110000;break;
        case  5: gain_eff = 0b01000000;break;
        case  6: gain_eff = 0b01010000;break;
        case  7: gain_eff = 0b01100000;break;
        case  8: gain_eff = 0b01110000;break;
        case  9: gain_eff = 0b10000000;break;
        case  10: gain_eff = 0b10010000;break;
        }
        int mix_sum = mix_l + mix_r + mix_en + sub_en + gain_eff;
  writeWire(TDA7419_MIX_G_EFF, mix_sum);
        }

можете менять последний параметр от 0 до 10

Re: Минималистичное переключение меню TDA7419

Спасибо!

29

Re: Минималистичное переключение меню TDA7419

Возможно для активации этого параметра необходимо будет изменить другие параметры из этой таблицы

http://forum.rcl-radio.ru/uploads/images/2023/07/6fd8296d3f80dc0a6783467fa20f8932.png

Re: Минималистичное переключение меню TDA7419

Понял, хорошо.

31 (2025-12-07 20:23:46 отредактировано akuma_angel)

Re: Минималистичное переключение меню TDA7419

Доброго времени суток, использую скетч:

#define SW       10  // pin SW ENCODER
#define CLK       9  // pin CLK ENCODER
#define DT        8  // pin CLK ENCODER
#define IR       12  // pin IR input


#include <Wire.h>
#include <TDA7419.h>
#include <EEPROM.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/ … remote.zip
#include <LiquidCrystal_I2C.h>  // http://forum.rcl-radio.ru/misc.php?acti … download=1
Encoder myEnc(CLK, DT);
LiquidCrystal_I2C lcd(0x27,16,2);
IRrecv irrecv(IR);
TDA7419 tda;
decode_results ir;


byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};     
byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};
unsigned long times,oldPosition  = -999,newPosition,tim;
byte a[6],d1,d2,d3,d4,d5,d6,e1,e2,e3,x;
  int menu,bas,w,w1,vol_d,bass_d,treble_d,middle,middle_reg,z,in,treb,bass_reg,bass;
  int gain0,gain1,gain2,gain3,gain_d,set,vol_reg,mute_reg,in_reg,treb_reg,menu0,power;
  int lon, lon_f, lon_d,out,vol_out,rf,lf,rt,lt,sab,treb_c,mid_c,bas_c,sab_f,mute=1;
  bool w2,w3,w4;
  int tic;



void setup(){
  lcd.init();lcd.backlight();Serial.begin(9600);irrecv.enableIRIn();
  lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);
  lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
  pinMode(SW,INPUT);// SW ENCODER
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
  vol_reg = EEPROM.read(0);treb_reg = EEPROM.read(1)-100;middle_reg = EEPROM.read(2)-100;bass_reg = EEPROM.read(3)-100;in = EEPROM.read(4);
  lon_f = EEPROM.read(5);lon = EEPROM.read(6);
  rf = EEPROM.read(7);lf = EEPROM.read(8);rt = EEPROM.read(9);lt = EEPROM.read(10);sab = EEPROM.read(11);

  }

void loop(){
//// BUTTON ENCODER MENU MENU2 //////////////////////////////////////////////////////////
  if(digitalRead(SW)==LOW && w3==0){menu++;tic++;if(menu>4){menu=0;}delay(200);times=millis();w=1;w2=1;cl();}
  if(digitalRead(SW)==HIGH){tic=0;}
  if(tic==4){menu=100;w3=1;lcd.setCursor(0,0);lcd.print("     МЕНЮ 2     ");delay(1500);cl();menu0=1;}
  if(digitalRead(SW)==LOW && w3==1){menu0++;if(menu0>11){menu0=1;}delay(200);times=millis();w=1;w2=1;cl();}

 
////////////// VOLUME ///////////////////////////////////////////////////////////////////
if(menu==0){

   if (newPosition != oldPosition){oldPosition = newPosition;vol_reg=vol_reg-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();}
   a[0]= (80-vol_reg)/10;a[1]=(80-vol_reg)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   if(mute_reg==0){lcd.setCursor(0,0);lcd.print("VOLUME");}else{lcd.setCursor(0,0);lcd.print("MUTE");}
   lcd.setCursor(0,1);lcd.print("INPUT ");lcd.print(in);
  }

////////////// TREBLE ///////////////////////////////////////////////////////////////////
if(menu==1){

   if (newPosition != oldPosition){oldPosition = newPosition;treb_reg=treb_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();}
   if(treb_reg<0){lcd.setCursor(9,0);treb=abs(treb_reg);lcd.write((uint8_t)3);}else{treb=treb_reg;lcd.setCursor(9,0);lcd.print(" ");}
   a[0]= treb/10;a[1]=treb%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("TREBLE");lcd.setCursor(0,1);lcd.print("CONTROL");
   }   

////////////// MIDDLE ///////////////////////////////////////////////////////////////////
if(menu==2){

   if (newPosition != oldPosition){oldPosition = newPosition;middle_reg=middle_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;mid_func();audio();}
   if(middle_reg<0){lcd.setCursor(9,0);middle=abs(middle_reg);lcd.write((uint8_t)3);}else{middle=middle_reg;lcd.setCursor(9,0);lcd.print(" ");}
   a[0]= middle/10;a[1]=middle%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("MIDDLE");lcd.setCursor(0,1);lcd.print("CONTROL");
   }   

////////////// BASS ///////////////////////////////////////////////////////////////////
if(menu==3){

   if (newPosition != oldPosition){oldPosition = newPosition;bass_reg=bass_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();}
   if(bass_reg<0){lcd.setCursor(9,0);bass=abs(bass_reg);lcd.write((uint8_t)3);}else{bass=bass_reg;lcd.setCursor(9,0);lcd.print(" ");}
   a[0]= bass/10;a[1]=bass%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("BASS");lcd.setCursor(0,1);lcd.print("CONTROL");
   } 

////////////// INPUT ///////////////////////////////////////////////////////////////////
if(menu==4){

   if (newPosition != oldPosition){oldPosition = newPosition;in=in+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;in_func();audio();}
   a[0]= in;
   for(x=0;x<1;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("INPUT");lcd.setCursor(0,1);lcd.print("CONTROL");
   }   

////////////////////////////////////////////////////////////////////////////////////////
///// MENU2 ////////////////////////////////////////////////////////////////////////////
////////////// LOUDNESS ///////////////////////////////////////////////////////////////////
if(menu0==1){

   if (newPosition != oldPosition){oldPosition = newPosition;lon_f=lon_f+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;lon_f_func();audio();}
   lcd.setCursor(0,0);lcd.print("LOUDNESS");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
   lcd.setCursor(10,0);
   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 GAIN ///////////////////////////////////////////////////////////////////
if(menu0==2){

   if (newPosition != oldPosition){oldPosition = newPosition;lon=lon+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;lon_func();audio();}
   a[0]= lon/10;a[1]=lon%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("LOUDNESS");lcd.setCursor(0,1);lcd.print("GAIN");
   }

//////////////// TREBLE FREQ /////////////////////////////////////////////////////////////////////
if(menu0==3){

   if (newPosition != oldPosition){oldPosition = newPosition;treb_c=treb_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_c_func();audio();}
   lcd.setCursor(0,0);lcd.print("TREBLE");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
   lcd.setCursor(8,0);
   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 FREQ /////////////////////////////////////////////////////////////////////
if(menu0==4){

   if (newPosition != oldPosition){oldPosition = newPosition;mid_c=mid_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;mid_c_func();audio();}
   lcd.setCursor(0,0);lcd.print("MIDDLE");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
   lcd.setCursor(9,0);
   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 FREQ /////////////////////////////////////////////////////////////////////
if(menu0==5){

   if (newPosition != oldPosition){oldPosition = newPosition;bas_c=bas_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bas_c_func();audio();}
   lcd.setCursor(0,0);lcd.print("BASS");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
   lcd.setCursor(9,0);
   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;}
   }

//////////////// SUBWOOFER FREQ /////////////////////////////////////////////////////////////////////
if(menu0==6){

   if (newPosition != oldPosition){oldPosition = newPosition;sab_f=sab_f+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;sab_f_func();audio();}
   lcd.setCursor(0,0);lcd.print("SUBWOOFER");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
   lcd.setCursor(10,0);
   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;}
   }   

////////////// RF GAIN ///////////////////////////////////////////////////////////////////
if(menu0==7){

   if (newPosition != oldPosition){oldPosition = newPosition;rf=rf+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;rf_func();audio();}
   a[0]= rf/10;a[1]=rf%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("RF_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
   } 
////////////// LF GAIN ///////////////////////////////////////////////////////////////////
if(menu0==8){

   if (newPosition != oldPosition){oldPosition = newPosition;lf=lf+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;lf_func();audio();}
   a[0]= lf/10;a[1]=lf%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("LF_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
   } 
////////////// RT GAIN ///////////////////////////////////////////////////////////////////
if(menu0==9){

   if (newPosition != oldPosition){oldPosition = newPosition;rt=rt+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;rt_func();audio();}
   a[0]= rt/10;a[1]=rt%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("RT_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
   }
////////////// LT GAIN ///////////////////////////////////////////////////////////////////
if(menu0==10){

   if (newPosition != oldPosition){oldPosition = newPosition;lt=lt+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;lt_func();audio();}
   a[0]= lt/10;a[1]=lt%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("LT_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
   }   
////////////// SAB GAIN ///////////////////////////////////////////////////////////////////
if(menu0==11){

   if (newPosition != oldPosition){oldPosition = newPosition;sab=sab+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;sab_func();audio();}
   a[0]= sab/10;a[1]=sab%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("SAB_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
   }               

           

//// EEPROM ///////////////////////////////////////
if(millis()-times>5000 && w==1 && mute==1 && power==0){
EEPROM.update(0,vol_reg);EEPROM.update(1,treb_reg+100);EEPROM.update(2,middle_reg+100);EEPROM.update(3,bass_reg+100);EEPROM.update(4,in);
EEPROM.update(5,lon_f);EEPROM.update(6,lon);
EEPROM.update(7,rf);EEPROM.update(8,lf);EEPROM.update(9,rt);EEPROM.update(10,lt);EEPROM.update(11,sab);
menu=0;menu0=100;w=0;w2=1;w3=0;tic=0;cl();
}   
  }// END LOOP


void rf_func(){if(rf>15){rf=15;}if(rf<0){rf=0;}}
void lf_func(){if(lf>15){lf=15;}if(lf<0){lf=0;}}
void rt_func(){if(rt>15){rt=15;}if(rt<0){rt=0;}}
void lt_func(){if(lt>15){lt=15;}if(lt<0){lt=0;}}
void sab_func(){if(sab>15){sab=15;}if(sab<0){sab=0;}}
void sab_f_func(){if(sab_f>3){sab_f=3;}if(sab_f<0){sab_f=0;}}
void bas_c_func(){if(bas_c>3){bas_c=3;}if(bas_c<0){bas_c=0;}}
void mid_c_func(){if(mid_c>3){mid_c=3;}if(mid_c<0){mid_c=0;}}
void treb_c_func(){if(treb_c>3){treb_c=3;}if(treb_c<0){treb_c=0;}}
void lon_func(){if(lon>15){lon=15;}if(lon<0){lon=0;}}
void lon_f_func(){if(lon_f>3){lon_f=3;}if(lon_f<0){lon_f=0;}}
void in_func(){if(in>3){in=3;}if(in<1){in=1;}}
void bass_func(){if(bass_reg>15){bass_reg=15;}if(bass_reg<-15){bass_reg=-15;}}
void mid_func(){if(middle_reg>15){middle_reg=15;}if(middle_reg<-15){middle_reg=-15;}}
void vol_func(){if(vol_reg>79){vol_reg=79;}if(vol_reg<0){vol_reg=0;}}
void treb_func(){if(treb_reg>15){treb_reg=15;}if(treb_reg<-15){treb_reg=-15;}}
void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);} 

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_reg-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_reg,treb_c,0);
  tda.setFilter_Middle(middle_reg,0,0);
  tda.setFilter_Bass(bass_reg,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 to_Timer(){newPosition = myEnc.read()/4;}

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);} 

спасибо автору за труды, чуть ли единственный  в этой области.
данный скетч один, который запустился без зависания наглухо ардуинки)))). Не проверял полноценно на полностью собранной системе, как отрабатывает процессор и как в общем звучит, гонял меню все четко на первый взгляд и хотелось бы попросить о возможности добавить 2 физические кнопки: STANDBY и MUTE, так же более заинтересовал второй вариант отображения, со шкалой которая. За что отвечают 8 байтов в начале скетча? эту строчку: if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении, как я понял уже можно удалить и обновить скетч, так как первое включение в принципе произошло(при выключении ардуинки данные сбрасываются изза этого ведь, если ее вновь включаешь?)