1

Тема: PGA2311+ arduino+encoder

Здравствуйте, прошу помощи, очень понравился этот проект своей простотой, но очень надо добавить пульт, кнопку on/stby а так же вывести пин для управления питанием усилителя.

2

Re: PGA2311+ arduino+encoder

У Вас собрана схема?

3

Re: PGA2311+ arduino+encoder

Нет ещё, это не долго))

4

Re: PGA2311+ arduino+encoder

Постараюсь в ближайшие дни заняться Вашим вопросом. Пуль будет иметь шесть кнопок гр+ гр- баланс+ баланс-  MUTE POWER. Выход STANDBY.

Часы надо добавлять? (будут показывать время в режимы POWER OFF на затемненном экране, на DS3231)

5

Re: PGA2311+ arduino+encoder

Часы это вообще будет просто мега круто!!!! Если они будут такие как в проекте PT2314 только без секунд, просто здоровенные часы и минуты!!!

6

Re: PGA2311+ arduino+encoder

LGT8F328 | ATtmega328

Промежуточное тестирование

добавлено
ds3231
кнопка power
выход standby

Установка времени - в режиме power off, нажать и удерживать кнопку энкодера, далее нажимать кнопки mute power для установки времени.

проверить работу часов и аудиопроцессора, в режиме mute и power_off звук должен отключаться.

после добавлю пульт

#define SW       10
#define MUTE      2
#define POWER     3
#define POWER_OUT 5

#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <CS3310.h>            // http://rcl-radio.ru/wp-content/uploads/2020/11/CS3310.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <DS3231.h>            // http://rcl-radio.ru/wp-content/uploads/2022/07/DS3231.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;
  
  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;
 
void setup(){
  delay(100);
  Wire.begin();Serial.begin(9600);
  lcd.init();lcd.backlight();clock.begin();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  lcd.setCursor(0,0);lcd.print("    PGA2311   ");
  lcd.setCursor(0,1);lcd.print(" Volume Control ");delay(1000);lcd.clear();
  if(EEPROM.read(100)!=0){for(int i=0;i<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
  audio();
  }
 
void loop(){ 
 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,LOW); //STBY
   /// MENU /////////////////////////////////////// 
   if(digitalRead(SW)==LOW){menu++;if(menu>1){menu=0;}lcd.clear();times=millis();w=1;w1=1;delay(200);}
   /// MUTE ///////////////////////////////////////
   if(digitalRead(MUTE)==LOW&&mute==0){mute=1;vol_old=vol;vol=1;audio();lcd.clear();lcd.setCursor(0,0);lcd.print("      MUTE   ");delay(300);}
   if(digitalRead(MUTE)==LOW&&mute==1){mute=0;vol=vol_old;audio();lcd.clear();w1=1;delay(300);}
  }
  else{digitalWrite(POWER_OUT,HIGH);}//STBY
 
   if(digitalRead(POWER)==LOW&&digitalRead(SW)==HIGH&&power==0){power=1;vol_old=vol;vol=1;audio();lcd.clear();
     lcd.setCursor(0,0);lcd.print("   POWER  OFF   ");delay(500);}
   if(digitalRead(POWER)==LOW&&digitalRead(SW)==HIGH&&power==1){power=0;vol=vol_old;audio();lcd.clear();
     lcd.setCursor(0,0);lcd.print("   POWER  ON    ");w1=1;delay(500);} 
  
   /////////////// VOLUME /////////////////////////////////////////////////////////
   if(menu==0&&mute==0&&power==0){
   if (newPosition != oldPosition&&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<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w1=0;}
 
     lcd.setCursor(0,0);lcd.print("VOLUME ");
     if(vol*0.5-96>=0){lcd.print("+");}
     lcd.print(vol*0.5-96,1);lcd.print(" ");
     lcd.setCursor(14,0);lcd.print("dB");
   } // menu == 0  
 
   /////////////// BALANCE +/- 10 dB /////////////////////////////////////////////////////////
   if(menu==1&&mute==0&&power==0){
   if (newPosition != oldPosition&&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("BALANCE ");if(balanc>=0){lcd.print("+");}lcd.print(balanc*0.5,1);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");
   if(w1==1){
   if(balanc<0){lcd.setCursor(balanc/4-2+7,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.print("  ");}
   if(balanc==0){lcd.setCursor(balanc/4-2+7,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.write((uint8_t)0);lcd.print("  ");}
   if(balanc>0){lcd.setCursor(balanc/4-2+8,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.print("  ");}
   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<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<=500){ lcd.setCursor(7,0);lcd.print(".");lcd.setCursor(7,1);lcd.print(".");}
  if(millis()-times_3231>500){ lcd.setCursor(7,0);lcd.print(" ");lcd.setCursor(7,1);lcd.print(" ");}
  if(secon!=old_sec){times_3231=millis();}
  old_sec=secon;
   if(digitalRead(SW)==LOW&&digitalRead(MUTE)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// HH++
   if(digitalRead(SW)==LOW&&digitalRead(POWER)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// MM++
 }  
 
 
 //////// EEPROM //////////////////////////////////////////////////
  if(millis()-times>10000 && w==1 && mute == 0 && power == 0){EEPROM.update(0,vol);EEPROM.update(1,balanc+20);w=0;menu=0;w1=1;lcd.clear();}
  } // LOOP
 
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<0){vol=0;}if(vol>235){vol=235;}}
void balanc_func(){if(balanc<-20){balanc=-20;}if(balanc>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);}

7

Re: PGA2311+ arduino+encoder

Так быстро??? Отлично!!! проверю, отпишусь

8

Re: PGA2311+ arduino+encoder

Подсветка LCD
http://forum.rcl-radio.ru/uploads/images/2023/07/31e25a28de5e3116eef54cc7ecd08a11.png

#define SW         10
#define MUTE        2
#define POWER       3
#define POWER_OUT   5
#define LCD_LED_OUT 6

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

#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <CS3310.h>            // http://rcl-radio.ru/wp-content/uploads/2020/11/CS3310.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <DS3231.h>            // http://rcl-radio.ru/wp-content/uploads/2022/07/DS3231.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;
  
  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;
 
void setup(){
  delay(100);
  Wire.begin();Serial.begin(9600);
  lcd.init();lcd.backlight();clock.begin();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(LCD_LED_OUT,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  analogWrite(LCD_LED_OUT, BRIG_H);
  lcd.setCursor(0,0);lcd.print("    PGA2311   ");
  lcd.setCursor(0,1);lcd.print(" Volume Control ");delay(1000);lcd.clear();
  if(EEPROM.read(100)!=0){for(int i=0;i<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
  audio();
  }
 
void loop(){ 
 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,LOW); //STBY
   analogWrite(LCD_LED_OUT, BRIG_H);
   /// MENU /////////////////////////////////////// 
   if(digitalRead(SW)==LOW){menu++;if(menu>1){menu=0;}lcd.clear();times=millis();w=1;w1=1;delay(200);}
   /// MUTE ///////////////////////////////////////
   if(digitalRead(MUTE)==LOW&&mute==0){mute=1;vol_old=vol;vol=1;audio();lcd.clear();lcd.setCursor(0,0);lcd.print("      MUTE   ");delay(300);}
   if(digitalRead(MUTE)==LOW&&mute==1){mute=0;vol=vol_old;audio();lcd.clear();w1=1;delay(300);}
  }
  else{analogWrite(LCD_LED_OUT, BRIG_L);digitalWrite(POWER_OUT,HIGH);}//STBY
 
   if(digitalRead(POWER)==LOW&&digitalRead(SW)==HIGH&&power==0){power=1;vol_old=vol;vol=1;audio();lcd.clear();
     lcd.setCursor(0,0);lcd.print("   POWER  OFF   ");delay(500);}
   if(digitalRead(POWER)==LOW&&digitalRead(SW)==HIGH&&power==1){power=0;vol=vol_old;audio();lcd.clear();
     lcd.setCursor(0,0);lcd.print("   POWER  ON    ");w1=1;delay(500);} 
  
   /////////////// VOLUME /////////////////////////////////////////////////////////
   if(menu==0&&mute==0&&power==0){
   if (newPosition != oldPosition&&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<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w1=0;}
 
     lcd.setCursor(0,0);lcd.print("VOLUME ");
     if(vol*0.5-96>=0){lcd.print("+");}
     lcd.print(vol*0.5-96,1);lcd.print(" ");
     lcd.setCursor(14,0);lcd.print("dB");
   } // menu == 0  
 
   /////////////// BALANCE +/- 10 dB /////////////////////////////////////////////////////////
   if(menu==1&&mute==0&&power==0){
   if (newPosition != oldPosition&&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("BALANCE ");if(balanc>=0){lcd.print("+");}lcd.print(balanc*0.5,1);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");
   if(w1==1){
   if(balanc<0){lcd.setCursor(balanc/4-2+7,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.print("  ");}
   if(balanc==0){lcd.setCursor(balanc/4-2+7,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.write((uint8_t)0);lcd.print("  ");}
   if(balanc>0){lcd.setCursor(balanc/4-2+8,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.print("  ");}
   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<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<=500){ lcd.setCursor(7,0);lcd.print(".");lcd.setCursor(7,1);lcd.print(".");}
  if(millis()-times_3231>500){ lcd.setCursor(7,0);lcd.print(" ");lcd.setCursor(7,1);lcd.print(" ");}
  if(secon!=old_sec){times_3231=millis();}
  old_sec=secon;
   if(digitalRead(SW)==LOW&&digitalRead(MUTE)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// HH++
   if(digitalRead(SW)==LOW&&digitalRead(POWER)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// MM++
 }  
 
 
 //////// EEPROM //////////////////////////////////////////////////
  if(millis()-times>10000 && w==1 && mute == 0 && power == 0){EEPROM.update(0,vol);EEPROM.update(1,balanc+20);w=0;menu=0;w1=1;lcd.clear();}
  } // LOOP
 
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<0){vol=0;}if(vol>235){vol=235;}}
void balanc_func(){if(balanc<-20){balanc=-20;}if(balanc>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);}

9

Re: PGA2311+ arduino+encoder

добавлен пульт

// LGT8F328 | ATtmega328

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

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

#define IR1 0xE318261B // VOL+
#define IR2 0x52A3D41F // VOL-
#define IR3 0x511DBB   // BAL+
#define IR4 0xD7E84B1B // BAL-
#define IR5 0xC101E57B // MUTE
#define IR6 0xF0C41643 // POWER

#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <CS3310.h>            // http://rcl-radio.ru/wp-content/uploads/2020/11/CS3310.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <DS3231.h>            // http://rcl-radio.ru/wp-content/uploads/2022/07/DS3231.zip
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // 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("    PGA2311   ");
  lcd.setCursor(0,1);lcd.print(" Volume Control ");delay(1000);lcd.clear();
  if(EEPROM.read(100)!=0){for(int i=0;i<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
  audio();
  }
 
void loop(){ 
  if ( irrecv.decode( &ir )) {Serial.print("0x");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 && menu!=0&&mute==0&&power==0){vol++;menu=0;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}
  if(ir.value==IR2 && menu!=0&&mute==0&&power==0){vol--;menu=0;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}

  if(ir.value==IR3 && menu!=1&&mute==0&&power==0){balanc++;menu=1;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;balanc_func();audio();}
  if(ir.value==IR4 && menu!=1&&mute==0&&power==0){balanc--;menu=0;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,LOW); //STBY
   analogWrite(LCD_LED_OUT, BRIG_H);
   /// MENU /////////////////////////////////////// 
   if(digitalRead(SW)==LOW){menu++;if(menu>1){menu=0;}lcd.clear();times=millis();w=1;w1=1;delay(200);}
   /// MUTE ///////////////////////////////////////
   if((digitalRead(MUTE)==LOW||ir.value==IR5)&&mute==0){mute=1;vol_old=vol;vol=1;audio();cl();lcd.setCursor(0,0);lcd.print("      MUTE   ");delay(300);}
   if((digitalRead(MUTE)==LOW||ir.value==IR5)&&mute==1){mute=0;vol=vol_old;audio();cl();w1=1;delay(300);}
  }
  else{analogWrite(LCD_LED_OUT, BRIG_L);digitalWrite(POWER_OUT,HIGH);}//STBY
 
   if((digitalRead(POWER)==LOW||ir.value==IR6)&&digitalRead(SW)==HIGH&&power==0&&mute==0){power=1;vol_old=vol;vol=1;audio();cl();
     lcd.setCursor(0,0);lcd.print("   POWER  OFF   ");delay(500);}
   if((digitalRead(POWER)==LOW||ir.value==IR6)&&digitalRead(SW)==HIGH&&power==1){power=0;vol=vol_old;audio();cl();
     lcd.setCursor(0,0);lcd.print("   POWER  ON    ");w1=1;delay(500);} 
  
   /////////////// VOLUME /////////////////////////////////////////////////////////
   if(menu==0&&mute==0&&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&&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<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w1=0;}
 
     lcd.setCursor(0,0);lcd.print("VOLUME ");
     if(vol*0.5-96>=0){lcd.print("+");}
     lcd.print(vol*0.5-96,1);lcd.print(" ");
     lcd.setCursor(14,0);lcd.print("dB");
   } // menu == 0  
 
   /////////////// BALANCE +/- 10 dB /////////////////////////////////////////////////////////
   if(menu==1&&mute==0&&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&&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("BALANCE ");if(balanc>=0){lcd.print("+");}lcd.print(balanc*0.5,1);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");
   if(w1==1){
   if(balanc<0){lcd.setCursor(balanc/4-2+7,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.print("  ");}
   if(balanc==0){lcd.setCursor(balanc/4-2+7,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.write((uint8_t)0);lcd.print("  ");}
   if(balanc>0){lcd.setCursor(balanc/4-2+8,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.print("  ");}
   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<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<=500){ lcd.setCursor(7,0);lcd.print(".");lcd.setCursor(7,1);lcd.print(".");}
  if(millis()-times_3231>500){ lcd.setCursor(7,0);lcd.print(" ");lcd.setCursor(7,1);lcd.print(" ");}
  if(secon!=old_sec){times_3231=millis();}
  old_sec=secon;
   if(digitalRead(SW)==LOW&&digitalRead(MUTE)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// HH++
   if(digitalRead(SW)==LOW&&digitalRead(POWER)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// MM++
 }  
 
 
 //////// EEPROM //////////////////////////////////////////////////
  if(millis()-times>10000 && w==1 && mute == 0 && 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(200);}  
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<0){vol=0;}if(vol>235){vol=235;}}
void balanc_func(){if(balanc<-20){balanc=-20;}if(balanc>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);}

10

Re: PGA2311+ arduino+encoder

настройка платы для LGT8F328
http://forum.rcl-radio.ru/uploads/images/2023/07/8b48789663a0fff901d34d38292f472d.png

11

Re: PGA2311+ arduino+encoder

Здравствуйте! Рисую плату и мне не совсем понятна строка в скетче #define POWER_OUT 5, ведь пин А5 пошел на CL, а пин D5 на 8-ю лапу PGA. Может это должен быть пин D7?

12

Re: PGA2311+ arduino+encoder

D5 можете перенести на любой свободный цифровой выход

По коду

pga(2,3,4);
5 - выход STANDBY
6 - выход подсветки
7 - свободен
8, 9 , 10 - энкодер
11 - свободен
12 - пульт
13 - свободен

Поэтому кнопки POWER и MUTE надо перенести

#define SW         10
#define MUTE        2
#define POWER       3
#define POWER_OUT   5
#define LCD_LED_OUT 6
#define IR         12

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

13

Re: PGA2311+ arduino+encoder

Собрал всё до кучи, всё отображается, регулируется, а звука нет!!! 101раз всё перепроверил, перепаивал другую pga, а звука всё равно нет

14

Re: PGA2311+ arduino+encoder

Загрузите тестовый скетч:

#include <Wire.h> 
#include <CS3310.h>

  CS3310 pga(2,3,4);//CS,SCLK,SDATAI
 
 
void setup(){
  Wire.begin();
  audio();
  }
 
void loop(){ 
  } // LOOP
 
void audio(){
  pga.setVol(200,200);// byte 1...255 === -95.5...+31.5 dB (step 0.5 dB)
  }

15

Re: PGA2311+ arduino+encoder

Загрузил, что должно произойти?

16

Re: PGA2311+ arduino+encoder

Должен быть звук, громкий.

17

Re: PGA2311+ arduino+encoder

Проверьте правильность подключения

CS3310 pga(2,3,4);//CS,SCLK,SDATAI

18

Re: PGA2311+ arduino+encoder

Еще раз загрузите скетч, выход D5 подайте на вход MUTE PGA2311

http://forum.rcl-radio.ru/uploads/images/2023/07/3c413b9fe26e92608f84e2e1330ae800.png


#include <Wire.h> 
#include <CS3310.h>

  CS3310 pga(2,3,4);//CS,SCLK,SDATAI
 
 
void setup(){
  Wire.begin();
  pinMode(5,OUTPUT);
  digitalWrite(5,HIGH);   // MUTE OFF
  audio();
  }
 
void loop(){ 
  } // LOOP
 
void audio(){
  pga.setVol(0,0);// byte 1...255 === -95.5...+31.5 dB (step 0.5 dB)
  }

19

Re: PGA2311+ arduino+encoder

Выход D13 соединить с входом MUTE PGA2311

// 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 0xE318261B // VOL+
#define IR2 0x52A3D41F // VOL-
#define IR3 0x511DBB   // BAL+
#define IR4 0xD7E84B1B // BAL-
#define IR5 0xC101E57B // MUTE
#define IR6 0xF0C41643 // POWER

#include <Wire.h> 
#include <EEPROM.h>
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <CS3310.h>            // http://rcl-radio.ru/wp-content/uploads/2020/11/CS3310.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <DS3231.h>            // http://rcl-radio.ru/wp-content/uploads/2022/07/DS3231.zip
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // 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("    PGA2311   ");
  lcd.setCursor(0,1);lcd.print(" Volume Control ");delay(1000);lcd.clear();
  if(EEPROM.read(100)!=0){for(int i=0;i<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( &ir )) {Serial.print("0x");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 && menu!=0&&mute==0&&power==0){vol++;menu=0;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}
  if(ir.value==IR2 && menu!=0&&mute==0&&power==0){vol--;menu=0;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}

  if(ir.value==IR3 && menu!=1&&mute==0&&power==0){balanc++;menu=1;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;balanc_func();audio();}
  if(ir.value==IR4 && menu!=1&&mute==0&&power==0){balanc--;menu=0;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,LOW); //STBY
   analogWrite(LCD_LED_OUT, BRIG_H);
   /// MENU /////////////////////////////////////// 
   if(digitalRead(SW)==LOW){menu++;if(menu>1){menu=0;}lcd.clear();times=millis();w=1;w1=1;delay(200);}
   /// MUTE ///////////////////////////////////////
   if((digitalRead(MUTE)==LOW||ir.value==IR5)&&mute==0){mute=1;digitalWrite(MUTE_PIN,LOW);audio();cl();lcd.setCursor(0,0);lcd.print("      MUTE   ");delay(300);}
   if((digitalRead(MUTE)==LOW||ir.value==IR5)&&mute==1){mute=0;digitalWrite(MUTE_PIN,HIGH);audio();cl();w1=1;delay(300);}
  }
  else{analogWrite(LCD_LED_OUT, BRIG_L);digitalWrite(POWER_OUT,HIGH);}//STBY
 
   if((digitalRead(POWER)==LOW||ir.value==IR6)&&digitalRead(SW)==HIGH&&power==0&&mute==0){power=1;digitalWrite(MUTE_PIN,LOW);audio();cl();
     lcd.setCursor(0,0);lcd.print("   POWER  OFF   ");delay(500);}
   if((digitalRead(POWER)==LOW||ir.value==IR6)&&digitalRead(SW)==HIGH&&power==1){power=0;digitalWrite(MUTE_PIN,HIGH);audio();cl();
     lcd.setCursor(0,0);lcd.print("   POWER  ON    ");w1=1;delay(500);} 
  
   /////////////// VOLUME /////////////////////////////////////////////////////////
   if(menu==0&&mute==0&&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&&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<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w1=0;}
 
     lcd.setCursor(0,0);lcd.print("VOLUME ");
     if(vol*0.5-96>=0){lcd.print("+");}
     lcd.print(vol*0.5-96,1);lcd.print(" ");
     lcd.setCursor(14,0);lcd.print("dB");
   } // menu == 0  
 
   /////////////// BALANCE +/- 10 dB /////////////////////////////////////////////////////////
   if(menu==1&&mute==0&&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&&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("BALANCE ");if(balanc>=0){lcd.print("+");}lcd.print(balanc*0.5,1);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");
   if(w1==1){
   if(balanc<0){lcd.setCursor(balanc/4-2+7,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.print("  ");}
   if(balanc==0){lcd.setCursor(balanc/4-2+7,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.write((uint8_t)0);lcd.print("  ");}
   if(balanc>0){lcd.setCursor(balanc/4-2+8,1);lcd.print("  ");lcd.write((uint8_t)0);lcd.print("  ");}
   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<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<=500){ lcd.setCursor(7,0);lcd.print(".");lcd.setCursor(7,1);lcd.print(".");}
  if(millis()-times_3231>500){ lcd.setCursor(7,0);lcd.print(" ");lcd.setCursor(7,1);lcd.print(" ");}
  if(secon!=old_sec){times_3231=millis();}
  old_sec=secon;
   if(digitalRead(SW)==LOW&&digitalRead(MUTE)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// HH++
   if(digitalRead(SW)==LOW&&digitalRead(POWER)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2023, 1, 14, hour, minut, secon);delay(200);}// MM++
 }  
 
 
 //////// EEPROM //////////////////////////////////////////////////
  if(millis()-times>10000 && w==1 && mute == 0 && 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(200);}  
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<0){vol=0;}if(vol>235){vol=235;}}
void balanc_func(){if(balanc<-20){balanc=-20;}if(balanc>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);}

20

Re: PGA2311+ arduino+encoder

Ничего не происходит, может pga плохие?

21

Re: PGA2311+ arduino+encoder

Загрузите скетч http://rcl-radio.ru/?p=88921 , скетч протестирован, соберите схему как показано на рисунке

http://forum.rcl-radio.ru/uploads/images/2023/07/8fcba46e5644715d247953a7605a2d53.png

22

Re: PGA2311+ arduino+encoder

У Вас верное подключение PGA2311 к ардуино?

23

Re: PGA2311+ arduino+encoder

Очень странно, получается 2 pga нерабочие, очень обидно, были не дешёвые и отзывы только положительные. Не коротил, соплей нет, всё аккуратно собрано на плате и тут такое...

24

Re: PGA2311+ arduino+encoder

Вероятность что pga не рабочие мало вероятно, где то в схеме ошибка в подключении.

25

Re: PGA2311+ arduino+encoder

Да, всё правильно, уже очень много раз проверял, я уже сутки с этим вожусь