Аудиопроцессор TDA7419 + LCD1602 (Arduino)

Ранее на странице 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);
}


Тестирование:

TDA7419 + энкодер + ИК пульт + анализатор спектра — http://forum.rcl-radio.ru/viewtopic.php?pid=53#p53
TDA7419 + энкодер + ИК пульт + FM_radio — http://forum.rcl-radio.ru/viewtopic.php?id=67

Comments

  1. У меня печатка уже собрана с управлением, на ней ардуино, дисплей, энкодер, и 4 кнопки, все прекрасно работает, а ну и печатка с самой tda. Я в создании схем, трассировке плат, пайке, и тому подобное понимаю,, т.к учусь на наладчика тех. Оборудования, а вот в программировании ноль, вот и прошу вас помочь, мне нужно, чтобы при подачи питания ардуинка висела в режиме standby, на дисплее выводилась надпись standby, и была выключена подсветка, также какой нибудь пин ардуинки выдавал 5 вольт для режима mute на усилителе, я знаю как управлять подсветкой, там через пины на ардуино, вернее катод на землю, анод на управляющий пин. Когда нажимаешь на кнопку включения, ардуинка выходит в свой рабочий режим по скетчу, на пине mute был 0 по напряжению, а на пине подсветки были 5 вольт. Фух, вроде понятно расписал.

    1. Так у Вас все уже готово я хочу Вам предложить протестировать новый скетч под TDA7419 (я его еще не написал), в нем не будет анализатора спектра, но в нем будет STANDBY с изменяемой яркостью подсветки (в режиме STANDBY затемнение), а так же IR пульт, часы DS3231 (или другие). Возможна даже функция будильника (включение усилителя в назначенное время). Время будет отображаться большими цифрами в режиме STANDBY.

      http://rcl-radio.ru/wp-content/uploads/2021/12/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-%D0%BE%D1%82-2021-12-20-160802.png

      Возможно два варианта отображения параметров:
      http://rcl-radio.ru/wp-content/uploads/2022/01/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-%D0%BE%D1%82-2022-01-21-210520.png
      или
      http://rcl-radio.ru/wp-content/uploads/2021/04/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-%D0%BE%D1%82-2021-04-17-180355.png

      Так же есть вариант использовать четырех строчный дисплей:
      http://rcl-radio.ru/?p=127449

      Рассмотрите все варианты, если они Вас не устроят, то на форуме создайте новую тему, опубликуйте скетч, я добавлю в него STANDBY и задействую выход для MUTE.

  2. Посмотрел ваши варианты, мне понравился режим standby с часами, но мне часы не нужны, просто хотелось бы какой-нибудь текст, но я могу его сам изменить.

    И главный экран мне нравиться:
    http://rcl-radio.ru/wp-content/uploads/2022/01/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-%D0%BE%D1%82-2022-01-21-210520.png

    Скетч я использую тот, который у вас написан под энкодер. Буду благодарен если отправите тот, который хотите написать.

          1. Ну ладно, если так не получается, то можно тогда без него со всеми режимами, у меня просто заказанная плата с завода, там все пропаяно уже. Могу гербер скинуть, если вам нужно.

            1. Могу тогда просто доработать скетч который Вы используете. Но все же создайте новую тему на форуме и опубликуйте скетч который Вы используете. Я так понимаю это скетч № 2 на этой странице, без анализатора и пульта?

                1. Все оставить как есть, только добавить кнопку POWER? Если да, то укажите номер пина под кнопку, номер пина под выход управления режимом STANDBY и номер пина под выход управления режимом MUTE.

  3. Здравствуйте, Александр! Возможно ли убрать кнопки, и заходить в дополнительное второе меню, через долгое нажатие энкодера? Я просто хочу сделать всё минималистично, чтобы только дисплей был и энкодер. Поможете?

  4. Hello, Alexander, thanks you alot for your awesome library!
    I run well with your library, only one small issue that the output signal from the IC too low, it about 10% compare with the original input signal , even I set the master volume up to 100% (80db), output on each chanel 100% (30db). When I try to increase the input’s Gain, it going to be harmonic distortion signal when gain more than 5db. For the Circuit , first I follow your suggest Schematic , then I try with the one in datasheet, got same issue
    May you please give some sharing how you using this IC in actual advice how to fix this issue, thanks again!

      1. Thank you for quick reply, I try to read the datasheet
        I found that the volumming control of master volume and the 4’s output speaker is same, I check back with your library setting, then I understood your above sample .ino sketch that you try to limited the gain for master volume at 80, each speaker at 30.
        I try adjust like below, then it run well for me now:
        -Volume max: 95
        -4 Speaker max: 63
        -sub max : 63
        One again, thank you alot for your great work to build all Tda’s library
        Big respect from Vietnam

  5. Здравствуйте! Хочу использовать данный скетч, но с дисплеем lcd0802. Что нужно переделать? Подскажите пожалуйста. В программировании я особо не бум-бум. Буду очень признателен за вашу помощь!

    1. Для перехода в дополнительное меню, необходимо сначала нажать кнопку «SET» и удерживая ее нажать на кнопку «MENU», кнопками «+» и «-» осуществляется изменение основного параметра дополнительного меню

      1. у меня скетч с форума с радио там при длительном удерживании кнопки мелькают пункты дополнительного меню которые заканчиваются на пункте басс центр…

            1. if(digitalRead(13)==HIGH&&menu>=5){menu++;cl();radio=0;time=millis();w=1;w2=1;if(menu>10){menu=0;}}// перебор меню 2 и выход в меню громкости

              заменить на

              if(digitalRead(13)==HIGH&&menu>=5){menu++;cl();radio=0;time=millis();w=1;w2=1;if(menu>11){menu=0;}}// перебор меню 2 и выход в меню громкости

Добавить комментарий

Войти с помощью: