26

Re: TDA8425 + OLED 128x32

Думал так же, но все согласно схеме подключены.

27

Re: TDA8425 + OLED 128x32

Опубликуйте скетч который используете.

28

Re: TDA8425 + OLED 128x32

Использовал скетч опубликованный Вами на странице проекта.

29

Re: TDA8425 + OLED 128x32

// энкодер
#define ENC_DT       9
#define ENC_CLK      8
#define ENC_SW       10

// ИК датчик
#define IR           12

// кнопки управления
#define IN_BUTTON       2
#define POWER_BUTTON    3
#define MUTE_BUTTON     4

// выход управления standby
#define STANDBY_OUT     13

// коды кнопок ИК пульта
#define MENU      0x2FDB24D // button encoder
#define UP        0x2FDD02F // >>>
#define DW        0x2FD32CD // <<<
#define INPUT_IR  0x2FD6A95 // IN
#define POWER_IR  0x2FD00FF // POWER
#define MUTE_IR   0x2FDB04F // MUTE

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

U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI
IRrecv irrecv(IR);
Encoder myEnc(ENC_DT, ENC_CLK);
decode_results ir;
TDA8425 tda;

extern uint8_t SmallFont[],BigNumbers[];
long times,oldPosition  = -999,newPosition;
int vol,balans,bass,treb,in,menu;
bool mute=0,gr1,gr2,w,w1,power=0;

void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
  pinMode(IN_BUTTON,INPUT_PULLUP);
  pinMode(POWER_BUTTON,INPUT_PULLUP);
  pinMode(MUTE_BUTTON,INPUT_PULLUP);
  pinMode(STANDBY_OUT,OUTPUT);

u8g.firstPage(); do {
  u8g.setFont(u8g_font_profont29r);u8g.drawStr(5,25,"TDA8425");
  }while( u8g.nextPage() );

  delay(300);
  digitalWrite(STANDBY_OUT,LOW);
  vol = EEPROM.read(0);bass = EEPROM.read(1);treb = EEPROM.read(2);balans = EEPROM.read(3)-4;in = EEPROM.read(4);
  audio();
}

void loop(){
  // IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта 
 
if(power==0){
if(digitalRead(ENC_SW)==LOW || ir.value==MENU){menu++;cl();delay(200);times=millis();w1=1;w=1;if(menu>3){menu=0;}} // меню

if((digitalRead(IN_BUTTON)==LOW || ir.value==INPUT_IR) && mute==0){in++;cl();times=millis();w1=1;w=1;if(in>1){in=0;}audio();
u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(0,25,"INPUT");u8g.setPrintPos(95, 25);u8g.print(in+1);}while( u8g.nextPage() );delay(1000);} // input

if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&& mute==0){mute=1;cl();times=millis();w1=1;w=1;audio();
u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(25,25,"MUTE");}while( u8g.nextPage() );delay(300);menu=100;} // mute on

if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&& mute==1){mute=0;cl();times=millis();w1=1;w=1;audio();
delay(300);menu=0;} // mute off
}

if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&& power==0){power=1;cl();times=millis();w1=1;w=1;mute=1;audio();digitalWrite(STANDBY_OUT,HIGH);
u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(10,25,"STANDBY");}while( u8g.nextPage() );delay(2000);menu=100;
u8g.firstPage(); do {}while( u8g.nextPage() );} // power on

if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&& power==1){power=0;cl();times=millis();w1=1;w=1;mute=0;audio();digitalWrite(STANDBY_OUT,LOW);delay(300);menu=0;} // power off

 
//////// VOLUME ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if(menu==0){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();}

   if(ir.value==UP){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка <<<<<<

  if(w==1){w=0;
// Serial.println(63-vol+balans);
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"VOLUME");
  u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(95, 24);u8g.print(vol-4);
  for(int v_pos=0; v_pos<(59-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos<(vol-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos<(59-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BASS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==1){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   bass=bass+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;bass_func();audio();}

   if(ir.value==UP){bass++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;bass_func();audio();}// кнопка >
   if(ir.value==DW){bass--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;bass_func();audio();}// кнопка <

  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(95, 24);u8g.print(bass-6);
  for(int v_pos=0; v_pos<(11-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos<(bass-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos<(11-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// TREB /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==2){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;treb_func();audio();}

   if(ir.value==UP){treb++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;treb_func();audio();}// кнопка >
   if(ir.value==DW){treb--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;treb_func();audio();}// кнопка <

  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(95, 24);u8g.print(treb-6);
  for(int v_pos=0; v_pos<(10-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos<(treb-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos<(10-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BALL /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==3){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   balans=balans+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;ball_func();audio();}

   if(ir.value==UP){balans++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка >
   if(ir.value==DW){balans--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка <

  if(w==1){w=0;
// Serial.println(63-vol+balans);
// Serial.println(63-vol-balans);
  u8g.firstPage(); 
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BALANCE");
  u8g.setFont(u8g_font_profont29r);
  if(balans>=0){u8g.setPrintPos(112, 24);u8g.print(balans);u8g.drawStr(95,24,"+");}
  else{u8g.setPrintPos(95, 24);u8g.print(balans);}

  for(int v_pos=0; v_pos<(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  const int SCREEN_WIDTH = 84;
  u8g.drawBox(43,18, 1, 9);// 0 dB
  if(balans >= 0){for(int v_pos=0; v_pos<(balans*8);v_pos+=4){u8g.drawBox(v_pos+48,18, 2, 9);}}
  else{for(int v_pos=SCREEN_WIDTH-48; v_pos>(SCREEN_WIDTH-(abs(balans)*8)-48); v_pos-=4){u8g.drawBox(v_pos,18, 2, 9);}}
  for(int v_pos=0; v_pos<(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
 
   } while( u8g.nextPage() );
  }}
 

////////////// EEPROM ///////////////////////////////////////////////////////////////////// 
  if(millis()-times>5000 && w1==1 && power==0 && mute==0){
     EEPROM.update(0,vol);EEPROM.update(1,bass);EEPROM.update(2,treb);EEPROM.update(3,balans+4);EEPROM.update(4,in);
     menu=0;w1=0;w=1;myEnc.write(0);}
  }


 
void to_Timer(){newPosition = myEnc.read()/4;}
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
}

void vol_func(){if(vol>59){vol=59;}if(vol<=4){vol=4;}} // int 0 = min ... int 63 = max + ballans 4 dB
void bass_func(){if(bass>11){bass=11;}if(bass<2){bass=2;}} // int 6 = 0 dB | int 2 = -12 dB | int 11 = 15 dB
void treb_func(){if(treb>10){treb=10;}if(treb<2){treb=2;}} // int 6 = 0 dB | int 2 = -12 dB | int 10 = 12 dB
void ball_func(){if(balans>4){balans=4;}if(balans<=-4){balans=-4;}}
void cl(){ir.value=0;delay(200);}

30

Re: TDA8425 + OLED 128x32

На платке энкодера проверьте наличие 3-х подтягивающих резисторов по 10 кОм

31

Re: TDA8425 + OLED 128x32

На плате только 2 резистора, звонятся оба по 7.9 кОм. Третий не припаян.

32

Re: TDA8425 + OLED 128x32

должно быть 3

33

Re: TDA8425 + OLED 128x32

Буду разбираться сам.

34

Re: TDA8425 + OLED 128x32

Проблема была в наводках на провода, схема была собрана на макетной планке с использованием длинных 10см проводов. После сборки и пайки все компактно в корпус, проблема исчезла.

35

Re: TDA8425 + OLED 128x32

// энкодер
#define ENC_DT       9
#define ENC_CLK      8
#define ENC_SW       10

// ИК датчик
#define IR           12

// кнопки управления
#define IN_BUTTON       2
#define POWER_BUTTON    3
#define MUTE_BUTTON     4

// выход управления standby
#define STANDBY_OUT     13

// выход управления input
#define IN_OUT     11

// коды кнопок ИК пульта
#define MENU      0x2FDB24D // button encoder
#define UP        0x2FDD02F // >>>
#define DW        0x2FD32CD // <<<
#define INPUT_IR  0x2FD6A95 // IN
#define POWER_IR  0x2FD00FF // POWER
#define MUTE_IR   0x2FDB04F // MUTE

#include <Wire.h> 
#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 <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip       
#include <boarddefs.h>          // входит в состав библиотеки IRremote
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <TDA8425.h>            // http://rcl-radio.ru/wp-content/uploads/2018/11/TDA8425.zip

 U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI 
 IRrecv irrecv(IR);
 Encoder myEnc(ENC_DT, ENC_CLK);
 decode_results ir; 
 TDA8425 tda;

 extern uint8_t SmallFont[],BigNumbers[];
 long times,times0,oldPosition  = -999,newPosition;
 int vol,balans,bass,treb,in,menu;
 bool mute=0,gr1,gr2,w,w1,power=0;
 bool in_flag,w2;

 void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  pinMode(IN_BUTTON,INPUT_PULLUP);
  pinMode(POWER_BUTTON,INPUT_PULLUP);
  pinMode(MUTE_BUTTON,INPUT_PULLUP);
  pinMode(STANDBY_OUT,OUTPUT);
  pinMode(IN_OUT,OUTPUT); 

 u8g.firstPage(); do {
  u8g.setFont(u8g_font_profont29r);u8g.drawStr(5,25,"TDA8425"); 
  }while( u8g.nextPage() );

  delay(300);
  digitalWrite(STANDBY_OUT,LOW);
  vol = EEPROM.read(0);bass = EEPROM.read(1);treb = EEPROM.read(2);balans = EEPROM.read(3)-4;in = EEPROM.read(4);
  if(in==0){digitalWrite(IN_OUT,HIGH);} 
  if(in==1){digitalWrite(IN_OUT,LOW);} 
  audio(); 
 }

 void loop(){
  // IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  
  
 if(power==0){ 
 if(digitalRead(ENC_SW)==LOW || ir.value==MENU){menu++;cl();delay(200);times=millis();w1=1;w=1;if(menu>3){menu=0;}} // меню

 if((digitalRead(IN_BUTTON)==LOW || ir.value==INPUT_IR) && mute==0){in++;cl();if(in>1){in=0;}audio();times0=millis();in_flag=1;
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);
 if(in==0){u8g.drawStr(0,25,"   AUX   ");digitalWrite(IN_OUT,HIGH);} 
 if(in==1){u8g.drawStr(0,25,"   BT  ");digitalWrite(IN_OUT,LOW);} 
 }while( u8g.nextPage() );delay(200);} // input 
 if(millis()-times0<3000 && in_flag==1){menu=100;}
 if(millis()-times0>=3000 && in_flag==1){menu=0;w=1;in_flag=0;}

 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&& mute==0){mute=1;cl();times=millis();w1=1;w=1;audio();
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(25,25,"MUTE");}while( u8g.nextPage() );delay(300);menu=100;} // mute on 

 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&& mute==1){mute=0;cl();times=millis();w1=1;w=1;audio();
 delay(300);menu=0;} // mute off 
 }

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&& power==0){power=1;cl();times=millis();w1=1;w=1;mute=1;audio();digitalWrite(STANDBY_OUT,HIGH);
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(10,25,"STANDBY");}while( u8g.nextPage() );delay(2000);menu=100;
 u8g.firstPage(); do {}while( u8g.nextPage() );} // power on 

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&& power==1){power=0;cl();times=millis();w1=1;w=1;mute=0;audio();digitalWrite(STANDBY_OUT,LOW);delay(300);menu=0;} // power off 
 
  
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();}
 
   if(ir.value==UP){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка <<<<<<
 
  if(w==1){w=0;
 // Serial.println(63-vol+balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"VOLUME");
  u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(95, 24);u8g.print(vol-4);
  for(int v_pos=0; v_pos<(59-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos<(vol-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos<(59-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BASS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==1){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   bass=bass+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;bass_func();audio();}

   if(ir.value==UP){bass++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;bass_func();audio();}// кнопка > 
   if(ir.value==DW){bass--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;bass_func();audio();}// кнопка <
 
  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(95, 24);u8g.print(bass-6);
  for(int v_pos=0; v_pos<(11-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos<(bass-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos<(11-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// TREB /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==2){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;treb_func();audio();}

   if(ir.value==UP){treb++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;treb_func();audio();}// кнопка > 
   if(ir.value==DW){treb--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;treb_func();audio();}// кнопка <
 
  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(95, 24);u8g.print(treb-6);
  for(int v_pos=0; v_pos<(10-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos<(treb-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos<(10-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BALL /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==3){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   balans=balans+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;ball_func();audio();}

   if(ir.value==UP){balans++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка > 
   if(ir.value==DW){balans--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка <
 
  if(w==1){w=0;
 // Serial.println(63-vol+balans);
 // Serial.println(63-vol-balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BALANCE");
  u8g.setFont(u8g_font_profont29r); 
  if(balans>=0){u8g.setPrintPos(112, 24);u8g.print(balans);u8g.drawStr(95,24,"+");}
  else{u8g.setPrintPos(95, 24);u8g.print(balans);}

  for(int v_pos=0; v_pos<(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  const int SCREEN_WIDTH = 84; 
  u8g.drawBox(43,18, 1, 9);// 0 dB
  if(balans >= 0){for(int v_pos=0; v_pos<(balans*8);v_pos+=4){u8g.drawBox(v_pos+48,18, 2, 9);}} 
  else{for(int v_pos=SCREEN_WIDTH-48; v_pos>(SCREEN_WIDTH-(abs(balans)*8)-48); v_pos-=4){u8g.drawBox(v_pos,18, 2, 9);}}
  for(int v_pos=0; v_pos<(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
  
   } while( u8g.nextPage() );
  }}
  

////////////// EEPROM /////////////////////////////////////////////////////////////////////  
  if(millis()-times>5000 && w1==1 && power==0 && mute==0){
     EEPROM.update(0,vol);EEPROM.update(1,bass);EEPROM.update(2,treb);EEPROM.update(3,balans+4);EEPROM.update(4,in);
     menu=0;w1=0;w=1;myEnc.write(0);}
  }


  
void to_Timer(){newPosition = myEnc.read()/4;} 
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
 } 

void vol_func(){if(vol>59){vol=59;}if(vol<=4){vol=4;}} // int 0 = min ... int 63 = max + ballans 4 dB 
void bass_func(){if(bass>11){bass=11;}if(bass<2){bass=2;}} // int 6 = 0 dB | int 2 = -12 dB | int 11 = 15 dB
void treb_func(){if(treb>10){treb=10;}if(treb<2){treb=2;}} // int 6 = 0 dB | int 2 = -12 dB | int 10 = 12 dB
void ball_func(){if(balans>4){balans=4;}if(balans<=-4){balans=-4;}}
void cl(){ir.value=0;delay(200);} 

36

Re: TDA8425 + OLED 128x32

Добрый день. А нет ли такого же, но без энкодера?. Просто на кнопках. Кнопок на корпусе много, а энкодер поставить негде...

37

Re: TDA8425 + OLED 128x32

Как вот тут, например.
https://rcl-radio.ru/?p=51737

38

Re: TDA8425 + OLED 128x32

Тестируйте:

// ИК датчик
#define IR           12

// кнопки управления
#define IN_BUTTON       2
#define POWER_BUTTON    3
#define MUTE_BUTTON     4

#define UP_BUTTON        5
#define DW_BUTTON        6
#define LEFT_BUTTON      7
#define RIGHT_BUTTON     8

// выход управления standby
#define STANDBY_OUT     13

// выход управления input
#define IN_OUT     11

// коды кнопок ИК пульта
#define MENU_UP   0x2FDB24D // button encoder
#define MENU_DW   0x2FDB23D // button encoder
#define UP        0x2FDD02F // >>>
#define DW        0x2FD32CD // <<<
#define INPUT_IR  0x2FD6A95 // IN
#define POWER_IR  0x2FD00FF // POWER
#define MUTE_IR   0x2FDB04F // MUTE

#include <Wire.h> 
#include <U8glib.h>             // https://github.com/olikraus/u8glib/  
#include <EEPROM.h>   
#include <boarddefs.h>          // входит в состав библиотеки IRremote
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <TDA8425.h>            // http://rcl-radio.ru/wp-content/uploads/2018/11/TDA8425.zip

 U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI 
 IRrecv irrecv(IR);
 decode_results ir; 
 TDA8425 tda;

 extern uint8_t SmallFont[],BigNumbers[];
 long times,times0,oldPosition  = -999,newPosition;
 int vol,balans,bass,treb,in,menu=0;
 bool mute=0,gr1,gr2,w=1,w1,power=0;
 bool in_flag,w2;

 void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  pinMode(IN_BUTTON,INPUT_PULLUP);
  pinMode(POWER_BUTTON,INPUT_PULLUP);
  pinMode(MUTE_BUTTON,INPUT_PULLUP);
  pinMode(STANDBY_OUT,OUTPUT);
  pinMode(IN_OUT,OUTPUT);
  pinMode(UP_BUTTON,INPUT_PULLUP);
  pinMode(DW_BUTTON,INPUT_PULLUP);
  pinMode(LEFT_BUTTON,INPUT_PULLUP);
  pinMode(RIGHT_BUTTON,INPUT_PULLUP);
   

 u8g.firstPage(); do {
  u8g.setFont(u8g_font_profont29r);u8g.drawStr(5,25,"TDA8425"); 
  }while( u8g.nextPage() );

  delay(300);
  digitalWrite(STANDBY_OUT,LOW);
  vol = EEPROM.read(0);bass = EEPROM.read(1);treb = EEPROM.read(2);balans = EEPROM.read(3)-4;in = EEPROM.read(4);
  if(in==0){digitalWrite(IN_OUT,HIGH);} 
  if(in==1){digitalWrite(IN_OUT,LOW);} 
  audio(); 
 }

 void loop(){
  // IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  
  
 if(power==0){ 
  
 if(digitalRead(UP_BUTTON)==LOW || ir.value==MENU_UP){menu++;cl();delay(200);times=millis();w1=1;w=1;if(menu>3){menu=0;}} // меню
 if(digitalRead(DW_BUTTON)==LOW || ir.value==MENU_DW){menu--;cl();delay(200);times=millis();w1=1;w=1;if(menu<0){menu=3;}} // меню
 

 if((digitalRead(IN_BUTTON)==LOW || ir.value==INPUT_IR) && mute==0){in++;cl();if(in>1){in=0;}audio();times0=millis();in_flag=1;
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);
 if(in==0){u8g.drawStr(0,25,"   AUX   ");digitalWrite(IN_OUT,HIGH);} 
 if(in==1){u8g.drawStr(0,25,"   BT  ");digitalWrite(IN_OUT,LOW);} 
 }while( u8g.nextPage() );delay(200);} // input 
 if(millis()-times0<3000 && in_flag==1){menu=100;}
 if(millis()-times0>=3000 && in_flag==1){menu=0;w=1;in_flag=0;}

 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&& mute==0){mute=1;cl();times=millis();w1=1;w=1;audio();
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(25,25,"MUTE");}while( u8g.nextPage() );delay(300);menu=100;} // mute on 

 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&& mute==1){mute=0;cl();times=millis();w1=1;w=1;audio();
 delay(300);menu=0;} // mute off 
 }

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&& power==0){power=1;cl();times=millis();w1=1;w=1;mute=1;audio();digitalWrite(STANDBY_OUT,HIGH);
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(10,25,"STANDBY");}while( u8g.nextPage() );delay(2000);menu=100;
 u8g.firstPage(); do {}while( u8g.nextPage() );} // power on 

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&& power==1){power=0;cl();times=millis();w1=1;w=1;mute=0;audio();digitalWrite(STANDBY_OUT,LOW);delay(300);menu=0;} // power off 
 
  
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
 
   if(ir.value==UP||digitalRead(RIGHT_BUTTON)==LOW){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка >>>>>>
   if(ir.value==DW||digitalRead(LEFT_BUTTON)==LOW){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка <<<<<<
 
  if(w==1){w=0;
 // Serial.println(63-vol+balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"VOLUME");
  u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(95, 24);u8g.print(vol-4);
  for(int v_pos=0; v_pos<(59-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos<(vol-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos<(59-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BASS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==1){
  // if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  // bass=bass+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;bass_func();audio();}

   if(ir.value==UP||digitalRead(RIGHT_BUTTON)==LOW){bass++;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;bass_func();audio();}// кнопка > 
   if(ir.value==DW||digitalRead(LEFT_BUTTON)==LOW){bass--;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;bass_func();audio();}// кнопка <
 
  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(95, 24);u8g.print(bass-6);
  for(int v_pos=0; v_pos<(11-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos<(bass-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos<(11-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// TREB /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==2){

   if(ir.value==UP||digitalRead(RIGHT_BUTTON)==LOW){treb++;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;treb_func();audio();}// кнопка > 
   if(ir.value==DW||digitalRead(LEFT_BUTTON)==LOW){treb--;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;treb_func();audio();}// кнопка <
 
  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(95, 24);u8g.print(treb-6);
  for(int v_pos=0; v_pos<(10-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos<(treb-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos<(10-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BALL /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==3){

   if(ir.value==UP||digitalRead(RIGHT_BUTTON)==LOW){balans++;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;ball_func();audio();}// кнопка > 
   if(ir.value==DW||digitalRead(LEFT_BUTTON)==LOW){balans--;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;ball_func();audio();}// кнопка <
 
  if(w==1){w=0;
 // Serial.println(63-vol+balans);
 // Serial.println(63-vol-balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,"BALANCE");
  u8g.setFont(u8g_font_profont29r); 
  if(balans>=0){u8g.setPrintPos(112, 24);u8g.print(balans);u8g.drawStr(95,24,"+");}
  else{u8g.setPrintPos(95, 24);u8g.print(balans);}

  for(int v_pos=0; v_pos<(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  const int SCREEN_WIDTH = 84; 
  u8g.drawBox(43,18, 1, 9);// 0 dB
  if(balans >= 0){for(int v_pos=0; v_pos<(balans*8);v_pos+=4){u8g.drawBox(v_pos+48,18, 2, 9);}} 
  else{for(int v_pos=SCREEN_WIDTH-48; v_pos>(SCREEN_WIDTH-(abs(balans)*8)-48); v_pos-=4){u8g.drawBox(v_pos,18, 2, 9);}}
  for(int v_pos=0; v_pos<(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
  
   } while( u8g.nextPage() );
  }}
  

////////////// EEPROM /////////////////////////////////////////////////////////////////////  
  if(millis()-times>5000 && w1==1 && power==0 && mute==0){
     EEPROM.update(0,vol);EEPROM.update(1,bass);EEPROM.update(2,treb);EEPROM.update(3,balans+4);EEPROM.update(4,in);
     menu=0;w1=0;w=1;}
  }


  
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
 } 

void vol_func(){if(vol>59){vol=59;}if(vol<=4){vol=4;}} // int 0 = min ... int 63 = max + ballans 4 dB 
void bass_func(){if(bass>11){bass=11;}if(bass<2){bass=2;}} // int 6 = 0 dB | int 2 = -12 dB | int 11 = 15 dB
void treb_func(){if(treb>10){treb=10;}if(treb<2){treb=2;}} // int 6 = 0 dB | int 2 = -12 dB | int 10 = 12 dB
void ball_func(){if(balans>4){balans=4;}if(balans<=-4){balans=-4;}}
void cl(){ir.value=0;delay(200);} 

39 (2026-08-24 15:29:25 отредактировано kkmaz)

Re: TDA8425 + OLED 128x32

Спасибо огромное. Сегодня заберу дисплейчик и протестирую.
Вопрос только один, За что отвечает кнопка IN, и что коммутирует вывод 11 INPUT ?

40

Re: TDA8425 + OLED 128x32

Вопрос только один, За что отвечает кнопка IN, и что коммутирует вывод 11 INPUT ?

Это просто индикатор выхода

41

Re: TDA8425 + OLED 128x32

Компиляция прошла нормально. Вроде все работает. Проверил пока без ТДАшки.

Re: TDA8425 + OLED 128x32

А можно скет поправить под дислей 1.3?

43

Re: TDA8425 + OLED 128x32

https://forum.rcl-radio.ru/uploads/images/2026/09/bd1e3227b58ed0ae46e6a76233bc933c.png
попробуйте сначала поменять настройки дисплея в библиотеке

44 (2026-09-11 00:07:14 отредактировано www.aleksandrov74)

Re: TDA8425 + OLED 128x32

Все нормально отображается корректно. Только беда Теперь команда с экодера и кнопок идут с какой то задержкой ,но у меня пока без TDA .Может быть такой эффект торможения без TDA? И еще при переводе на StandBY ,на 13 пине логическая 1,а хотелось бы 0.

45

Re: TDA8425 + OLED 128x32

www.aleksandrov74 пишет:

Все нормально отображается корректно. Только беда Теперь команда с экодера и кнопок идут с какой то задержкой ,но у меня пока без TDA .Может быть такой эффект торможения без TDA? И еще при переводе на StandBY ,на 13 пине логическая 1,а хотелось бы 0.

Если tda на шине нет ,возможны торможения.
https://forum.rcl-radio.ru/uploads/images/2026/09/46bd8cdb387588475e62a6ccb998b538.png
попробуйте так поменять выход пина 13.

46 (2026-09-11 12:26:50 отредактировано www.aleksandrov74)

Re: TDA8425 + OLED 128x32

if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&& power==0){power=1;cl();times=millis();w1=1;w=1;mute=1;audio();digitalWrite(STANDBY_OUT,LOW);
u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(10,25,"STANDBY");}while( u8g.nextPage() );delay(2000);menu=100;
u8g.firstPage(); do {}while( u8g.nextPage() );} // power on

if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&& power==1){power=0;cl();times=millis();w1=1;w=1;mute=0;audio();digitalWrite(STANDBY_OUT,HIGH);delay(300);menu=0;} // power off

Сделал как вы написали все четко!
Заменил еще одно но, картинка находится в верхних строках, а не по середине , как то можно поправить?
Еще можно было сделать при переключении входа, на каком нибудь пине ардуино появлялась логическая 1 ,а при переходе снова на другой вход ,стоновилась бы логический 0, и обозвать например это вход ,Bluetooth ON",а второй вход AUX.

47

Re: TDA8425 + OLED 128x32

www.aleksandrov74 пишет:

Заменил еще одно но, картинка находится в верхних строках, а не по середине , как то можно поправить?

Логично, что строка вверх сместилась. Ведь скетч написан под дисплей  128х32 пикселя ,а вы поставили дисплей 128х64 . Пикселей по вертикали стало в два раза больше. Нужно во всем скетче править расположение по вертикали.

48

Re: TDA8425 + OLED 128x32

www.aleksandrov74 пишет:

Еще можно было сделать при переключении входа, на каком нибудь пине ардуино появлялась логическая 1 ,а при переходе снова на другой вход ,стоновилась бы логический 0, и обозвать например это вход ,Bluetooth ON",а второй вход AUX.

В сообщении №38 скетч,там как раз ножка 11 меняет логические уровни при переключении входов.

Re: TDA8425 + OLED 128x32

Но там кнопки в управлении а не энкодер

50 (2026-09-11 18:36:35 отредактировано kkmaz)

Re: TDA8425 + OLED 128x32

Добрый день. Наконец-то собрал все в кучу. Все работает. Есть один нюанс, какой-то шум идет от ТДАшки.
При коротком на входе усилителя тишина полная. линейный вход минуя тда тоже тихо. 
Может ли шуметь длинная линия на А4,А5? Или то, что дисплей висит на одной линии данных с ТДАшкой?
И еще один вопрос, можно ли как-то выровнять входные уровни каналов?