<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; TDA7468 - обновленная библиотека (полный функционал)]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=238&amp;type=atom" />
	<updated>2020-12-24T17:56:11Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=238</id>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2706#p2706" />
			<content type="html"><![CDATA[<p>Хорошо, если что пишите.</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2020-12-24T17:56:11Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2706#p2706</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2705#p2705" />
			<content type="html"><![CDATA[<p>На данный момент в макетном варианте на столе всё работает. Если закрыть глаза на описанное выше непонятное явление, которое, кстати, может зависеть как от качества питающего напряжения, так и от разводки-экранировки общих шин цифровой и аналоговых частей, то можно сказать: &quot;протестировано&quot;.</p><p>По окончании монтажа законченной конструкции может что-то ещё вылезет. Тогда, с Вашего позволения, я о себе напомню!</p>]]></content>
			<author>
				<name><![CDATA[dimb0t]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1083</uri>
			</author>
			<updated>2020-12-24T17:36:49Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2705#p2705</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2695#p2695" />
			<content type="html"><![CDATA[<p>Код поправил, по 5 пункту пока не могу разобраться, у меня не выявляется</p><div class="codebox"><pre><code>#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка &gt;
#define IR_4 0x2FDF20D // Кнопка &lt;
#define IR_5 0x2FD708F // Кнопка IN
#define IR_6 0x2FD6A95 // Кнопка MUTE
#define IR_7 0x2FD00FF // Кнопка POWER
#define IR_8 0x2FDB24D // Кнопка MENU

#include &lt;Wire.h&gt;
#include &lt;TDA7468.h&gt;  //-V2-// http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=892&amp;download=1
#include &lt;EEPROM.h&gt;
#include &lt;boarddefs.h&gt;
#include &lt;IRremote.h&gt; // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include &lt;Encoder.h&gt;  // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include &lt;MsTimer2.h&gt; // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include &lt;LiquidCrystal_I2C.h&gt; //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=45&amp;download=1
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  Encoder myEnc(8, 9);//CLK, DT
  TDA7468 tda;
  IRrecv irrecv(11);  //  D11 = IR
  decode_results ir;

  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}; 
  int power,menu,in,gain0,gain1,gain2,gain3,gain4,w,w2,www,vol,vol_d,z,z0,z1;
  int bas,treb,in_x,gain_d,menu_high,mute_mic,menu0,mic_gain,menu1,sur_mode,sur_gain;
  unsigned long oldPosition  = -999,newPosition,times,times1,times_in;
  int mix,buff,mod,rez,cur,dec,acl_mode,menu2,mv,mute=1,gr1,gr2,balanc;

  
void setup(){ 
   Wire.begin();
   Serial.begin(9600);irrecv.enableIRIn();
   MsTimer2::set(1, to_Timer);MsTimer2::start();
   lcd.init();lcd.backlight();irrecv.enableIRIn();
   pinMode(10,INPUT);   // SW кнопка энкодера
   pinMode(12,INPUT_PULLUP);   // INPUT LOW
   pinMode(A0,INPUT_PULLUP);   // MENU HIGH
   pinMode(A1,INPUT_PULLUP);   // MUTE
   pinMode(A2,INPUT_PULLUP);   // POWER
   pinMode(3,OUTPUT); // выход IN5
   pinMode(2,OUTPUT); // выход POWER
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
   if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}} 
   in=EEPROM.read(0);vol=EEPROM.read(1);gain1=EEPROM.read(2);gain2=EEPROM.read(3);gain3=EEPROM.read(4);
   gain4=EEPROM.read(5);bas=EEPROM.read(6)-7;treb=EEPROM.read(7)-7;mute_mic=EEPROM.read(8);mic_gain=EEPROM.read(9);
   buff=EEPROM.read(10);mix=EEPROM.read(11);sur_mode=EEPROM.read(12);sur_gain=EEPROM.read(13); 
   mod=EEPROM.read(14);rez=EEPROM.read(15);cur=EEPROM.read(16);dec=EEPROM.read(17);
   acl_mode=EEPROM.read(18);mv=EEPROM.read(19);balanc=EEPROM.read(20)-4;
   cl();menu_high=100;mute=0;audio();lcd.print(&quot;   POWER OFF    &quot;);delay(1000);lcd.noBacklight();
}

void loop(){
  ////////////////////// IR /////////////////////////////////////////////////
  if ( irrecv.decode( &amp;ir )) {Serial.print(&quot;0x&quot;);Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
  
  //// POWER 
  if((digitalRead(A2)==LOW||ir.value==IR_7)&amp;&amp;power==0){power=1;cl();menu_high=100;mute=0;audio();lcd.print(&quot;   POWER OFF    &quot;);delay(1000);lcd.noBacklight();}
  if((digitalRead(A2)==LOW||ir.value==IR_7)&amp;&amp;power==1){power=0;cl();w=0;w2=1;mute=1;audio();lcd.backlight();lcd.print(&quot;   POWER  ON    &quot;);delay(1000);menu_high=0;menu=0;cl();}

  //// MUTE .......................................................................................................................
   if((digitalRead(A1)==LOW||ir.value==IR_6)&amp;&amp;mute==1&amp;&amp;power==0){mute=0;cl();w=0;w2=1;lcd.print(&quot;      MUTE     &quot;);menu_high=100;audio();delay(500);}// mute on
   if((digitalRead(A1)==LOW||ir.value==IR_6)&amp;&amp;mute==0&amp;&amp;power==0){mute=1;cl();times=millis();w=1;w2=1;menu=0;menu_high=0;audio();delay(500);}// mute off
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(mic_gain&lt;4){digitalWrite(3,HIGH);}else{digitalWrite(3,LOW);} // IN5
   if(power==0){digitalWrite(2,HIGH);}else{digitalWrite(2,LOW);}// POWER
   
 // HIGH MENU //////////////////////////
 if((digitalRead(A0)==LOW||ir.value==IR_8)&amp;&amp;power==0&amp;&amp;mute==1){menu_high++;cl();times=millis();w=1;w2=1,www=1;if(menu_high&gt;3){menu_high=0;}
 lcd.setCursor(5,0);lcd.print(&quot; MENU &quot;);lcd.setCursor(0,1);
 switch(menu_high){
  case 0:lcd.print(&quot;     VOLUME     &quot;);break;
  case 1:lcd.print(&quot; SELECTION  MIC &quot;);break;
  case 2:lcd.print(&quot;    SURROUND    &quot;);break;
  case 3:lcd.print(&quot;    BASS ALC    &quot;);break;
  }
 delay(1000);cl();}
 //////////////////////////////////////
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==0&amp;&amp;power==0&amp;&amp;mute==1){menu++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu&gt;3){menu=0;}}// LOW MENU VOLUME
   if(ir.value==IR_1 &amp;&amp; menu_high==0&amp;&amp;power==0&amp;&amp;mute==1){menu++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu&gt;3){menu=0;}}// LOW MENU VOLUME
   if(ir.value==IR_2 &amp;&amp; menu_high==0&amp;&amp;power==0&amp;&amp;mute==1){menu--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu&lt;0){menu=3;}}// LOW MENU VOLUME
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==1&amp;&amp;power==0&amp;&amp;mute==1){menu0++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu0&gt;1){menu0=0;}}// LOW MENU MIC
   if(ir.value==IR_1 &amp;&amp; menu_high==1&amp;&amp;power==0&amp;&amp;mute==1){menu0++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu0&gt;1){menu0=0;}}// LOW MENU MIC
   if(ir.value==IR_2 &amp;&amp; menu_high==1&amp;&amp;power==0&amp;&amp;mute==1){menu0--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu0&lt;0){menu0=1;}}// LOW MENU MIC
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==2&amp;&amp;power==0&amp;&amp;mute==1){menu1++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu1&gt;3){menu1=0;}}// LOW MENU SURROUND
   if(ir.value==IR_1 &amp;&amp; menu_high==2&amp;&amp;power==0&amp;&amp;mute==1){menu1++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu1&gt;3){menu1=0;}}// LOW MENU SURROUND
   if(ir.value==IR_2 &amp;&amp; menu_high==2&amp;&amp;power==0&amp;&amp;mute==1){menu1--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu1&lt;0){menu1=3;}}// LOW MENU SURROUND
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==3&amp;&amp;power==0&amp;&amp;mute==1){menu2++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu2&gt;5){menu2=0;}}// LOW MENU BASS ALC
   if(ir.value==IR_1 &amp;&amp; menu_high==3&amp;&amp;power==0&amp;&amp;mute==1){menu2++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu2&gt;5){menu2=0;}}// LOW MENU SURROUND
   if(ir.value==IR_2 &amp;&amp; menu_high==3&amp;&amp;power==0&amp;&amp;mute==1){menu2--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu2&lt;0){menu2=5;}}// LOW MENU SURROUND
 
 if((digitalRead(12)==LOW||ir.value==IR_5)&amp;&amp;power==0){if(in_x==1){in++;};cl();times_in=millis();in_x=1;w2=1;www=1;menu=100;if(in&gt;3){in=0;}}// INPUT

 if(menu_high==0){
  /////////////////////////////// VOLUME 0...62 ////////////////////////////////////////////////
 if(menu==0){
     if(ir.value==IR_3){vol++;opim1();vol_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();w=1;w2=1;;vol_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){vol--;opim1();vol_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();w=1;w2=1;vol_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
   
   if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print((&quot;VOLUME &quot;));
     if(vol&lt;10){lcd.setCursor(7,0);lcd.print(&quot; &quot;);}else{lcd.setCursor(8,0);}lcd.print(vol);
     vol_d=map(vol, 0,58, 0, 48);
     lcd.setCursor(12,0);
     switch(in){
      case 0: lcd.print((&quot;AUX1&quot;));break;
      case 1: lcd.print((&quot;AUX2&quot;));break;
      case 2: lcd.print((&quot;AUX3&quot;));break;
      case 3: lcd.print((&quot;AUX4&quot;));break;} 

   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=vol_d;z++,z1++){if(z1&gt;2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(F(&quot;   &quot;));}}
   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;}}
  ////////////////////// VOLUME END ////////////////////////////////////////////

  ///////////////////////// BASS +/-14 dB /////////////////////////////////////////////////////////
   if(menu==1){
     if(ir.value==IR_3){bas++;opim1();bass_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){bas++;gr2=0;cl1();w=1;w2=1;;bass_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){bas--;opim1();bass_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){bas--;gr1=0;cl1();w=1;w2=1;bass_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
     
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bas=bas+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;BASS    &quot;));
   if(bas*2&gt;=0){lcd.print(F(&quot;+&quot;));}lcd.print(bas*2);lcd.print(&quot; &quot;);lcd.setCursor(13,0);lcd.print(F(&quot;dB&quot;));
   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=(bas+1)*2+14;z++,z1++){if(z1&gt;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(F(&quot;   &quot;));}}
   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;}} 
  /////////////////////// END BASS //////////////////////////////////  

  ///////////////////////// TREBLE +/-14 dB /////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==IR_3){treb++;opim1();treb_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();w=1;w2=1;;treb_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){treb--;opim1();treb_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();w=1;w2=1;treb_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;TREBLE  &quot;));
   if(treb*2&gt;=0){lcd.print(F(&quot;+&quot;));}lcd.print(treb*2);lcd.print(&quot; &quot;);lcd.setCursor(13,0);lcd.print(F(&quot;dB&quot;));
   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=(treb+1)*2+14;z++,z1++){if(z1&gt;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(F(&quot;   &quot;));}}
   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;}} 
  /////////////////////// END TREBLE //////////////////////////////////

  ///////////////////////// BALANCE +/-4 dB /////////////////////////////////////////////////////////
   if(menu==3){
     if(ir.value==IR_3){balanc++;opim1();balanc_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){balanc++;gr2=0;cl1();w=1;w2=1;;balanc_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){balanc--;opim1();balanc_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){balanc--;gr1=0;cl1();w=1;w2=1;balanc_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balanc=balanc+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;balanc_func();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;BALANCE  &quot;));
   lcd.print(balanc);lcd.print(&quot; &quot;);lcd.setCursor(13,0);lcd.print(F(&quot;dB&quot;));
   if(w2==1){
   if(balanc&lt;0){lcd.setCursor(balanc-2+7,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   if(balanc==0){lcd.setCursor(balanc-2+7,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   if(balanc&gt;0){lcd.setCursor(balanc-2+8,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}w2=0;}} 
  /////////////////////// END BALANCE //////////////////////////////////
  
 } // end menu

  ////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu=100;menu0=100;menu1=100;menu2=100;
   switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain3;break;}

     if(ir.value==IR_3){gain0++;opim1();times=millis();times_in=millis();www=1;gain_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();w=1;w2=1;times=millis();times_in=millis();www=1;gain_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){gain0--;opim1();times=millis();times_in=millis();www=1;gain_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();w=1;w2=1;times=millis();times_in=millis();www=1;gain_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;times=millis();times_in=millis();www=1;w=1;w2=1;gain_func();} 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain3 = gain0;break;}
  if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print(&quot;Gain AUX&quot;);lcd.print(in+1);lcd.setCursor(10,0);lcd.print(&quot; &quot;);lcd.print(gain0*2);lcd.print(&quot; &quot;);lcd.setCursor(14,0);lcd.print(&quot;dB&quot;);gain_d=gain0+1;
   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=gain_d*4;z++,z1++){if(z1&gt;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(&quot;   &quot;);}}
   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()-times_in&gt;3000){in_x=0;cl();w2=1;menu=0;menu_high=0;}}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

///// MENU MIC /////////////////////////////
 if(menu_high==1){
 if(menu0==0){
     if(ir.value==IR_3){mute_mic++;opim1();func_mic_mute();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mute_mic++;gr2=0;cl1();w=1;w2=1;func_mic_mute();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mute_mic--;opim1();func_mic_mute();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mute_mic--;gr1=0;cl1();w=1;w2=1;func_mic_mute();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    mute_mic=mute_mic+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mic_mute();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot; MUTE SELECTION &quot;));
   if(mute_mic==1){lcd.setCursor(0,1);lcd.print((&quot;    MUTE ON     &quot;));}
              else{lcd.setCursor(0,1);lcd.print((&quot;    MUTE OFF    &quot;));}}
 /////////////////
 if(menu0==1){
     if(ir.value==IR_3){mic_gain++;opim1();func_mic_gain();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mic_gain++;gr2=0;cl1();w=1;w2=1;;func_mic_gain();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mic_gain--;opim1();func_mic_gain();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mic_gain--;gr1=0;cl1();w=1;w2=1;func_mic_gain();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    mic_gain=mic_gain+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mic_gain();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;   MUTE  GAIN   &quot;));
   switch(mic_gain){
    case 0: lcd.setCursor(0,1);lcd.print((&quot; MIC  GAIN 14 dB &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print((&quot; MIC  GAIN 10 dB &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print((&quot; MIC  GAIN  6 dB &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print((&quot; MIC  GAIN  0 dB &quot;));break; 
    case 4: lcd.setCursor(0,1);lcd.print((&quot;    MIC   OFF    &quot;));break;
    }}}
///////////////////////////////////////////
  
///// MENU SURROUND /////////////////////////////
 if(menu_high==2){
 if(menu1==0){
     if(ir.value==IR_3){sur_mode++;opim1();func_sur_mode();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){sur_mode++;gr2=0;cl1();w=1;w2=1;;func_sur_mode();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){sur_mode--;opim1();func_sur_mode();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){sur_mode--;gr1=0;cl1();w=1;w2=1;func_sur_mode();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    sur_mode=sur_mode+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_sur_mode();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;    SURROUND    &quot;));
   if(sur_mode==1){lcd.setCursor(0,1);lcd.print((&quot;       ON       &quot;));}
              else{lcd.setCursor(0,1);lcd.print((&quot;       OFF      &quot;));}}
 //////////
  if(menu1==1){
     if(ir.value==IR_3){sur_gain++;opim1();func_sur_gain();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){sur_gain++;gr2=0;cl1();w=1;w2=1;;func_sur_gain();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){sur_gain--;opim1();func_sur_gain();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){sur_gain--;gr1=0;cl1();w=1;w2=1;func_sur_gain();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
       
  if (newPosition != oldPosition){oldPosition = newPosition;
    sur_gain=sur_gain+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_sur_gain();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;    SURROUND    &quot;));
   switch(sur_gain){
    case 0: lcd.setCursor(0,1);lcd.print((&quot;   GAIN  0  dB   &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print((&quot;   GAIN  6  dB   &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print((&quot;   GAIN  9  dB   &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print((&quot;   GAIN  12 dB   &quot;));break; 
    }}   
  //////////
  if(menu1==2){
     if(ir.value==IR_3){mix++;opim1();func_mix();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mix++;gr2=0;cl1();w=1;w2=1;;func_mix();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mix--;opim1();func_mix();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mix--;gr1=0;cl1();w=1;w2=1;func_mix();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    mix=mix+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mix();audio();} 
  lcd.setCursor(0,0);lcd.print((&quot;     MIXING     &quot;));
   switch(mix){
    case 0: lcd.setCursor(0,1);lcd.print((&quot;inverting : 100%&quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print((&quot;inverting : 50% &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print((&quot;inverting : 25% &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print((&quot;inverting : 0%  &quot;));break; 
    case 4: lcd.setCursor(0,1);lcd.print((&quot;non-inver : 100%&quot;));break;
    case 5: lcd.setCursor(0,1);lcd.print((&quot;non-inver :  75%&quot;));break;
    case 6: lcd.setCursor(0,1);lcd.print((&quot;non-inver :  50%&quot;));break; 
    case 7: lcd.setCursor(0,1);lcd.print((&quot;      MUTE      &quot;));break; 
    }} 
  ////////
  if(menu1==3){
     if(ir.value==IR_3){buff++;opim1();func_buff();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){buff++;gr2=0;cl1();w=1;w2=1;;func_buff();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){buff--;opim1();func_buff();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){buff--;gr1=0;cl1();w=1;w2=1;func_buff();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    buff=buff+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_buff();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;  BUFFER GAIN   &quot;));
   if(buff==1){lcd.setCursor(0,1);lcd.print((&quot;      0 dB       &quot;));}
          else{lcd.setCursor(0,1);lcd.print((&quot;      6 dB       &quot;));}}
    }
///////////////////////////////////////////


///// MENU BASS ALC /////////////////////////////
 if(menu_high==3){
 if(menu2==0){
     if(ir.value==IR_3){acl_mode++;opim1();func_acl_mode();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){acl_mode++;gr2=0;cl1();w=1;w2=1;;func_acl_mode();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){acl_mode--;opim1();func_acl_mode();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){acl_mode--;gr1=0;cl1();w=1;w2=1;func_acl_mode();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    acl_mode=acl_mode+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_acl_mode();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;    ALC Mode    &quot;));
   if(acl_mode==1){lcd.setCursor(0,1);lcd.print((&quot;       ON       &quot;));}
              else{lcd.setCursor(0,1);lcd.print((&quot;       OFF      &quot;));}}
 //////////
  if(menu2==1){
     if(ir.value==IR_3){dec++;opim1();func_dec();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){dec++;gr2=0;cl1();w=1;w2=1;;func_dec();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){dec--;opim1();func_dec();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){dec--;gr1=0;cl1();w=1;w2=1;func_dec();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    dec=dec+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_dec();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;    Detector    &quot;));
   if(dec==1){lcd.setCursor(0,1);lcd.print((&quot;       ON       &quot;));}
         else{lcd.setCursor(0,1);lcd.print((&quot;       OFF      &quot;));}}
 //////////
   if(menu2==2){
     if(ir.value==IR_3){cur++;opim1();func_cur();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){cur++;gr2=0;cl1();w=1;w2=1;;func_cur();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){cur--;opim1();func_cur();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){cur--;gr1=0;cl1();w=1;w2=1;func_cur();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;   
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    cur=cur+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_cur();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;Release  Current&quot;));
   if(cur==1){lcd.setCursor(0,1);lcd.print((&quot;  Circuit  ON    &quot;));}
         else{lcd.setCursor(0,1);lcd.print((&quot;  Circuit  OFF   &quot;));}}
 //////////
  if(menu2==3){
     if(ir.value==IR_3){rez++;opim1();func_rez();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){rez++;gr2=0;cl1();w=1;w2=1;;func_rez();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){rez--;opim1();func_rez();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){rez--;gr1=0;cl1();w=1;w2=1;func_rez();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;   
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    rez=rez+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_rez();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;  Attack Time  &quot;));
   switch(rez){
    case 0: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 12.5k &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 25.0k &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 50.0k &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 100 k &quot;));break; 
    }}  
  //////////
  if(menu2==4){
     if(ir.value==IR_3){mv++;opim1();func_mv();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mv++;gr2=0;cl1();w=1;w2=1;;func_mv();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mv--;opim1();func_mv();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mv--;gr1=0;cl1();w=1;w2=1;func_mv();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;  
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    mv=mv+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mv();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;   Threshold    &quot;));
   switch(mv){
    case 0: lcd.setCursor(0,1);lcd.print(F(&quot;   700 mVrms   &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print(F(&quot;   485 mVrms   &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print(F(&quot;   320 mVrms   &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print(F(&quot;   170 mVrms   &quot;));break; 
    }} 
  ////////
  if(menu2==5){
     if(ir.value==IR_3){mod++;opim1();func_mod();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mod++;gr2=0;cl1();w=1;w2=1;;func_mod();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mod--;opim1();func_mod();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mod--;gr1=0;cl1();w=1;w2=1;func_mod();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;  
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    mod=mod+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mod();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;      MODE      &quot;));
   if(mod==0){lcd.setCursor(0,1);lcd.print(F(&quot; Fixed Resistor &quot;));}
         else{lcd.setCursor(0,1);lcd.print(F(&quot;    Adaptive    &quot;));}}
    }
///////////////////////////////////////////

  
 ////////////// EEPROM ///////////////////////////////////////////////////
 if(millis()-times&gt;20000 &amp;&amp; w==1 &amp;&amp; power==0){
     EEPROM.update(0,in);EEPROM.update(1,vol);
     EEPROM.update(2,gain1);EEPROM.update(3,gain2);EEPROM.update(4,gain3);EEPROM.update(5,gain4);
     EEPROM.update(6,bas+7);EEPROM.update(7,treb+7);EEPROM.update(8,mute_mic);EEPROM.update(9,mic_gain);
     EEPROM.update(10,buff);EEPROM.update(11,mix);EEPROM.update(12,sur_mode);EEPROM.update(13,sur_gain);
     EEPROM.update(14,mod);EEPROM.update(15,rez);EEPROM.update(16,cur);EEPROM.update(17,dec);
     EEPROM.update(18,acl_mode);EEPROM.update(19,mv);EEPROM.update(20,balanc+4);
     menu=0;w=0;w2=1;cl();menu_high=0;}
 
} 
  void opim1(){gr1=1;gr2=0;cl1();w=1;w2=1;}
  void func_mv(){if(mv&gt;3){mv=0;}if(mv&lt;0){mv=3;}}
  void func_mod(){if(mod&gt;1){mod=0;}if(mod&lt;0){mod=1;}}
  void func_rez(){if(rez&gt;3){rez=0;}if(rez&lt;0){rez=3;}}
  void func_cur(){if(cur&gt;1){cur=0;}if(cur&lt;0){cur=1;}}
  void func_dec(){if(dec&gt;1){dec=0;}if(dec&lt;0){dec=1;}}
  void func_acl_mode(){if(acl_mode&gt;1){acl_mode=0;}if(acl_mode&lt;0){acl_mode=1;}}
  void func_buff(){if(buff&gt;1){buff=0;}if(buff&lt;0){buff=1;}}
  void func_mix(){if(mix&gt;7){mix=0;}if(mix&lt;0){mix=7;}}
  void func_sur_gain(){if(sur_gain&gt;3){sur_gain=0;}if(sur_gain&lt;0){sur_gain=3;}}
  void func_sur_mode(){if(sur_mode&gt;1){sur_mode=0;}if(sur_mode&lt;0){sur_mode=1;}}
  void func_mic_gain(){if(mic_gain&gt;4){mic_gain=0;}if(mic_gain&lt;0){mic_gain=4;}}
  void func_mic_mute(){if(mute_mic&gt;1){mute_mic=0;}if(mute_mic&lt;0){mute_mic=1;}}
  void cl(){ir.value=0;delay(300);lcd.clear();}
  void cl1(){ir.value=0;delay(100);}
  void vol_func(){if(vol&gt;58){vol=58;}if(vol&lt;0){vol=0;}}
  void balanc_func(){if(balanc&gt;4){balanc=4;}if(balanc&lt;-4){balanc=-4;}}
  void gain_func(){if(gain0&gt;7){gain0=7;}if(gain0&lt;0){gain0=0;}}
  void treb_func(){if(treb&gt;7){treb=7;}if(treb&lt;-7){treb=-7;}}
  void bass_func(){if(bas&gt;7){bas=7;}if(bas&lt;-7){bas=-7;}}
  void audio(){
  tda.setInput(in,mute_mic,mic_gain); // INPUT SELECT &amp; MIC - установки входных цепей и микрофонного входа;
                       // INPUT SELECT 0...4 === IN1...IN4 - выбор входа;
                       // MUTE (IN5) 0 off 1 on (IN5) - при включении входы IN1...IN4 переходят в режим MUTE, в звуковом тракте остаётся микрофон (вход IN5), если он активирован;
                       // MIC 0...3 === gain 14dB...0dB // mic 4 === OFF - активация микрофонного входа (IN5) и установка предусиления для него;
///////////////////////////////////////////////////////////////       
  tda.setGain(gain0); // INPUT GAIN - установка предварительного усиления;
                      // gain 0...7 === 0...14 dB  step 2dB;
//////////////////////////////////////////////////////////////       
  tda.setSurround(sur_mode,sur_gain,mix,buff); // SURROUND - установки режима объёмного звука; 
                            // SURROUND MODE 1 on 0 off - активация режима объёмного звука;
                            // GAIN 0...3 === 0...12 dB - предусиление фазоинверторов перед подмешиванием сигнала в соседний канал;
                            // MIXING 0...7 === inverting 100%, 50%, 25%, 0%, non inverting 100%, 75%, 50%, mute - установка режима фазоинверторов;
                            // BUFFER GAIN 1...0 === 0dB...6dB - установка режима буферного каскада;    
  tda.setVol_R(vol+balanc); // VOLUME R 0...62 - регулирование уровня правого канала;
  tda.setVol_L(vol-balanc); // VOLUME L 0...62 - регулирование уровня левого канала;
  tda.setTreb_Bass(treb,bas); // TREBLE &amp; BASS SELECTION -14...14 step 2 dB - коррекция тона ВЧ-НЧ. Когда бас установлен в диапазоне-14dB...0dB, ALC автоматически переключается в положение &quot;OFF&quot;;
  tda.setOutput(mute); // OUTPUT - установка выхода;
                    // MUTE 0...1 === ON...OFF - активация режима MUTE для выхода всего звукового тракта;
  tda.setAlc(acl_mode,dec,cur,rez,mv,mod); // BASS ALC - установки автоматической регулировки уровня низких частот;
                           // ALC Mode 1 on 0 off - включение/выключение режима автоматического регулирования;
                           // Detector 1 on 0 off - включение/выключение детектора НЧ составляющей на выходе;
                           // Release Current Circuit 1 on 0 off - включение/выключение источника тока;
                           // Attack Time Resistor 0...3 === 12k5, 25k, 50k, 100k - резистор делителя, формирующего сигнал управления системой ALC;
                           // Threshold 0...3 === 700mVrms, 485mVrms, 320mVrms, 170mVrms, - пороговые уровни ограничения НЧ сигнала на выходе;
                           // Attack Mode - режим резистора делителя Attack Time Resistor - 0...1 === MODE 1: Fixed Resistor ... MODE 2: Adaptive - фиксированное значение/адаптивное значение;
}

void to_Timer(){newPosition = myEnc.read()/4;}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2020-12-19T07:47:43Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2695#p2695</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2688#p2688" />
			<content type="html"><![CDATA[<p>Доброго времени суток! В целом всё работает. Несколько мелочей:</p><p>1) показание баланса +0. Думаю просто ноль без плюса будет лучше;</p><p>2) в микрофонном подменю Mute Selection пультом сам режим переключается (Mute OFF/ON) - звук пропадает/появляется, а на экране остаётся Mute OFF. То есть переключение режима экран не отображает. При переключении кнопками - всё нормально, переключения отображаются на экране;</p><p>3) если я с ПУЛЬТА вхожу в меню выбора входов IN, то возврат в меню VOLUME происходит через 3 секунды в независимости от того, произвожу я регулировку уровня или нет. С энкодера - всё нормально, возврат происходит через 3 секунды при ОТСУТСТВИИ действий;</p><p>4) в нашем случае имеется режим POWER. Думаю, что логичнее было бы при включении питания процессора по умолчанию включать режим Power OFF. То есть я включаю устройство (подобно, например, DVD плееру или телевизору) и работа начинается с нажатия кнопки POWER на самом устройстве или с пульта.</p><br /><p>Ну и остался косяк, систему появления которого я не могу понять: вхожу в MENU высвечивается Selection Mic, Surround или Bass ALC и далее подменю не индицируется. Лечится нажатием на энкодер (в каждом меню жму энкодер и подменю появляется). Потом это пропадание может повториться просто в процессе работы, беспричинно, как мне кажется.</p>]]></content>
			<author>
				<name><![CDATA[dimb0t]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1083</uri>
			</author>
			<updated>2020-12-15T18:18:27Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2688#p2688</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2677#p2677" />
			<content type="html"><![CDATA[<p>Быстро &quot;пробежался&quot; - всё в норме. Покручу-поверчу подольше - отпишусь.</p>]]></content>
			<author>
				<name><![CDATA[dimb0t]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1083</uri>
			</author>
			<updated>2020-12-10T18:02:51Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2677#p2677</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2676#p2676" />
			<content type="html"><![CDATA[<p>Скетч использует 29274 байт (95%) памяти устройства. Всего доступно 30720 байт.<br />Глобальные переменные используют 1493 байт (72%) динамической памяти, оставляя 555 байт для локальных переменных. Максимум: 2048 байт.</p><div class="codebox"><pre><code>#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка &gt;
#define IR_4 0x2FDF20D // Кнопка &lt;
#define IR_5 0x2FD708F // Кнопка IN
#define IR_6 0x2FD6A95 // Кнопка MUTE
#define IR_7 0x2FD00FF // Кнопка POWER
#define IR_8 0x2FDB24D // Кнопка MENU

#include &lt;Wire.h&gt;
#include &lt;TDA7468.h&gt;  //-V2-// http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=892&amp;download=1
#include &lt;EEPROM.h&gt;
#include &lt;boarddefs.h&gt;
#include &lt;IRremote.h&gt; // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include &lt;Encoder.h&gt;  // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include &lt;MsTimer2.h&gt; // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include &lt;LiquidCrystal_I2C.h&gt; //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=45&amp;download=1
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  Encoder myEnc(8, 9);//CLK, DT
  TDA7468 tda;
  IRrecv irrecv(11);  //  D11 = IR
  decode_results ir;

  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}; 
  int power=0,menu,in,gain0,gain1,gain2,gain3,gain4,w,w2,www,vol,vol_d,z,z0,z1;
  int bas,treb,in_x,gain_d,menu_high,mute_mic,menu0,mic_gain,menu1,sur_mode,sur_gain;
  unsigned long oldPosition  = -999,newPosition,times,times1,times_in;
  int mix,buff,mod,rez,cur,dec,acl_mode,menu2,mv,mute=1,gr1,gr2,balanc;

  
void setup(){ 
   Wire.begin();
   Serial.begin(9600);irrecv.enableIRIn();
   MsTimer2::set(1, to_Timer);MsTimer2::start();
   lcd.init();lcd.backlight();irrecv.enableIRIn();
   pinMode(10,INPUT);   // SW кнопка энкодера
   pinMode(12,INPUT_PULLUP);   // INPUT LOW
   pinMode(A0,INPUT_PULLUP);   // INPUT HIGH
   pinMode(A1,INPUT_PULLUP);   // MUTE
   pinMode(A2,INPUT_PULLUP);   // POWER
   pinMode(3,OUTPUT); // выход IN5
   pinMode(2,OUTPUT); // выход POWER
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
   if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}} 
   in=EEPROM.read(0);vol=EEPROM.read(1);gain1=EEPROM.read(2);gain2=EEPROM.read(3);gain3=EEPROM.read(4);
   gain4=EEPROM.read(5);bas=EEPROM.read(6)-7;treb=EEPROM.read(7)-7;mute_mic=EEPROM.read(8);mic_gain=EEPROM.read(9);
   buff=EEPROM.read(10);mix=EEPROM.read(11);sur_mode=EEPROM.read(12);sur_gain=EEPROM.read(13); 
   mod=EEPROM.read(14);rez=EEPROM.read(15);cur=EEPROM.read(16);dec=EEPROM.read(17);
   acl_mode=EEPROM.read(18);mv=EEPROM.read(19);balanc=EEPROM.read(20)-4;
   audio();
}

void loop(){
  ////////////////////// IR /////////////////////////////////////////////////
  if ( irrecv.decode( &amp;ir )) {Serial.print(&quot;0x&quot;);Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
  
  //// POWER 
  if((digitalRead(A2)==LOW||ir.value==IR_7)&amp;&amp;power==0){power=1;cl();menu_high=100;mute=0;audio();lcd.print(&quot;   POWER OFF    &quot;);delay(1000);lcd.noBacklight();}
  if((digitalRead(A2)==LOW||ir.value==IR_7)&amp;&amp;power==1){power=0;cl();w=0;w2=1;mute=1;audio();lcd.backlight();lcd.print(&quot;   POWER  ON    &quot;);delay(1000);menu_high=0;menu=0;cl();}

  //// MUTE .......................................................................................................................
   if((digitalRead(A1)==LOW||ir.value==IR_6)&amp;&amp;mute==1&amp;&amp;power==0){mute=0;cl();w=0;w2=1;lcd.print(&quot;      MUTE     &quot;);menu_high=100;audio();delay(500);}// mute on
   if((digitalRead(A1)==LOW||ir.value==IR_6)&amp;&amp;mute==0&amp;&amp;power==0){mute=1;cl();times=millis();w=1;w2=1;menu=0;menu_high=0;audio();delay(500);}// mute off
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(mic_gain&lt;4){digitalWrite(3,HIGH);}else{digitalWrite(3,LOW);} // IN5
   if(power==0){digitalWrite(2,HIGH);}else{digitalWrite(2,LOW);}// POWER
   
 // HIGH MENU //////////////////////////
 if((digitalRead(A0)==LOW||ir.value==IR_8)&amp;&amp;power==0&amp;&amp;mute==1){menu_high++;cl();times=millis();w=1;w2=1,www=1;if(menu_high&gt;3){menu_high=0;}
 switch(menu_high){
  case 0:lcd.setCursor(5,0);lcd.print(&quot; MENU &quot;);lcd.setCursor(0,1);lcd.print(&quot;     VOLUME     &quot;);break;
  case 1:lcd.setCursor(5,0);lcd.print(&quot; MENU &quot;);lcd.setCursor(0,1);lcd.print(&quot; SELECTION  MIC &quot;);break;
  case 2:lcd.setCursor(5,0);lcd.print(&quot; MENU &quot;);lcd.setCursor(0,1);lcd.print(&quot;    SURROUND    &quot;);break;
  case 3:lcd.setCursor(5,0);lcd.print(&quot; MENU &quot;);lcd.setCursor(0,1);lcd.print(&quot;    BASS ALC    &quot;);break;
  }
 delay(1000);cl();}
 //////////////////////////////////////
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==0&amp;&amp;power==0&amp;&amp;mute==1){menu++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu&gt;3){menu=0;}}// LOW MENU VOLUME
   if(ir.value==IR_1 &amp;&amp; menu_high==0&amp;&amp;power==0&amp;&amp;mute==1){menu++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu&gt;3){menu=0;}}// LOW MENU VOLUME
   if(ir.value==IR_2 &amp;&amp; menu_high==0&amp;&amp;power==0&amp;&amp;mute==1){menu--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu&lt;0){menu=3;}}// LOW MENU VOLUME
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==1&amp;&amp;power==0&amp;&amp;mute==1){menu0++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu0&gt;1){menu0=0;}}// LOW MENU MIC
   if(ir.value==IR_1 &amp;&amp; menu_high==1&amp;&amp;power==0&amp;&amp;mute==1){menu0++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu0&gt;1){menu0=0;}}// LOW MENU MIC
   if(ir.value==IR_2 &amp;&amp; menu_high==1&amp;&amp;power==0&amp;&amp;mute==1){menu0--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu0&lt;0){menu0=1;}}// LOW MENU MIC
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==2&amp;&amp;power==0&amp;&amp;mute==1){menu1++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu1&gt;3){menu1=0;}}// LOW MENU SURROUND
   if(ir.value==IR_1 &amp;&amp; menu_high==2&amp;&amp;power==0&amp;&amp;mute==1){menu1++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu1&gt;3){menu1=0;}}// LOW MENU SURROUND
   if(ir.value==IR_2 &amp;&amp; menu_high==2&amp;&amp;power==0&amp;&amp;mute==1){menu1--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu1&lt;0){menu1=3;}}// LOW MENU SURROUND
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==3&amp;&amp;power==0&amp;&amp;mute==1){menu2++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu2&gt;5){menu2=0;}}// LOW MENU BASS ALC
   if(ir.value==IR_1 &amp;&amp; menu_high==3&amp;&amp;power==0&amp;&amp;mute==1){menu2++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu2&gt;5){menu2=0;}}// LOW MENU SURROUND
   if(ir.value==IR_2 &amp;&amp; menu_high==3&amp;&amp;power==0&amp;&amp;mute==1){menu2--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu2&lt;0){menu2=5;}}// LOW MENU SURROUND
 
 if((digitalRead(12)==LOW||ir.value==IR_5)&amp;&amp;power==0){if(in_x==1){in++;};cl();times_in=millis();in_x=1;w2=1;www=1;menu=100;if(in&gt;3){in=0;}}// INPUT

 if(menu_high==0){
  /////////////////////////////// VOLUME 0...62 ////////////////////////////////////////////////
 if(menu==0){
     if(ir.value==IR_3){vol++;opim1();vol_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();w=1;w2=1;;vol_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){vol--;opim1();vol_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();w=1;w2=1;vol_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
   
   if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print((&quot;VOLUME &quot;));
     if(vol&lt;10){lcd.setCursor(7,0);lcd.print(&quot; &quot;);}else{lcd.setCursor(8,0);}lcd.print(vol);
     vol_d=map(vol, 0,58, 0, 48);
     lcd.setCursor(12,0);
     switch(in){
      case 0: lcd.print((&quot;AUX1&quot;));break;
      case 1: lcd.print((&quot;AUX2&quot;));break;
      case 2: lcd.print((&quot;AUX3&quot;));break;
      case 3: lcd.print((&quot;AUX4&quot;));break;} 

   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=vol_d;z++,z1++){if(z1&gt;2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(F(&quot;   &quot;));}}
   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;}}
  ////////////////////// VOLUME END ////////////////////////////////////////////

  ///////////////////////// BASS +/-14 dB /////////////////////////////////////////////////////////
   if(menu==1){
     if(ir.value==IR_3){bas++;opim1();bass_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){bas++;gr2=0;cl1();w=1;w2=1;;bass_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){bas--;opim1();bass_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){bas--;gr1=0;cl1();w=1;w2=1;bass_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
     
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bas=bas+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;BASS    &quot;));
   if(bas*2&gt;=0){lcd.print(F(&quot;+&quot;));}lcd.print(bas*2);lcd.print(&quot; &quot;);lcd.setCursor(13,0);lcd.print(F(&quot;dB&quot;));
   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=(bas+1)*2+14;z++,z1++){if(z1&gt;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(F(&quot;   &quot;));}}
   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;}} 
  /////////////////////// END BASS //////////////////////////////////  

  ///////////////////////// TREBLE +/-14 dB /////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==IR_3){treb++;opim1();treb_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();w=1;w2=1;;treb_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){treb--;opim1();treb_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();w=1;w2=1;treb_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;TREBLE  &quot;));
   if(treb*2&gt;=0){lcd.print(F(&quot;+&quot;));}lcd.print(treb*2);lcd.print(&quot; &quot;);lcd.setCursor(13,0);lcd.print(F(&quot;dB&quot;));
   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=(treb+1)*2+14;z++,z1++){if(z1&gt;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(F(&quot;   &quot;));}}
   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;}} 
  /////////////////////// END TREBLE //////////////////////////////////

  ///////////////////////// BALANCE +/-4 dB /////////////////////////////////////////////////////////
   if(menu==3){
     if(ir.value==IR_3){balanc++;opim1();balanc_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){balanc++;gr2=0;cl1();w=1;w2=1;;balanc_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){balanc--;opim1();balanc_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){balanc--;gr1=0;cl1();w=1;w2=1;balanc_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balanc=balanc+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;balanc_func();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;BALANCE &quot;));
   if(balanc&gt;=0){lcd.print(F(&quot;+&quot;));}lcd.print(balanc);lcd.print(&quot; &quot;);lcd.setCursor(13,0);lcd.print(F(&quot;dB&quot;));
   if(w2==1){
   if(balanc&lt;0){lcd.setCursor(balanc-2+7,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   if(balanc==0){lcd.setCursor(balanc-2+7,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   if(balanc&gt;0){lcd.setCursor(balanc-2+8,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}w2=0;}} 
  /////////////////////// END BALANCE //////////////////////////////////
  
 } // end menu

  ////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu=100;menu0=100;menu1=100;menu2=100;
   switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain3;break;}

     if(ir.value==IR_3){gain0++;opim1();gain_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();w=1;w2=1;;gain_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){gain0--;opim1();gain_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();w=1;w2=1;gain_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;times=millis();times_in=millis();www=1;w=1;w2=1;gain_func();} 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain3 = gain0;break;}
  if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print(&quot;Gain AUX&quot;);lcd.print(in+1);lcd.setCursor(10,0);lcd.print(&quot; &quot;);lcd.print(gain0*2);lcd.print(&quot; &quot;);lcd.setCursor(14,0);lcd.print(&quot;dB&quot;);gain_d=gain0+1;
   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=gain_d*4;z++,z1++){if(z1&gt;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(&quot;   &quot;);}}
   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()-times_in&gt;3000){in_x=0;cl();w2=1;menu=0;menu_high=0;}}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

///// MENU MIC /////////////////////////////
 if(menu_high==1){
 if(menu0==0){
     if(ir.value==IR_3){mute_mic++;opim1();func_mic_gain();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mute_mic++;gr2=0;cl1();w=1;w2=1;;func_mic_gain();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mute_mic--;opim1();func_mic_gain();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mute_mic--;gr1=0;cl1();w=1;w2=1;func_mic_gain();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    mute_mic=mute_mic+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mic_mute();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot; MUTE SELECTION &quot;));
   if(mute_mic==1){lcd.setCursor(0,1);lcd.print((&quot;    MUTE ON     &quot;));}
              else{lcd.setCursor(0,1);lcd.print((&quot;    MUTE OFF    &quot;));}}
 /////////////////
 if(menu0==1){
     if(ir.value==IR_3){mic_gain++;opim1();func_mic_gain();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mic_gain++;gr2=0;cl1();w=1;w2=1;;func_mic_gain();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mic_gain--;opim1();func_mic_gain();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mic_gain--;gr1=0;cl1();w=1;w2=1;func_mic_gain();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    mic_gain=mic_gain+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mic_gain();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;   MUTE  GAIN   &quot;));
   switch(mic_gain){
    case 0: lcd.setCursor(0,1);lcd.print((&quot; MIC  GAIN 14 dB &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print((&quot; MIC  GAIN 10 dB &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print((&quot; MIC  GAIN  6 dB &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print((&quot; MIC  GAIN  0 dB &quot;));break; 
    case 4: lcd.setCursor(0,1);lcd.print((&quot;    MIC   OFF    &quot;));break;
    }}}
///////////////////////////////////////////
  
///// MENU SURROUND /////////////////////////////
 if(menu_high==2){
 if(menu1==0){
     if(ir.value==IR_3){sur_mode++;opim1();func_sur_mode();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){sur_mode++;gr2=0;cl1();w=1;w2=1;;func_sur_mode();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){sur_mode--;opim1();func_sur_mode();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){sur_mode--;gr1=0;cl1();w=1;w2=1;func_sur_mode();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    sur_mode=sur_mode+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_sur_mode();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;    SURROUND    &quot;));
   if(sur_mode==1){lcd.setCursor(0,1);lcd.print((&quot;       ON       &quot;));}
              else{lcd.setCursor(0,1);lcd.print((&quot;       OFF      &quot;));}}
 //////////
  if(menu1==1){
     if(ir.value==IR_3){sur_gain++;opim1();func_sur_gain();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){sur_gain++;gr2=0;cl1();w=1;w2=1;;func_sur_gain();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){sur_gain--;opim1();func_sur_gain();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){sur_gain--;gr1=0;cl1();w=1;w2=1;func_sur_gain();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
       
  if (newPosition != oldPosition){oldPosition = newPosition;
    sur_gain=sur_gain+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_sur_gain();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;    SURROUND    &quot;));
   switch(sur_gain){
    case 0: lcd.setCursor(0,1);lcd.print((&quot;   GAIN  0  dB   &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print((&quot;   GAIN  6  dB   &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print((&quot;   GAIN  9  dB   &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print((&quot;   GAIN  12 dB   &quot;));break; 
    }}   
  //////////
  if(menu1==2){
     if(ir.value==IR_3){mix++;opim1();func_mix();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mix++;gr2=0;cl1();w=1;w2=1;;func_mix();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mix--;opim1();func_mix();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mix--;gr1=0;cl1();w=1;w2=1;func_mix();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    mix=mix+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mix();audio();} 
  lcd.setCursor(0,0);lcd.print((&quot;     MIXING     &quot;));
   switch(mix){
    case 0: lcd.setCursor(0,1);lcd.print((&quot;inverting : 100%&quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print((&quot;inverting : 50% &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print((&quot;inverting : 25% &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print((&quot;inverting : 0%  &quot;));break; 
    case 4: lcd.setCursor(0,1);lcd.print((&quot;non-inver : 100%&quot;));break;
    case 5: lcd.setCursor(0,1);lcd.print((&quot;non-inver :  75%&quot;));break;
    case 6: lcd.setCursor(0,1);lcd.print((&quot;non-inver :  50%&quot;));break; 
    case 7: lcd.setCursor(0,1);lcd.print((&quot;      MUTE      &quot;));break; 
    }} 
  ////////
  if(menu1==3){
     if(ir.value==IR_3){buff++;opim1();func_buff();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){buff++;gr2=0;cl1();w=1;w2=1;;func_buff();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){buff--;opim1();func_buff();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){buff--;gr1=0;cl1();w=1;w2=1;func_buff();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    buff=buff+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_buff();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;  BUFFER GAIN   &quot;));
   if(buff==1){lcd.setCursor(0,1);lcd.print((&quot;      0 dB       &quot;));}
          else{lcd.setCursor(0,1);lcd.print((&quot;      6 dB       &quot;));}}
    }
///////////////////////////////////////////


///// MENU BASS ALC /////////////////////////////
 if(menu_high==3){
 if(menu2==0){
     if(ir.value==IR_3){acl_mode++;opim1();func_acl_mode();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){acl_mode++;gr2=0;cl1();w=1;w2=1;;func_acl_mode();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){acl_mode--;opim1();func_acl_mode();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){acl_mode--;gr1=0;cl1();w=1;w2=1;func_acl_mode();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    acl_mode=acl_mode+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_acl_mode();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;    ALC Mode    &quot;));
   if(acl_mode==1){lcd.setCursor(0,1);lcd.print((&quot;       ON       &quot;));}
              else{lcd.setCursor(0,1);lcd.print((&quot;       OFF      &quot;));}}
 //////////
  if(menu2==1){
     if(ir.value==IR_3){dec++;opim1();func_dec();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){dec++;gr2=0;cl1();w=1;w2=1;;func_dec();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){dec--;opim1();func_dec();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){dec--;gr1=0;cl1();w=1;w2=1;func_dec();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    dec=dec+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_dec();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;    Detector    &quot;));
   if(dec==1){lcd.setCursor(0,1);lcd.print((&quot;       ON       &quot;));}
         else{lcd.setCursor(0,1);lcd.print((&quot;       OFF      &quot;));}}
 //////////
   if(menu2==2){
     if(ir.value==IR_3){cur++;opim1();func_cur();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){cur++;gr2=0;cl1();w=1;w2=1;;func_cur();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){cur--;opim1();func_cur();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){cur--;gr1=0;cl1();w=1;w2=1;func_cur();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;   
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    cur=cur+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_cur();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;Release  Current&quot;));
   if(cur==1){lcd.setCursor(0,1);lcd.print((&quot;  Circuit  ON    &quot;));}
         else{lcd.setCursor(0,1);lcd.print((&quot;  Circuit  OFF   &quot;));}}
 //////////
  if(menu2==3){
     if(ir.value==IR_3){rez++;opim1();func_rez();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){rez++;gr2=0;cl1();w=1;w2=1;;func_rez();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){rez--;opim1();func_rez();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){rez--;gr1=0;cl1();w=1;w2=1;func_rez();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;   
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    rez=rez+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_rez();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;  Attack Time  &quot;));
   switch(rez){
    case 0: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 12.5k &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 25.0k &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 50.0k &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 100 k &quot;));break; 
    }}  
  //////////
  if(menu2==4){
     if(ir.value==IR_3){mv++;opim1();func_mv();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mv++;gr2=0;cl1();w=1;w2=1;;func_mv();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mv--;opim1();func_mv();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mv--;gr1=0;cl1();w=1;w2=1;func_mv();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;  
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    mv=mv+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mv();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;   Threshold    &quot;));
   switch(mv){
    case 0: lcd.setCursor(0,1);lcd.print(F(&quot;   700 mVrms   &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print(F(&quot;   485 mVrms   &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print(F(&quot;   320 mVrms   &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print(F(&quot;   170 mVrms   &quot;));break; 
    }} 
  ////////
  if(menu2==5){
     if(ir.value==IR_3){mod++;opim1();func_mod();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mod++;gr2=0;cl1();w=1;w2=1;;func_mod();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mod--;opim1();func_mod();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mod--;gr1=0;cl1();w=1;w2=1;func_mod();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;  
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    mod=mod+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mod();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;      MODE      &quot;));
   if(mod==0){lcd.setCursor(0,1);lcd.print(F(&quot; Fixed Resistor &quot;));}
         else{lcd.setCursor(0,1);lcd.print(F(&quot;    Adaptive    &quot;));}}
    }
///////////////////////////////////////////

  
 ////////////// EEPROM ///////////////////////////////////////////////////
 if(millis()-times&gt;20000 &amp;&amp; w==1 &amp;&amp; power==0){
     EEPROM.update(0,in);EEPROM.update(1,vol);
     EEPROM.update(2,gain1);EEPROM.update(3,gain2);EEPROM.update(4,gain3);EEPROM.update(5,gain4);
     EEPROM.update(6,bas+7);EEPROM.update(7,treb+7);EEPROM.update(8,mute_mic);EEPROM.update(9,mic_gain);
     EEPROM.update(10,buff);EEPROM.update(11,mix);EEPROM.update(12,sur_mode);EEPROM.update(13,sur_gain);
     EEPROM.update(14,mod);EEPROM.update(15,rez);EEPROM.update(16,cur);EEPROM.update(17,dec);
     EEPROM.update(18,acl_mode);EEPROM.update(19,mv);EEPROM.update(20,balanc+4);
     menu=0;w=0;w2=1;cl();menu_high=0;}
 
} 
  void opim1(){gr1=1;gr2=0;cl1();w=1;w2=1;}
  void func_mv(){if(mv&gt;3){mv=0;}if(mv&lt;0){mv=3;}}
  void func_mod(){if(mod&gt;1){mod=0;}if(mod&lt;0){mod=1;}}
  void func_rez(){if(rez&gt;3){rez=0;}if(rez&lt;0){rez=3;}}
  void func_cur(){if(cur&gt;1){cur=0;}if(cur&lt;0){cur=1;}}
  void func_dec(){if(dec&gt;1){dec=0;}if(dec&lt;0){dec=1;}}
  void func_acl_mode(){if(acl_mode&gt;1){acl_mode=0;}if(acl_mode&lt;0){acl_mode=1;}}
  void func_buff(){if(buff&gt;1){buff=0;}if(buff&lt;0){buff=1;}}
  void func_mix(){if(mix&gt;7){mix=0;}if(mix&lt;0){mix=7;}}
  void func_sur_gain(){if(sur_gain&gt;3){sur_gain=0;}if(sur_gain&lt;0){sur_gain=3;}}
  void func_sur_mode(){if(sur_mode&gt;1){sur_mode=0;}if(sur_mode&lt;0){sur_mode=1;}}
  void func_mic_gain(){if(mic_gain&gt;4){mic_gain=0;}if(mic_gain&lt;0){mic_gain=4;}}
  void func_mic_mute(){if(mute_mic&gt;1){mute_mic=0;}if(mute_mic&lt;0){mute_mic=1;}}
  void cl(){ir.value=0;delay(300);lcd.clear();}
  void cl1(){ir.value=0;delay(100);}
  void vol_func(){if(vol&gt;58){vol=58;}if(vol&lt;0){vol=0;}}
  void balanc_func(){if(balanc&gt;4){balanc=4;}if(balanc&lt;-4){balanc=-4;}}
  void gain_func(){if(gain0&gt;7){gain0=7;}if(gain0&lt;0){gain0=0;}}
  void treb_func(){if(treb&gt;7){treb=7;}if(treb&lt;-7){treb=-7;}}
  void bass_func(){if(bas&gt;7){bas=7;}if(bas&lt;-7){bas=-7;}}
  void audio(){
  tda.setInput(in,mute_mic,mic_gain); // INPUT SELECT &amp; MIC - установки входных цепей и микрофонного входа;
                       // INPUT SELECT 0...4 === IN1...IN4 - выбор входа;
                       // MUTE (IN5) 0 off 1 on (IN5) - при включении входы IN1...IN4 переходят в режим MUTE, в звуковом тракте остаётся микрофон (вход IN5), если он активирован;
                       // MIC 0...3 === gain 14dB...0dB // mic 4 === OFF - активация микрофонного входа (IN5) и установка предусиления для него;
///////////////////////////////////////////////////////////////       
  tda.setGain(gain0); // INPUT GAIN - установка предварительного усиления;
                      // gain 0...7 === 0...14 dB  step 2dB;
//////////////////////////////////////////////////////////////       
  tda.setSurround(sur_mode,sur_gain,mix,buff); // SURROUND - установки режима объёмного звука; 
                            // SURROUND MODE 1 on 0 off - активация режима объёмного звука;
                            // GAIN 0...3 === 0...12 dB - предусиление фазоинверторов перед подмешиванием сигнала в соседний канал;
                            // MIXING 0...7 === inverting 100%, 50%, 25%, 0%, non inverting 100%, 75%, 50%, mute - установка режима фазоинверторов;
                            // BUFFER GAIN 1...0 === 0dB...6dB - установка режима буферного каскада;    
  tda.setVol_R(vol+balanc); // VOLUME R 0...62 - регулирование уровня правого канала;
  tda.setVol_L(vol-balanc); // VOLUME L 0...62 - регулирование уровня левого канала;
  tda.setTreb_Bass(treb,bas); // TREBLE &amp; BASS SELECTION -14...14 step 2 dB - коррекция тона ВЧ-НЧ. Когда бас установлен в диапазоне-14dB...0dB, ALC автоматически переключается в положение &quot;OFF&quot;;
  tda.setOutput(mute); // OUTPUT - установка выхода;
                    // MUTE 0...1 === ON...OFF - активация режима MUTE для выхода всего звукового тракта;
  tda.setAlc(acl_mode,dec,cur,rez,mv,mod); // BASS ALC - установки автоматической регулировки уровня низких частот;
                           // ALC Mode 1 on 0 off - включение/выключение режима автоматического регулирования;
                           // Detector 1 on 0 off - включение/выключение детектора НЧ составляющей на выходе;
                           // Release Current Circuit 1 on 0 off - включение/выключение источника тока;
                           // Attack Time Resistor 0...3 === 12k5, 25k, 50k, 100k - резистор делителя, формирующего сигнал управления системой ALC;
                           // Threshold 0...3 === 700mVrms, 485mVrms, 320mVrms, 170mVrms, - пороговые уровни ограничения НЧ сигнала на выходе;
                           // Attack Mode - режим резистора делителя Attack Time Resistor - 0...1 === MODE 1: Fixed Resistor ... MODE 2: Adaptive - фиксированное значение/адаптивное значение;
}

void to_Timer(){newPosition = myEnc.read()/4;}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2020-12-10T17:36:41Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2676#p2676</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2675#p2675" />
			<content type="html"><![CDATA[<p>Сколько не хватает памяти?</p><p>nano<br />Скетч использует 30340 байт (98%) памяти устройства. Всего доступно 30720 байт.<br />Глобальные переменные используют 1493 байт (72%) динамической памяти, оставляя 555 байт для локальных переменных. Максимум: 2048 байт.</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2020-12-10T17:29:09Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2675#p2675</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2674#p2674" />
			<content type="html"><![CDATA[<p>снова та же ошибка</p>]]></content>
			<author>
				<name><![CDATA[dimb0t]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1083</uri>
			</author>
			<updated>2020-12-10T17:25:30Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2674#p2674</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2673#p2673" />
			<content type="html"><![CDATA[<p>Я поправил, у меня на nano компилируется, часть памяти для скетча перекинул в ОЗУ</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2020-12-10T17:18:18Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2673#p2673</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2672#p2672" />
			<content type="html"><![CDATA[<p>Думаю, можно и без баланса обойтись.</p>]]></content>
			<author>
				<name><![CDATA[dimb0t]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1083</uri>
			</author>
			<updated>2020-12-10T17:15:59Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2672#p2672</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2671#p2671" />
			<content type="html"><![CDATA[<p>Arduino: 1.8.13 (Linux), Плата:&quot;Arduino Nano, ATmega328P (Old Bootloader)&quot;</p><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><p>Скетч использует 30776 байт (100%) памяти устройства. Всего доступно 30720 байт.<br />Глобальные переменные используют 955 байт (46%) динамической памяти, оставляя 1093 байт для локальных переменных. Максимум: 2048 байт.<br />Скетч слишком большой; прочитайте <a href="http://www.arduino.cc/en/Guide/Troubleshooting#size">http://www.arduino.cc/en/Guide/Troubleshooting#size</a><br />text section exceeds available space in board<br />Ошибка компиляции для платы Arduino Nano.</p><br /><p>Этот отчёт будет иметь больше информации с<br />включенной опцией Файл -&gt; Настройки -&gt;<br />&quot;Показать подробный вывод во время компиляции&quot;</p>]]></content>
			<author>
				<name><![CDATA[dimb0t]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1083</uri>
			</author>
			<updated>2020-12-10T17:14:44Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2671#p2671</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2670#p2670" />
			<content type="html"><![CDATA[<p>Я забрал 4 дБ у громкости для баланса, будет немного тише при максимуме громкости.</p><div class="codebox"><pre><code>#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка &gt;
#define IR_4 0x2FDF20D // Кнопка &lt;
#define IR_5 0x2FD708F // Кнопка IN
#define IR_6 0x2FD6A95 // Кнопка MUTE
#define IR_7 0x2FD00FF // Кнопка POWER
#define IR_8 0x2FDB24D // Кнопка MENU

#include &lt;Wire.h&gt;
#include &lt;TDA7468.h&gt;  //-V2-// http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=892&amp;download=1
#include &lt;EEPROM.h&gt;
#include &lt;boarddefs.h&gt;
#include &lt;IRremote.h&gt; // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include &lt;Encoder.h&gt;  // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include &lt;MsTimer2.h&gt; // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include &lt;LiquidCrystal_I2C.h&gt; //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=45&amp;download=1
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  Encoder myEnc(8, 9);//CLK, DT
  TDA7468 tda;
  IRrecv irrecv(11);  //  D11 = IR
  decode_results ir;

  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}; 
  int power=0,menu,in,gain0,gain1,gain2,gain3,gain4,w,w2,www,vol,vol_d,z,z0,z1;
  int bas,treb,in_x,gain_d,menu_high,mute_mic,menu0,mic_gain,menu1,sur_mode,sur_gain;
  unsigned long oldPosition  = -999,newPosition,times,times1,times_in;
  int mix,buff,mod,rez,cur,dec,acl_mode,menu2,mv,mute=1,gr1,gr2,balanc;

  
void setup(){ 
   Wire.begin();
   Serial.begin(9600);irrecv.enableIRIn();
   MsTimer2::set(1, to_Timer);MsTimer2::start();
   lcd.init();lcd.backlight();irrecv.enableIRIn();
   pinMode(10,INPUT);   // SW кнопка энкодера
   pinMode(12,INPUT_PULLUP);   // INPUT LOW
   pinMode(A0,INPUT_PULLUP);   // INPUT HIGH
   pinMode(A1,INPUT_PULLUP);   // MUTE
   pinMode(A2,INPUT_PULLUP);   // POWER
   pinMode(3,OUTPUT); // выход IN5
   pinMode(2,OUTPUT); // выход POWER
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
   if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}} 
   in=EEPROM.read(0);vol=EEPROM.read(1);gain1=EEPROM.read(2);gain2=EEPROM.read(3);gain3=EEPROM.read(4);
   gain4=EEPROM.read(5);bas=EEPROM.read(6)-7;treb=EEPROM.read(7)-7;mute_mic=EEPROM.read(8);mic_gain=EEPROM.read(9);
   buff=EEPROM.read(10);mix=EEPROM.read(11);sur_mode=EEPROM.read(12);sur_gain=EEPROM.read(13); 
   mod=EEPROM.read(14);rez=EEPROM.read(15);cur=EEPROM.read(16);dec=EEPROM.read(17);
   acl_mode=EEPROM.read(18);mv=EEPROM.read(19);balanc=EEPROM.read(20)-4;
   audio();
}

void loop(){
  ////////////////////// IR /////////////////////////////////////////////////
  if ( irrecv.decode( &amp;ir )) {Serial.print(&quot;0x&quot;);Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
  
  //// POWER 
  if((digitalRead(A2)==LOW||ir.value==IR_7)&amp;&amp;power==0){power=1;cl();menu_high=100;mute=0;audio();lcd.print(&quot;   POWER OFF    &quot;);delay(1000);lcd.noBacklight();}
  if((digitalRead(A2)==LOW||ir.value==IR_7)&amp;&amp;power==1){power=0;cl();w=0;w2=1;mute=1;audio();lcd.backlight();lcd.print(&quot;   POWER  ON    &quot;);delay(1000);menu_high=0;menu=0;cl();}

  //// MUTE .......................................................................................................................
   if((digitalRead(A1)==LOW||ir.value==IR_6)&amp;&amp;mute==1&amp;&amp;power==0){mute=0;cl();w=0;w2=1;lcd.print(&quot;      MUTE     &quot;);menu_high=100;audio();delay(500);}// mute on
   if((digitalRead(A1)==LOW||ir.value==IR_6)&amp;&amp;mute==0&amp;&amp;power==0){mute=1;cl();times=millis();w=1;w2=1;menu=0;menu_high=0;audio();delay(500);}// mute off
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(mic_gain&lt;4){digitalWrite(3,HIGH);}else{digitalWrite(3,LOW);} // IN5
   if(power==0){digitalWrite(2,HIGH);}else{digitalWrite(2,LOW);}// POWER
   
 // HIGH MENU //////////////////////////
 if((digitalRead(A0)==LOW||ir.value==IR_8)&amp;&amp;power==0&amp;&amp;mute==1){menu_high++;cl();times=millis();w=1;w2=1,www=1;if(menu_high&gt;3){menu_high=0;}
 switch(menu_high){
  case 0:lcd.setCursor(5,0);lcd.print(&quot; MENU &quot;);lcd.setCursor(0,1);lcd.print(&quot;     VOLUME     &quot;);break;
  case 1:lcd.setCursor(5,0);lcd.print(&quot; MENU &quot;);lcd.setCursor(0,1);lcd.print(&quot; SELECTION  MIC &quot;);break;
  case 2:lcd.setCursor(5,0);lcd.print(&quot; MENU &quot;);lcd.setCursor(0,1);lcd.print(&quot;    SURROUND    &quot;);break;
  case 3:lcd.setCursor(5,0);lcd.print(&quot; MENU &quot;);lcd.setCursor(0,1);lcd.print(&quot;    BASS ALC    &quot;);break;
  }
 delay(1000);cl();}
 //////////////////////////////////////
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==0&amp;&amp;power==0&amp;&amp;mute==1){menu++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu&gt;3){menu=0;}}// LOW MENU VOLUME
   if(ir.value==IR_1 &amp;&amp; menu_high==0&amp;&amp;power==0&amp;&amp;mute==1){menu++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu&gt;3){menu=0;}}// LOW MENU VOLUME
   if(ir.value==IR_2 &amp;&amp; menu_high==0&amp;&amp;power==0&amp;&amp;mute==1){menu--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu&lt;0){menu=3;}}// LOW MENU VOLUME
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==1&amp;&amp;power==0&amp;&amp;mute==1){menu0++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu0&gt;1){menu0=0;}}// LOW MENU MIC
   if(ir.value==IR_1 &amp;&amp; menu_high==1&amp;&amp;power==0&amp;&amp;mute==1){menu0++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu0&gt;1){menu0=0;}}// LOW MENU MIC
   if(ir.value==IR_2 &amp;&amp; menu_high==1&amp;&amp;power==0&amp;&amp;mute==1){menu0--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu0&lt;0){menu0=1;}}// LOW MENU MIC
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==2&amp;&amp;power==0&amp;&amp;mute==1){menu1++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu1&gt;3){menu1=0;}}// LOW MENU SURROUND
   if(ir.value==IR_1 &amp;&amp; menu_high==2&amp;&amp;power==0&amp;&amp;mute==1){menu1++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu1&gt;3){menu1=0;}}// LOW MENU SURROUND
   if(ir.value==IR_2 &amp;&amp; menu_high==2&amp;&amp;power==0&amp;&amp;mute==1){menu1--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu1&lt;0){menu1=3;}}// LOW MENU SURROUND
 
 if(digitalRead(10)==LOW &amp;&amp; menu_high==3&amp;&amp;power==0&amp;&amp;mute==1){menu2++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu2&gt;5){menu2=0;}}// LOW MENU BASS ALC
   if(ir.value==IR_1 &amp;&amp; menu_high==3&amp;&amp;power==0&amp;&amp;mute==1){menu2++;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu2&gt;5){menu2=0;}}// LOW MENU SURROUND
   if(ir.value==IR_2 &amp;&amp; menu_high==3&amp;&amp;power==0&amp;&amp;mute==1){menu2--;cl();delay(200);times=millis();w=1;w2=1,www=1;if(menu2&lt;0){menu2=5;}}// LOW MENU SURROUND
 
 if((digitalRead(12)==LOW||ir.value==IR_5)&amp;&amp;power==0){if(in_x==1){in++;};cl();times_in=millis();in_x=1;w2=1;www=1;menu=100;if(in&gt;3){in=0;}}// INPUT

 if(menu_high==0){
  /////////////////////////////// VOLUME 0...62 ////////////////////////////////////////////////
 if(menu==0){
     if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl1();w=1;w2=1;vol_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();w=1;w2=1;;vol_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl1();w=1;w2=1;vol_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();w=1;w2=1;vol_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
   
   if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print((&quot;VOLUME &quot;));
     if(vol&lt;10){lcd.setCursor(7,0);lcd.print(&quot; &quot;);}else{lcd.setCursor(8,0);}lcd.print(vol);
     vol_d=map(vol, 0,58, 0, 48);
     lcd.setCursor(12,0);
     switch(in){
      case 0: lcd.print(F(&quot;AUX1&quot;));break;
      case 1: lcd.print(F(&quot;AUX2&quot;));break;
      case 2: lcd.print(F(&quot;AUX3&quot;));break;
      case 3: lcd.print(F(&quot;AUX4&quot;));break;} 

   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=vol_d;z++,z1++){if(z1&gt;2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(F(&quot;   &quot;));}}
   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;}}
  ////////////////////// VOLUME END ////////////////////////////////////////////

  ///////////////////////// BASS +/-14 dB /////////////////////////////////////////////////////////
   if(menu==1){
     if(ir.value==IR_3){bas++;gr1=1;gr2=0;cl1();w=1;w2=1;bass_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){bas++;gr2=0;cl1();w=1;w2=1;;bass_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){bas--;gr1=0;gr2=1;cl1();w=1;w2=1;bass_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){bas--;gr1=0;cl1();w=1;w2=1;bass_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
     
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bas=bas+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;BASS    &quot;));
   if(bas*2&gt;=0){lcd.print(F(&quot;+&quot;));}lcd.print(bas*2);lcd.print(&quot; &quot;);lcd.setCursor(13,0);lcd.print(F(&quot;dB&quot;));
   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=(bas+1)*2+14;z++,z1++){if(z1&gt;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(F(&quot;   &quot;));}}
   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;}} 
  /////////////////////// END BASS //////////////////////////////////  

  ///////////////////////// TREBLE +/-14 dB /////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==IR_3){treb++;gr1=1;gr2=0;cl1();w=1;w2=1;treb_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();w=1;w2=1;;treb_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){treb--;gr1=0;gr2=1;cl1();w=1;w2=1;treb_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();w=1;w2=1;treb_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;TREBLE  &quot;));
   if(treb*2&gt;=0){lcd.print(F(&quot;+&quot;));}lcd.print(treb*2);lcd.print(&quot; &quot;);lcd.setCursor(13,0);lcd.print(F(&quot;dB&quot;));
   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=(treb+1)*2+14;z++,z1++){if(z1&gt;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(F(&quot;   &quot;));}}
   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;}} 
  /////////////////////// END TREBLE //////////////////////////////////

  ///////////////////////// BALANCE +/-4 dB /////////////////////////////////////////////////////////
   if(menu==3){
     if(ir.value==IR_3){balanc++;gr1=1;gr2=0;cl1();w=1;w2=1;balanc_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){balanc++;gr2=0;cl1();w=1;w2=1;;balanc_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){balanc--;gr1=0;gr2=1;cl1();w=1;w2=1;balanc_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){balanc--;gr1=0;cl1();w=1;w2=1;balanc_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
   if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balanc=balanc+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;balanc_func();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot;BALANCE &quot;));
   if(balanc&gt;=0){lcd.print(F(&quot;+&quot;));}lcd.print(balanc);lcd.print(&quot; &quot;);lcd.setCursor(13,0);lcd.print(F(&quot;dB&quot;));
   if(w2==1){
   if(balanc&lt;0){lcd.setCursor(balanc-2+7,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   if(balanc==0){lcd.setCursor(balanc-2+7,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   if(balanc&gt;0){lcd.setCursor(balanc-2+8,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}w2=0;}} 
  /////////////////////// END BALANCE //////////////////////////////////
  
 } // end menu

  ////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu=100;menu0=100;menu1=100;menu2=100;
   switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain3;break;}

     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();w=1;w2=1;gain_func();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();w=1;w2=1;;gain_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();w=1;w2=1;gain_func();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();w=1;w2=1;gain_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;times=millis();times_in=millis();www=1;w=1;w2=1;gain_func();} 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain3 = gain0;break;}
  if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print(&quot;Gain AUX&quot;);lcd.print(in+1);lcd.setCursor(10,0);lcd.print(&quot; &quot;);lcd.print(gain0*2);lcd.print(&quot; &quot;);lcd.setCursor(14,0);lcd.print(&quot;dB&quot;);gain_d=gain0+1;
   if(w2==1){
   for(z=0,z0=0,z1=0;z&lt;=gain_d*4;z++,z1++){if(z1&gt;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(&quot;   &quot;);}}
   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()-times_in&gt;3000){in_x=0;cl();w2=1;menu=0;menu_high=0;}}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

///// MENU MIC /////////////////////////////
 if(menu_high==1){
 if(menu0==0){
     if(ir.value==IR_3){mute_mic++;gr1=1;gr2=0;cl1();w=1;w2=1;func_mic_gain();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mute_mic++;gr2=0;cl1();w=1;w2=1;;func_mic_gain();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mute_mic--;gr1=0;gr2=1;cl1();w=1;w2=1;func_mic_gain();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mute_mic--;gr1=0;cl1();w=1;w2=1;func_mic_gain();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    mute_mic=mute_mic+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mic_mute();audio();} 
   lcd.setCursor(0,0);lcd.print((&quot; MUTE SELECTION &quot;));
   if(mute_mic==1){lcd.setCursor(0,1);lcd.print((&quot;    MUTE ON     &quot;));}
              else{lcd.setCursor(0,1);lcd.print((&quot;    MUTE OFF    &quot;));}}
 /////////////////
 if(menu0==1){
     if(ir.value==IR_3){mic_gain++;gr1=1;gr2=0;cl1();w=1;w2=1;func_mic_gain();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mic_gain++;gr2=0;cl1();w=1;w2=1;;func_mic_gain();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mic_gain--;gr1=0;gr2=1;cl1();w=1;w2=1;func_mic_gain();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mic_gain--;gr1=0;cl1();w=1;w2=1;func_mic_gain();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    mic_gain=mic_gain+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mic_gain();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;   MUTE  GAIN   &quot;));
   switch(mic_gain){
    case 0: lcd.setCursor(0,1);lcd.print(F(&quot; MIC  GAIN 14 dB &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print(F(&quot; MIC  GAIN 10 dB &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print(F(&quot; MIC  GAIN  6 dB &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print(F(&quot; MIC  GAIN  0 dB &quot;));break; 
    case 4: lcd.setCursor(0,1);lcd.print(F(&quot;    MIC   OFF    &quot;));break;
    }}}
///////////////////////////////////////////
  
///// MENU SURROUND /////////////////////////////
 if(menu_high==2){
 if(menu1==0){
     if(ir.value==IR_3){sur_mode++;gr1=1;gr2=0;cl1();w=1;w2=1;func_sur_mode();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){sur_mode++;gr2=0;cl1();w=1;w2=1;;func_sur_mode();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){sur_mode--;gr1=0;gr2=1;cl1();w=1;w2=1;func_sur_mode();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){sur_mode--;gr1=0;cl1();w=1;w2=1;func_sur_mode();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    sur_mode=sur_mode+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_sur_mode();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;    SURROUND    &quot;));
   if(sur_mode==1){lcd.setCursor(0,1);lcd.print(F(&quot;       ON       &quot;));}
              else{lcd.setCursor(0,1);lcd.print(F(&quot;       OFF      &quot;));}}
 //////////
  if(menu1==1){
     if(ir.value==IR_3){sur_gain++;gr1=1;gr2=0;cl1();w=1;w2=1;func_sur_gain();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){sur_gain++;gr2=0;cl1();w=1;w2=1;;func_sur_gain();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){sur_gain--;gr1=0;gr2=1;cl1();w=1;w2=1;func_sur_gain();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){sur_gain--;gr1=0;cl1();w=1;w2=1;func_sur_gain();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
       
  if (newPosition != oldPosition){oldPosition = newPosition;
    sur_gain=sur_gain+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_sur_gain();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;    SURROUND    &quot;));
   switch(sur_gain){
    case 0: lcd.setCursor(0,1);lcd.print(F(&quot;   GAIN  0  dB   &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print(F(&quot;   GAIN  6  dB   &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print(F(&quot;   GAIN  9  dB   &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print(F(&quot;   GAIN  12 dB   &quot;));break; 
    }}   
  //////////
  if(menu1==2){
     if(ir.value==IR_3){mix++;gr1=1;gr2=0;cl1();w=1;w2=1;func_mix();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mix++;gr2=0;cl1();w=1;w2=1;;func_mix();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mix--;gr1=0;gr2=1;cl1();w=1;w2=1;func_mix();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mix--;gr1=0;cl1();w=1;w2=1;func_mix();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    mix=mix+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mix();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;     MIXING     &quot;));
   switch(mix){
    case 0: lcd.setCursor(0,1);lcd.print(F(&quot;inverting : 100%&quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print(F(&quot;inverting : 50% &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print(F(&quot;inverting : 25% &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print(F(&quot;inverting : 0%  &quot;));break; 
    case 4: lcd.setCursor(0,1);lcd.print(F(&quot;non-inver : 100%&quot;));break;
    case 5: lcd.setCursor(0,1);lcd.print(F(&quot;non-inver :  75%&quot;));break;
    case 6: lcd.setCursor(0,1);lcd.print(F(&quot;non-inver :  50%&quot;));break; 
    case 7: lcd.setCursor(0,1);lcd.print(F(&quot;      MUTE      &quot;));break; 
    }} 
  ////////
  if(menu1==3){
     if(ir.value==IR_3){buff++;gr1=1;gr2=0;cl1();w=1;w2=1;func_buff();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){buff++;gr2=0;cl1();w=1;w2=1;;func_buff();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){buff--;gr1=0;gr2=1;cl1();w=1;w2=1;func_buff();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){buff--;gr1=0;cl1();w=1;w2=1;func_buff();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    buff=buff+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_buff();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;  BUFFER GAIN   &quot;));
   if(buff==1){lcd.setCursor(0,1);lcd.print(F(&quot;      0 dB       &quot;));}
          else{lcd.setCursor(0,1);lcd.print(F(&quot;      6 dB       &quot;));}}
    }
///////////////////////////////////////////


///// MENU BASS ALC /////////////////////////////
 if(menu_high==3){
 if(menu2==0){
     if(ir.value==IR_3){acl_mode++;gr1=1;gr2=0;cl1();w=1;w2=1;func_acl_mode();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){acl_mode++;gr2=0;cl1();w=1;w2=1;;func_acl_mode();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){acl_mode--;gr1=0;gr2=1;cl1();w=1;w2=1;func_acl_mode();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){acl_mode--;gr1=0;cl1();w=1;w2=1;func_acl_mode();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
  
  if (newPosition != oldPosition){oldPosition = newPosition;
    acl_mode=acl_mode+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_acl_mode();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;    ALC Mode    &quot;));
   if(acl_mode==1){lcd.setCursor(0,1);lcd.print(F(&quot;       ON       &quot;));}
              else{lcd.setCursor(0,1);lcd.print(F(&quot;       OFF      &quot;));}}
 //////////
  if(menu2==1){
     if(ir.value==IR_3){dec++;gr1=1;gr2=0;cl1();w=1;w2=1;func_dec();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){dec++;gr2=0;cl1();w=1;w2=1;;func_dec();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){dec--;gr1=0;gr2=1;cl1();w=1;w2=1;func_dec();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){dec--;gr1=0;cl1();w=1;w2=1;func_dec();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    dec=dec+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_dec();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;    Detector    &quot;));
   if(dec==1){lcd.setCursor(0,1);lcd.print(F(&quot;       ON       &quot;));}
         else{lcd.setCursor(0,1);lcd.print(F(&quot;       OFF      &quot;));}}
 //////////
   if(menu2==2){
     if(ir.value==IR_3){cur++;gr1=1;gr2=0;cl1();w=1;w2=1;func_cur();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){cur++;gr2=0;cl1();w=1;w2=1;;func_cur();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){cur--;gr1=0;gr2=1;cl1();w=1;w2=1;func_cur();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){cur--;gr1=0;cl1();w=1;w2=1;func_cur();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;   
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    cur=cur+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_cur();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;Release  Current&quot;));
   if(cur==1){lcd.setCursor(0,1);lcd.print(F(&quot;  Circuit  ON    &quot;));}
         else{lcd.setCursor(0,1);lcd.print(F(&quot;  Circuit  OFF   &quot;));}}
 //////////
  if(menu2==3){
     if(ir.value==IR_3){rez++;gr1=1;gr2=0;cl1();w=1;w2=1;func_rez();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){rez++;gr2=0;cl1();w=1;w2=1;;func_rez();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){rez--;gr1=0;gr2=1;cl1();w=1;w2=1;func_rez();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){rez--;gr1=0;cl1();w=1;w2=1;func_rez();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;   
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    rez=rez+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_rez();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;  Attack Time  &quot;));
   switch(rez){
    case 0: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 12.5k &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 25.0k &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 50.0k &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print(F(&quot; Resistor 100 k &quot;));break; 
    }}  
  //////////
  if(menu2==4){
     if(ir.value==IR_3){mv++;gr1=1;gr2=0;cl1();w=1;w2=1;func_mv();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mv++;gr2=0;cl1();w=1;w2=1;;func_mv();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mv--;gr1=0;gr2=1;cl1();w=1;w2=1;func_mv();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mv--;gr1=0;cl1();w=1;w2=1;func_mv();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;  
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    mv=mv+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mv();audio();} 
  lcd.setCursor(0,0);lcd.print(F(&quot;   Threshold    &quot;));
   switch(mv){
    case 0: lcd.setCursor(0,1);lcd.print(F(&quot;   700 mVrms   &quot;));break;
    case 1: lcd.setCursor(0,1);lcd.print(F(&quot;   485 mVrms   &quot;));break;
    case 2: lcd.setCursor(0,1);lcd.print(F(&quot;   320 mVrms   &quot;));break;
    case 3: lcd.setCursor(0,1);lcd.print(F(&quot;   170 mVrms   &quot;));break; 
    }} 
  ////////
  if(menu2==5){
     if(ir.value==IR_3){mod++;gr1=1;gr2=0;cl1();w=1;w2=1;func_mod();audio();}// кнопка &gt; 
     if(ir.value==0xFFFFFFFF and gr1==1){mod++;gr2=0;cl1();w=1;w2=1;;func_mod();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
     if(ir.value==IR_4){mod--;gr1=0;gr2=1;cl1();w=1;w2=1;func_mod();audio();}// кнопка &lt;
     if(ir.value==0xFFFFFFFF and gr2==1){mod--;gr1=0;cl1();w=1;w2=1;func_mod();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;  
    
  if (newPosition != oldPosition){oldPosition = newPosition;
    mod=mod+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;func_mod();audio();} 
   lcd.setCursor(0,0);lcd.print(F(&quot;      MODE      &quot;));
   if(mod==0){lcd.setCursor(0,1);lcd.print(F(&quot; Fixed Resistor &quot;));}
         else{lcd.setCursor(0,1);lcd.print(F(&quot;    Adaptive    &quot;));}}
    }
///////////////////////////////////////////

  
 ////////////// EEPROM ///////////////////////////////////////////////////
 if(millis()-times&gt;20000 &amp;&amp; w==1 &amp;&amp; power==0){
     EEPROM.update(0,in);EEPROM.update(1,vol);
     EEPROM.update(2,gain1);EEPROM.update(3,gain2);EEPROM.update(4,gain3);EEPROM.update(5,gain4);
     EEPROM.update(6,bas+7);EEPROM.update(7,treb+7);EEPROM.update(8,mute_mic);EEPROM.update(9,mic_gain);
     EEPROM.update(10,buff);EEPROM.update(11,mix);EEPROM.update(12,sur_mode);EEPROM.update(13,sur_gain);
     EEPROM.update(14,mod);EEPROM.update(15,rez);EEPROM.update(16,cur);EEPROM.update(17,dec);
     EEPROM.update(18,acl_mode);EEPROM.update(19,mv);EEPROM.update(20,balanc+4);
     menu=0;w=0;w2=1;cl();menu_high=0;}
 
} 
  void func_mv(){if(mv&gt;3){mv=0;}if(mv&lt;0){mv=3;}}
  void func_mod(){if(mod&gt;1){mod=0;}if(mod&lt;0){mod=1;}}
  void func_rez(){if(rez&gt;3){rez=0;}if(rez&lt;0){rez=3;}}
  void func_cur(){if(cur&gt;1){cur=0;}if(cur&lt;0){cur=1;}}
  void func_dec(){if(dec&gt;1){dec=0;}if(dec&lt;0){dec=1;}}
  void func_acl_mode(){if(acl_mode&gt;1){acl_mode=0;}if(acl_mode&lt;0){acl_mode=1;}}
  void func_buff(){if(buff&gt;1){buff=0;}if(buff&lt;0){buff=1;}}
  void func_mix(){if(mix&gt;7){mix=0;}if(mix&lt;0){mix=7;}}
  void func_sur_gain(){if(sur_gain&gt;3){sur_gain=0;}if(sur_gain&lt;0){sur_gain=3;}}
  void func_sur_mode(){if(sur_mode&gt;1){sur_mode=0;}if(sur_mode&lt;0){sur_mode=1;}}
  void func_mic_gain(){if(mic_gain&gt;4){mic_gain=0;}if(mic_gain&lt;0){mic_gain=4;}}
  void func_mic_mute(){if(mute_mic&gt;1){mute_mic=0;}if(mute_mic&lt;0){mute_mic=1;}}
  void cl(){ir.value=0;delay(300);lcd.clear();}
  void cl1(){ir.value=0;delay(100);}
  void vol_func(){if(vol&gt;58){vol=58;}if(vol&lt;0){vol=0;}}
  void balanc_func(){if(balanc&gt;4){balanc=4;}if(balanc&lt;-4){balanc=-4;}}
  void gain_func(){if(gain0&gt;7){gain0=7;}if(gain0&lt;0){gain0=0;}}
  void treb_func(){if(treb&gt;7){treb=7;}if(treb&lt;-7){treb=-7;}}
  void bass_func(){if(bas&gt;7){bas=7;}if(bas&lt;-7){bas=-7;}}
  void audio(){
  tda.setInput(in,mute_mic,mic_gain); // INPUT SELECT &amp; MIC - установки входных цепей и микрофонного входа;
                       // INPUT SELECT 0...4 === IN1...IN4 - выбор входа;
                       // MUTE (IN5) 0 off 1 on (IN5) - при включении входы IN1...IN4 переходят в режим MUTE, в звуковом тракте остаётся микрофон (вход IN5), если он активирован;
                       // MIC 0...3 === gain 14dB...0dB // mic 4 === OFF - активация микрофонного входа (IN5) и установка предусиления для него;
///////////////////////////////////////////////////////////////       
  tda.setGain(gain0); // INPUT GAIN - установка предварительного усиления;
                      // gain 0...7 === 0...14 dB  step 2dB;
//////////////////////////////////////////////////////////////       
  tda.setSurround(sur_mode,sur_gain,mix,buff); // SURROUND - установки режима объёмного звука; 
                            // SURROUND MODE 1 on 0 off - активация режима объёмного звука;
                            // GAIN 0...3 === 0...12 dB - предусиление фазоинверторов перед подмешиванием сигнала в соседний канал;
                            // MIXING 0...7 === inverting 100%, 50%, 25%, 0%, non inverting 100%, 75%, 50%, mute - установка режима фазоинверторов;
                            // BUFFER GAIN 1...0 === 0dB...6dB - установка режима буферного каскада;    
  tda.setVol_R(vol+balanc); // VOLUME R 0...62 - регулирование уровня правого канала;
  tda.setVol_L(vol-balanc); // VOLUME L 0...62 - регулирование уровня левого канала;
  tda.setTreb_Bass(treb,bas); // TREBLE &amp; BASS SELECTION -14...14 step 2 dB - коррекция тона ВЧ-НЧ. Когда бас установлен в диапазоне-14dB...0dB, ALC автоматически переключается в положение &quot;OFF&quot;;
  tda.setOutput(mute); // OUTPUT - установка выхода;
                    // MUTE 0...1 === ON...OFF - активация режима MUTE для выхода всего звукового тракта;
  tda.setAlc(acl_mode,dec,cur,rez,mv,mod); // BASS ALC - установки автоматической регулировки уровня низких частот;
                           // ALC Mode 1 on 0 off - включение/выключение режима автоматического регулирования;
                           // Detector 1 on 0 off - включение/выключение детектора НЧ составляющей на выходе;
                           // Release Current Circuit 1 on 0 off - включение/выключение источника тока;
                           // Attack Time Resistor 0...3 === 12k5, 25k, 50k, 100k - резистор делителя, формирующего сигнал управления системой ALC;
                           // Threshold 0...3 === 700mVrms, 485mVrms, 320mVrms, 170mVrms, - пороговые уровни ограничения НЧ сигнала на выходе;
                           // Attack Mode - режим резистора делителя Attack Time Resistor - 0...1 === MODE 1: Fixed Resistor ... MODE 2: Adaptive - фиксированное значение/адаптивное значение;
}

void to_Timer(){newPosition = myEnc.read()/4;}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2020-12-10T17:06:52Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2670#p2670</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2669#p2669" />
			<content type="html"><![CDATA[<p>Как по мне, так без разницы, меню громкость-тембр маленькое. Пускай будет в конце. Тембром чаще пользуются. А баланс это не совсем настройка. Это больше подстройка.</p>]]></content>
			<author>
				<name><![CDATA[dimb0t]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1083</uri>
			</author>
			<updated>2020-12-10T16:55:55Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2669#p2669</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2668#p2668" />
			<content type="html"><![CDATA[<p>В каком порядке сделать баланс, сразу после громкости или после тембров?</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2020-12-10T16:49:39Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2668#p2668</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: TDA7468 - обновленная библиотека (полный функционал)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=2667#p2667" />
			<content type="html"><![CDATA[<p>Да. Проверил. Работает.</p>]]></content>
			<author>
				<name><![CDATA[dimb0t]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1083</uri>
			</author>
			<updated>2020-12-10T16:47:06Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=2667#p2667</id>
		</entry>
</feed>
