Re: TDA8425 + OLED 128x32
Думал так же, но все согласно схеме подключены.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Переделки → 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);}
На платке энкодера проверьте наличие 3-х подтягивающих резисторов по 10 кОм
На плате только 2 резистора, звонятся оба по 7.9 кОм. Третий не припаян.
должно быть 3
Буду разбираться сам.
Проблема была в наводках на провода, схема была собрана на макетной планке с использованием длинных 10см проводов. После сборки и пайки все компактно в корпус, проблема исчезла.
// энкодер
#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);} Добрый день. А нет ли такого же, но без энкодера?. Просто на кнопках. Кнопок на корпусе много, а энкодер поставить негде...
Как вот тут, например.
https://rcl-radio.ru/?p=51737
Тестируйте:
// ИК датчик
#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);} Спасибо огромное. Сегодня заберу дисплейчик и протестирую.
Вопрос только один, За что отвечает кнопка IN, и что коммутирует вывод 11 INPUT ?
Вопрос только один, За что отвечает кнопка IN, и что коммутирует вывод 11 INPUT ?
Это просто индикатор выхода
Компиляция прошла нормально. Вроде все работает. Проверил пока без ТДАшки.
А можно скет поправить под дислей 1.3?
попробуйте сначала поменять настройки дисплея в библиотеке
Все нормально отображается корректно. Только беда Теперь команда с экодера и кнопок идут с какой то задержкой ,но у меня пока без TDA .Может быть такой эффект торможения без TDA? И еще при переводе на StandBY ,на 13 пине логическая 1,а хотелось бы 0.
Все нормально отображается корректно. Только беда Теперь команда с экодера и кнопок идут с какой то задержкой ,но у меня пока без TDA .Может быть такой эффект торможения без TDA? И еще при переводе на StandBY ,на 13 пине логическая 1,а хотелось бы 0.
Если tda на шине нет ,возможны торможения.
попробуйте так поменять выход пина 13.
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.
Заменил еще одно но, картинка находится в верхних строках, а не по середине , как то можно поправить?
Логично, что строка вверх сместилась. Ведь скетч написан под дисплей 128х32 пикселя ,а вы поставили дисплей 128х64 . Пикселей по вертикали стало в два раза больше. Нужно во всем скетче править расположение по вертикали.
Еще можно было сделать при переключении входа, на каком нибудь пине ардуино появлялась логическая 1 ,а при переходе снова на другой вход ,стоновилась бы логический 0, и обозвать например это вход ,Bluetooth ON",а второй вход AUX.
В сообщении №38 скетч,там как раз ножка 11 меняет логические уровни при переключении входов.
Но там кнопки в управлении а не энкодер
Добрый день. Наконец-то собрал все в кучу. Все работает. Есть один нюанс, какой-то шум идет от ТДАшки.
При коротком на входе усилителя тишина полная. линейный вход минуя тда тоже тихо.
Может ли шуметь длинная линия на А4,А5? Или то, что дисплей висит на одной линии данных с ТДАшкой?
И еще один вопрос, можно ли как-то выровнять входные уровни каналов?
forum.rcl-radio.ru → Переделки → TDA8425 + OLED 128x32