101

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

кондеры сейчас уберу.
визуально индикатор как то помигивает,будто фпс просел.спектроанализатор так не мигал ( в менюшках нет помигивания символов, в индикаторе есть... буквы L R  тоже помигивают)

102

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

В скетче есть строка 
delay(75);

Уменьшите значение или удалите строку.

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

103 (2020-06-14 01:21:09 отредактировано roline)

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

я Вас наверное уже замучил))) простите.))
на просторах сети нарыл скетч

//VU METER
//AUDIO INPUT AT A2 AND A4 ARDUINO UNO BOARD

#include <LiquidCrystal.h>

//SPECIAL CHARACTERS
byte p3[8] = {
        B10000,
        B10000,
        B10000,
        B10000,
        B10000,
        B10000,
        B10000,
        B10000
};

byte p4[8] = {
        B11000,
        B11000,
        B11000,
        B11000,
        B11000,
        B11000,
        B11000,
        B11000
};

byte p5[8] = {
        B11100,
        B11100,
        B11100,
        B11100,
        B11100,
        B11100,
        B11100,
        B11100
};

byte p6[8] = {
        B11110,
        B11110,
        B11110,
        B11110,
        B11110,
        B11110,
        B11110,
        B11110
};

byte p7[8] = {
        B11111,
        B11111,
        B11111,
        B11111,
        B11111,
        B11111,
        B11111,
        B11111
};

byte L[8] = {
        B00000,
        B00000,
        B11111,
        B10000,
        B10000,
        B10000,
        B00000,
        B00000
};

byte R[8] = {
        B00000,
        B00000,
        B11111,
        B00101,
        B00101,
        B11010,
        B00000,
        B00000
};

byte K[8] = {
	B10101,
	B01010,
        B10101,
	B01010,
	B10101,
	B01010,
	B10101,
	B01010
};

byte LEEG[8] = {
        B00000,
        B00000,
        B00000,
        B00000,
        B00000,
        B00000,
        B00000,
        B00000
};

int leftChannel = 0;   // left channel input
int rightChannel = 0;  // right channel input

int left,left2,right,right2;  //variables               
const int numReadings = 3;    //5 readings for data

int readings[numReadings];      // 
int index = 0;                  // index of the instantaneous reading
int total= 0;                   //total set at zero
int maxi=0;
int index2 = 0;                 // index of the current reading (2)
int total2= 0;                  // highest number in the readings   
int maxi2=0;
int inputPin = A2;              //INPUT LEFT
int inputPin2 = A0;             //INPUT RIGHT
int volL=0;
int volR=0;
int carL=0;
int carR=0;
int vul;
int vul2;
int laad;
LiquidCrystal lcd(7, 6, 2, 3, 4, 5);   //LCD configuration

void setup() {
  
   Serial.begin(9600);
   lcd.begin(16, 2); //size of the LCD
   for (int thisReading = 0; thisReading < numReadings; thisReading++)
   readings[thisReading] = 0;
  
   lcd.createChar(1, p3);
   lcd.createChar(2, p4);
   lcd.createChar(3, p5);
   lcd.createChar(4, p6);
   lcd.createChar(5, p7);
   lcd.createChar(6, L);
   lcd.createChar(7, R);
   lcd.createChar(8, K);
   lcd.createChar(9, LEEG);
  
  
   
    for(vul=0;vul<80;vul++)
    {
      for(laad=0;laad<vul/5;laad++)
      {
        lcd.setCursor(laad, 1); 
        lcd.write(5);
      }
     if(laad<1)
       {
       lcd.setCursor(0, 1); 
        lcd.write(5);
       }
    
     lcd.setCursor(laad+1, 1); 
     lcd.write((vul-vul/5*5)+1);
     for(laad=laad+2;laad<16;laad++)
      {
        lcd.setCursor(laad, 1); 
        lcd.write(9);
      }
    lcd.setCursor(0, 0); 
    lcd.print("VU METER");
    delay(50);
    }
    lcd.clear();
    delay(500);
  
  
  
  
  
}

void loop()

{
    lcd.setCursor(0, 0);       //L and R are put on the screen
    lcd.write(6);
    lcd.setCursor(0, 1);
    lcd.write(7);
    lcd.setCursor(15, 0);       //caps are put on the screen BOX LIKE DESIGN AT END
    lcd.write(8);
    lcd.setCursor(15, 1);
    lcd.write(8);
   
    total=analogRead(inputPin);
    if(total > maxi)
    {
      maxi=total;
    }
   
    index++;
   
    if (index >= numReadings)               //
    {             
     index = 0;                         
     left=maxi;
     maxi=0;
    }
   
   
    total2=analogRead(inputPin2);
    if(total2 > maxi2)
    {
      maxi2=total2;
    }
   
    index2++;
   
    if (index2 >= numReadings)               //
    {             
     index2 = 0;                         
     right=maxi2;
     maxi2=0;
    }
   
   
   
    volR=right/3;
   
    
     if(volR>14)
    {
      volR=14;
    }
    for(vul = 0 ; vul < volR ; vul++)
    {
      lcd.setCursor(vul+1, 1);
      lcd.write(5);
    }
   
    for(vul = volR+1 ; vul < 15 ; vul++)
    {
      lcd.setCursor(vul, 1);
      lcd.write(9);
    }
   
  
    volL=left/3;   
   
    if(volL>14)
    {
      volL=14;
    }
    for(vul2 = 0 ; vul2 < volL ; vul2++)
    {
      lcd.setCursor(vul2+1, 0);
      lcd.write(5);
    }
   
    for(vul2 = volL+1 ; vul2 < 15 ; vul2++)
    {
      lcd.setCursor(vul2, 0);
      lcd.write(9);
    }
    Serial.println(left);
}

работает прекрасно с вашей обвязкой... но как вставить в основной скетч ...мозгов не хватает

ПС балин, он тоже на вч не реагирует((((да что за напасть то такая

104

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

Здравствуйте, возможно ли в проектах на TDA 7313 добавить режим standby? Заранее спасибо.

105

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

Мне нужен скетч который Вы используете.

106

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

Здравствуйте. Планирую использовать обновленный скетч — TDA7313_IR

107

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

Опубликуйте номер поста.

108

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

Данный контент доступен только зарегистрированным пользователям.

109

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

Не тестировал
Кнопка POWER D11
выход управления STANDBY D13

#include <Wire.h>
#include <MsTimer2.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <EEPROM.h>
#include <TDA7313.h>
#include <boarddefs.h>
#include <IRremote.h>
  IRrecv irrecv(10); // указываем вывод модуля IR приемника
  TDA7313 tda;decode_results ir;
  Encoder myEnc(9, 8);//CLK, DT подключение энкодера
  LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 подключение LCD
   byte 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};
   unsigned long newPosition,time,time1,oldPosition  = -999;
   int vol,w1,w2=1,gr1,gr2,vol_d,menu,w,z,z0,z1,bass_d,bass,treb_d,treb,i,menu1,in,gain,gain1,gain2,gain3,loud,lr,rr,lf,rf,power,vol_old;
 
void setup(){ 
  Serial.begin(9600);Wire.begin();irrecv.enableIRIn(); // запускаем модуль IR
  lcd.begin(16, 2);lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
   pinMode(A0,INPUT);// КНОПКА ЭНКОДЕРA
   pinMode(12,INPUT);// КНОПКА IN
   pinMode(11,INPUT);// КНОПКА POWER
   pinMode(13,OUTPUT);// выход управления STANDBY
     MsTimer2::set(3, to_Timer);MsTimer2::start();
     vol = EEPROM.read(0);bass = EEPROM.read(1)-7;treb = EEPROM.read(2)-7;in = EEPROM.read(3);
     gain1 = EEPROM.read(4);gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);loud = EEPROM.read(7);
     lr = EEPROM.read(8);rr = EEPROM.read(9);lf = EEPROM.read(10);rf = EEPROM.read(11);
      if(in==0){gain=gain1;}
      if(in==1){gain=gain2;}
      if(in==2){gain=gain3;}
      digitalWrite(13,LOW);
      lcd.setCursor(0,0);lcd.print("    TDA 7313    ");
      lcd.setCursor(0,1);lcd.print("      V2.0      ");
      delay(1000);
      digitalWrite(13,HIGH);
      audio();
}
 
void to_Timer(){newPosition = myEnc.read()/4;}
 
void loop(){
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);time1=millis();time=millis();w=1;w1=1;irrecv.resume();}// IR приемник
  if(ir.value==0){gr1=0;gr2=0;}
  if(power==0){
  if((analogRead(A0)<900)&&menu1==0){menu++;cl();myEnc.write(0);i++;time=millis();w=1;w2=1;if(menu>2){menu=0;}}// меню
  if((analogRead(A0)>900)){i=0;}if(i>3){cl();lcd.print("     MENU 2     ");delay(500);cl();menu1=1;menu=100;}
  if((analogRead(A0)<900)&&menu1>0){menu1++;cl();myEnc.write(0);time=millis();w=1;w2=1;if(menu1>6){cl();menu1=0;menu=0;}}// меню 1
  
     if(ir.value==0x2FDD02F){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu>2){menu=0;}}// меню кнопка вверх
     if(ir.value==0x2FD32CD){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu<0){menu=2;}}// меню кнопка вниз
     
     if(ir.value==0x2FDEA15){in++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(in>2){in=0;}audio();lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);delay(1000);}//  кнопка IN
  }
  if(digitalRead(11)==HIGH && power==0){power=1;vol_old=vol;vol=0;menu = 100;audio();digitalWrite(13,LOW);cl();lcd.setCursor(0,0);lcd.print("    POWER OFF   ");}
  if(digitalRead(11)==HIGH && power==1){power=0;vol=vol_old;menu=0;digitalWrite(13,HIGH);lcd.setCursor(0,0);lcd.print("    POWER  ON   ");delay(2000);audio();cl();}
     
  //////////////////////////////////////// Volume 0...63 дБ //////////////////////////////////////
 if(menu==0){
     if(ir.value==0x2FD906F){vol++;gr1=1;gr2=0;cl1();w2=1;if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();w2=1;if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){vol--;gr1=0;gr2=1;cl1();w2=1;if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();w2=1;if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка <<<<<<
   
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol>63){vol=63;}if(vol<0){vol=0;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Volume ");lcd.print(" ");
  lcd.print(-78.75+(float)vol*1.25,2);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");vol_d=vol-15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,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;}}
//////////////////////////////////////////////////////////////////////////////////////////////////////
 
 /////////////////////// индикация тембр НЧ -14...14 дБ ///////////////////
   if(menu==1){ 
     if(ir.value==0x2FD906F){bass++;gr1=1;gr2=0;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){bass--;gr1=0;gr2=1;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка <<<<<<
   
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();} 
   lcd.setCursor(0,0);lcd.print("Bass    ");
   lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+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;}}
/////////////////////////////////////////////////////////////////////////////////////
 
 /////////////////////// индикация тембр ВЧ -14...14 дБ ///////////////////
   if(menu==2){
 if(ir.value==0x2FD906F){treb++;gr1=1;gr2=0;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){treb--;gr1=0;gr2=1;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка <<<<<<
   
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();} 
   lcd.setCursor(0,0);lcd.print("Treble  ");
   lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+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;}}
/////////////////////////////////////////////////////////////////////////////////////
 
  if(digitalRead(12)==HIGH){in++;;cl();myEnc.write(0);time=millis();w=1;w2=1;if(in>2){in=0;}if(in<0){in=2;}audio();lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);delay(1000);}
 
///////////////////////////////////// GAIN //////////////////////////////////////////
 
 if(menu1==1){
      if(in==0){gain=gain1;}
      if(in==1){gain=gain2;}
      if(in==2){gain=gain3;}
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;w2=1;if(gain>3){gain=3;}if(gain<0){gain=0;}audio();} 
 
      if(in==0){gain1=gain;}
      if(in==1){gain2=gain;}
      if(in==2){gain3=gain;}
    
  lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);lcd.setCursor(0,1);lcd.print(" Gain ");lcd.print((float)gain*3.75);lcd.print(" dB ");
 }
 /////////////////////////////// LOUDNESS //////////////////////////////////////////
 
  if(menu1==2){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    loud=loud+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;w2=1;if(loud>1){loud=0;}if(loud<0){loud=1;}audio();}
    lcd.setCursor(0,0);lcd.print("LOUDNESS ");if(loud==1){lcd.print("ON ");}else{lcd.print("OFF");}
} 
////////////////////////////////// att  LR //////////////////////////////////////////////
 
   if(menu1==3){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lr=lr-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lr>31){lr=31;}if(lr<0){lr=0;}audio();} 
    lcd.setCursor(0,0);lcd.print("Speaker   ");lcd.print((float)-lr*1.25,2);lcd.print("  ");
    lcd.setCursor(0,1);lcd.print("LR");lcd.setCursor(14,1);lcd.print("dB");
     if(w2==1){
   for(z=0,z0=0,z1=0;z<=-lr+31;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+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;}}
 ////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////// att  LF //////////////////////////////////////////////
 
   if(menu1==4){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lf=lf-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(lf>31){lf=31;}if(lf<0){lf=0;}audio();} 
    lcd.setCursor(0,0);lcd.print("Speaker   ");lcd.print((float)-lf*1.25,2);lcd.print("  ");
    lcd.setCursor(0,1);lcd.print("LF");lcd.setCursor(14,1);lcd.print("dB");
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=-lf+31;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+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;}}
 ////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////// att  RF //////////////////////////////////////////////
 
   if(menu1==5){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    rf=rf-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(rf>31){rf=31;}if(rf<0){rf=0;}audio();} 
    lcd.setCursor(0,0);lcd.print("Speaker   ");lcd.print((float)-rf*1.25,2);lcd.print("  ");
    lcd.setCursor(0,1);lcd.print("RF");lcd.setCursor(14,1);lcd.print("dB");
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=-rf+31;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+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;}}
 ////////////////////////////////////////////////////////////////////////////////////////
   ////////////////////////////////// att  RR //////////////////////////////////////////////
 
   if(menu1==6){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    rr=rr-newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(rr>31){rr=31;}if(rr<0){rr=0;}audio();} 
    lcd.setCursor(0,0);lcd.print("Speaker   ");lcd.print((float)-rr*1.25,2);lcd.print(" ");
    lcd.setCursor(0,1);lcd.print("RR");lcd.setCursor(14,1);lcd.print("dB");
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=-rr+31;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+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;}}
 ////////////////////////////////////////////////////////////////////////////////////////
 
 
 if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol);
     EEPROM.update(1,bass+7);
     EEPROM.update(2,treb+7);
     EEPROM.update(3,in);
     EEPROM.update(4,gain1);EEPROM.update(5,gain2);EEPROM.update(6,gain3);
     EEPROM.update(7,loud);
     EEPROM.update(8,lr);EEPROM.update(9,rr);EEPROM.update(10,lf);EEPROM.update(11,rf);
     menu1=0;lcd.clear();w=0,w2=1;menu=0;}
}
 
 void cl(){ir.value=0;delay(300);lcd.clear();}
 void cl1(){ir.value=0;delay(50);}
void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(lr);   // аттенюатор LR 0...31
  tda.setAttRR(rr);   // аттенюатор RR 0...31
  tda.setAttLF(lf);   // аттенюатор LF 0...31
  tda.setAttRF(rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(bass);    // тембр НЧ -7...+7
  tda.setTreble(treb);  // тембр ВЧ -7...+7
}

110

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

Спасибо, как протестирую отпишусь.

111

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

Доброго здоровья liman324.
Если тема еще жива, хотел бы задать Вам несколько вопросов.
Есть скетч, на базе Вашего http://rcl-radio.ru/wp-content/uploads/ … 313_IR.zip с некоторыми изменениями.
Изменено, под себя, подключение LCD, кнопок, энкодера, свой пульт ДУ.  Все регулировки вынесены в первое меню по кнопке энкодера, Вместо регулировок att LR, LF, RF, RR сделан регулятор баланса +/- 5 позиций, добваленно управление питанием входа. В планах добавить регулировку выхода на SUBWOOFER(LR, RR).

#include <Wire.h>
#include <MsTimer2.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <EEPROM.h>
#include <TDA7313.h>
#include <boarddefs.h>
#include <IRremote.h>
  IRrecv irrecv(10); // указываем вывод модуля IR приемника
  TDA7313 tda;
  decode_results ir;
  Encoder myEnc(3, 2);//CLK, DT подключение энкодера
  LiquidCrystal lcd(8, 9, 4, 5, 6, 7);// RS,E,D4,D5,D6,D7 подключение LCD
   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};
   unsigned long newPosition,time,time1,oldPosition  = -999;
   int vol,w1,w2=1,gr1,gr2,vol_d,menu,w,z,z0,z1,bass_d,bass,treb_d,treb,i,loud,in,gain,gain1,gain2,gain3,lr,rr,lf,rf;

void setup(){ 
   Serial.begin(9600);
   Wire.begin();irrecv.enableIRIn(); // запускаем модуль I2C,IR
   lcd.begin(16, 2);lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
   pinMode(15,INPUT);// КНОПКА ЭНКОДЕРA
   pinMode(14,INPUT_PULLUP);// КНОПКА IN
   pinMode(13,OUTPUT);//Питание для источника   
    MsTimer2::set(3, to_Timer);MsTimer2::start();
    vol = EEPROM.read(0);bass = EEPROM.read(1)-7;treb = EEPROM.read(2)-7;in = EEPROM.read(3);
    gain1 = EEPROM.read(4);gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);loud = EEPROM.read(7);
    lr = EEPROM.read(8);rr = EEPROM.read(9);lf = EEPROM.read(10);rf = EEPROM.read(11);
    if(in==0){gain=gain1;}
    if(in==1){gain=gain2;}
    if(in==2){gain=gain3;}
    lcd.setCursor(1,0);lcd.print("TDA7313 IR BAL");
    lcd.setCursor(2,1);lcd.print("GREENWAVE IR");
    delay(2000);audio();
    lcd.clear();}
   void to_Timer(){newPosition = myEnc.read()/4;}
 
void loop(){
  if ( irrecv.decode( &ir )) 
  {Serial.print("0x");Serial.println( ir.value,HEX);
  time1=millis();time=millis();
  w=1;w1=1;irrecv.resume();}// IR приемник
  if((digitalRead(15)==LOW)){menu++;cl();myEnc.write(0);i++;time=millis();w=1;w2=1;
  if(menu>5){menu=0;}}// меню
     
     if(ir.value==0xFD50AF){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;
     if(menu>4){menu=0;}}// меню кнопка вверх
     if(ir.value==0xFDCA35){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;
     if(menu<0){menu=4;}}// меню кнопка вниз
     if(ir.value==0xFD18E7){in++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;
     if(in>2){in=0;}audio();//  кнопка IN
//     lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);delay(1000);
     }

//////////////////////////////////////// Volume 0...63 дБ ////////////////////////////////////
 if(menu==0){     
     if(ir.value==0xFD7887){vol++;gr1=1;gr2=0;cl1();w2=1;
     if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();w2=1;
     if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка >>>>>>
     if(ir.value==0xFD4AB5){vol--;gr1=0;gr2=1;cl1();w2=1;
     if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();w2=1;
     if(vol<0){vol=0;}if(vol>63){vol=63;}audio();}// кнопка <<<<<<
   
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;
    if(vol>63){vol=63;}if(vol<0){vol=0;}audio();}
   
   lcd.setCursor(0,0);lcd.print("Volume ");
   lcd.print(-78.75+(float)vol*1.25,0);
   lcd.print(" ");
   lcd.setCursor(10,0);lcd.print("dB IN");lcd.print(in+1);
   vol_d=vol-15;
   
//   lcd.setCursor(13,0);lcd.print("IN");lcd.print(in+1);
   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;}}
//////////////////////////////////////////////////////////////////////////////////////////////

 /////////////////////// индикация тембр НЧ -14...14 дБ //////////////////////////////////////
   if(menu==1){   
     if(ir.value==0xFD7887){bass++;gr1=1;gr2=0;cl1();w2=1;
     if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl1();w2=1;
     if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка >>>>>>
     if(ir.value==0xFD4AB5){bass--;gr1=0;gr2=1;cl1();w2=1;
     if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl1();w2=1;
     if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка <<<<<<
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;
    if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();} 
    lcd.setCursor(0,0);lcd.print("Bass    ");
    lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
    if(w2==1){
    for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
    if(z1==1){lcd.setCursor(z0+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;}}
////////////////////////////////////////////////////////////////////////////////////////////////
 
 /////////////////////// индикация тембр ВЧ -14...14 дБ ////////////////////////////////////////
   if(menu==2){   
   if(ir.value==0xFD7887){treb++;gr1=1;gr2=0;cl1();w2=1;
   if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();w2=1;
   if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка >>>>>>
   if(ir.value==0xFD4AB5){treb--;gr1=0;gr2=1;cl1();w2=1;
   if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка < 
   if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();w2=1;
   if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка <<<<<<
   
   if (newPosition != oldPosition) {
   oldPosition = newPosition;
   treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;
   if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();} 
   lcd.setCursor(0,0);lcd.print("Treble  ");
   lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+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==4){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    loud=loud+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;w2=1;
    if(loud>1){loud=0;}if(loud<0){loud=1;}audio();}
    lcd.setCursor(0,0);lcd.print("LOUDNESS ");
    if(loud==1){lcd.print("ON ");}else{lcd.print("OFF");}} 
   
/////////////////////////////////////////// IN /////////////////////////////////////////////
 
  if(digitalRead(14)==LOW){in++;;cl();myEnc.write(0);time=millis();w=1;w2=1;
  if(in>2){in=0;}if(in<0){in=2;}audio();}
  if(in==2){digitalWrite(13, HIGH);}else{digitalWrite(13, LOW);}
 
////////////////////////////////////// INPUT GAIN //////////////////////////////////////////
 
 if(menu==5){
      if(in==0){gain=gain1;}
      if(in==1){gain=gain2;}
      if(in==2){gain=gain3;}
/*{
     if(ir.value==0xFD7887);gain++;gr1=1;gr2=0;cl1();w2=1;// кнопка >
     if(ir.value==0xFD4AB5);gain--;gr1=0;gr2=1;cl1();w2=1;// кнопка <
     if(gain>3){gain=3;}if(gain<0){gain=0;}audio();} 
*/
     if (newPosition != oldPosition) {
     oldPosition = newPosition;
     gain=gain+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;w2=1;
     if(gain>3){gain=3;}if(gain<0){gain=0;}audio();} 
 
      if(in==0){gain1=gain;}
      if(in==1){gain2=gain;}
      if(in==2){gain3=gain;}
    
  lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in+1);
  lcd.setCursor(0,1);lcd.print(" Gain ");lcd.print((float)gain*3.75);lcd.print(" dB ");}

 ///////////////////////////////////// BALANCE //////////////////////////////////////////////
   if(menu==3){
    
    if (newPosition != oldPosition){
    oldPosition = newPosition;
    lf=lf+newPosition;lr=lr+newPosition;rf=rf-newPosition;rr=rr-newPosition;myEnc.write(0);newPosition=0;
    lcd.clear();time=millis();w=1;
    if(lf>10){lf=10;}if(lf<0){lf=0;}
    if(rf>10){rf=10;}if(rf<0){rf=0;}
    if(lr>10){lr=10;}if(lr<0){lr=0;}
    if(rr>10){rr=10;}if(rr<0){rr=0;}
    audio();} 

   lcd.setCursor(0,0);
   if(lf-5>=0){lcd.print("-");}else{lcd.print("+");}
   lcd.print(abs(rf-5));lcd.print(" dB ");
   lcd.print(" <>  ");
   if(rf-5>=0){lcd.print("-");}else{lcd.print("+");}
   lcd.print(abs(rf-5));lcd.print(" dB ");
   lcd.setCursor(0,1);lcd.print("L");
   lcd.setCursor(15,1);lcd.print("R");  
   if(lf-5<0){lcd.setCursor(lf-5+7,1);lcd.write((uint8_t)0);}
   if(lf-5>0){lcd.setCursor(lf-5+8,1);lcd.write((uint8_t)0);}
   if(lf-5==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}
   }
//////////////////////////////////////////////////////////////////////////////////////////
 
 
 if(millis()-time>5000 && w==1){
     EEPROM.update(0,vol);
     EEPROM.update(1,bass+7);
     EEPROM.update(2,treb+7);
     EEPROM.update(3,in);
     EEPROM.update(4,gain1);EEPROM.update(5,gain2);EEPROM.update(6,gain3);
     EEPROM.update(7,loud);
     EEPROM.update(8,lr);EEPROM.update(9,rr);EEPROM.update(10,lf);EEPROM.update(11,rf);
//     menu1=0;
     lcd.clear();w=0,w2=1;menu=0;}
}
 
 void cl(){ir.value=0;delay(300);lcd.clear();}
 void cl1(){ir.value=0;delay(50);}
void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(lr);   // аттенюатор LR 0...31
  tda.setAttRR(rr);   // аттенюатор RR 0...31
  tda.setAttLF(lf);   // аттенюатор LF 0...31
  tda.setAttRF(rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(bass);    // тембр НЧ -7...+7
  tda.setTreble(treb);  // тембр ВЧ -7...+7
}

Не поможете ли с управлением с пульта функциями LOUDNESS и баланс(у меня реализован по Вашему принципу регулировки att LR).
Так же интересны режимы MUTE и  standby(включение устройства при нажатии в выключенном состоянии любой кнопки(INPUT, энкодер-SW), выключение при длительном удержании кнопки энкодера или INPUT). С управлением с пульта кнопками MUTE и  standby.
Буду весьма признателен и, думаю, не я один.
Сейчас сижу дома, болею, есть свободное время тестировать.

112

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

LOUDNES поборол с помощью delay. Но это, по моему, неправильно. Без delay чехарда какая-то.

    if(ir.value==0xFD7887){{loud=loud+1;}delay(50);
    if(loud>1){loud=0;}if(loud<0){loud=1;}w=1;w2=1;audio();}

С балансом все не разберусь.

113

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

if(ir.value==0xFD7887){loud++;cl1();if(loud>1){loud=0;}if(loud<0){loud=1;}w=1;w2=1;audio();}

114

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

Спасибо, пошептало. Продолжим сражаться с балансом.

115

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

По аналогии подправил баланс

if(menu==3){
    if(ir.value==0xFD7887){lf++;lr++;rf--;rr--;cl1();
    lcd.clear();w=1;//кнопка >
    if(lf>10){lf=10;}if(rf<0){rf=0;}if(lr>10){lr=10;}if(rr<0){rr=0;}audio();}

    if(ir.value==0xFD4AB5){lf--;lr=--;rf=++;rr=++;cl1();
    lcd.clear();w=1;//кнопка <
    if(lf<0){lf=0;}if(rf>10){rf=10;}if(lr<0){lr=0;}if(rr>10){rr=10;}audio();}
    
    if (newPosition != oldPosition){
    oldPosition = newPosition;
    lf=lf+newPosition;lr=lr+newPosition;rf=rf-newPosition;rr=rr-newPosition;myEnc.write(0);newPosition=0;
    lcd.clear();time=millis();w=1;
    if(lf>10){lf=10;}if(lf<0){lf=0;}if(rf>10){rf=10;}if(rf<0){rf=0;}
    if(lr>10){lr=10;}if(lr<0){lr=0;}if(rr>10){rr=10;}if(rr<0){rr=0;}
    audio();} 

   lcd.setCursor(0,0);
   if(lf-5>=0){lcd.print("-");}else{lcd.print("+");}
   lcd.print(abs(rf-5));lcd.print(" dB ");
   lcd.print(" <>  ");
   if(rf-5>=0){lcd.print("-");}else{lcd.print("+");}
   lcd.print(abs(rf-5));lcd.print(" dB ");
   lcd.setCursor(0,1);lcd.print("L");
   lcd.setCursor(15,1);lcd.print("R");  
   if(lf-5<0){lcd.setCursor(lf-5+7,1);lcd.write((uint8_t)0);}
   if(lf-5>0){lcd.setCursor(lf-5+8,1);lcd.write((uint8_t)0);}
   if(lf-5==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}
   }

116

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

Спасибо за помощь.
Еще хотелось бы разобраться за что отвечает каждая переменная в строчке

int vol,w1,w2=1,gr1,gr2,vol_d,menu,w,z,z0,z1,bass_d,bass,treb_d,treb,i,loud,in,gain,gain1,gain2,gain3,lr,rr,lf,rf;

А то  мне в 53 года стыдно тупо копировать чужой код, не понимая смысла.

117

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

vol - значение громкости
w2 - флаг разрешения вывода полосы
Вы его не применяете, но лучше применять, при повороте ручки энкодера обновляется полоса уровня но только один раз.
У Вас полоса обновляется постоянно в основном цикле loop, это вызывает мерцание поллосы.
Вот пример:
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;}}

w - флаг разрешения записи значений в EEPROM
gr1,gr2 - флаги разрешающие применить длинное нажатие кнопки пульта, при удержании кнопки пульта все кнопки пульта имеют код FFFFFFF, эти флаги позволяют решить проблему с одинаковым кодом кнопок при при удержании кнопки.
vol_d - переменная для хранения уровня громкости но с корректируюшим значением, для вывода уровня полосы.
пример: vol_d = vol +15;

menu - номер пункта меню
w1 - эта переменная не нужна, это тоже флаг, но она ни чем не управляет, просто забыл удалить.
z,z0,z1 - переменные позволяющие выводить полосу
bass_d,bass - тембр низкие частоты и переменная для хранения уровня низких частот но с корректируюшим значением
treb_d,treb - тембр высоких частот и переменная для хранения уровня высокие частоты но с корректируюшим значением
i -  обычно применяется в циклах, но в этом скетче не применяется, можно удалить
loud - тонкомпенсация
in - хранит номер входа
gain,gain1,gain2,gain3 - предусиление для 4-х входов
lr,rr,lf,rf - переменные для хранения уровней аттенюаторов выходов.

118

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

Вопрос по поводу MUTE с отдельной кнопки на пульте и панели(можно только на пульте для исключения введения дополнительной кнопки на панели) и STANDBY - перевод устройства в выключенное состояние(отключение питания аналоговой части и подсветки дисплея) и отображение на дисплее надписи STANDBY(включение устройства при нажатии в выключенном состоянии кнопки энкодер-SW или дополнительной кнопки пульта, выключение при длительном удержании кнопки энкодера или дополнительной кнопки пульта) остается в силе.
В дальнейшем в STANDBY планирую отображение часов на дисплее.

Функции интересные, можно было бы прикрутить ко многим Вашим проектам.

119

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

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

120 (2021-02-12 00:23:22 отредактировано VADA)

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

Спасибо, что разжевали с флагами. Буду курить буквари.
Для меня этот проект - очередная попытка на старости лет вникнуть в контроллеры.
Век живи, век учись.

121

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

liman324 пишет:

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

С железными вопросами разберемся, - радиолюбитель с 40-ка летним стажем.
Вывод, полюбому, нужен для управления питанием.

122 (2021-02-12 05:40:45 отредактировано VADA)

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

Кнопки у меня подключены к аналоговым входам

   pinMode(15,INPUT);// КНОПКА ЭНКОДЕРA
   pinMode(14,INPUT_PULLUP);// КНОПКА IN

Осталось еще пара цифровых свободных.

123

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

A0-A3 можете использовать как цифровые входы - выходы, A6 A7 только как аналоговые, но их тоже можно использовать для кнопок.

124 (2021-02-12 00:10:42 отредактировано VADA)

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

При острой нехватке ног подключим дисплей по I2C.
Про "A6 A7 только как аналоговые входы" не знал.
Что поделать, - далекий.

125

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

Кстати, MUTE и STANDBY лучше вносить в Ваш код, только укажите из какого поста.
Так, пожалуй, будет удобнее для всех.