1

Тема: TDA8425 + OLED 128x32

http://forum.rcl-radio.ru/uploads/images/2026/01/c07c38d98b7a963a9d69cac0dbf02185.png

http://forum.rcl-radio.ru/uploads/images/2026/01/757dc857d69bfd965d9bed974888f543.png

http://forum.rcl-radio.ru/uploads/images/2026/01/6ccf049697bc477775a1682a1fa4a8d6.png

http://forum.rcl-radio.ru/uploads/images/2026/01/03068df51245af85557b796dca902ae7.png

http://forum.rcl-radio.ru/uploads/images/2026/01/c437dbd9d40eeed7bc82d5cccd62b1de.png

http://forum.rcl-radio.ru/uploads/images/2026/01/03a01820a12435ebe527034ba2f5bba8.png

http://forum.rcl-radio.ru/uploads/images/2026/01/05baa7de0dbc8d9959bc680a09cd0e0c.png

http://forum.rcl-radio.ru/uploads/images/2026/01/5ef886e5e5edba7e4f293b912e0bfca1.png

http://forum.rcl-radio.ru/uploads/images/2026/01/00c9efff332ec89a1e12b724bea5340d.png

http://forum.rcl-radio.ru/uploads/images/2026/01/7d1dc5c895bf287654b6afdcea1a13ea.png


// энкодер
#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/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,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);} 

2

Re: TDA8425 + OLED 128x32

C:\Users\User\AppData\Local\Temp\.arduinoIDE-unsaved202604-7308-tvyc4o.hqc5\sketch_jan4a\sketch_jan4a.ino:30:10: fatal error: boarddefs.h: No such file or directory
#include <boarddefs.h>          // входит в состав библиотеки IRremote
          ^~~~~~~~~~~~~
compilation terminated.
exit status 1

Compilation error: boarddefs.h: No such file or directory

Вот на этио ругается

3

Re: TDA8425 + OLED 128x32

Используйте библиотеку указанную в скетче - #include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/ … remote.zip

4

Re: TDA8425 + OLED 128x32

Всё, разобрался. новый ардуино иде ругается. на 1,8,19 прошилось. Вопрос по кнопкам. На какие пины подключаются

5

Re: TDA8425 + OLED 128x32

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

6

Re: TDA8425 + OLED 128x32

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

7

Re: TDA8425 + OLED 128x32

С тембрами всё норм

8

Re: TDA8425 + OLED 128x32

громкость как то не так работает. прибавляю, цифры увеличиваются а звук уменьшается - скетч поправил

9

Re: TDA8425 + OLED 128x32

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

10

Re: TDA8425 + OLED 128x32

обновил скетч

11

Re: TDA8425 + OLED 128x32

да кстати если что я использую плату lgt8

12

Re: TDA8425 + OLED 128x32

evgeny000 пишет:

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

на всякий случай повторю пост

13

Re: TDA8425 + OLED 128x32

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

У меня такого не наблюдается

14

Re: TDA8425 + OLED 128x32

Обновил скетч добавил паузу в 200 мс в код перебора меню

15

Re: TDA8425 + OLED 128x32

Огромнейшее спасибо. Результат превзошёл ожидания. Вы проделали огромную работу. Я думаю такой вариант будет интересен многим.

16

Re: TDA8425 + OLED 128x32

Я уже опубликовал статью на сайте rcl-radio.ru

17

Re: TDA8425 + OLED 128x32

Да увидел. Вы просто молодец.

18

Re: TDA8425 + OLED 128x32

PT2257 вот ещё бы эту микросхему перевести на такой же дисплей. Хотя это уже наверное наглость с моей стороны.

19

Re: TDA8425 + OLED 128x32

PT2257 вот ещё бы эту микросхему перевести на такой же дисплей. Хотя это уже наверное наглость с моей стороны.

Почему бы нет, опубликую статью на сайте.

Если для тестирования PT2257 все готово, то завтра напишу скетч, там всего то громкость, баланс, mute и Standby. Микросхема очень простая.

20

Re: TDA8425 + OLED 128x32

а чего там готовить. всё на макетке за минут 15-25 собирается

21

Re: TDA8425 + OLED 128x32

у меня даже собранная макетка есть. только там микруха m62429/ перекинуть не долго. да и команд там не много

22

Re: TDA8425 + OLED 128x32

http://forum.rcl-radio.ru/viewtopic.php … 057#p12057