<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; PGA2311+ arduino+encoder]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=569&amp;type=atom" />
	<updated>2024-01-26T07:03:09Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=569</id>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=9327#p9327" />
			<content type="html"><![CDATA[<p>Спасибо! Теперь он работает отлично.</p>]]></content>
			<author>
				<name><![CDATA[gabiivg]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2325</uri>
			</author>
			<updated>2024-01-26T07:03:09Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=9327#p9327</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=9325#p9325" />
			<content type="html"><![CDATA[<p>if(digitalRead(SW)==LOW)</p><p>замените на</p><p>if(digitalRead(SW)==LOW &amp;&amp; mute==0)</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-01-26T00:03:54Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=9325#p9325</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=9324#p9324" />
			<content type="html"><![CDATA[<p>Привет.&nbsp; Спасибо за проект, все работает.&nbsp; Но есть проблема: если я нажму кнопку MUTE, а затем кнопку энкодера, он пропадет с дисплея.&nbsp; Можете ли вы решить эту проблему? Если я снова нажму кнопку MUTE, индикация на ЖК-дисплее вернется.</p>]]></content>
			<author>
				<name><![CDATA[gabiivg]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2325</uri>
			</author>
			<updated>2024-01-25T18:44:04Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=9324#p9324</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8868#p8868" />
			<content type="html"><![CDATA[<p>Я в шоке!!! На моей ардуинке на пин d5 китайцы просто не дорисовали дорожку!!! Она не перерезана, не спалена, она тупо на 3мм не дорисована до пина! Впервые такое наблюдаю! А я Вам тут мозг выношу))) Простите пожалуйста и ОГРОМНОЕ ВАМ СПАСИБО!!!! ВСЁ РАБОТАЕТ КАК НАДО!!!!!!!</p>]]></content>
			<author>
				<name><![CDATA[yuraword]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=780</uri>
			</author>
			<updated>2023-11-12T13:36:58Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8868#p8868</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8860#p8860" />
			<content type="html"><![CDATA[<p>Собрал схему</p><p>Все работает, D5 5В когда STANDBY, 0В в активном режиме. <br />Кнопки пульта работают правильно, регулировка громкости не быстрая, так как шаг 0,5 дБ, ускорил как мог.</p><p>Код практически не менял, только уменьшил задержку в работе пульта и все.</p><div class="codebox"><pre><code>// LGT8F328 | ATtmega328

#define SW         10
#define MUTE        7
#define POWER       11
#define POWER_OUT   5
#define LCD_LED_OUT 6
#define IR         12
#define MUTE_PIN   13


#define BRIG_H 200 // Яркость 0…255 POWER ON
#define BRIG_L 50  // Яркость 0…255 POWER OFF

#define IR1 0x33B810EF // VOL+
#define IR2 0x33B8E01F // VOL-
#define IR3 0x33B8E41B   // BAL+
#define IR4 0x33B824DB // BAL-
#define IR5 0x33B8946B // MUTE
#define IR6 0x33B800FF // POWER

#include &lt;Wire.h&gt; 
#include &lt;EEPROM.h&gt;
#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;CS3310.h&gt;            // http://rcl-radio.ru/wp-content/uploads/2020/11/CS3310.zip
#include &lt;LiquidCrystal_I2C.h&gt; // http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=45&amp;download=1
#include &lt;DS3231.h&gt;            // http://rcl-radio.ru/wp-content/uploads/2022/07/DS3231.zip
#include &lt;boarddefs.h&gt;         // входит в состав библиотеки IRremote
#include &lt;IRremote.h&gt;          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip 
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  Encoder myEnc(9, 8);//CLK, DT
  CS3310 pga(2,3,4);//CS,SCLK,SDATAI
  DS3231 clock;RTCDateTime DateTime;
  IRrecv irrecv(IR); // указываем вывод модуля IR приемника
  decode_results ir; 
  
  int a[4],vol,vol_d,z,z0,z1,vol_old,balanc,x;
  byte w,w1,mute,menu;
  unsigned long times,oldPosition  = -999,newPosition,times_3231;
  byte power, d1,d2,d3,d4,d5,d6,e1,e2,e3;
  int hour,minut,secon,old_sec;
  bool gr1,gr2;
 
void setup(){
  delay(100);
  Wire.begin();Serial.begin(9600);
  lcd.init();lcd.backlight();clock.begin();
  irrecv.enableIRIn();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(LCD_LED_OUT,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  analogWrite(LCD_LED_OUT, BRIG_H);
  lcd.setCursor(0,0);lcd.print(&quot;    PGA2311   &quot;);
  lcd.setCursor(0,1);lcd.print(&quot; Volume Control &quot;);delay(1000);lcd.clear();
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
  vol = EEPROM.read(0);
  balanc = EEPROM.read(1)-20;
  // clock.setDateTime(__DATE__, __TIME__);
  pinMode(SW,INPUT);            // кнопка энкодера MENU   
  pinMode(MUTE,INPUT_PULLUP);   // кнопка MUTE
  pinMode(POWER,INPUT_PULLUP);  // кнопка POWER
  pinMode(POWER_OUT,OUTPUT);    // выход управления POWER
  pinMode(MUTE_PIN,OUTPUT);    // выход управления MUTE
  digitalWrite(MUTE_PIN,HIGH);
  audio();
  }
 
void loop(){ 
  if ( irrecv.decode( &amp;ir )) {Serial.print(&quot;0x&quot;);Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

  if(ir.value==IR1 &amp;&amp; menu!=0&amp;&amp;mute==0&amp;&amp;power==0){vol++;menu=0;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}
  if(ir.value==IR2 &amp;&amp; menu!=0&amp;&amp;mute==0&amp;&amp;power==0){vol--;menu=0;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}

  if(ir.value==IR3 &amp;&amp; menu!=1&amp;&amp;mute==0&amp;&amp;power==0){balanc++;menu=1;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;balanc_func();audio();}
  if(ir.value==IR4 &amp;&amp; menu!=1&amp;&amp;mute==0&amp;&amp;power==0){balanc--;menu=1;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;balanc_func();audio();}  
  
 if(power==0){
  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}; 
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  }
 else{
  byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
  byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};      
  byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
  byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
  byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
  byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
  byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
  byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000}; 
  lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);
  lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
  }
  if(power==0){
   digitalWrite(POWER_OUT,HIGH); //STBY
   analogWrite(LCD_LED_OUT, BRIG_H);
   /// MENU /////////////////////////////////////// 
   if(digitalRead(SW)==LOW){menu++;if(menu&gt;1){menu=0;}lcd.clear();times=millis();w=1;w1=1;delay(200);}
   /// MUTE ///////////////////////////////////////
   if((digitalRead(MUTE)==LOW||ir.value==IR5)&amp;&amp;mute==0){mute=1;digitalWrite(MUTE_PIN,LOW);audio();cl();lcd.setCursor(0,0);lcd.print(&quot;      MUTE   &quot;);delay(300);}
   if((digitalRead(MUTE)==LOW||ir.value==IR5)&amp;&amp;mute==1){mute=0;digitalWrite(MUTE_PIN,HIGH);audio();cl();w1=1;delay(300);}
  }
  else{analogWrite(LCD_LED_OUT, BRIG_L);digitalWrite(POWER_OUT,LOW);}//STBY
 
   if((digitalRead(POWER)==LOW||ir.value==IR6)&amp;&amp;digitalRead(SW)==HIGH&amp;&amp;power==0&amp;&amp;mute==0){power=1;digitalWrite(MUTE_PIN,LOW);audio();cl();
     lcd.setCursor(0,0);lcd.print(&quot;   POWER  OFF   &quot;);delay(500);}
   if((digitalRead(POWER)==LOW||ir.value==IR6)&amp;&amp;digitalRead(SW)==HIGH&amp;&amp;power==1){power=0;digitalWrite(MUTE_PIN,HIGH);audio();cl();
     lcd.setCursor(0,0);lcd.print(&quot;   POWER  ON    &quot;);w1=1;delay(500);} 
  
   /////////////// VOLUME /////////////////////////////////////////////////////////
   if(menu==0&amp;&amp;mute==0&amp;&amp;power==0){
   
   if(ir.value==IR1){vol++;gr1=1;gr2=0;cl1();times=millis();w=1;w1=1;vol_func();audio();}
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();times=millis();w=1;w1=1;vol_func();audio();}
   if(ir.value==IR2){vol--;gr1=0;gr2=1;cl1();times=millis();w=1;w1=1;vol_func();audio();}
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();times=millis();w=1;w1=1;vol_func();audio();}
 
   if (newPosition != oldPosition&amp;&amp;mute==0){oldPosition = newPosition;
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();} 
   vol_d=map(vol,0,235,0,45);
   if(w1==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(&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);}w1=0;}
 
     lcd.setCursor(0,0);lcd.print(&quot;VOLUME &quot;);
     if(vol*0.5-96&gt;=0){lcd.print(&quot;+&quot;);}
     lcd.print(vol*0.5-96,1);lcd.print(&quot; &quot;);
     lcd.setCursor(14,0);lcd.print(&quot;dB&quot;);
   } // menu == 0  
 
   /////////////// BALANCE +/- 10 dB /////////////////////////////////////////////////////////
   if(menu==1&amp;&amp;mute==0&amp;&amp;power==0){

   if(ir.value==IR3){balanc++;gr1=1;gr2=0;cl1();times=millis();w=1;w1=1;balanc_func();audio();}
   if(ir.value==0xFFFFFFFF and gr1==1){balanc++;gr2=0;cl1();times=millis();w=1;w1=1;balanc_func();audio();}
   if(ir.value==IR4){balanc--;gr1=0;gr2=1;cl1();times=millis();w=1;w1=1;balanc_func();audio();}
   if(ir.value==0xFFFFFFFF and gr2==1){balanc--;gr1=0;cl1();times=millis();w=1;w1=1;balanc_func();audio();}
    
   if (newPosition != oldPosition&amp;&amp;mute==0){oldPosition = newPosition;
   balanc=balanc+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;balanc_func();audio();} 
   lcd.setCursor(0,0);lcd.print(&quot;BALANCE &quot;);if(balanc&gt;=0){lcd.print(&quot;+&quot;);}lcd.print(balanc*0.5,1);lcd.print(&quot; &quot;);lcd.setCursor(14,0);lcd.print(&quot;dB&quot;);
   if(w1==1){
   if(balanc&lt;0){lcd.setCursor(balanc/4-2+7,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   if(balanc==0){lcd.setCursor(balanc/4-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/4-2+8,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   w1=0;}
   }// menu == 1

if(power==1){
  DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  int tim=1254;
      a[0]=hour/10%10;
      a[1]=hour%10;
      a[2]=minut/10%10;
      a[3]=minut%10;
   for(x=0;x&lt;4;x++){
    switch(x){
        case 0: e1=1,e2=2,e3=3;break;
        case 1: e1=4,e2=5,e3=6;break;
        case 2: e1=8,e2=9,e3=10;break;
        case 3: e1=11,e2=12,e3=13;break;
   }digit();}
 
  if(millis()-times_3231&lt;=500){ lcd.setCursor(7,0);lcd.print(&quot;.&quot;);lcd.setCursor(7,1);lcd.print(&quot;.&quot;);}
  if(millis()-times_3231&gt;500){ lcd.setCursor(7,0);lcd.print(&quot; &quot;);lcd.setCursor(7,1);lcd.print(&quot; &quot;);}
  if(secon!=old_sec){times_3231=millis();}
  old_sec=secon;
   if(digitalRead(SW)==LOW&amp;&amp;digitalRead(MUTE)==LOW){hour++;if(hour&gt;23){hour=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// HH++
   if(digitalRead(SW)==LOW&amp;&amp;digitalRead(POWER)==LOW){minut++;if(minut&gt;59){minut=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// MM++
 }  
 
 
 //////// EEPROM //////////////////////////////////////////////////
  if(millis()-times&gt;10000 &amp;&amp; w==1 &amp;&amp; mute == 0 &amp;&amp; power == 0){EEPROM.update(0,vol);EEPROM.update(1,balanc+20);w=0;menu=0;w1=1;lcd.clear();}
  } // LOOP


void cl(){ir.value=0;delay(200);lcd.clear();}
void cl1(){ir.value=0;delay(10);}  
void audio(){
  pga.setVol(vol+balanc+20,vol-balanc+20);// byte 1...255 === -95.5...+31.5 dB (step 0.5 dB)
  }
void to_Timer(){newPosition = myEnc.read()/4;}
void vol_func(){if(vol&lt;0){vol=0;}if(vol&gt;235){vol=235;}}
void balanc_func(){if(balanc&lt;-20){balanc=-20;}if(balanc&gt;20){balanc=20;}}
void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2023-11-11T14:15:41Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8860#p8860</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8858#p8858" />
			<content type="html"><![CDATA[<p>Простите пожалуйста, не хочу показаться назойливым, я ещё раз проверил, но действительно ничего не поменялось, мало того, пропали 5В на Пине D5! Мне перед Вами становиться уже очень неудобно!!! Спасибо!!!</p>]]></content>
			<author>
				<name><![CDATA[yuraword]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=780</uri>
			</author>
			<updated>2023-11-11T12:16:06Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8858#p8858</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8851#p8851" />
			<content type="html"><![CDATA[<p>Реле должно быть инверсно<br />скорость регулировки с пульта должна быть выше<br /></p><div class="quotebox"><blockquote><p>баланс с пульта появляется если нажать balance+, если нажимаю &quot;-&quot;, то регулируется громкость(или наоборот, точно не помню)</p></blockquote></div><p> - исправлено</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2023-11-09T13:17:23Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8851#p8851</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8850#p8850" />
			<content type="html"><![CDATA[<p>Прошу прощения но вообще ничего не поменялось</p>]]></content>
			<author>
				<name><![CDATA[yuraword]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=780</uri>
			</author>
			<updated>2023-11-09T12:42:55Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8850#p8850</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8847#p8847" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>// LGT8F328 | ATtmega328

#define SW         10
#define MUTE        7
#define POWER       11
#define POWER_OUT   5
#define LCD_LED_OUT 6
#define IR         12
#define MUTE_PIN   13


#define BRIG_H 200 // Яркость 0…255 POWER ON
#define BRIG_L 50  // Яркость 0…255 POWER OFF

#define IR1 0x807F48B7 // VOL+
#define IR2 0x807FC837 // VOL-
#define IR3 0x807FD02F   // BAL+
#define IR4 0x807F50AF // BAL-
#define IR5 0x807FF807 // MUTE
#define IR6 0x807F807F // POWER

#include &lt;Wire.h&gt; 
#include &lt;EEPROM.h&gt;
#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;CS3310.h&gt;            // http://rcl-radio.ru/wp-content/uploads/2020/11/CS3310.zip
#include &lt;LiquidCrystal_I2C.h&gt; // http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=45&amp;download=1
#include &lt;DS3231.h&gt;            // http://rcl-radio.ru/wp-content/uploads/2022/07/DS3231.zip
#include &lt;boarddefs.h&gt;         // входит в состав библиотеки IRremote
#include &lt;IRremote.h&gt;          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip 
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  Encoder myEnc(9, 8);//CLK, DT
  CS3310 pga(2,3,4);//CS,SCLK,SDATAI
  DS3231 clock;RTCDateTime DateTime;
  IRrecv irrecv(IR); // указываем вывод модуля IR приемника
  decode_results ir; 
  
  int a[4],vol,vol_d,z,z0,z1,vol_old,balanc,x;
  byte w,w1,mute,menu;
  unsigned long times,oldPosition  = -999,newPosition,times_3231;
  byte power, d1,d2,d3,d4,d5,d6,e1,e2,e3;
  int hour,minut,secon,old_sec;
  bool gr1,gr2;
 
void setup(){
  delay(100);
  Wire.begin();Serial.begin(9600);
  lcd.init();lcd.backlight();clock.begin();
  irrecv.enableIRIn();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(LCD_LED_OUT,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  analogWrite(LCD_LED_OUT, BRIG_H);
  lcd.setCursor(0,0);lcd.print(&quot;    PGA2311   &quot;);
  lcd.setCursor(0,1);lcd.print(&quot; Volume Control &quot;);delay(1000);lcd.clear();
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
  vol = EEPROM.read(0);
  balanc = EEPROM.read(1)-20;
  // clock.setDateTime(__DATE__, __TIME__);
  pinMode(SW,INPUT);            // кнопка энкодера MENU   
  pinMode(MUTE,INPUT_PULLUP);   // кнопка MUTE
  pinMode(POWER,INPUT_PULLUP);  // кнопка POWER
  pinMode(POWER_OUT,OUTPUT);    // выход управления POWER
  pinMode(MUTE_PIN,OUTPUT);    // выход управления MUTE
  digitalWrite(MUTE_PIN,HIGH);
  audio();
  }
 
void loop(){ 
  if ( irrecv.decode( &amp;ir )) {Serial.print(&quot;0x&quot;);Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

  if(ir.value==IR1 &amp;&amp; menu!=0&amp;&amp;mute==0&amp;&amp;power==0){vol++;menu=0;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}
  if(ir.value==IR2 &amp;&amp; menu!=0&amp;&amp;mute==0&amp;&amp;power==0){vol--;menu=0;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}

  if(ir.value==IR3 &amp;&amp; menu!=1&amp;&amp;mute==0&amp;&amp;power==0){balanc++;menu=1;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;balanc_func();audio();}
  if(ir.value==IR4 &amp;&amp; menu!=1&amp;&amp;mute==0&amp;&amp;power==0){balanc--;menu=1;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;balanc_func();audio();}  
  
 if(power==0){
  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}; 
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  }
 else{
  byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
  byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};      
  byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
  byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
  byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
  byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
  byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
  byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000}; 
  lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);
  lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
  }
  if(power==0){
   digitalWrite(POWER_OUT,HIGH); //STBY
   analogWrite(LCD_LED_OUT, BRIG_H);
   /// MENU /////////////////////////////////////// 
   if(digitalRead(SW)==LOW){menu++;if(menu&gt;1){menu=0;}lcd.clear();times=millis();w=1;w1=1;delay(200);}
   /// MUTE ///////////////////////////////////////
   if((digitalRead(MUTE)==LOW||ir.value==IR5)&amp;&amp;mute==0){mute=1;digitalWrite(MUTE_PIN,LOW);audio();cl();lcd.setCursor(0,0);lcd.print(&quot;      MUTE   &quot;);delay(300);}
   if((digitalRead(MUTE)==LOW||ir.value==IR5)&amp;&amp;mute==1){mute=0;digitalWrite(MUTE_PIN,HIGH);audio();cl();w1=1;delay(300);}
  }
  else{analogWrite(LCD_LED_OUT, BRIG_L);digitalWrite(POWER_OUT,LOW);}//STBY
 
   if((digitalRead(POWER)==LOW||ir.value==IR6)&amp;&amp;digitalRead(SW)==HIGH&amp;&amp;power==0&amp;&amp;mute==0){power=1;digitalWrite(MUTE_PIN,LOW);audio();cl();
     lcd.setCursor(0,0);lcd.print(&quot;   POWER  OFF   &quot;);delay(500);}
   if((digitalRead(POWER)==LOW||ir.value==IR6)&amp;&amp;digitalRead(SW)==HIGH&amp;&amp;power==1){power=0;digitalWrite(MUTE_PIN,HIGH);audio();cl();
     lcd.setCursor(0,0);lcd.print(&quot;   POWER  ON    &quot;);w1=1;delay(500);} 
  
   /////////////// VOLUME /////////////////////////////////////////////////////////
   if(menu==0&amp;&amp;mute==0&amp;&amp;power==0){
   
   if(ir.value==IR1){vol++;gr1=1;gr2=0;cl1();times=millis();w=1;w1=1;vol_func();audio();}
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();times=millis();w=1;w1=1;vol_func();audio();}
   if(ir.value==IR2){vol--;gr1=0;gr2=1;cl1();times=millis();w=1;w1=1;vol_func();audio();}
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();times=millis();w=1;w1=1;vol_func();audio();}
 
   if (newPosition != oldPosition&amp;&amp;mute==0){oldPosition = newPosition;
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();} 
   vol_d=map(vol,0,235,0,45);
   if(w1==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(&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);}w1=0;}
 
     lcd.setCursor(0,0);lcd.print(&quot;VOLUME &quot;);
     if(vol*0.5-96&gt;=0){lcd.print(&quot;+&quot;);}
     lcd.print(vol*0.5-96,1);lcd.print(&quot; &quot;);
     lcd.setCursor(14,0);lcd.print(&quot;dB&quot;);
   } // menu == 0  
 
   /////////////// BALANCE +/- 10 dB /////////////////////////////////////////////////////////
   if(menu==1&amp;&amp;mute==0&amp;&amp;power==0){

   if(ir.value==IR3){balanc++;gr1=1;gr2=0;cl1();times=millis();w=1;w1=1;balanc_func();audio();}
   if(ir.value==0xFFFFFFFF and gr1==1){balanc++;gr2=0;cl1();times=millis();w=1;w1=1;balanc_func();audio();}
   if(ir.value==IR4){balanc--;gr1=0;gr2=1;cl1();times=millis();w=1;w1=1;balanc_func();audio();}
   if(ir.value==0xFFFFFFFF and gr2==1){balanc--;gr1=0;cl1();times=millis();w=1;w1=1;balanc_func();audio();}
    
   if (newPosition != oldPosition&amp;&amp;mute==0){oldPosition = newPosition;
   balanc=balanc+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;balanc_func();audio();} 
   lcd.setCursor(0,0);lcd.print(&quot;BALANCE &quot;);if(balanc&gt;=0){lcd.print(&quot;+&quot;);}lcd.print(balanc*0.5,1);lcd.print(&quot; &quot;);lcd.setCursor(14,0);lcd.print(&quot;dB&quot;);
   if(w1==1){
   if(balanc&lt;0){lcd.setCursor(balanc/4-2+7,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   if(balanc==0){lcd.setCursor(balanc/4-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/4-2+8,1);lcd.print(&quot;  &quot;);lcd.write((uint8_t)0);lcd.print(&quot;  &quot;);}
   w1=0;}
   }// menu == 1

if(power==1){
  DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
  int tim=1254;
      a[0]=hour/10%10;
      a[1]=hour%10;
      a[2]=minut/10%10;
      a[3]=minut%10;
   for(x=0;x&lt;4;x++){
    switch(x){
        case 0: e1=1,e2=2,e3=3;break;
        case 1: e1=4,e2=5,e3=6;break;
        case 2: e1=8,e2=9,e3=10;break;
        case 3: e1=11,e2=12,e3=13;break;
   }digit();}
 
  if(millis()-times_3231&lt;=500){ lcd.setCursor(7,0);lcd.print(&quot;.&quot;);lcd.setCursor(7,1);lcd.print(&quot;.&quot;);}
  if(millis()-times_3231&gt;500){ lcd.setCursor(7,0);lcd.print(&quot; &quot;);lcd.setCursor(7,1);lcd.print(&quot; &quot;);}
  if(secon!=old_sec){times_3231=millis();}
  old_sec=secon;
   if(digitalRead(SW)==LOW&amp;&amp;digitalRead(MUTE)==LOW){hour++;if(hour&gt;23){hour=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// HH++
   if(digitalRead(SW)==LOW&amp;&amp;digitalRead(POWER)==LOW){minut++;if(minut&gt;59){minut=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// MM++
 }  
 
 
 //////// EEPROM //////////////////////////////////////////////////
  if(millis()-times&gt;10000 &amp;&amp; w==1 &amp;&amp; mute == 0 &amp;&amp; power == 0){EEPROM.update(0,vol);EEPROM.update(1,balanc+20);w=0;menu=0;w1=1;lcd.clear();}
  } // LOOP


void cl(){ir.value=0;delay(200);lcd.clear();}
void cl1(){ir.value=0;delay(50);}  
void audio(){
  pga.setVol(vol+balanc+20,vol-balanc+20);// byte 1...255 === -95.5...+31.5 dB (step 0.5 dB)
  }
void to_Timer(){newPosition = myEnc.read()/4;}
void vol_func(){if(vol&lt;0){vol=0;}if(vol&gt;235){vol=235;}}
void balanc_func(){if(balanc&lt;-20){balanc=-20;}if(balanc&gt;20){balanc=20;}}
void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2023-11-08T02:04:42Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8847#p8847</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8845#p8845" />
			<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>2023-11-07T11:21:02Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8845#p8845</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8844#p8844" />
			<content type="html"><![CDATA[<p>Здравствуйте, в общем приехала мне ещё одна PGA, впаял и вуаля, всё завелось с пол пинка!!! Обнаружилось несколько моментов: 5В, которое на реле, появляется в режиме &quot;POWER OFF&quot;, а надо наоборот; регулировка громкости с пульта происходит очень, ну прям оооочень медленно, может подскажете что нужно поменять чтобы это дело как то ускорить?)); баланс с пульта появляется если нажать balance+, если нажимаю &quot;-&quot;, то регулируется громкость(или наоборот, точно не помню). В целом ДОВОЛЕН КАК СЛОН!!!! СПАСИБО!!!!</p>]]></content>
			<author>
				<name><![CDATA[yuraword]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=780</uri>
			</author>
			<updated>2023-11-06T22:06:33Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8844#p8844</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8082#p8082" />
			<content type="html"><![CDATA[<p>Выслал</p>]]></content>
			<author>
				<name><![CDATA[yuraword]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=780</uri>
			</author>
			<updated>2023-07-25T09:31:48Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8082#p8082</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8081#p8081" />
			<content type="html"><![CDATA[<p>Да, лучше на почту liman324@yandex.ru</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2023-07-25T09:11:16Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8081#p8081</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8080#p8080" />
			<content type="html"><![CDATA[<p>Можно Вам на почту?, я без понятия как это здесь делается</p>]]></content>
			<author>
				<name><![CDATA[yuraword]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=780</uri>
			</author>
			<updated>2023-07-25T09:02:52Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8080#p8080</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: PGA2311+ arduino+encoder]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=8079#p8079" />
			<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>2023-07-25T07:59:48Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=8079#p8079</id>
		</entry>
</feed>
