1

Тема: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Отличный проект, liman324 спасибо!
http://m.rcl-radio.ru/?p=112670

Одно плохо - дисплей 0,96 мелкий.
Собственные попытки переделать скетч под дисплей 1,3 не увенчались успехом.

Прошу помощи в этом - переделке скетча под дисплей 1,3.
С меня ром или коньяк smile

2

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Шрифт будет другой, имитация семисегментного шрифта не будет.
Пример - http://rcl-radio.ru/?p=130369

3 (2023-07-27 20:00:15 отредактировано Karl2233)

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

liman324 пишет:

Шрифт будет другой, имитация семисегментного шрифта не будет.
Пример - http://rcl-radio.ru/?p=130369

Тоже красивый шрифт.
Как по мне, так не хуже. Хотя тот конечно стильный.
Но надо чем-то жертвовать.

Ваш вариант с 0,96 дисплеем хорош для лампового усилителя - там шасси высотой 4см и получается прикольный симбиоз.

P. S. А Вам не сложно будет сразу добавить в скетч 4 выхода, на которых будет "1" при выборе соответствующего входа? В принципе ноги Ардуино любые, я плату сам делаю.
И сохранить режим STBY можно будет?

А то я помню как переназначил управление LC.. smile)

P. P. S. Спасибо что взялись!

4

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

#define IR2    0x33B820DF // button encoder
#define IR3    0x33B8946B // mute
#define IR4    0x33B810EF // >>>
#define IR5    0x33B8E01F // <<<
#define IR6    0x33B844BB // INPUT
#define POWER  0x33B800FF // STANDBY
 
#include <LC75341.h>           // http://rcl-radio.ru/wp-content/uploads/2022/01/lc75341.zip
#include <Wire.h> 
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
 
Encoder myEnc(9, 8);// DT, CLK
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
LC75341 lc(3,4,2);   // CE,DI,CL 
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 
 

long times,oldPosition  = -999,newPosition;
int vol_reg,menu,mute_reg,power,treb_reg,gain0,gain1,gain2,gain3,gain4,gain5,bass_reg,in_reg,ball,vol_old;
bool w,w2,gr1,gr2,www;
 
void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(10,INPUT);        // encoder SW
  pinMode(7,INPUT_PULLUP);  // mute button
  pinMode(11,INPUT_PULLUP); // input button
  pinMode(5,OUTPUT);        // OUT STBY
  pinMode(6,INPUT_PULLUP);  // POWER BUTTON
  // input_out_pin
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(A3,OUTPUT);
  vol_reg = EEPROM.read(0);treb_reg = EEPROM.read(1)-5;bass_reg = EEPROM.read(2);gain1 = EEPROM.read(4);
  gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);gain4 = EEPROM.read(7);gain5 = EEPROM.read(8);
  in_reg = EEPROM.read(9);ball = EEPROM.read(10)-4;
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }
  audio_L();
  audio_R();
 
}
 
void loop(){
//  Serial.println(menu);
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   
//////// BUTTON /////////////////////////////////////////////////////////////////////////////////////////////////////////////
 if(power==0){
 if(mute_reg==0){
   if(digitalRead(10)==LOW||ir.value==IR2){menu++;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>3){menu=0;}}
   if((digitalRead(11)==LOW||ir.value==IR6)){in_reg++;menu=4;cl();times=millis();w=1;w2=1;www=1;if(in_reg>3){in_reg=0;}}
  }
   if((digitalRead(7)==LOW||ir.value==IR3)&&mute_reg==0){mute_reg=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,"MUTE");} while( u8g.nextPage() );}
   if((digitalRead(7)==LOW||ir.value==IR3)&&mute_reg==1){mute_reg=0;w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}
 }
////////// POWER ///////////////////
  if((digitalRead(6)==LOW||ir.value==POWER)&&power==0){power=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(40,30,"POWER OFF");} while( u8g.nextPage() );
     delay(1500); u8g.firstPage();do {} while( u8g.nextPage() );}
   if((digitalRead(6)==LOW||ir.value==POWER)&&power==1){power=0;
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"POWER ON");} while( u8g.nextPage() );delay(1500);
   w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}

   if(power==0){digitalWrite(5,HIGH);}else{digitalWrite(5,LOW);} 
   
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  vol_reg=vol_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}
 
   if(ir.value==IR5){vol_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol_reg++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка >>>>>>
   if(ir.value==IR4){vol_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol_reg--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <<<<<<
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"VOLUME");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(79-vol_reg);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,18,"IN");
  u8g.setPrintPos(20, 18);u8g.print(in_reg+1);u8g.drawStr(0,28,"GAIN");u8g.setPrintPos(30, 28);u8g.print(gain0*2);
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"TREBLE");u8g.setPrintPos(80, 44);u8g.print(treb_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BASS");u8g.setPrintPos(80, 54);u8g.print(bass_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BALANCE");u8g.setPrintPos(80, 64);u8g.print(ball);u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  

//////// TREBLE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  treb_reg=treb_reg-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}
 
   if(ir.value==IR4){treb_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){treb_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка <
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"TREBLE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(treb_reg*2);  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BASS");u8g.setPrintPos(80, 44);u8g.print(bass_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BALANCE");u8g.setPrintPos(80, 54);u8g.print(ball);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"VOLUME");u8g.setPrintPos(80, 64);u8g.print(79-vol_reg);//u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
//////// BASS //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==2){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  bass_reg=bass_reg-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}
 
   if(ir.value==IR4){bass_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){bass_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка <
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BASS");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(bass_reg*2);  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BALANCE");u8g.setPrintPos(80, 44);u8g.print(ball);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"VOLUME");u8g.setPrintPos(80, 54);u8g.print(79-vol_reg);//u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"TREBLE");u8g.setPrintPos(80, 64);u8g.print(treb_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  
//////// BALANCE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==3){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  ball=ball-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}
 
   if(ir.value==IR4){ball++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){ball--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка <
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BALANCE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(abs(ball));  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  if(ball<=0){u8g.drawStr(45,28,"LCH");}
  if(ball>=0){u8g.drawStr(105,28,"RCH");}
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"VOLUME");u8g.setPrintPos(80, 44);u8g.print(79-vol_reg);//u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"TREBLE");u8g.setPrintPos(80, 54);u8g.print(treb_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BASS");u8g.setPrintPos(80, 64);u8g.print(bass_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
////////////// INPUT GAIN ///////////////////////////////////////////////////////////////////
 if(menu==4){
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }
 
  if (newPosition != oldPosition){oldPosition = newPosition;gain0=gain0-newPosition;myEnc.write(0);newPosition=0;times=millis();www=1;w=1;w2=1;gain_func();}
 
   if(ir.value==IR4){gain0++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){gain0--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка <
 
  switch(in_reg){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     }  
  if(www==1){audio_R();audio_L();www=0;}
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"INPUT");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(in_reg+1);  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"GAIN");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 60);u8g.print(gain0*2);
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
 
////////////////// EEPROM //////////////////////////////////////////////////////////////
 if(millis()-times>10000 && w2==1 && mute_reg==0 && power==0){
     EEPROM.update(0,vol_reg);EEPROM.update(1,treb_reg+5);EEPROM.update(2,bass_reg);EEPROM.update(4,gain1);
     EEPROM.update(5,gain2);EEPROM.update(6,gain3);EEPROM.update(7,gain4);EEPROM.update(8,gain5);
     EEPROM.update(9,in_reg);EEPROM.update(10,ball+4);
     if(menu!=0){menu=0;}w=1;w2=0;}   
}// end loop
 
void treb_func(){if(treb_reg<-5){treb_reg=-5;}if(treb_reg>5){treb_reg=5;}}
void gain_func(){{if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}}
void ball_func(){if(ball>4){ball=4;}if(ball<-4){ball=-4;}}
void bass_func(){if(bass_reg<0){bass_reg=0;}if(bass_reg>10){bass_reg=10;}}
void vol_func(){if(vol_reg<4){vol_reg=4;}if(vol_reg>79){vol_reg=79;}}
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(300);}
void out_in(bool o1, bool o2, bool o3, bool o4){digitalWrite(A0,o1);digitalWrite(A2,o2);digitalWrite(A3,o3);digitalWrite(A4,o4);}
 
void audio_L(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg-ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5 
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(1);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3 
  lc.test();
  }
 
void audio_R(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg+ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5 
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(2);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3 
  lc.test();
  }  

5

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Вау!
Я только к 5 августа смогу проверить.
Большое спасибо Александр!

6

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Основная статья - http://rcl-radio.ru/?p=130783

7

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Класс!
Александр, спасибо за статью.

8

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Уважаемый liman324, в схеме нет ошибки в части подключения LC75341?
Сегодня-завтра протестирую цифровую часть, с аудиопроцессором пока не смогу.

9

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Уважаемый liman324, в схеме нет ошибки в части подключения LC75341?

Я поправил схему

10 (2023-08-06 08:34:50 отредактировано Karl2233)

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Доброго дня liman324!
Протестировал.
Пока обнаружил что на выходах А0-А3 не всё верно:
При ИН1, всё хорошо(А0=1,остальные =0).
При ИН2 и ИН4, везде 0.
При ИН3, А3=1, остальные =0.

11

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Ошибку нашел, скетч поправил:

#define IR2    0x33B820DF // button encoder
#define IR3    0x33B8946B // mute
#define IR4    0x33B810EF // >>>
#define IR5    0x33B8E01F // <<<
#define IR6    0x33B844BB // INPUT
#define POWER  0x33B800FF // STANDBY
 
#include <LC75341.h>           // http://rcl-radio.ru/wp-content/uploads/2022/01/lc75341.zip
#include <Wire.h> 
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
 
Encoder myEnc(8, 9);// DT, CLK
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
LC75341 lc(3,4,2);   // CE,DI,CL 
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 
 

long times,oldPosition  = -999,newPosition, times1;
int vol_reg,menu,mute_reg,power,treb_reg,gain0,gain1,gain2,gain3,gain4,gain5,bass_reg,in_reg,ball,vol_old;
bool w,w2,gr1,gr2,www,oled_off;
 
void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(10,INPUT);        // encoder SW
  pinMode(7,INPUT_PULLUP);  // mute button
  pinMode(11,INPUT_PULLUP); // input button
  pinMode(5,OUTPUT);        // OUT STBY
  pinMode(6,INPUT_PULLUP);  // POWER BUTTON
  // input_out_pin
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(A3,OUTPUT);
  vol_reg = EEPROM.read(0);treb_reg = EEPROM.read(1)-5;bass_reg = EEPROM.read(2);gain1 = EEPROM.read(4);
  gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);gain4 = EEPROM.read(7);gain5 = EEPROM.read(8);
  in_reg = EEPROM.read(9);ball = EEPROM.read(10)-4;oled_off = EEPROM.read(11);
  if(oled_off>1){oled_off=0;}
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }
  audio_L();
  audio_R();
 
}
 
void loop(){
//  Serial.println(menu);
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;times1=millis();}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   
//////// BUTTON /////////////////////////////////////////////////////////////////////////////////////////////////////////////
 if(power==0){
 if(mute_reg==0){
   if(digitalRead(10)==LOW||ir.value==IR2){menu++;times1=millis();gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>3){menu=0;}}
   if((digitalRead(11)==LOW||ir.value==IR6)){in_reg++;menu=4;cl();times1=millis();times=millis();w=1;w2=1;www=1;if(in_reg>3){in_reg=0;}}
  }
   if((digitalRead(7)==LOW||ir.value==IR3)&&mute_reg==0){mute_reg=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,"MUTE");} while( u8g.nextPage() );}
   if((digitalRead(7)==LOW||ir.value==IR3)&&mute_reg==1){mute_reg=0;times1=millis();w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}
 }
////////// POWER ///////////////////
  if((digitalRead(6)==LOW||ir.value==POWER)&&power==0){power=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(40,30,"POWER OFF");} while( u8g.nextPage() );
     delay(1500); u8g.firstPage();do {} while( u8g.nextPage() );}
   if((digitalRead(6)==LOW||ir.value==POWER)&&power==1){power=0;times1=millis();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"POWER ON");} while( u8g.nextPage() );delay(1500);
   w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}

   if(power==0){digitalWrite(5,HIGH);}else{digitalWrite(5,LOW);} 

   if(digitalRead(10)==LOW && digitalRead(11)==LOW && power==1 && oled_off==0){oled_off=1;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED OFF");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   if(digitalRead(10)==LOW && digitalRead(11)==LOW && power==1 && oled_off==1){oled_off=0;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED  ON");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  vol_reg=vol_reg+newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}
 
   if(ir.value==IR5){vol_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol_reg++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка >>>>>>
   if(ir.value==IR4){vol_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol_reg--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <<<<<<
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"VOLUME");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(79-vol_reg);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,18,"IN");
  u8g.setPrintPos(20, 18);u8g.print(in_reg+1);u8g.drawStr(0,28,"GAIN");u8g.setPrintPos(30, 28);u8g.print(gain0*2);
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"TREBLE");u8g.setPrintPos(80, 44);u8g.print(treb_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BASS");u8g.setPrintPos(80, 54);u8g.print(bass_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BALANCE");u8g.setPrintPos(80, 64);u8g.print(ball);u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  

//////// TREBLE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  treb_reg=treb_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}
 
   if(ir.value==IR4){treb_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){treb_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка <
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"TREBLE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(treb_reg*2);  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BASS");u8g.setPrintPos(80, 44);u8g.print(bass_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BALANCE");u8g.setPrintPos(80, 54);u8g.print(ball);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"VOLUME");u8g.setPrintPos(80, 64);u8g.print(79-vol_reg);//u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
//////// BASS //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==2){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  bass_reg=bass_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}
 
   if(ir.value==IR4){bass_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){bass_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка <
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BASS");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(bass_reg*2);  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BALANCE");u8g.setPrintPos(80, 44);u8g.print(ball);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"VOLUME");u8g.setPrintPos(80, 54);u8g.print(79-vol_reg);//u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"TREBLE");u8g.setPrintPos(80, 64);u8g.print(treb_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  
//////// BALANCE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==3){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  ball=ball-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}
 
   if(ir.value==IR4){ball++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){ball--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка <
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BALANCE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(abs(ball));  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  if(ball<=0){u8g.drawStr(45,28,"LCH");}
  if(ball>=0){u8g.drawStr(105,28,"RCH");}
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"VOLUME");u8g.setPrintPos(80, 44);u8g.print(79-vol_reg);//u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"TREBLE");u8g.setPrintPos(80, 54);u8g.print(treb_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BASS");u8g.setPrintPos(80, 64);u8g.print(bass_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
////////////// INPUT GAIN ///////////////////////////////////////////////////////////////////
 if(menu==4){
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }
 
  if (newPosition != oldPosition){oldPosition = newPosition;gain0=gain0-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();www=1;w=1;w2=1;gain_func();}
 
   if(ir.value==IR4){gain0++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){gain0--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка <
 
  switch(in_reg){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     }  
  if(www==1){audio_R();audio_L();www=0;}
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"INPUT");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(in_reg+1);  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"GAIN");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 60);u8g.print(gain0*2);
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
 
////////////////// EEPROM //////////////////////////////////////////////////////////////
 if(millis()-times>10000 && w2==1 && mute_reg==0 && power==0){
     EEPROM.update(0,vol_reg);EEPROM.update(1,treb_reg+5);EEPROM.update(2,bass_reg);EEPROM.update(4,gain1);
     EEPROM.update(5,gain2);EEPROM.update(6,gain3);EEPROM.update(7,gain4);EEPROM.update(8,gain5);
     EEPROM.update(9,in_reg);EEPROM.update(10,ball+4);
     if(menu!=0){menu=0;}w=1;w2=0;}  
 if(millis()-times1>30000 && mute_reg==0 && oled_off==1){ u8g.firstPage();   do {}  while( u8g.nextPage() );} 
}// end loop
 
void treb_func(){if(treb_reg<-5){treb_reg=-5;}if(treb_reg>5){treb_reg=5;}}
void gain_func(){{if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}}
void ball_func(){if(ball>4){ball=4;}if(ball<-4){ball=-4;}}
void bass_func(){if(bass_reg<0){bass_reg=0;}if(bass_reg>10){bass_reg=10;}}
void vol_func(){if(vol_reg<4){vol_reg=4;}if(vol_reg>79){vol_reg=79;}}
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(300);}
void out_in(bool o1, bool o2, bool o3, bool o4){digitalWrite(A0,o1);digitalWrite(A1,o2);digitalWrite(A2,o3);digitalWrite(A3,o4);}
 
void audio_L(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg-ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5 
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(1);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3 
  lc.test();
  }
 
void audio_R(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg+ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5 
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(2);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3 
  lc.test();
  }  

12 (2023-08-06 14:40:20 отредактировано Karl2233)

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Да, сейчас корректно отрабатывает.
Спасибо!
Разведу плату(с кондерами и резисторами на шинах управления) и проверю с аудиопроцессором.
Вопрос.
Александр, можно ли добавить такую функцию:
на любом свободном выходе Ардуины появляется лог "1" через 20сек после перехода из Power OFF в Power ON, при обратном переходе из ON в OFF, на этом выходе лог "0" и через 1-2сек лог "0" на  D5?
Таким образом, на двух выходах Ардуино есть лог "1" в режиме Power ON,  но они появляются в разное время.
Поясню.
В некоторых усилителях класса D все защиты встроены, но "бах" в динамиках слышен.
Например ТРА3221 при питании 15В работает четко, а при повышении питания до 30В этот "бах" грозит спалить колонки.
Ставить защиту АС бесполезно(в усилителе диф.выход), приколхозил таймер 555, но при вЫключении усилителя(Power OFF) проблема осталась.

13

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

на любом свободном выходе Ардуины появляется лог "1" через 20сек после перехода из Power OFF в Power ON, при обратном переходе из ON в OFF, на этом выходе лог "0" и через 1-2сек лог "0" на  D5?

Использован D13

#define IR2    0x33B820DF // button encoder
#define IR3    0x33B8946B // mute
#define IR4    0x33B810EF // >>>
#define IR5    0x33B8E01F // <<<
#define IR6    0x33B844BB // INPUT
#define POWER  0x33B800FF // STANDBY
 
#include <LC75341.h>           // http://rcl-radio.ru/wp-content/uploads/2022/01/lc75341.zip
#include <Wire.h> 
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
 
Encoder myEnc(8, 9);// DT, CLK
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
LC75341 lc(3,4,2);   // CE,DI,CL 
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 
 

long times,oldPosition  = -999,newPosition, times1, times2;
int vol_reg,menu,mute_reg,power,treb_reg,gain0,gain1,gain2,gain3,gain4,gain5,bass_reg,in_reg,ball,vol_old;
bool w,w2,gr1,gr2,www,oled_off,w_power;
 
void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(10,INPUT);        // encoder SW
  pinMode(7,INPUT_PULLUP);  // mute button
  pinMode(11,INPUT_PULLUP); // input button
  pinMode(5,OUTPUT);        // OUT STBY
  pinMode(6,INPUT_PULLUP);  // POWER BUTTON
  pinMode(13,OUTPUT);   
  digitalWrite(13,LOW);    
  // input_out_pin
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(A3,OUTPUT);
  vol_reg = EEPROM.read(0);treb_reg = EEPROM.read(1)-5;bass_reg = EEPROM.read(2);gain1 = EEPROM.read(4);
  gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);gain4 = EEPROM.read(7);gain5 = EEPROM.read(8);
  in_reg = EEPROM.read(9);ball = EEPROM.read(10)-4;oled_off = EEPROM.read(11);
  if(oled_off>1){oled_off=0;}
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }
  audio_L();
  audio_R();
  times2=millis();
 
}
 
void loop(){
//  Serial.println(menu);
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;times1=millis();}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   
//////// BUTTON /////////////////////////////////////////////////////////////////////////////////////////////////////////////
 if(power==0){
 if(mute_reg==0){
   if(digitalRead(10)==LOW||ir.value==IR2){menu++;times1=millis();gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>3){menu=0;}}
   if((digitalRead(11)==LOW||ir.value==IR6)){in_reg++;menu=4;cl();times1=millis();times=millis();w=1;w2=1;www=1;if(in_reg>3){in_reg=0;}}
  }
   if((digitalRead(7)==LOW||ir.value==IR3)&&mute_reg==0){mute_reg=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,"MUTE");} while( u8g.nextPage() );}
   if((digitalRead(7)==LOW||ir.value==IR3)&&mute_reg==1){mute_reg=0;times1=millis();w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}
 }
////////// POWER ///////////////////
  if((digitalRead(6)==LOW||ir.value==POWER)&&power==0){power=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();times2=millis();digitalWrite(13,LOW);
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(40,30,"POWER OFF");} while( u8g.nextPage() );
     delay(1500);digitalWrite(5,LOW); u8g.firstPage();do {} while( u8g.nextPage() );}
   if((digitalRead(6)==LOW||ir.value==POWER)&&power==1){power=0;times1=millis();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"POWER ON");} while( u8g.nextPage() );delay(1500);
   w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}

   if(millis()-times2>20000 && power==0){digitalWrite(13,HIGH);}

   if(power==0){digitalWrite(5,HIGH);}

   if(digitalRead(10)==LOW && digitalRead(11)==LOW && power==1 && oled_off==0){oled_off=1;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED OFF");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   if(digitalRead(10)==LOW && digitalRead(11)==LOW && power==1 && oled_off==1){oled_off=0;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED  ON");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  vol_reg=vol_reg+newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}
 
   if(ir.value==IR5){vol_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol_reg++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка >>>>>>
   if(ir.value==IR4){vol_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol_reg--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <<<<<<
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"VOLUME");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(79-vol_reg);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,18,"IN");
  u8g.setPrintPos(20, 18);u8g.print(in_reg+1);u8g.drawStr(0,28,"GAIN");u8g.setPrintPos(30, 28);u8g.print(gain0*2);
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"TREBLE");u8g.setPrintPos(80, 44);u8g.print(treb_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BASS");u8g.setPrintPos(80, 54);u8g.print(bass_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BALANCE");u8g.setPrintPos(80, 64);u8g.print(ball);u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  

//////// TREBLE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  treb_reg=treb_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}
 
   if(ir.value==IR4){treb_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){treb_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка <
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"TREBLE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(treb_reg*2);  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BASS");u8g.setPrintPos(80, 44);u8g.print(bass_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BALANCE");u8g.setPrintPos(80, 54);u8g.print(ball);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"VOLUME");u8g.setPrintPos(80, 64);u8g.print(79-vol_reg);//u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
//////// BASS //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==2){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  bass_reg=bass_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}
 
   if(ir.value==IR4){bass_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){bass_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка <
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BASS");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(bass_reg*2);  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BALANCE");u8g.setPrintPos(80, 44);u8g.print(ball);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"VOLUME");u8g.setPrintPos(80, 54);u8g.print(79-vol_reg);//u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"TREBLE");u8g.setPrintPos(80, 64);u8g.print(treb_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  
//////// BALANCE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==3){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  ball=ball-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}
 
   if(ir.value==IR4){ball++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){ball--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка <
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BALANCE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(abs(ball));  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  if(ball<=0){u8g.drawStr(45,28,"LCH");}
  if(ball>=0){u8g.drawStr(105,28,"RCH");}
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"VOLUME");u8g.setPrintPos(80, 44);u8g.print(79-vol_reg);//u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"TREBLE");u8g.setPrintPos(80, 54);u8g.print(treb_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BASS");u8g.setPrintPos(80, 64);u8g.print(bass_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
////////////// INPUT GAIN ///////////////////////////////////////////////////////////////////
 if(menu==4){
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }
 
  if (newPosition != oldPosition){oldPosition = newPosition;gain0=gain0-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();www=1;w=1;w2=1;gain_func();}
 
   if(ir.value==IR4){gain0++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка > 
   if(ir.value==IR5){gain0--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка <
 
  switch(in_reg){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     }  
  if(www==1){audio_R();audio_L();www=0;}
 
  if(w==1){w=0;
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"INPUT");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(in_reg+1);  
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"GAIN");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 60);u8g.print(gain0*2);
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
 
////////////////// EEPROM //////////////////////////////////////////////////////////////
 if(millis()-times>10000 && w2==1 && mute_reg==0 && power==0){
     EEPROM.update(0,vol_reg);EEPROM.update(1,treb_reg+5);EEPROM.update(2,bass_reg);EEPROM.update(4,gain1);
     EEPROM.update(5,gain2);EEPROM.update(6,gain3);EEPROM.update(7,gain4);EEPROM.update(8,gain5);
     EEPROM.update(9,in_reg);EEPROM.update(10,ball+4);
     if(menu!=0){menu=0;}w=1;w2=0;}  
 if(millis()-times1>30000 && mute_reg==0 && oled_off==1){ u8g.firstPage();   do {}  while( u8g.nextPage() );} 
}// end loop
 
void treb_func(){if(treb_reg<-5){treb_reg=-5;}if(treb_reg>5){treb_reg=5;}}
void gain_func(){{if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}}
void ball_func(){if(ball>4){ball=4;}if(ball<-4){ball=-4;}}
void bass_func(){if(bass_reg<0){bass_reg=0;}if(bass_reg>10){bass_reg=10;}}
void vol_func(){if(vol_reg<4){vol_reg=4;}if(vol_reg>79){vol_reg=79;}}
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(300);}
void out_in(bool o1, bool o2, bool o3, bool o4){digitalWrite(A0,o1);digitalWrite(A1,o2);digitalWrite(A2,o3);digitalWrite(A3,o4);}
 
void audio_L(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg-ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5 
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(1);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3 
  lc.test();
  }
 
void audio_R(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg+ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5 
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(2);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3 
  lc.test();
  }  

14

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Класс!
Всё работает как надо.
Александр, огроменное спасибо!

З.Ы, помню кто-то говорил про бутылку рома smile  Полагаю что бутылку пересылать будет проблематично, но эквивалент в стоимости готов smile
Если можно, в личку, плз, куда сделать инвестицию в хорошее настроение и на развитие таланта.

15

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Заранее спасибо за помощь сайту!

Номер карты СБ указан в самом низу сайта rcl-radio.ru

16 (2023-08-06 21:08:43 отредактировано Karl2233)

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Только сейчас прочитал статью.
Оказывается в программе полно новинок: там кроме 4 выходов управления, есть ещё гашение дисплея.
Крутотень!
Теперь главное не забыть про активацию этого режима.
Был случай в детстве, какой-то полезный режим реализовал на 155 логике, и забыл про то, что активировал его.
Потом во время гулянки заметил что магнитофон странно ведет себя. Пока грелся паяльник, я его разобрал (быстро, как на Формуле 1), уже в канифоль ткнул жало и вспомнил...

17

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Доброго дня!
Вопрос - можно ли поменять в скетче D5 и D6 на D8 и D9? В используемых библиотеках ничего не надо менять?

18

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Да, можно поменять.

В используемых библиотеках ничего не надо менять?

Менять ни чего не надо

19

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Я великий программист smile
поменял шесть ног между собой (D5-D8, D6-D9 и D7-D10) в скетче и ничего не сломал.
Прям удивительно.
*пошёл дальше плату разводить и писать книгу Mein Programmierung

20 (2023-09-03 12:47:18 отредактировано Karl2233)

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Вопрос: почему в статье написано "скетч нуждается в тестировании"?
Всё прекрасно работает.
Я выложу скетч со сменой ног(так удобнее разводить, меньше перемычек) и схему (в оригинальном Вы добавляли ножку с задержкой).
Уважаемый liman324, поменяйте пожалуйста, в статье схему и скетч.
http://forum.rcl-radio.ru/uploads/images/2023/09/7d0560063d4231dc7ab39cd400b11178.jpg

#define IR2   0xFF2FD0 // button encoder
#define IR3   0xFFAF50 // mute
#define IR4   0xFF8F70 // >>>
#define IR5   0xFF4FB0 // <<<
#define IR6   0xFFCF30 // INPUT 
#define POWER 0xFF0FF0 // STANDBY

#include <LC75341.h>           // http://rcl-radio.ru/wp-content/uploads/ … c75341.zip
#include <Wire.h>
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/ … remote.zip

Encoder myEnc(5, 6);// DT, CLK(8, 9)
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
LC75341 lc(3,4,2);   // CE,DI,CL
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir;


long times,oldPosition  = -999,newPosition, times1, times2;
int vol_reg,menu,mute_reg,power,treb_reg,gain0,gain1,gain2,gain3,gain4,gain5,bass_reg,in_reg,ball,vol_old;
bool w,w2,gr1,gr2,www,oled_off,w_power;

void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(7,INPUT);        // encoder SW
  pinMode(10,INPUT_PULLUP);  // mute button
  pinMode(11,INPUT_PULLUP); // input button
  pinMode(8,OUTPUT);        // OUT STBY
  pinMode(9,INPUT_PULLUP);  // POWER BUTTON
  pinMode(13,OUTPUT);   // тут сразу пропадает напряжение при ВЫКЛ и появляется с задержкой при ВКЛ
  digitalWrite(13,LOW);  // input_out_pin
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(A3,OUTPUT);
  vol_reg = EEPROM.read(0);treb_reg = EEPROM.read(1)-5;bass_reg = EEPROM.read(2);gain1 = EEPROM.read(4);
  gain2 = EEPROM.read(8);gain3 = EEPROM.read(9);gain4 = EEPROM.read(10);gain5 = EEPROM.read(5);
  in_reg = EEPROM.read(6);ball = EEPROM.read(7)-4;oled_off = EEPROM.read(11);
  if(oled_off>1){oled_off=0;}
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }
  audio_L();
  audio_R();
  times2=millis();

}

void loop(){
//  Serial.println(menu);
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;times1=millis();}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   
//////// BUTTON /////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(power==0){
if(mute_reg==0){
   if(digitalRead(7)==LOW||ir.value==IR2){menu++;times1=millis();gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>3){menu=0;}}
   if((digitalRead(11)==LOW||ir.value==IR6)){in_reg++;menu=4;cl();times1=millis();times=millis();w=1;w2=1;www=1;if(in_reg>3){in_reg=0;}}
  }
   if((digitalRead(10)==LOW||ir.value==IR3)&&mute_reg==0){mute_reg=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,"MUTE");} while( u8g.nextPage() );}
   if((digitalRead(10)==LOW||ir.value==IR3)&&mute_reg==1){mute_reg=0;times1=millis();w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}
}
////////// POWER ///////////////////
  if((digitalRead(9)==LOW||ir.value==POWER)&&power==0){power=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();times2=millis();digitalWrite(13,LOW);
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(40,30,"POWER OFF");} while( u8g.nextPage() );
     delay(1500);digitalWrite(5,LOW); u8g.firstPage();do {} while( u8g.nextPage() );}
   if((digitalRead(9)==LOW||ir.value==POWER)&&power==1){power=0;times1=millis();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"POWER ON");} while( u8g.nextPage() );delay(1500);
   w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}

   if(millis()-times2>10000 && power==0){digitalWrite(13,HIGH);}

   if(power==0){digitalWrite(8,HIGH);}else{digitalWrite(8,LOW);}

   if(digitalRead(7)==LOW && digitalRead(11)==LOW && power==1 && oled_off==0){oled_off=1;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED OFF");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   if(digitalRead(7)==LOW && digitalRead(11)==LOW && power==1 && oled_off==1){oled_off=0;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED  ON");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   
//////// VOLUME ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  vol_reg=vol_reg+newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}

   if(ir.value==IR5){vol_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){vol_reg++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка >>>>>>
   if(ir.value==IR4){vol_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol_reg--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <<<<<<

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"VOLUME");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(79-vol_reg);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,18,"IN");
  u8g.setPrintPos(20, 18);u8g.print(in_reg+1);u8g.drawStr(0,28,"GAIN");u8g.setPrintPos(30, 28);u8g.print(gain0*2);
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"TREBLE");u8g.setPrintPos(80, 44);u8g.print(treb_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BASS");u8g.setPrintPos(80, 54);u8g.print(bass_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BALANCE");u8g.setPrintPos(80, 64);u8g.print(ball);u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

//////// TREBLE ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  treb_reg=treb_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}

   if(ir.value==IR4){treb_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){treb_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка <

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"TREBLE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(treb_reg*2); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BASS");u8g.setPrintPos(80, 44);u8g.print(bass_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BALANCE");u8g.setPrintPos(80, 54);u8g.print(ball);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"VOLUME");u8g.setPrintPos(80, 64);u8g.print(79-vol_reg);//u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////// BASS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==2){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  bass_reg=bass_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}

   if(ir.value==IR4){bass_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){bass_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка <

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BASS");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(bass_reg*2); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BALANCE");u8g.setPrintPos(80, 44);u8g.print(ball);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"VOLUME");u8g.setPrintPos(80, 54);u8g.print(79-vol_reg);//u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"TREBLE");u8g.setPrintPos(80, 64);u8g.print(treb_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
//////// BALANCE ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==3){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  ball=ball-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}

   if(ir.value==IR4){ball++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){ball--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка <

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BALANCE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(abs(ball)); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  if(ball<=0){u8g.drawStr(45,28,"LCH");}
  if(ball>=0){u8g.drawStr(105,28,"RCH");}
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"VOLUME");u8g.setPrintPos(80, 44);u8g.print(79-vol_reg);//u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"TREBLE");u8g.setPrintPos(80, 54);u8g.print(treb_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BASS");u8g.setPrintPos(80, 64);u8g.print(bass_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////// INPUT GAIN ///////////////////////////////////////////////////////////////////
if(menu==4){
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }

  if (newPosition != oldPosition){oldPosition = newPosition;gain0=gain0-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();www=1;w=1;w2=1;gain_func();}

   if(ir.value==IR4){gain0++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){gain0--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка <

  switch(in_reg){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     } 
  if(www==1){audio_R();audio_L();www=0;}

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"INPUT");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(in_reg+1); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"GAIN");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 60);u8g.print(gain0*2);
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

////////////////// EEPROM //////////////////////////////////////////////////////////////
if(millis()-times>10000 && w2==1 && mute_reg==0 && power==0){
     EEPROM.update(0,vol_reg);EEPROM.update(1,treb_reg+5);EEPROM.update(2,bass_reg);EEPROM.update(4,gain1);
     EEPROM.update(8,gain2);EEPROM.update(9,gain3);EEPROM.update(7,gain4);EEPROM.update(5,gain5);
     EEPROM.update(6,in_reg);EEPROM.update(10,ball+4);
     if(menu!=0){menu=0;}w=1;w2=0;} 
if(millis()-times1>30000 && mute_reg==0 && oled_off==1){ u8g.firstPage();   do {}  while( u8g.nextPage() );}
}// end loop

void treb_func(){if(treb_reg<-5){treb_reg=-5;}if(treb_reg>5){treb_reg=5;}}
void gain_func(){{if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}}
void ball_func(){if(ball>4){ball=4;}if(ball<-4){ball=-4;}}
void bass_func(){if(bass_reg<0){bass_reg=0;}if(bass_reg>10){bass_reg=10;}}
void vol_func(){if(vol_reg<4){vol_reg=4;}if(vol_reg>79){vol_reg=79;}}
void to_Timer(){newPosition = myEnc.read()/4;}
void cl(){ir.value=0;delay(300);}
void out_in(bool o1, bool o2, bool o3, bool o4){digitalWrite(A0,o1);digitalWrite(A1,o2);digitalWrite(A2,o3);digitalWrite(A3,o4);}

void audio_L(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg-ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(1);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3
  lc.test();
  }

void audio_R(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg+ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(2);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3
  lc.test();
  }

21

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Вопрос: почему в статье написано "скетч нуждается в тестировании"?

Тестирование с подключенным аудиопроцессором проводили?

22 (2023-09-10 18:05:09 отредактировано Karl2233)

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

Да, проводил.
Всё работает кроме:
1. При регулировке вниз, с 1 на 0, скачок громкости вверх, хотя на дисплее 0. При этом скачке тембр меняется. Т.е. переход на 0 не корректно работает.
2. При спящем дисплее, если крутить энкодер то раздаётся щелчок. Очень громкий.
3. При регулировке громкости от 0 до 10 раздаются щелчки энкодера. Потом, при переходе с 10 на 11 щелчок и нормально регулируется.
4.Цифровой шум, капец достал. Если подключаю УМ к плате процессора без питания, то шум все равно есть. Какая-то генерация возникает при подключении к плате процессора.
Если отключаю выход от платы процессора, то в колонках тишина. Ищу земляную петлю.

Питание организовано так:
1.держурный ИИП(его общий соеденил с общим основного ИИП) питает Атмегу.
2.основной ИИП через XL4019 понижает до 12, потом LM7809.

23

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

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

Сделайте питание наподобие:

http://forum.rcl-radio.ru/uploads/images/2023/09/b4fe4a435f9e5cc7900b8d17bd26117d.png

Поправил Ваш скетч, проверьте регулировку громкости.

В режиме STANDBY отключил таймер который следит за энкодером, при включении включаю его, щелчки должны пропасть.


#define IR2   0xFF2FD0 // button encoder
#define IR3   0xFFAF50 // mute
#define IR4   0xFF8F70 // >>>
#define IR5   0xFF4FB0 // <<<
#define IR6   0xFFCF30 // INPUT 
#define POWER 0xFF0FF0 // STANDBY

#include <LC75341.h>           // http://rcl-radio.ru/wp-content/uploads/ … c75341.zip
#include <Wire.h>
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/ … remote.zip

Encoder myEnc(5, 6);// DT, CLK(8, 9)
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
LC75341 lc(3,4,2);   // CE,DI,CL
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir;


long times,oldPosition  = -999,newPosition, times1, times2;
int vol_reg,menu,mute_reg,power,treb_reg,gain0,gain1,gain2,gain3,gain4,gain5,bass_reg,in_reg,ball,vol_old;
bool w,w2,gr1,gr2,www,oled_off,w_power;

void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(7,INPUT);        // encoder SW
  pinMode(10,INPUT_PULLUP);  // mute button
  pinMode(11,INPUT_PULLUP); // input button
  pinMode(8,OUTPUT);        // OUT STBY
  pinMode(9,INPUT_PULLUP);  // POWER BUTTON
  pinMode(13,OUTPUT);   // тут сразу пропадает напряжение при ВЫКЛ и появляется с задержкой при ВКЛ
  digitalWrite(13,LOW);  // input_out_pin
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(A3,OUTPUT);
  vol_reg = EEPROM.read(0);treb_reg = EEPROM.read(1)-5;bass_reg = EEPROM.read(2);gain1 = EEPROM.read(4);
  gain2 = EEPROM.read(8);gain3 = EEPROM.read(9);gain4 = EEPROM.read(10);gain5 = EEPROM.read(5);
  in_reg = EEPROM.read(6);ball = EEPROM.read(7)-4;oled_off = EEPROM.read(11);
  if(oled_off>1){oled_off=0;}
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }
  audio_L();
  audio_R();
  times2=millis();

}

void loop(){
//  Serial.println(menu);
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;times1=millis();}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   
//////// BUTTON /////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(power==0){
if(mute_reg==0){
   if(digitalRead(7)==LOW||ir.value==IR2){menu++;times1=millis();gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>3){menu=0;}}
   if((digitalRead(11)==LOW||ir.value==IR6)){in_reg++;menu=4;cl();times1=millis();times=millis();w=1;w2=1;www=1;if(in_reg>3){in_reg=0;}}
  }
   if((digitalRead(10)==LOW||ir.value==IR3)&&mute_reg==0){mute_reg=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,"MUTE");} while( u8g.nextPage() );}
   if((digitalRead(10)==LOW||ir.value==IR3)&&mute_reg==1){mute_reg=0;times1=millis();w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}
}
////////// POWER ///////////////////
  if((digitalRead(9)==LOW||ir.value==POWER)&&power==0){power=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();times2=millis();digitalWrite(13,LOW);
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(40,30,"POWER OFF");} while( u8g.nextPage() );
     MsTimer2::set(1, to_Timer);MsTimer2::stop();delay(1500);digitalWrite(5,LOW); u8g.firstPage();do {} while( u8g.nextPage() );}
   if((digitalRead(9)==LOW||ir.value==POWER)&&power==1){power=0;times1=millis();MsTimer2::set(1, to_Timer);MsTimer2::start();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"POWER ON");} while( u8g.nextPage() );delay(1500);
   w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}

   if(millis()-times2>10000 && power==0){digitalWrite(13,HIGH);}

   if(power==0){digitalWrite(8,HIGH);}else{digitalWrite(8,LOW);}

   if(digitalRead(7)==LOW && digitalRead(11)==LOW && power==1 && oled_off==0){oled_off=1;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED OFF");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   if(digitalRead(7)==LOW && digitalRead(11)==LOW && power==1 && oled_off==1){oled_off=0;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED  ON");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   
//////// VOLUME ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  vol_reg=vol_reg+newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}

   if(ir.value==IR5){vol_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){vol_reg++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка >>>>>>
   if(ir.value==IR4){vol_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol_reg--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <<<<<<

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"VOLUME");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(79-vol_reg);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,18,"IN");
  u8g.setPrintPos(20, 18);u8g.print(in_reg+1);u8g.drawStr(0,28,"GAIN");u8g.setPrintPos(30, 28);u8g.print(gain0*2);
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"TREBLE");u8g.setPrintPos(80, 44);u8g.print(treb_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BASS");u8g.setPrintPos(80, 54);u8g.print(bass_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BALANCE");u8g.setPrintPos(80, 64);u8g.print(ball);u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

//////// TREBLE ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  treb_reg=treb_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}

   if(ir.value==IR4){treb_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){treb_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка <

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"TREBLE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(treb_reg*2); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BASS");u8g.setPrintPos(80, 44);u8g.print(bass_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BALANCE");u8g.setPrintPos(80, 54);u8g.print(ball);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"VOLUME");u8g.setPrintPos(80, 64);u8g.print(79-vol_reg);//u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////// BASS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==2){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  bass_reg=bass_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}

   if(ir.value==IR4){bass_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){bass_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка <

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BASS");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(bass_reg*2); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BALANCE");u8g.setPrintPos(80, 44);u8g.print(ball);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"VOLUME");u8g.setPrintPos(80, 54);u8g.print(79-vol_reg);//u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"TREBLE");u8g.setPrintPos(80, 64);u8g.print(treb_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
//////// BALANCE ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==3){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  ball=ball-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}

   if(ir.value==IR4){ball++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){ball--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка <

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BALANCE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(abs(ball)); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  if(ball<=0){u8g.drawStr(45,28,"LCH");}
  if(ball>=0){u8g.drawStr(105,28,"RCH");}
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"VOLUME");u8g.setPrintPos(80, 44);u8g.print(79-vol_reg);//u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"TREBLE");u8g.setPrintPos(80, 54);u8g.print(treb_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BASS");u8g.setPrintPos(80, 64);u8g.print(bass_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////// INPUT GAIN ///////////////////////////////////////////////////////////////////
if(menu==4){
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }

  if (newPosition != oldPosition){oldPosition = newPosition;gain0=gain0-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();www=1;w=1;w2=1;gain_func();}

   if(ir.value==IR4){gain0++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){gain0--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка <

  switch(in_reg){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     } 
  if(www==1){audio_R();audio_L();www=0;}

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"INPUT");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(in_reg+1); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"GAIN");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 60);u8g.print(gain0*2);
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

////////////////// EEPROM //////////////////////////////////////////////////////////////
if(millis()-times>10000 && w2==1 && mute_reg==0 && power==0){
     EEPROM.update(0,vol_reg);EEPROM.update(1,treb_reg+5);EEPROM.update(2,bass_reg);EEPROM.update(4,gain1);
     EEPROM.update(8,gain2);EEPROM.update(9,gain3);EEPROM.update(7,gain4);EEPROM.update(5,gain5);
     EEPROM.update(6,in_reg);EEPROM.update(10,ball+4);
     if(menu!=0){menu=0;}w=1;w2=0;} 
if(millis()-times1>30000 && mute_reg==0 && oled_off==1){ u8g.firstPage();   do {}  while( u8g.nextPage() );}
}// end loop

void treb_func(){if(treb_reg<-5){treb_reg=-5;}if(treb_reg>5){treb_reg=5;}}
void gain_func(){{if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}}
void ball_func(){if(ball>4){ball=4;}if(ball<-4){ball=-4;}}
void bass_func(){if(bass_reg<0){bass_reg=0;}if(bass_reg>10){bass_reg=10;}}
void vol_func(){if(vol_reg<4){vol_reg=4;}if(vol_reg>79){vol_reg=79;}}
void to_Timer(){newPosition = myEnc.read()/4;}
void cl(){ir.value=0;delay(300);}
void out_in(bool o1, bool o2, bool o3, bool o4){digitalWrite(A0,o1);digitalWrite(A1,o2);digitalWrite(A2,o3);digitalWrite(A3,o4);}

void audio_L(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg-4-ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(1);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3
  lc.test();
  }

void audio_R(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg-4+ball);  // volume 0...-79 dB = byte 0...79
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(2);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3
  lc.test();
  }

24

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

При просыпании проблема ушла.
Осталась проблема которая на минимальной громкости, только теперь с уровня "10" она ушла на уровень "6".
Получается так:  снижаешь громкость, на уровне "6" щелчок и уже на уровне "5" играет громко, как на "30". Дальнейшее снижение происходит со щелчками но громкость не снижается.
Если повышать громкость, то до "6" сама громкость не меняется, идут щелчки в динамиках. С уровня "6" всё работает как надо до уровня "75".

25

Re: Регулятор громкости и тембра на LC75341 + 0.96' I2C 128X64 OLED (Ardui

регулировка громкости от 0 до 71 дБ, 8 дБ забрал для баланса

#define IR2   0xFF2FD0 // button encoder
#define IR3   0xFFAF50 // mute
#define IR4   0xFF8F70 // >>>
#define IR5   0xFF4FB0 // <<<
#define IR6   0xFFCF30 // INPUT 
#define POWER 0xFF0FF0 // STANDBY

#include <LC75341.h>           // http://rcl-radio.ru/wp-content/uploads/ … c75341.zip
#include <Wire.h>
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/ … remote.zip

Encoder myEnc(5, 6);// DT, CLK(8, 9)
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
LC75341 lc(3,4,2);   // CE,DI,CL
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir;


long times,oldPosition  = -999,newPosition, times1, times2;
int vol_reg,menu,mute_reg,power,treb_reg,gain0,gain1,gain2,gain3,gain4,gain5,bass_reg,in_reg,ball,vol_old;
bool w,w2,gr1,gr2,www,oled_off,w_power;

void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(7,INPUT);        // encoder SW
  pinMode(10,INPUT_PULLUP);  // mute button
  pinMode(11,INPUT_PULLUP); // input button
  pinMode(8,OUTPUT);        // OUT STBY
  pinMode(9,INPUT_PULLUP);  // POWER BUTTON
  pinMode(13,OUTPUT);   // тут сразу пропадает напряжение при ВЫКЛ и появляется с задержкой при ВКЛ
  digitalWrite(13,LOW);  // input_out_pin
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(A3,OUTPUT);
  vol_reg = EEPROM.read(0);treb_reg = EEPROM.read(1)-5;bass_reg = EEPROM.read(2);gain1 = EEPROM.read(4);
  gain2 = EEPROM.read(8);gain3 = EEPROM.read(9);gain4 = EEPROM.read(10);gain5 = EEPROM.read(5);
  in_reg = EEPROM.read(6);ball = EEPROM.read(7)-4;oled_off = EEPROM.read(11);
  if(oled_off>1){oled_off=0;}
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }
  audio_L();
  audio_R();
  times2=millis();

}

void loop(){
//  Serial.println(menu);
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;times1=millis();}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   
//////// BUTTON /////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(power==0){
if(mute_reg==0){
   if(digitalRead(7)==LOW||ir.value==IR2){menu++;times1=millis();gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>3){menu=0;}}
   if((digitalRead(11)==LOW||ir.value==IR6)){in_reg++;menu=4;cl();times1=millis();times=millis();w=1;w2=1;www=1;if(in_reg>3){in_reg=0;}}
  }
   if((digitalRead(10)==LOW||ir.value==IR3)&&mute_reg==0){mute_reg=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,"MUTE");} while( u8g.nextPage() );}
   if((digitalRead(10)==LOW||ir.value==IR3)&&mute_reg==1){mute_reg=0;times1=millis();w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}
}
////////// POWER ///////////////////
  if((digitalRead(9)==LOW||ir.value==POWER)&&power==0){power=1;menu=100;cl();vol_old=vol_reg;vol_reg=79;audio_R();audio_L();times2=millis();digitalWrite(13,LOW);
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(40,30,"POWER OFF");} while( u8g.nextPage() );
     MsTimer2::set(1, to_Timer);MsTimer2::stop();delay(1500);digitalWrite(5,LOW); u8g.firstPage();do {} while( u8g.nextPage() );}
   if((digitalRead(9)==LOW||ir.value==POWER)&&power==1){power=0;times1=millis();MsTimer2::set(1, to_Timer);MsTimer2::start();
     u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"POWER ON");} while( u8g.nextPage() );delay(1500);
   w=1;menu=0;cl();vol_reg=vol_old;audio_R();audio_L();}

   if(millis()-times2>10000 && power==0){digitalWrite(13,HIGH);}

   if(power==0){digitalWrite(8,HIGH);}else{digitalWrite(8,LOW);}

   if(digitalRead(7)==LOW && digitalRead(11)==LOW && power==1 && oled_off==0){oled_off=1;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED OFF");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   if(digitalRead(7)==LOW && digitalRead(11)==LOW && power==1 && oled_off==1){oled_off=0;EEPROM.update(11,oled_off);
   u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(42,30,"OLED  ON");} while( u8g.nextPage() );
   delay(2000);u8g.firstPage();do {} while( u8g.nextPage() );}
   
//////// VOLUME ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  vol_reg=vol_reg+newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}

   if(ir.value==IR5){vol_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){vol_reg++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка >>>>>>
   if(ir.value==IR4){vol_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol_reg--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio_R();audio_L();}// кнопка <<<<<<

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"VOLUME");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(71-vol_reg);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,18,"IN");
  u8g.setPrintPos(20, 18);u8g.print(in_reg+1);u8g.drawStr(0,28,"GAIN");u8g.setPrintPos(30, 28);u8g.print(gain0*2);
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"TREBLE");u8g.setPrintPos(80, 44);u8g.print(treb_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BASS");u8g.setPrintPos(80, 54);u8g.print(bass_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BALANCE");u8g.setPrintPos(80, 64);u8g.print(ball);u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

//////// TREBLE ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  treb_reg=treb_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}

   if(ir.value==IR4){treb_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){treb_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio_R();audio_L();}// кнопка <

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"TREBLE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(treb_reg*2); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BASS");u8g.setPrintPos(80, 44);u8g.print(bass_reg*2);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"BALANCE");u8g.setPrintPos(80, 54);u8g.print(ball);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"VOLUME");u8g.setPrintPos(80, 64);u8g.print(79-vol_reg);//u8g.drawStr(95,64,"dB");
   } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////// BASS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==2){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  bass_reg=bass_reg-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}

   if(ir.value==IR4){bass_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){bass_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio_R();audio_L();}// кнопка <

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BASS");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(bass_reg*2); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"BALANCE");u8g.setPrintPos(80, 44);u8g.print(ball);u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"VOLUME");u8g.setPrintPos(80, 54);u8g.print(79-vol_reg);//u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"TREBLE");u8g.setPrintPos(80, 64);u8g.print(treb_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
//////// BALANCE ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==3){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  ball=ball-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}

   if(ir.value==IR4){ball++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){ball--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;ball_func();audio_R();audio_L();}// кнопка <

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BALANCE");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(abs(ball)); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  if(ball<=0){u8g.drawStr(45,28,"LCH");}
  if(ball>=0){u8g.drawStr(105,28,"RCH");}
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"VOLUME");u8g.setPrintPos(80, 44);u8g.print(79-vol_reg);//u8g.drawStr(95,44,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,54,"TREBLE");u8g.setPrintPos(80, 54);u8g.print(treb_reg*2);u8g.drawStr(95,54,"dB");
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,64,"BASS");u8g.setPrintPos(80, 64);u8g.print(bass_reg*2);u8g.drawStr(95,64,"dB");
    } while( u8g.nextPage() );
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////// INPUT GAIN ///////////////////////////////////////////////////////////////////
if(menu==4){
  switch(in_reg){
     case 0: gain0 = gain1;out_in(1,0,0,0);break;
     case 1: gain0 = gain2;out_in(0,1,0,0);break;
     case 2: gain0 = gain3;out_in(0,0,1,0);break;
     case 3: gain0 = gain4;out_in(0,0,0,1);break;
     }

  if (newPosition != oldPosition){oldPosition = newPosition;gain0=gain0-newPosition;myEnc.write(0);newPosition=0;times1=millis();times=millis();www=1;w=1;w2=1;gain_func();}

   if(ir.value==IR4){gain0++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка >
   if(ir.value==IR5){gain0--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;gain_func();audio_R();audio_L();}// кнопка <

  switch(in_reg){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     } 
  if(www==1){audio_R();audio_L();www=0;}

  if(w==1){w=0;
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"INPUT");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 22);u8g.print(in_reg+1); 
  u8g.setFont(u8g_font_profont12r);//u8g.drawStr(115,8,"dB");
  u8g.drawLine(0, 32, 128, 32);
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,44,"GAIN");u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(78, 60);u8g.print(gain0*2);
    } while( u8g.nextPage() );
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

////////////////// EEPROM //////////////////////////////////////////////////////////////
if(millis()-times>10000 && w2==1 && mute_reg==0 && power==0){
     EEPROM.update(0,vol_reg);EEPROM.update(1,treb_reg+5);EEPROM.update(2,bass_reg);EEPROM.update(4,gain1);
     EEPROM.update(8,gain2);EEPROM.update(9,gain3);EEPROM.update(7,gain4);EEPROM.update(5,gain5);
     EEPROM.update(6,in_reg);EEPROM.update(10,ball+4);
     if(menu!=0){menu=0;}w=1;w2=0;} 
if(millis()-times1>30000 && mute_reg==0 && oled_off==1){ u8g.firstPage();   do {}  while( u8g.nextPage() );}
}// end loop

void treb_func(){if(treb_reg<-5){treb_reg=-5;}if(treb_reg>5){treb_reg=5;}}
void gain_func(){{if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}}
void ball_func(){if(ball>4){ball=4;}if(ball<-4){ball=-4;}}
void bass_func(){if(bass_reg<0){bass_reg=0;}if(bass_reg>10){bass_reg=10;}}
void vol_func(){if(vol_reg<0){vol_reg=0;}if(vol_reg>71){vol_reg=71;}}
void to_Timer(){newPosition = myEnc.read()/4;}
void cl(){ir.value=0;delay(300);}
void out_in(bool o1, bool o2, bool o3, bool o4){digitalWrite(A0,o1);digitalWrite(A1,o2);digitalWrite(A2,o3);digitalWrite(A3,o4);}

void audio_L(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg+4-ball);  // volume 0...-79 dB = byte 0...79  71+4-4
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(1);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3
  lc.test();
  }

void audio_R(){
  lc.addr();
  lc.set_input(in_reg);   // input 1...4 = byte 0...3 (byte 4...7 = All switches off)
  lc.set_gain(gain0);    // gain 0...30 dB step 2 dB = byte 0...15
  lc.set_volume(vol_reg+4+ball);  // volume 0...-79 dB = byte 0...79   71+4+4
  lc.set_treble(treb_reg);  // treble -10...10 dB step 2 dB = int -5...5
  lc.set_bass(bass_reg);    // bass 0...20 dB step 2 dB = int 0...10
  lc.set_ch(2);      // Channel Selection RCH = byte 2, LCH = byte 1, Left and right together = byte 3
  lc.test();
  }