Ранее на странице http://rcl-radio.ru/?p=57658 расматривался пример использования аудипроцессора TDA7419 на платформе Arduino с использованием дисплея LCD TFT 2,4 (SPFD5408), на этой странице будет рассмотрен пример использования LCD дисплея LCD1602 на базе контроллера HD44780. Главной задачей при разработке регулятора тембра и громкости на TDA7419 ставилась простота и удобство управления. Аудиопроцессор содержит множество настроек помимо громкости и тембра, поэтому при его настройке используется два меню. Первое основное меню содержит минимальный набор регулировок, которые являются основными. Второе меню содержит настройки обращение к которым происходит редко.
Управление аудипроцессором осуществляется при помощи четырех кнопок: «MENU», «SET», «+» и «-«.
Основное меню:
- Громкость -80…0 дБ
- Тембр ВЧ ±15 дБ
- Тембр СЧ ±15 дБ
- Тембр НЧ ±15 дБ
При нажатии на кнопку «MENU» происходит перебор параметров (громкость, тембр), кнопками «+» и «-» осуществляется регулирование основных параметров. При одновременном нажатии на кнопки «+» и «-» аудиопроцессор переходит в режим MUTE, при повторном нажатии режим MUTE отключается.
Дополнительное меню:
- Input | Gain — выбор входа (1…3) и усиления предусилителя 0…15 дБ
- Loudness | Attenuation — переключение частотных полос FLAT 400 800 2400 Гц и ослабление сигнала (0…-15 дБ)
- Volume OUT | RF LF RT LT SUBW — регулировка усиления выходов для ПК фронт, ЛК фронт, ПК тыл, ЛК тыл, сабвуфер (0…15 дБ)
- Treble center — переключение частотных полос для ВЧ 12.5 15 17.5 кГц
- Middle center — переключение частотных полос для CЧ 0,5 1 1.5 2.5 кГц
- Bass center — переключение частотных полос для НЧ 60 80 100 200 Гц
- Subwoofer Cut-off Frequency — переключение частоты среза для сабвуфера FLAT 80 120 160 Гц
Для перехода в дополнительное меню, необходимо сначала нажать кнопку «SET» и удерживая ее нажать на кнопку «MENU», кнопками «+» и «-» осуществляется изменение основного параметра дополнительного меню (например выбор входа), а при нажатии на кнопку «SET» и удержании ее, кнопками «+» и «-» осуществляется изменение дополнительного параметра (например предусиление выбранного входа).
Если в течении 10 секунд кнопки управления будут неактивны, то произойдет переход в основное меню к параметру Volume (Громкость) и сохранение всех настроек в энергонезависимой памяти.
Подключение
Библиотека — https://github.com/liman324/TDA7419.git
Даташит — tda7419
#include <Wire.h> #include <TDA7419.h> #include <EEPROM.h>//#include <EEPROMex.h> #include <LiquidCrystal.h> TDA7419 tda; LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 int menu,vol,bas,w,w1,vol_d,bass_d,treb,treble_d,middle,middle_d,z,in,gain0,gain1,gain2,gain3,gain_d,set; int lon, lon_f, lon_d,out,vol_out,rf,lf,rt,lt,sab,treb_c,mid_c,bas_c,sab_f,mute=1; unsigned long time; byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000}; byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000}; void setup(){ lcd.begin(16, 2);lcd.createChar(0,a1); lcd.createChar(1,a2);Wire.begin();Serial.begin(9600); pinMode(13,INPUT);// set pinMode(12,INPUT);// меню pinMode(11,INPUT);// плюс pinMode(10,INPUT);// минус vol = EEPROM.read(0);treb = EEPROM.read(1)-15;middle = EEPROM.read(3)-15;bas = 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); audio(); } void loop(){ if(digitalRead(12)==HIGH&&menu<4){menu++;cl();time=millis();w1=1;if(menu>3){menu=0;}}// меню if(digitalRead(12)==HIGH&&menu>=4){menu++;cl();time=millis();w1=1;if(menu>10){menu=0;}}// меню 2 if(digitalRead(12)==HIGH&&digitalRead(13)==HIGH){menu=4;cl();} if(digitalRead(10)==HIGH&&digitalRead(11)==HIGH){mute++;w=1;if(mute>1){mute=0;}} //////////////////////////////////////// Volume -80 ... 0 дБ ////////////////////////////////////// if(menu==0){ if(digitalRead(11)==HIGH){vol++;w=1;if(vol>80){vol=80;}}// 80 максимальная громкость if(digitalRead(10)==HIGH){vol--;w=1;if(vol<0){vol=0;}}// 0 минимум громкости if(w==1){audio();cl();time=millis();w=0;w1=1;} lcd.setCursor(0,0);if(mute==1){lcd.print("Volume ");}else{lcd.print("MUTE ");} lcd.print(-80+vol);lcd.setCursor(13,0);lcd.print("dB");vol_d=vol/2-17; if(vol_d>=0){for(z=0;z<=vol_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((vol_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} lcd.setCursor(13,1);lcd.print(vol);} ///////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр ВЧ + управление кнопками -15...15 дБ /////////////////// if(menu==1){ if(digitalRead(11)==HIGH){treb++;w=1;if(treb>15){treb=15;}} if(digitalRead(10)==HIGH){treb--;w=1;if(treb<-15){treb=-15;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Treble "); lcd.print(treb);lcd.setCursor(13,0);lcd.print("dB");treble_d=treb+15; if(treble_d>=0){for(z=0;z<=treble_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((treble_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}} ///////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр CЧ + управление кнопками -15...15 дБ /////////////////// if(menu==2){ if(digitalRead(11)==HIGH){middle++;w=1;if(middle>15){middle=15;}} if(digitalRead(10)==HIGH){middle--;w=1;if(middle<-15){middle=-15;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Middle "); lcd.print(middle);lcd.setCursor(13,0);lcd.print("dB");middle_d=middle+15; if(middle_d>=0){for(z=0;z<=middle_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((middle_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}} ///////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр НЧ + управление кнопками -15...15 дБ /////////////////// if(menu==3){ if(digitalRead(11)==HIGH){bas++;w=1;if(bas>15){bas=15;}} if(digitalRead(10)==HIGH){bas--;w=1;if(bas<-15){bas=-15;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Bass "); lcd.print(bas);lcd.setCursor(13,0);lcd.print("dB");bass_d=bas+15; if(bass_d>=0){for(z=0;z<=bass_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((bass_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}} //////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// вход 1...3 + предусилитель 0...15 дБ ////////////////////////////// if(menu==4){ //рег. предусилителя - нажать и удерживать кнопку set, рег. кнопки плюс и минус if(digitalRead(11)==HIGH&&digitalRead(13)==LOW){in++;w=1;if(in>3){in=3;}} if(digitalRead(10)==HIGH&&digitalRead(13)==LOW){in--;w=1;if(in<1){in=1;}} if(in==1){gain0=gain1;}if(in==2){gain0=gain2;}if(in==3){gain0=gain3;} if(digitalRead(13)==HIGH&&digitalRead(11)==HIGH){gain0++;w=1;if(gain0>15){gain0=15;}} if(digitalRead(13)==HIGH&&digitalRead(10)==HIGH){gain0--;w=1;if(gain0<0){gain0=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in);gain_d=gain0; if(gain_d>=0){for(z=0;z<=gain_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((gain_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} if(in==1){gain1=gain0;}if(in==2){gain2=gain0;}if(in==3){gain3=gain0;} lcd.setCursor(11,1);lcd.print(gain0);lcd.print(" dB ");} ///////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////// loudness //////////////////////////////////////////////////// if(menu==5){ if(digitalRead(11)==HIGH&&digitalRead(13)==LOW){lon_f++;w=1;if(lon_f>3){lon_f=3;}} if(digitalRead(10)==HIGH&&digitalRead(13)==LOW){lon_f--;w=1;if(lon_f<0){lon_f=0;}} if(digitalRead(13)==HIGH&&digitalRead(11)==HIGH){lon++;w=1;if(lon>15){lon=15;}} if(digitalRead(13)==HIGH&&digitalRead(10)==HIGH){lon--;w=1;if(lon<0){lon=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;}lon_d=lon; 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;} lcd.setCursor(0,1); if(lon_d>=0){for(z=0;z<=lon_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((lon_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} lcd.setCursor(9,1);lcd.print("-");lcd.print(lon);lcd.print(" dB ");} ////////////////////////////////////////// out ///////////////////////////////////////////////// if(menu==6){ if(digitalRead(11)==HIGH&&digitalRead(13)==LOW){out++;w=1;if(out>4){out=4;}} if(digitalRead(10)==HIGH&&digitalRead(13)==LOW){out--;w=1;if(out<0){out=0;}} 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(digitalRead(13)==HIGH&&digitalRead(11)==HIGH){vol_out++;w=1;if(vol_out>15){vol_out=15;}} if(digitalRead(13)==HIGH&&digitalRead(10)==HIGH){vol_out--;w=1;if(vol_out<0){vol_out=0;}} 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;} lcd.print(" dB ");if(w==1){audio();cl();time=millis();w1=1;w=0;}} /////////////////////////////////treble center////////////////////////////////////////////////// if(menu==7){ if(digitalRead(11)==HIGH){treb_c++;w=1;if(treb_c>3){treb_c=3;}} if(digitalRead(10)==HIGH){treb_c--;w=1;if(treb_c<0){treb_c=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} 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==8){ if(digitalRead(11)==HIGH){mid_c++;w=1;if(mid_c>3){mid_c=3;}} if(digitalRead(10)==HIGH){mid_c--;w=1;if(mid_c<0){mid_c=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} 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==9){ if(digitalRead(11)==HIGH){bas_c++;w=1;if(bas_c>3){bas_c=3;}} if(digitalRead(10)==HIGH){bas_c--;w=1;if(bas_c<0){bas_c=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} 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==10){ if(digitalRead(11)==HIGH){sab_f++;w=1;if(sab_f>3){sab_f=3;}} if(digitalRead(10)==HIGH){sab_f--;w=1;if(sab_f<0){sab_f=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} 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 && w1==1){ EEPROM.update(0,vol);EEPROM.update(1,treb+15);EEPROM.update(2,middle+15);EEPROM.update(3,bas+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;w1=0; cl();} }//loop void cl(){delay(300);lcd.clear();} 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(bas,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); }
Следующий скетч позволяет для регулировки основных параметров (громкость и тембр) дополнительно использовать энкодер KY-040 (энкодер дублирует кнопки). При нажатии на кнопку энкодера можно выбрать нужный параметр, а при вращении ручки энкодера изменить его. Энкодер работает только в основном меню.
#include <Wire.h> #include <TDA7419.h> #include <EEPROM.h>//#include <EEPROMex.h> #include <LiquidCrystal.h> #include <Encoder.h> #include <MsTimer2.h> Encoder myEnc(9, 8);//CLK, DT TDA7419 tda; LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 int menu,vol,bas,w,w1,vol_d,bass_d,treb,treble_d,middle,middle_d,z,in,gain0,gain1,gain2,gain3,gain_d,set; int lon, lon_f, lon_d,out,vol_out,rf,lf,rt,lt,sab,treb_c,mid_c,bas_c,sab_f,mute=1,vol_ram; unsigned long time, oldPosition = -999,time1; byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000}; byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000}; void setup(){ lcd.begin(16, 2);lcd.createChar(0,a1); lcd.createChar(1,a2);Wire.begin();Serial.begin(9600); pinMode(13,INPUT);// set pinMode(12,INPUT);// меню pinMode(11,INPUT);// плюс pinMode(10,INPUT);// минус pinMode(A0,INPUT);// КНОПКА ЭНКОДЕРА vol = EEPROM.read(0);treb = EEPROM.read(1)-15;middle = EEPROM.read(3)-15;bas = 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); MsTimer2::set(1, to_Timer);MsTimer2::start(); audio(); } long newPosition; void to_Timer(){ //функция таймера newPosition = myEnc.read()/4; } void loop(){ if((analogRead(A0)<900||digitalRead(12)==HIGH)&&menu<4){menu++;cl();myEnc.write(0);time=millis();w1=1;if(menu>3){menu=0;}}// меню if(digitalRead(12)==HIGH&&menu>=4){menu++;cl();myEnc.write(0);time=millis();w1=1;if(menu>10){menu=0;}}// меню 2 if(digitalRead(12)==HIGH&&digitalRead(13)==HIGH){menu=4;cl();} if(digitalRead(10)==HIGH&&digitalRead(11)==HIGH){mute++;w=1;if(mute>1){mute=0;}} //////////////////////////////////////// Volume -80 ... 0 дБ ////////////////////////////////////// if(menu==0){ if (newPosition != oldPosition) { oldPosition = newPosition; vol=vol+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(vol>80){vol=80;}if(vol<0){vol=0;}} if(digitalRead(11)==HIGH){vol++;w=1;if(vol>80){vol=80;}}// 80 максимальная громкость if(digitalRead(10)==HIGH){vol--;w=1;if(vol<0){vol=0;}}// 0 минимум громкости if(w==1){audio();cl();time=millis();w=0;w1=1;} lcd.setCursor(0,0);if(mute==1){lcd.print("Volume ");}else{lcd.print("MUTE ");} lcd.print(-80+vol);lcd.setCursor(13,0);lcd.print("dB");vol_d=vol/2-17; if(vol_d>=0){for(z=0;z<=vol_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((vol_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} lcd.setCursor(13,1);lcd.print(vol);} ///////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр ВЧ + управление кнопками -15...15 дБ /////////////////// if(menu==1){ if (newPosition != oldPosition) { oldPosition = newPosition; treb=treb+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(treb>15){treb=15;}if(treb<-15){treb=-15;}} if(digitalRead(11)==HIGH){treb++;w=1;if(treb>15){treb=15;}} if(digitalRead(10)==HIGH){treb--;w=1;if(treb<-15){treb=-15;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Treble "); lcd.print(treb);lcd.setCursor(13,0);lcd.print("dB");treble_d=treb+15; if(treble_d>=0){for(z=0;z<=treble_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((treble_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}} ///////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр CЧ + управление кнопками -15...15 дБ /////////////////// if(menu==2){ if (newPosition != oldPosition) { oldPosition = newPosition; middle=middle+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(middle>15){middle=15;}if(middle<-15){middle=-15;}} if(digitalRead(11)==HIGH){middle++;w=1;if(middle>15){middle=15;}} if(digitalRead(10)==HIGH){middle--;w=1;if(middle<-15){middle=-15;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Middle "); lcd.print(middle);lcd.setCursor(13,0);lcd.print("dB");middle_d=middle+15; if(middle_d>=0){for(z=0;z<=middle_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((middle_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}} ///////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр НЧ + управление кнопками -15...15 дБ /////////////////// if(menu==3){ if (newPosition != oldPosition) { oldPosition = newPosition; bas=bas+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(bas>15){bas=15;}if(bas<-15){bas=-15;}} if(digitalRead(11)==HIGH){bas++;w=1;if(bas>15){bas=15;}} if(digitalRead(10)==HIGH){bas--;w=1;if(bas<-15){bas=-15;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Bass "); lcd.print(bas);lcd.setCursor(13,0);lcd.print("dB");bass_d=bas+15; if(bass_d>=0){for(z=0;z<=bass_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((bass_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}} //////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// вход 1...3 + предусилитель 0...15 дБ ////////////////////////////// if(menu==4){ //рег. предусилителя - нажать и удерживать кнопку set, рег. кнопки плюс и минус if(digitalRead(11)==HIGH&&digitalRead(13)==LOW){in++;w=1;if(in>3){in=3;}} if(digitalRead(10)==HIGH&&digitalRead(13)==LOW){in--;w=1;if(in<1){in=1;}} if(in==1){gain0=gain1;}if(in==2){gain0=gain2;}if(in==3){gain0=gain3;} if(digitalRead(13)==HIGH&&digitalRead(11)==HIGH){gain0++;w=1;if(gain0>15){gain0=15;}} if(digitalRead(13)==HIGH&&digitalRead(10)==HIGH){gain0--;w=1;if(gain0<0){gain0=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in);gain_d=gain0; if(gain_d>=0){for(z=0;z<=gain_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((gain_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} if(in==1){gain1=gain0;}if(in==2){gain2=gain0;}if(in==3){gain3=gain0;} lcd.setCursor(11,1);lcd.print(gain0);lcd.print(" dB ");} ///////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////// loudness //////////////////////////////////////////////////// if(menu==5){ if(digitalRead(11)==HIGH&&digitalRead(13)==LOW){lon_f++;w=1;if(lon_f>3){lon_f=3;}} if(digitalRead(10)==HIGH&&digitalRead(13)==LOW){lon_f--;w=1;if(lon_f<0){lon_f=0;}} if(digitalRead(13)==HIGH&&digitalRead(11)==HIGH){lon++;w=1;if(lon>15){lon=15;}} if(digitalRead(13)==HIGH&&digitalRead(10)==HIGH){lon--;w=1;if(lon<0){lon=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;}lon_d=lon; 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;} lcd.setCursor(0,1); if(lon_d>=0){for(z=0;z<=lon_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((lon_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} lcd.setCursor(9,1);lcd.print("-");lcd.print(lon);lcd.print(" dB ");} ////////////////////////////////////////// out ///////////////////////////////////////////////// if(menu==6){ if(digitalRead(11)==HIGH&&digitalRead(13)==LOW){out++;w=1;if(out>4){out=4;}} if(digitalRead(10)==HIGH&&digitalRead(13)==LOW){out--;w=1;if(out<0){out=0;}} 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(digitalRead(13)==HIGH&&digitalRead(11)==HIGH){vol_out++;w=1;if(vol_out>15){vol_out=15;}} if(digitalRead(13)==HIGH&&digitalRead(10)==HIGH){vol_out--;w=1;if(vol_out<0){vol_out=0;}} 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;} lcd.print(" dB ");if(w==1){audio();cl();time=millis();w1=1;w=0;}} /////////////////////////////////treble center////////////////////////////////////////////////// if(menu==7){ if(digitalRead(11)==HIGH){treb_c++;w=1;if(treb_c>3){treb_c=3;}} if(digitalRead(10)==HIGH){treb_c--;w=1;if(treb_c<0){treb_c=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} 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==8){ if(digitalRead(11)==HIGH){mid_c++;w=1;if(mid_c>3){mid_c=3;}} if(digitalRead(10)==HIGH){mid_c--;w=1;if(mid_c<0){mid_c=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} 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==9){ if(digitalRead(11)==HIGH){bas_c++;w=1;if(bas_c>3){bas_c=3;}} if(digitalRead(10)==HIGH){bas_c--;w=1;if(bas_c<0){bas_c=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} 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==10){ if(digitalRead(11)==HIGH){sab_f++;w=1;if(sab_f>3){sab_f=3;}} if(digitalRead(10)==HIGH){sab_f--;w=1;if(sab_f<0){sab_f=0;}} if(w==1){audio();cl();time=millis();w1=1;w=0;} 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 && w1==1){ EEPROM.update(0,vol);EEPROM.update(1,treb+15);EEPROM.update(2,middle+15);EEPROM.update(3,bas+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;w1=0; myEnc.write(0);cl();} }//loop void cl(){delay(300);lcd.clear();} 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(bas,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); }
Тестирование:
Здравствуйте, подскажите в чем дело скетч с энкодером не работает — постоянно перебирает основное меню с частотой 2-3 герца, на кнопки и энкодер не реагирует. Первый скетч работает без замечаний.
Проверьте подключение энкодера и наличие на платке энкодера трех резисторов по 10 кОм.
Здравствуйте! Собрал Ваше устройство. Залил скетч (1 вариант). В результате такое ощущение что идет демо-режим. Перебираются все функции, но на кнопки не реагирует.
Проверьте подключение шины I2C
SCL SDA
GND аудиопроцессора и GND Arduino соединены вместе?
Спасибо. Вероятно TDA7419 «не живая». Буду другую пробовать
Здравствуйте. А можно ли сделать регулировку, баланс л-п, и фадер п-з?
В системах 4,1 5,1 баланс не применяется, не эффективно, вместо этого есть независимая регулировка усиления выходов.
ответе на последе смс
здраствуйте , а как дописать код чтоб выбор входа был с помощью энкодора и при этом выл на ардуине подача на включение сигнала , пример вход 1 и допустим пин а4 был сигнал +5 вольт
Входы переключаются через меню, для индикации выходов можно использовать свободные пины:
if(in==1){digitalWrite(A1,HIGH);}else{digitalWrite(A1,LOW);}
Спасибо большое !
Hi, I try to assemble the same schematic and copy the sketch and all is working except that there’s no sound output. Does anyone experience the same?
Download the I2C scanner, check the address of the audio processor http://forum.rcl-radio.ru/viewtopic.php?id=64
My friend.
Thanks for sharing,i tried trying to copy the code and paste it into the arduino ide but i get the code error.
Can you send me the .ino file please?.
thank you very much.
Which sketch exactly, 1 or 2?
My friend, Thank you for your reply, I need sketch 2. Please support for me. Thank you very much
Can you send me the .ino file please for sketch2? Thanks in advance.
My friend.Thank you for sending the file. Wish you always healthy and happy.
Привет, у меня проблемы с розовым шумом на малой громкости. У вас бывает так же? Если да, то как обойти, пробовал несколько фильтров и менял конденсаторы ТДА и ничего не решает.
Замкните накоротко вход, проверьте исчезнет ли шум.
Мой источник музыки, который издавал шум. Я изменил свой шрифт, и проблема решилась.
Я запутался в библиотеке, если я хочу использовать запись DIF TDA в переменной IN, должен ли я поставить ее в 0, 4 или 5?
0
Здравствуйте! Я не силен в программировании, поэтому обращаюсь к Вам с просьбой, можно ли переписать скетч для такого же дисплея 16*2, но на шине I2C (LiquidCrystal_I2C)?
Укажите номер скетча.
Вариант с энкодером, если я правильно понимаю, то номер 2, СПАСИБО!
И еще вопрос: хочу добавить еще модуль ИК пульта, согласно Вашего проекта на TDA7719 (http://rcl-radio.ru/?p=62993). Если я скопирую из того скетча и добавлю в этот, блок с кодом модуля IR, будет ли он работать?:
void setup(){ Serial.begin(9600);;irrecv.enableIRIn(); // запускаем модуль IR
Wire.begin();lcd.begin(16, 2);lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
pinMode(A0,INPUT);// КНОПКА ЭНКОДЕРA
pinMode(12,INPUT);// КНОПКА MENU2
pinMode(11,INPUT);// КНОПКА SET
pinMode(10,INPUT);// КНОПКА IN
vol = EEPROM.read(0)-79;treb = EEPROM.read(1)-15;treb_f = EEPROM.read(2);mid = EEPROM.read(3)-15;mid_f = EEPROM.read(4);bass = EEPROM.read(5)-15;bass_f = EEPROM.read(6);
loun = EEPROM.read(7)-15;loun_f = EEPROM.read(8);att_lf=EEPROM.read(9)-30;att_rf=EEPROM.read(10)-30;att_lr=EEPROM.read(11)-30;att_rr=EEPROM.read(12)-30;
att_l=EEPROM.read(13)-30;att_r=EEPROM.read(14)-30;sub_f=EEPROM.read(15);faza=EEPROM.read(16);bass_q=EEPROM.read(17);mid_q=EEPROM.read(18);
in0=EEPROM.read(19);vol0=EEPROM.read(20);vol1=EEPROM.read(21);vol2=EEPROM.read(22);vol3=EEPROM.read(23);vol4=EEPROM.read(24);inn();
MsTimer2::set(3, to_Timer);MsTimer2::start();
lcd.setCursor(0,0);lcd.print(» TDA7719 «);delay(1000);audio();
Используйте библиотеку http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
Она не будет конфликтовать с таймером 2
Спасибо, буду пробовать.
Здравствуйте! У меня еще вопрос: на энкодер подавать +5В на прямую от БП, или лучше через токоограничительный резистор, скажем ом на 100?
и кнопки
Токоограничивающие резисторы ставить не нужно
Здравствуйте liman!, Возможно ли добавить функцию standby, с отключением подсветки? И какой-нибудь пин, который сажает на землю выход mute у усилителя. Буду рад, если поможете с этим
Уж очень я загорелся желанием сделать домашний кинотеатр 4.1
TDA7419 у Вас уже есть в наличии?
Да