Re: TDA7439 + энкодер + ИК пульт + STANDBY + анализатор спектра
Хотя вроде по схеме справа почти везде - это кондеры для правильной работы регулятора частот.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Переделки → TDA7439 + энкодер + ИК пульт + STANDBY + анализатор спектра
Хотя вроде по схеме справа почти везде - это кондеры для правильной работы регулятора частот.
28 28 должны стоять 5,6 нФ, а на 2 выводе электролит, все остальные номиналы не важно.
здравствуйте , установил 5,6 нФ , на 2 ноге электролит и все равно не работает
Подтягивающие резисторы подключили?
Да, и с ними и без не работает , с Ардуино нано и мега ведет себя одинаково - в сканере просто перечисляются все адреса и приписка о неизвестном устройстве
Как правило запуск TDA7439 всегда происходил без проблем у многих пользователей форума судя по их сообщениям. Возможно есть ошибки в печатном монтаже, замыкание шины на массу или другие участки схемы. Я не вижу причин чтобы TDA7439 не запускалась. Бывают трудности у пользователей форума, как правило нет звука, но I2C адрес читался всегда.
Нужно ли обязательно подключать землю Ардуино и тда, пробовал и так и так
Обязательно нужно подключать.
А DIGGND тоже тоже на землю кидается ?
Сопротивление между DIGGND и SDA 3кОм
А DIGGND тоже тоже на землю кидается ?
Да
А в какой последовательности лучше подключать, если раздельное питание р сначала Ардуино, а потом tda?
На TDA подаете 9В с первого источника, его землю соединяете с землей адруино, ардуино питается от другого источника. Хотя можно их питать от одного источника 9В, подав 9 В на вход vin Arduino. Аналоговая земля tda и цифровая как правило объединяют через резистор 2,2 - 10 Ом, но можно просто их замкнуть.
Подскажите ошибку ?- при загрузке скетча выскакивает меню и экран выключен, при вкл power больше так не чудит и лишнее не выскакивает. Скетч переделал под свои хотелки.
#define IR_1 0xFF18E7 // Кнопка вверх
#define IR_2 0xFF4AB5 // Кнопка вниз
#define IR_3 0xFF5AA5 // Кнопка >
#define IR_4 0xFF10EF // Кнопка <
#define IR_5 0xFF38C7 // Кнопка IN
#define IR_6 0xFFB04F // Кнопка POWER
#define IR_7 0xFF6897 // Кнопка MUTE
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <Wire.h>
#include <TDA7419.h>
#include <IRremote.h>
#include <Encoder.h>
#include <MsTimer2.h>
Encoder myEnc(3,2); //CLK, DT
TDA7419 tda;
LiquidCrystal_I2C lcd(0x27,16,2);
IRrecv irrecv(12); // D12 = IR
decode_results ir;
int menu,menu2,vol,bas,w,w1,vol_d,bass_d,treb,treble_d,middle,middle_d,z,in,gain0,gain1,gain2,gain3,gain_d,set;
int lon, lon_f, lon_d,out,vol_out,rf,lf,rt,lt,sab,treb_c,mid_c,bas_c,sab_f,mute = 0,vol_ram;
unsigned long time, oldPosition = -999,times;
byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000};
byte a3[ 8 ] = { 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b00000, 0b00000, 0b00000};
byte a4[ 8 ] = { 0b00000, 0b00001, 0b00011, 0b01111, 0b01111, 0b00011, 0b00001, 0b00000};
byte a5[ 8 ] = { 0b00000, 0b00000, 0b01000, 0b00100, 0b00100, 0b01000, 0b00000, 0b00000};
byte tone1[ 8 ] = { 0b11100, 0b11110, 0b01000, 0b00100, 0b00010, 0b01110, 0b11110, 0b01100};
byte tone2[ 8 ] = { 0b00010, 0b00011, 0b00010, 0b01110, 0b11110, 0b01100, 0b00000, 0b00000};
byte tone3[ 8 ] = { 0b01000, 0b11100, 0b11101, 0b10100, 0b00100, 0b01001, 0b10000, 0b00000};
byte power=0,gr1,gr2,w2=1;
void setup() {
//Serial.begin(9600); // раскоментировать при настройке пульта
lcd.init(); // инициализация LCD дисплея SDA – A4, SCL – A5
lcd.createChar(0,a1);
lcd.createChar(1,a2);
lcd.createChar(2,a3);
lcd.createChar(3,a4);
lcd.createChar(4,a5);
lcd.createChar(5,tone1);
lcd.createChar(6,tone2);
lcd.createChar(7,tone3);
irrecv.enableIRIn(); // запускаем модуль IR
Wire.begin();
lcd.clear();
pinMode(A1,INPUT_PULLUP); // меню
pinMode(A0,INPUT_PULLUP); // Set
pinMode(11,INPUT_PULLUP); // Power
pinMode(A2,INPUT_PULLUP); // плюс
pinMode(A3,INPUT_PULLUP); // минус
pinMode(9,INPUT_PULLUP); // оптрон защита АС
pinMode(10,OUTPUT); // реле
pinMode(13,OUTPUT); // выход управления ST-BY
pinMode(4,INPUT_PULLUP); // кнопка энкодера
pinMode(8,INPUT_PULLUP); // mute
if(EEPROM.read(200)!=0){for(int i=0;i<201;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
vol = EEPROM.read(0);treb = EEPROM.read(1)-15;middle = EEPROM.read(3)-15;bas = EEPROM.read(3)-15;
in = EEPROM.read(4);gain1 = EEPROM.read(5);gain2 = EEPROM.read(6);gain3 = EEPROM.read(7);
lon = EEPROM.read(8);lon_f = EEPROM.read(9);rf = EEPROM.read(10);lf = EEPROM.read(11);
rt = EEPROM.read(12);lt = EEPROM.read(13);sab = EEPROM.read(14);treb_c = EEPROM.read(15);
mid_c = EEPROM.read(16);bas_c = EEPROM.read(17);sab_f = EEPROM.read(18);
MsTimer2::set(1, to_Timer);MsTimer2::start();
audio();
}
long newPosition;
void to_Timer(){ //функция таймера
newPosition = myEnc.read()/4;
}
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(ir.value==IR_6 && power==0)
{power=1;digitalWrite(13,LOW);digitalWrite(10,LOW);cl();menu=100;lcd.setCursor(0,0);lcd.print(F(" POWER OFF "));delay(1000);lcd.noBacklight();cl();}
if(ir.value==IR_6 && power==1)
{power=0;cl();w=1;menu=0;digitalWrite(13,HIGH);lcd.setCursor(0,0);lcd.print(F(" POWER ON "));delay(2000);cl();digitalWrite(10,HIGH);cl();}
if(ir.value==IR_2&& mute==0){menu2=100;menu++;cl();time=millis();w1=1;if(menu>4){menu=0;}} // меню кнопка пульта вверх
if(ir.value==IR_1&& mute==0){menu2=100;menu--;cl();time=millis();w1=1;if(menu>0){menu=4;}} // меню кнопка пульта вниз
if(ir.value==IR_7&& mute==0){mute++;w=1;if(mute>1){mute=0;}} // режим mute пульта
//------------------------------------------------------------------- power ---------------------------------------------------------------------------------------------------
if(digitalRead(9)==LOW)
{digitalWrite(10,LOW);digitalWrite(13,LOW);menu=100;menu2=100;lcd.clear();lcd.setCursor(0,0);lcd.print(F(" Warning!!! "));delay(500);}
if(digitalRead(11)==LOW && power==0)
{power=1;cl();myEnc.write(0);digitalWrite(10,LOW);digitalWrite(13,LOW);menu=100;menu2=100;lcd.setCursor(0,0);lcd.print(" POWER OFF ");delay(1000);lcd.noBacklight();cl();}
if(digitalRead(11)==LOW && power==1)
{power=0;cl();myEnc.write(0);digitalWrite(13,HIGH);w=1;menu=0;menu2=100;lcd.backlight();lcd.setCursor(0,0);lcd.print(" POWER ON ");delay(2000);digitalWrite(10,HIGH);cl();}
if(power==0){
if(digitalRead(4)==LOW){menu2=100;menu++;cl();myEnc.write(0);time=millis();w1=1;if(menu>3){menu=0;}} // основное меню,кнопка энкодера
if(digitalRead(A1)==LOW){menu=100;menu2++;cl();myEnc.write(0);time=millis();w1=1;if(menu2>6){menu2=0;}} // меню настроек
if(digitalRead(8)==LOW){mute++;w=1;cl();time=millis();if(mute>1){mute=0;}}
}
if(power==0){digitalWrite(13,LOW);}else{digitalWrite(13,HIGH);}
//--------------------------------------------------------------- Volume -80 ... 0 дБ ----------------------------------------------------------------------------------------
if(menu==0){
if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
vol=vol+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;vol_func();}
if(w==1){audio();cl();time=millis();w=0;w1=1;}
if(mute==1)
{lcd.setCursor(0,0);lcd.print("Volume "); lcd.print( "0");lcd.setCursor( 12, 0);lcd.print("MUTE");
lcd.setCursor( 1, 1); lcd.print("x"); lcd.setCursor( 0, 1);lcd.write(( uint8_t ) 3);
for ( z = 3 ; z <= 15; z++ ) { lcd.setCursor( z , 1);lcd.write(( uint8_t ) 2);}
}
if(mute==0)
{vol_d=map(vol,0,80,0,16);
lcd.setCursor(0,0);lcd.print("Volume "); lcd.print(-vol/5);lcd.setCursor(13,0);lcd.print("dB");
lcd.setCursor( 1, 1);lcd.write(( uint8_t ) 4);lcd.setCursor( 0, 1);lcd.write(( uint8_t ) 3);
if(vol_d>0){
for(z=2 ; z <= vol_d; z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}
for(z = vol_d ; z<=16; z++){lcd.setCursor(z+2,1);lcd.write((uint8_t)2);}}}
}
//----------------------------------------------------------- индикация, тембр ВЧ -15...15 дБ -------------------------------------------------------------------------------
if(menu==1){
if(ir.value==IR_3){treb++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
if(ir.value==IR_4){treb--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
treb=treb+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;treb_func();}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print("Treble ");
lcd.print(treb);lcd.setCursor(13,0);lcd.print("dB");treble_d=treb+15;
lcd.setCursor( 0, 1);lcd.write(( uint8_t ) 6);
treble_d = treb / 2 + 8;
if ( treble_d >= 0 ) {
for (z = 2 ; z <= treble_d; z++ ) {lcd.setCursor ( z, 1 );lcd.write ( ( uint8_t ) 0 ) ;}
for ( z = treble_d ; z <= 15; z++ ) {lcd.setCursor ( z + 2, 1 );lcd.write(( uint8_t ) 2);}}
}
//-------------------------------------------------------------- индикация, тембр CЧ -15...15 дБ ----------------------------------------------------------------------------
if(menu==2){
if (newPosition != oldPosition) {
oldPosition = newPosition;
middle=middle+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;if(middle>15){middle=15;}if(middle<-15){middle=-15;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print("Middle ");
lcd.print(middle);lcd.setCursor(13,0);lcd.print("dB");middle_d=middle+15;
lcd.setCursor( 0, 1);lcd.write(( uint8_t ) 7);
middle_d=middle / 2+8;
if(middle_d>0){
for(z=2 ; z <= middle_d; z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}
for(z = middle_d ; z<=15; z++){lcd.setCursor(z+2,1);lcd.write((uint8_t)2);}}
}
//------------------------------------------------------------------ индикация, тембр НЧ -15...15 дБ -------------------------------------------------------------------------
if(menu==3){
if(ir.value==IR_3){bas++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){bas++;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
if(ir.value==IR_4){bas--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){bas--;gr1=0;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
bas=bas+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;bass_func();}
lcd.setCursor(0,0);lcd.print("Bass ");
lcd.print(bas);lcd.setCursor(13,0);lcd.print("dB");bass_d=bas+15;
lcd.setCursor( 0, 1);lcd.write(( uint8_t ) 5);
bass_d=bas / 2+8;
if(bass_d>0){
for(z=2 ; z <= bass_d; z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}
for(z = bass_d ; z<=15; z++){lcd.setCursor(z+2,1);lcd.write((uint8_t)2);}}
}
//------------------------------------------------------------------- вход 1...3 + предусилитель 0...15 дБ -------------------------------------------------------------------
if(menu2==0){
if(digitalRead(A0)==LOW){in++;w=1;if(in>3){in=1;}}
if(in==1){gain0=gain1;}if(in==2){gain0=gain2;}if(in==3){gain0=gain3;}
if(digitalRead(A2)==LOW){gain0++;w=1;if(gain0>15){gain0=15;}}
if(digitalRead(A3)==LOW){gain0--;w=1;if(gain0<0){gain0=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Input: "));lcd.print(in);gain_d=gain0;
if(gain_d>=0){for(z=0;z<=gain_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
if((gain_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
if(in==1){gain1=gain0;}if(in==2){gain2=gain0;}if(in==3){gain3=gain0;}
lcd.setCursor(11,1);lcd.print(gain0);lcd.print(F(" dB "));}
//--------------------------------------------------------------------------- loudness ---------------------------------------------------------------------------------------
if(menu2==1){
if(digitalRead(A0)==LOW){lon_f++;w=1;if(lon_f>3){lon_f=0;}}
if(digitalRead(A2)==LOW){lon++;w=1;if(lon>15){lon=15;}}
if(digitalRead(A3)==LOW){lon--;w=1;if(lon<0){lon=0;}}
lcd.setCursor(0,0);lcd.print(F("Loudness: "));
switch(lon_f)
{case 0: lcd.print(F("FLAT"));break;
case 1: lcd.print(F("400Hz"));break;
case 2: lcd.print(F("800Hz"));break;
case 3: lcd.print(F("2400Hz"));break;}
lcd.setCursor(0,1);
if(lon_d>=0){for(z=0;z<=lon_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
if((lon_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
lcd.setCursor(9,1);lcd.print(F("-"));lcd.print(lon);lcd.print(F(" dB "));}
//----------------------------------------------------------------------------- out ------------------------------------------------------------------------------------------
if(menu2==2){
if(digitalRead(A0)==LOW){out++;w=1;if(out>4){out=0;}}
switch(out)
{case 0:vol_out=rf;break;
case 1:vol_out=lf;break;
case 2:vol_out=rt;break;
case 3:vol_out=lt;break;
case 4:vol_out=sab;break;}
if(digitalRead(A2)==LOW){vol_out++;w=1;if(vol_out>15){vol_out=15;}}
if(digitalRead(A3)==LOW){vol_out--;w=1;if(vol_out<0){vol_out=0;}}
lcd.setCursor(0,0);lcd.print(F("Volume OUT"));
lcd.setCursor(0,1);
switch(out){
case 0:rf=vol_out;lcd.print(F("RF: +"));lcd.print(rf);break;
case 1:lf=vol_out;lcd.print(F("LF: +"));lcd.print(lf);break;
case 2:rt=vol_out;lcd.print(F("RT: +"));lcd.print(rt);break;
case 3:lt=vol_out;lcd.print(F("LT: +"));lcd.print(lt);break;
case 4:sab=vol_out;lcd.print(F("SUBW: +"));lcd.print(sab);break;}
lcd.print(F(" dB "));if(w==1){audio();cl();time=millis();w1=1;w=0;}}
//---------------------------------------------------------------------------treble center -----------------------------------------------------------------------------------
if(menu2==3){
if(digitalRead(A2)==LOW){treb_c++;w=1;if(treb_c>3){treb_c=0;}}
if(digitalRead(A3)==LOW){treb_c--;w=1;if(treb_c<0){treb_c=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Treble Center "));
lcd.setCursor(1,6);
switch(treb_c){
case 0: lcd.print(F("10.0 kHz"));break;
case 1: lcd.print(F("12.5 kHz"));break;
case 2: lcd.print(F("15.0 kHz"));break;
case 3: lcd.print(F("17.5 kHz"));break;}}
//---------------------------------------------------------------------------- middle center ---------------------------------------------------------------------------------
if(menu2==4){
if(digitalRead(A2)==LOW){mid_c++;w=1;if(mid_c>3){mid_c=0;}}
if(digitalRead(A3)==LOW){mid_c--;w=1;if(mid_c<0){mid_c=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Middle Center "));
lcd.setCursor(1,6);
switch(mid_c){
case 0: lcd.print(F("0.5 kHz"));break;
case 1: lcd.print(F("1.0 kHz"));break;
case 2: lcd.print(F("1.5 kHz"));break;
case 3: lcd.print(F("2.5 kHz"));break;}}
//----------------------------------------------------------------------------- bass center ----------------------------------------------------------------------------------
if(menu2==5){
if(digitalRead(A2)==LOW){bas_c++;w=1;if(bas_c>3){bas_c=0;}}
if(digitalRead(A3)==LOW){bas_c--;w=1;if(bas_c<0){bas_c=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Bass Center "));
lcd.setCursor(1,6);
switch(bas_c){
case 0: lcd.print(F("60 Hz"));break;
case 1: lcd.print(F("80 Hz"));break;
case 2: lcd.print(F("100 Hz"));break;
case 3: lcd.print(F("200 Hz"));break;}}
//-------------------------------------------------------------------------------- subw --------------------------------------------------------------------------------------
if(menu2==6){
if(digitalRead(A2)==LOW){sab_f++;w=1;if(sab_f>3){sab_f=0;}}
if(digitalRead(A3)==LOW){sab_f--;w=1;if(sab_f<0){sab_f=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Subwoofer Freq."));
lcd.setCursor(1,6);
switch(sab_f){
case 0: lcd.print(F("FLAT"));break;
case 1: lcd.print(F("80 Hz"));break;
case 2: lcd.print(F("120 Hz"));break;
case 3: lcd.print(F("160 Hz"));break;}}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Serial.println(time);
if(millis()-time>10000 && w1==1 && power==0 && mute==0){
EEPROM.update(0,vol);EEPROM.update(1,treb+15);EEPROM.update(2,middle+15);EEPROM.update(3,bas+15);
EEPROM.update(4,in);EEPROM.update(5,gain1);EEPROM.update(6,gain2);EEPROM.update(7,gain3);
EEPROM.update(8,lon);EEPROM.update(9,lon_f);
EEPROM.update(10,rf);EEPROM.update(11,lf);EEPROM.update(12,rt);EEPROM.update(13,lt);
EEPROM.update(14,sab);EEPROM.update(15,treb_c);EEPROM.update(16,mid_c);EEPROM.update(17,bas_c);
EEPROM.update(18,sab_f);
menu2=100; menu=0;w1=0;cl();}
}
void treb_func(){if(treb>15){treb=15;}if(treb<-15){treb=-15;}}
void bass_func(){if(bas>15){bas=15;}if(bas<-15){bas=-15;}}
void vol_func(){if(vol>80){vol=80;}if(vol<0){vol=0;}}
void cl(){delay(300);lcd.clear();}
void audio(){
tda.setInput(in,gain0,0); //вх1=1, вх2=2, вх3=3
tda.setInput2(0,0,0); // не используется
tda.setAtt_loudness(lon,lon_f,0,0);
tda.setSoft(mute,0,0,0,0);//mute off (не менять)
tda.setVolume(vol-79,0); // общая громкость от 0 до 79 макс
tda.setAtt_LF(64+lf,0); // гром. лк фронт
tda.setAtt_RF(64+rf,0); // гром. пк фронт
tda.setAtt_LT(64+lt,0); // гром. лк тыл
tda.setAtt_RT(64+rt,0); // гром. пк тыл
tda.setAtt_SUB(64+sab,0); // гром. савбуфер
tda.setAtt_Mix(79,0); // не использует
tda.setFilter_Treble(treb,treb_c,0);
tda.setFilter_Middle(middle,0,0);
tda.setFilter_Bass(bas,0,0);
tda.setSub_M_B(sab_f,mid_c,bas_c,0,0);
tda.setMix_Gain_Eff(1,0,0,0,0); // не используется
tda.setSpektor(0,0,1,0,1,0,0);
}
Попробуйте так
int menu,menu2,vol,bas,w,w1,vol_d,bass_d,treb,treble_d,middle,middle_d,z,in,gain0,gain1,gain2,gain3,gain_d,set;
заменить на
int menu=100,menu2,vol,bas,w,w1,vol_d,bass_d,treb,treble_d,middle,middle_d,z,in,gain0,gain1,gain2,gain3,gain_d,set;
Благодарю, заработало
Гляньте скетч, есть ошибки ? малоопытен в программировании.
#define IR_1 0xFF18E7 // Кнопка вверх
#define IR_2 0xFF4AB5 // Кнопка вниз
#define IR_3 0xFF5AA5 // Кнопка >
#define IR_4 0xFF10EF // Кнопка <
#define IR_5 0xFF38C7 // Кнопка IN
#define IR_6 0xFFB04F // Кнопка POWER
#define IR_7 0xFF6897 // Кнопка MUTE
#define Power 11 // Power
#define Menu A1 // меню
#define Set A0 // Set
#define plus A2 // плюс
#define minus A3 // минус
#define Enc 4 // кнопка энкодера
#define Mute 8 // mute
#define st_by 13 // выход управления в режим ST-BY
#define guard 9 // оптрон защиты АС
#define relay 10 // реле защиты AC
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <Wire.h>
#include <TDA7419.h>
#include <IRremote.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <microDS18B20.h>
MicroDS18B20<5> sensor1; // Датчики температуры на D5 и D6
MicroDS18B20<6> sensor2;
Encoder myEnc(3,2); // CLK, DT
TDA7419 tda;
LiquidCrystal_I2C lcd(0x27,16,2);
IRrecv irrecv(12); // D12 = IR
decode_results ir;
int menu,menu2 = 100,vol,bas,w,w1,vol_d,bass_d,treb,treble_d,middle,middle_d,z,in,gain0,gain1,gain2,gain3,gain_d,set;
int lon, lon_f, lon_d,out,vol_out,rf,lf,rt,lt,sab,treb_c,mid_c,bas_c,sab_f,mute = 0,vol_ram;
unsigned long time, oldPosition = -999,times,Timer;
byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000};
byte a3[8]={ 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b00000, 0b00000, 0b00000};
byte a4[8]={ 0b00000, 0b00001, 0b00011, 0b01111, 0b01111, 0b00011, 0b00001, 0b00000};
byte a5[8]={ 0b00000, 0b00000, 0b01000, 0b00100, 0b00100, 0b01000, 0b00000, 0b00000};
byte tone1[ 8 ] = { 0b11100, 0b11110, 0b01000, 0b00100, 0b00010, 0b01110, 0b11110, 0b01100};
byte tone2[ 8 ] = { 0b00010, 0b00011, 0b00010, 0b01110, 0b11110, 0b01100, 0b00000, 0b00000};
byte tone3[ 8 ] = { 0b01000, 0b11100, 0b11101, 0b10100, 0b00100, 0b01001, 0b10000, 0b00000};
byte gr1,gr2,w2=1;
bool flag = false, power;
float temperature1,temperature2,temp = 80;
void setup() {
//Serial.begin(9600); // раскоментировать при настройке пульта
lcd.init(); // инициализация LCD дисплея SDA – A4, SCL – A5
lcd.createChar(0,a1);
lcd.createChar(1,a2);
lcd.createChar(2,a3);
lcd.createChar(3,a4);
lcd.createChar(4,a5);
lcd.createChar(5,tone1);
lcd.createChar(6,tone2);
lcd.createChar(7,tone3);
irrecv.enableIRIn(); // запускаем модуль IR
Wire.begin();
pinMode(Menu,INPUT_PULLUP);
pinMode(Set,INPUT_PULLUP);
pinMode(Power,INPUT_PULLUP);
pinMode(plus,INPUT_PULLUP);
pinMode(minus,INPUT_PULLUP);
pinMode(guard,INPUT_PULLUP);
pinMode(relay,OUTPUT);
pinMode(st_by,OUTPUT);
pinMode(Enc,INPUT_PULLUP);
pinMode(Mute,INPUT_PULLUP);
if(EEPROM.read(200)!=0){for(int i=0;i<201;i++){EEPROM.update(i,0);}} // очистка памяти при первом включении
vol = EEPROM.read(0);treb = EEPROM.read(1)-15;bas = EEPROM.read(3)-15;
in = EEPROM.read(4);gain1 = EEPROM.read(5);gain2 = EEPROM.read(6);gain3 = EEPROM.read(7);
lon = EEPROM.read(8);lon_f = EEPROM.read(9);rf = EEPROM.read(10);lf = EEPROM.read(11);
rt = EEPROM.read(12);lt = EEPROM.read(13);sab = EEPROM.read(14);treb_c = EEPROM.read(15);
mid_c = EEPROM.read(16);bas_c = EEPROM.read(17);sab_f = EEPROM.read(18);
MsTimer2::set(1, to_Timer);MsTimer2::start();
audio();
lcd.backlight();
}
long newPosition;
void to_Timer(){ //функция таймера
newPosition = myEnc.read()/4;
}
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(digitalRead(guard)==LOW && !flag)
{flag = true;digitalWrite(10,LOW);digitalWrite(13,LOW);menu=100;menu2=100;lcd.clear();lcd.setCursor(0,0);lcd.print(F(" Warning!!! "));delay(100);}
if(power==0){digitalWrite(st_by,HIGH);}else{digitalWrite(st_by,LOW);}
if((digitalRead(Power)==LOW || ir.value==IR_6) && power==0)
{power=1;cl();myEnc.write(0);digitalWrite(st_by,LOW);digitalWrite(relay,LOW);menu=100;menu2=100;lcd.setCursor(0,0);lcd.print(" POWER OFF ");delay(1000);lcd.noBacklight();cl();}
if((digitalRead(Power)==LOW || ir.value==IR_6) && power==1)
{power=0;cl();myEnc.write(0);digitalWrite(st_by,HIGH);w=1;menu=0;menu2=100;lcd.backlight();lcd.setCursor(0,0);lcd.print(" POWER ON ");delay(2000);digitalWrite(relay,HIGH);cl();}
if(power==0){
if(digitalRead(Enc)==LOW&& mute==0){menu2=100;menu++;cl();myEnc.write(0);time=millis();w1=1;if(menu>2){menu=0;}} // основное меню,кнопка энкодера
if(digitalRead(Menu)==LOW&& mute==0){menu=100;menu2++;cl();myEnc.write(0);time=millis();w1=1;if(menu2>6){menu2=0;}} // меню настроек
if(digitalRead(Mute)==LOW){mute++;w=1;time=millis();if(mute>1){mute=0;}}
if(ir.value==IR_2&& mute==0){menu2=100;menu++;cl();time=millis();w1=1;if(menu>2){menu=0;}} // меню кнопка пульта вверх
if(ir.value==IR_1&& mute==0){menu2=100;menu--;cl();time=millis();w1=1;if(menu<0){menu=0;}} // меню кнопка пульта вниз
if(ir.value==IR_7&& mute==0){mute++;w=1;if(mute>1){mute=0;}} // режим mute пульта
}
if(power==0){digitalWrite(st_by,HIGH);}else{digitalWrite(st_by,LOW);}
//--------------------------------------------------------------- Volume -80 ... 0 дБ ----------------------------------------------------------------------------------------
if(menu==0){
if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
vol=vol+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;vol_func();}
if(w==1){audio();cl();time=millis();w=0;w1=1;}
if(mute==1)
{lcd.setCursor(0,0);lcd.print("Volume "); lcd.print( "0");lcd.setCursor( 12, 0);lcd.print("MUTE");
lcd.setCursor( 1, 1); lcd.print("x"); lcd.setCursor( 0, 1);lcd.write(( uint8_t ) 3);
for ( z = 3 ; z <= 15; z++ ) { lcd.setCursor( z , 1);lcd.write(( uint8_t )2);}
}
else
{w=0;vol_d=map(vol,0,80,0,15);
lcd.setCursor(0,0);lcd.print("Volume "); lcd.print(-vol/5);lcd.setCursor(13,0);lcd.print("dB");
lcd.setCursor( 1, 1);lcd.write(( uint8_t ) 4);lcd.setCursor( 0, 1);lcd.write(( uint8_t ) 3);
if(vol_d>0){
for(z=2 ; z <= vol_d; z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}
for(z = vol_d ; z<=16; z++){lcd.setCursor(z+2,1);lcd.write((uint8_t)2);}}}
}
//----------------------------------------------------------- индикация, тембр ВЧ -15...15 дБ -------------------------------------------------------------------------------
if(menu==1){
if(ir.value==IR_3){treb++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>>
if(ir.value==IR_4){treb--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
treb=treb+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;treb_func();}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print("Treble ");
lcd.print(treb);lcd.setCursor(13,0);lcd.print("dB");treble_d=treb+15;
lcd.setCursor( 0, 1);lcd.write(( uint8_t ) 6);
treble_d = treb / 2 + 8;
if ( treble_d >= 0 ) {
for (z = 2 ; z <= treble_d; z++ ) {lcd.setCursor ( z, 1 );lcd.write ( ( uint8_t ) 0 ) ;}
for ( z = treble_d ; z <= 15; z++ ) {lcd.setCursor ( z + 2, 1 );lcd.write(( uint8_t ) 2);}}
}
//----------------------------------------------------------- индикация, тембр НЧ -15...15 дБ ---------------------------------------------------------------------------------
if(menu==2){
if(ir.value==IR_3){bas++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){bas++;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>>
if(ir.value==IR_4){bas--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){bas--;gr1=0;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
bas=bas+newPosition;myEnc.write(0);newPosition=0;audio();lcd.clear();time=millis();w1=1;bass_func();}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print("Bass ");
lcd.print(bas);lcd.setCursor(13,0);lcd.print("dB");bass_d=bas+15;
lcd.setCursor( 0, 1);lcd.write(( uint8_t ) 5);
bass_d=bas / 2+8;
if(bass_d>0){
for(z=2 ; z <= bass_d; z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}
for(z = bass_d ; z<=15; z++){lcd.setCursor(z+2,1);lcd.write((uint8_t)2);}}
}
//------------------------------------------------------------- вход 1...3 + предусилитель 0...15 дБ --------------------------------------------------------------------------
if(menu2==0){
if(digitalRead(Set)==LOW){in++;w=1;if(in>3){in=1;}}
if(in==1){gain0=gain1;}if(in==2){gain0=gain2;}if(in==3){gain0=gain3;}
if(digitalRead(plus)==LOW){gain0++;w=1;if(gain0>15){gain0=15;}}
if(digitalRead(minus)==LOW){gain0--;w=1;if(gain0<0){gain0=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Input: "));
switch(in)
{case 1:lcd.print(F("AUX1"));break;
case 2:lcd.print(F("AUX2"));break;
case 3:lcd.print(F("BT"));break;}
gain_d=gain0;
if(gain_d>=0){for(z=0;z<=gain_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
if((gain_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
if(in==1){gain1=gain0;}if(in==2){gain2=gain0;}if(in==3){gain3=gain0;}
lcd.setCursor(11,1);lcd.print(gain0);lcd.print(F(" dB "));}
//--------------------------------------------------------------------------- loudness ---------------------------------------------------------------------------------------
if(menu2==1){
if(digitalRead(Set)==LOW){lon_f++;w=1;if(lon_f>3){lon_f=0;}}
if(digitalRead(plus)==LOW){lon++;w=1;if(lon>15){lon=15;}}
if(digitalRead(minus)==LOW){lon--;w=1;if(lon<0){lon=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}lon_d=lon;
lcd.setCursor(0,0);lcd.print(F("Loudness: "));
switch(lon_f)
{case 0: lcd.print(F("FLAT"));break;
case 1: lcd.print(F("400Hz"));break;
case 2: lcd.print(F("800Hz"));break;
case 3: lcd.print(F("2400Hz"));break;}
lcd.setCursor(0,1);
if(lon_d>=0){for(z=0;z<=lon_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
if((lon_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
lcd.setCursor(9,1);lcd.print(F("-"));lcd.print(lon);lcd.print(F(" dB "));}
//----------------------------------------------------------------------------- out ------------------------------------------------------------------------------------------
if(menu2==2){
if(digitalRead(Set)==LOW){out++;w=1;if(out>4){out=0;}}
switch(out)
{case 0:vol_out=rf;break;
case 1:vol_out=lf;break;
case 2:vol_out=rt;break;
case 3:vol_out=lt;break;
case 4:vol_out=sab;break;}
if(digitalRead(plus)==LOW){vol_out++;w=1;if(vol_out>15){vol_out=15;}}
if(digitalRead(minus)==LOW){vol_out--;w=1;if(vol_out<0){vol_out=0;}}
lcd.setCursor(0,0);lcd.print(F("Volume OUT"));
lcd.setCursor(0,1);
switch(out){
case 0:rf=vol_out;lcd.print(F("RF: +"));lcd.print(rf);break;
case 1:lf=vol_out;lcd.print(F("LF: +"));lcd.print(lf);break;
case 2:rt=vol_out;lcd.print(F("RT: +"));lcd.print(rt);break;
case 3:lt=vol_out;lcd.print(F("LT: +"));lcd.print(lt);break;
case 4:sab=vol_out;lcd.print(F("SUBW: +"));lcd.print(sab);break;}
lcd.print(F(" dB "));if(w==1){audio();cl();time=millis();w1=1;w=0;}}
//---------------------------------------------------------------------------treble center -----------------------------------------------------------------------------------
if(menu2==3){
if(digitalRead(plus)==LOW){treb_c++;w=1;if(treb_c>3){treb_c=0;}}
if(digitalRead(minus)==LOW){treb_c--;w=1;if(treb_c<0){treb_c=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Treble Center "));
lcd.setCursor(1,6);
switch(treb_c){
case 0: lcd.print(F("10.0 kHz"));break;
case 1: lcd.print(F("12.5 kHz"));break;
case 2: lcd.print(F("15.0 kHz"));break;
case 3: lcd.print(F("17.5 kHz"));break;}}
//-------------------------------------------------------------------------- middle center ------------------------------------------------------------------------------------
if(menu2==4){
if(digitalRead(plus)==LOW){mid_c++;w=1;if(mid_c>3){mid_c=0;}}
if(digitalRead(minus)==LOW){mid_c--;w=1;if(mid_c<0){mid_c=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Middle Center "));
lcd.setCursor(1,6);
switch(mid_c){
case 0: lcd.print(F("0.5 kHz"));break;
case 1: lcd.print(F("1.0 kHz"));break;
case 2: lcd.print(F("1.5 kHz"));break;
case 3: lcd.print(F("2.5 kHz"));break;}}
//----------------------------------------------------------------------------- bass center ----------------------------------------------------------------------------------
if(menu2==5){
if(digitalRead(plus)==LOW){bas_c++;w=1;if(bas_c>3){bas_c=0;}}
if(digitalRead(minus)==LOW){bas_c--;w=1;if(bas_c<0){bas_c=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Bass Center "));
lcd.setCursor(1,6);
switch(bas_c){
case 0: lcd.print(F("60 Hz"));break;
case 1: lcd.print(F("80 Hz"));break;
case 2: lcd.print(F("100 Hz"));break;
case 3: lcd.print(F("200 Hz"));break;}}
//-------------------------------------------------------------------------------- subw --------------------------------------------------------------------------------------
if(menu2==6){
if(digitalRead(plus)==LOW){sab_f++;w=1;if(sab_f>3){sab_f=0;}}
if(digitalRead(minus)==LOW){sab_f--;w=1;if(sab_f<0){sab_f=0;}}
if(w==1){audio();cl();time=millis();w1=1;w=0;}
lcd.setCursor(0,0);lcd.print(F("Subwoofer Freq."));
lcd.setCursor(1,6);
switch(sab_f){
case 0: lcd.print(F("FLAT"));break;
case 1: lcd.print(F("80 Hz"));break;
case 2: lcd.print(F("120 Hz"));break;
case 3: lcd.print(F("160 Hz"));break;}}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Serial.println(time);
if(millis()-time>10000 && w1==1 && power==0 && mute==0 ){
EEPROM.update(0,vol);EEPROM.update(1,treb+15);EEPROM.update(3,bas+15);
EEPROM.update(4,in);EEPROM.update(5,gain1);EEPROM.update(6,gain2);EEPROM.update(7,gain3);
EEPROM.update(8,lon);EEPROM.update(9,lon_f);
EEPROM.update(10,rf);EEPROM.update(11,lf);EEPROM.update(12,rt);EEPROM.update(13,lt);
EEPROM.update(14,sab);EEPROM.update(15,treb_c);EEPROM.update(16,mid_c);EEPROM.update(17,bas_c);
EEPROM.update(18,sab_f);
menu2=100; menu=0;w1=0;cl();}
sensor1.requestTemp(); // запрашиваем измерение температуры радиаторов
sensor2.requestTemp();
temperature1 = sensor1.getTemp() ;
temperature2 = sensor2.getTemp() ;
if( temperature1 && temperature2 >= temp)
{ digitalWrite(relay,LOW);cl();menu=100;menu2=100;lcd.setCursor(0,0);lcd.print(F(" Temp!!! "));delay(100);}
}
void treb_func(){if(treb>15){treb=15;}if(treb<-15){treb=-15;}}
void bass_func(){if(bas>15){bas=15;}if(bas<-15){bas=-15;}}
void vol_func(){if(vol>80){vol=80;}if(vol<0){vol=0;}}
void cl(){delay(300);lcd.clear();}
void audio(){
tda.setInput(in,gain0,0); //вх1=1, вх2=2, вх3=3
tda.setInput2(0,0,0); // не используется
tda.setAtt_loudness(lon,lon_f,0,0);
tda.setSoft(mute,0,0,0,0);//mute off (не менять)
tda.setVolume(vol-79,0); // общая громкость от 0 до 79 макс
tda.setAtt_LF(64+lf,0); // гром. лк фронт
tda.setAtt_RF(64+rf,0); // гром. пк фронт
tda.setAtt_LT(64+lt,0); // гром. лк тыл
tda.setAtt_RT(64+rt,0); // гром. пк тыл
tda.setAtt_SUB(64+sab,0); // гром. савбуфер
tda.setAtt_Mix(79,0); // не использует
tda.setFilter_Treble(treb,treb_c,0);
//tda.setFilter_Middle(middle,0,0);
tda.setFilter_Bass(bas,0,0);
tda.setSub_M_B(sab_f,mid_c,bas_c,0,0);
tda.setMix_Gain_Eff(1,0,0,0,0); // не используется
tda.setSpektor(0,0,1,0,1,0,0);
}
Добрый день!
Я не разбираюсь в программировании.
Хотел узнать, в скетч, который в основной статье а именно: TDA7439_01.zip можно просто добавить VU metr и чтобы с пульта можно было регулировать громкость гейна входов?
Прошивка эта очень понравилась, а STANDBY и автогейн POWER ON, OFF мне не нужны.
Очень долго мучился, как это сделать, скопировать что-то надо из другого скетча, но так и не получается, пишет ошибку компиляции
Разобрался. Посидел, потыкал сравнивал скетчи убирал вставлял символы. Сейчас всё устраивает.
Здравствуйте, собрал усилитель на базе этого проекта, все работает великолепно кроме пульта, прописываю пульт, все нажимается и срабатывает. Беру другой пульт, нажимаю абсолютно любую кнопку и на усилителе срабатывает прокрутка меню и так со всеми пультами что есть дома. Т.е. ардуинка срабатывает на абсолютно любой пульт. Пробовал прописывать несколько пультов, ничего не меняется. На 10-м пине резистор 22к на плюс, на самом ИК приемнике кондер по питанию 47мк, через токоограничительный резистор 100 Ом(пробовал и без него). И еще один неприятный момент, надо ооочень коротко нажимать кнопки пульта, например нажимаю на stby как обычно, оно включает и тут же выключает, в моем случае это очень опасно, т.к. ардуино через реле управляет питанием ШИМ-ки мощного импульсника. Можно ли исправить все это?
Опубликуйте скетч который используете.
Простите,не могу понять как вставить код
#define IR_1 0xA0A058A7 // меню кнопка вверх
#define IR_2 0xA0A018E7 // меню кнопка вниз
#define IR_3 0xA0A09867 // кнопка >
#define IR_4 0xA0A0A857 // кнопка <
#define IR_5 0xA0A0B847 // BASS++
#define IR_6 0xA0A06897 // BASS--
#define IR_7 0xA0A05CA3 // TREBLE++
#define IR_8 0xA0A0AE51 // TREBLE--
#define IR_9 0xA0A034CB // MIDDLE++
#define IR_10 0xA0A0B44B // MIDDLE--
#define IR_11 0xA0A07887 // IN
#define IR_12 0xA0A040BF // STANDBY
//// VU metr ////////////////////////////
#define GAIN 10 // усиление 0...50
#define STEP 5 // плавность полос 0...20
#define RL 1 // RL - горизонт, вертикаль 0...1
/////////////////////////////////////////
#include <Wire.h>
#include <TDA7439.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
IRrecv irrecv(10); // указываем вывод модуля IR приемника
TDA7439 tda;
Encoder myEnc(9, 8);//CLK, DT
decode_results ir;
LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
int vol,vol_old,vol_d,treb,treb_d,balans,in,standby=1,gain0,gain1,gain2,gain3,gain4;
byte w,w1,in_d,gr1,gr2,www;
int z,z0,z1,bass,bass_d,mids,mids_d,menu,w2,spek;
unsigned long time,time1, oldPosition = -999,newPosition;
int ur,ul,urr,ull,urrr,ulll;
int x,i,u_maxr,u_maxl;
int u_l0[20],u_r0[20];
byte znak_r[8]={0b00000,0b00000,0b11111,0b00101,0b00101,0b11010,0b00000,0b00000};
byte znak_l[8]={0b00000,0b00000,0b11111,0b10000,0b10000,0b10000,0b00000,0b00000};
void setup() { Serial.begin(9600); Serial.println("TDA7439");
lcd.begin(16, 2);
irrecv.enableIRIn(); // запускаем модуль IR
pinMode(12,OUTPUT);// STANDBY
digitalWrite(12,LOW);
lcd.setCursor(0,0);lcd.print(" VLAD ");delay(1000);
pinMode(13,INPUT);// меню кнопка энкодера SW
pinMode(11,INPUT);// in 1-4
pinMode(A2,INPUT);// POWER
pinMode(A0,INPUT);// in R
pinMode(A1,INPUT);// in L
pinMode(17,OUTPUT);// IN1 (выход A3)
MsTimer2::set(3, to_Timer);MsTimer2::start();
vol = EEPROM.read(0);// vol eeprom
bass = EEPROM.read(1)-7;// bass eeprom
mids = EEPROM.read(2)-7;// mids eeprom
treb = EEPROM.read(3)-7;// treb eeprom
balans = EEPROM.read(4)-4;// balans eeprom
in = EEPROM.read(5);// in eeprom
gain1 = EEPROM.read(6);gain2 = EEPROM.read(7);gain3 = EEPROM.read(8);gain4 = EEPROM.read(9);
switch(in){
case 0: gain0 = gain1;break;
case 1: gain0 = gain2;break;
case 2: gain0 = gain3;break;
case 3: gain0 = gain4;break;
}
if(standby==1){vol_old=vol;vol=0;}
delay(500);audio();
}
void loop() {
if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
if(spek==0){
byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
}else{
byte a1[8] = {0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101};
byte a2[8] = {0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100};
byte a3[8] = {0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000};
byte a4[8] = {0b00011,0b00011,0b00011,0b0011,0b0011,0b0011,0b0011,0b0011};
byte a5[8] = {0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000};
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(6,a4);lcd.createChar(7,a5);
}
lcd.createChar(4,znak_r);
lcd.createChar(5,znak_l);
///////////////////// управление //////////////////////////////////////////
if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);time1=millis();time=millis();w=1;w1=1;if(spek==1){menu=0;cl();}irrecv.resume();}// IR приемник
if(digitalRead(13)==LOW&&standby==0){menu++;cl();myEnc.write(0);time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню
if((digitalRead(11)==HIGH || ir.value==IR_11)&&standby==0){if(menu==5){in++;};cl();myEnc.write(0);time=millis();w=1;w2=1;www=1;menu=5;if(in>3){in=0;};audio();}// in
if(standby==1){menu=100;spek=0;w=0;lcd.setCursor(0,0);lcd.print(" POWER OFF ");}
if((analogRead(A2)>1000 || ir.value==IR_12)&&standby==1){standby=0;spek=0;cl();time=millis();w=1;w2=1;lcd.clear();lcd.setCursor(0,0);lcd.print(" POWER ON ");
digitalWrite(12,HIGH);vol=vol_old;audio();delay(1000);menu=0;w2=1;}
if((analogRead(A2)>1000 || ir.value==IR_12)&&standby==0){standby=1;spek=0;cl();time=millis();w=1;w2=1;lcd.clear();digitalWrite(12,LOW);vol_old=vol;vol=0;audio();delay(500);menu=100;}
if(ir.value==IR_1&&standby==0){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню кнопка вверх
if(ir.value==IR_2&&standby==0){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// меню кнопка вниз
if(ir.value==IR_5&&menu!=1&&standby==0){bass++;menu=1;gr1=1;gr2=0;cl();;w=1;w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}
if(ir.value==IR_6&&menu!=1&&standby==0){bass--;menu=1;gr1=0;gr2=1;cl();;w=1;w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}
if(ir.value==IR_7&&menu!=2&&standby==0){mids++;menu=2;gr1=1;gr2=0;cl();;w=1;w2=1;if(mids>7){mids=7;}if(mids<-7){mids=-7;}audio();}
if(ir.value==IR_8&&menu!=2&&standby==0){mids--;menu=2;gr1=0;gr2=1;cl();;w=1;w2=1;if(mids>7){mids=7;}if(mids<-7){mids=-7;}audio();}
if(ir.value==IR_9&&menu!=3&&standby==0){treb++;menu=3;gr1=1;gr2=0;cl();;w=1;w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}
if(ir.value==IR_10&&menu!=3&&standby==0){treb--;menu=3;gr1=0;gr2=1;cl();w=1;w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}
// индикация громкости + управление //////////////
if(menu==0){
if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl2();w2=1;if(vol<0){vol=0;}if(vol>48){vol=48;}audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl2();w2=1;if(vol<0){vol=0;}if(vol>48){vol=48;}audio();}// кнопка >>>>>>
if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl2();w2=1;if(vol<0){vol=0;}if(vol>48){vol=48;}audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl2();w2=1;if(vol<0){vol=0;}if(vol>48){vol=48;}audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol<0){vol=0;}if(vol>48){vol=48;}audio();}
lcd.setCursor(0,0);lcd.print("Volume ");
lcd.print(" ");lcd.print(-48+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol;
if(w2==1){
for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
// индикация тембр НЧ //////////////
if(menu==1){
if(ir.value==IR_3||ir.value==IR_5){bass++;gr1=1;gr2=0;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка >>>>>>
if(ir.value==IR_4||ir.value==IR_6){bass--;gr1=0;gr2=1;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl1();w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();}
lcd.setCursor(0,0);lcd.print("Bass ");
lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
// индикация тембр CЧ //////////////
if(menu==2){
if(ir.value==IR_3||ir.value==IR_7){mids++;gr1=1;gr2=0;cl1();w2=1;if(mids>7){mids=7;}if(mids<-7){mids=-7;}audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){mids++;gr2=0;cl1();w2=1;if(mids>7){mids=7;}if(mids<-7){mids=-7;}audio();}// кнопка >>>>>>
if(ir.value==IR_4||ir.value==IR_8){mids--;gr1=0;gr2=1;cl1();w2=1;if(mids>7){mids=7;}if(mids<-7){mids=-7;}audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){mids--;gr1=0;cl1();w2=1;if(mids>7){mids=7;}if(mids<-7){mids=-7;}audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
mids=mids+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(mids>7){mids=7;}if(mids<-7){mids=-7;}audio();}
lcd.setCursor(0,0);lcd.print("Middle ");
lcd.print(" ");lcd.print(mids*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");mids_d=mids*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=mids_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
// индикация тембр BЧ //////////////
if(menu==3){
if(ir.value==IR_3||ir.value==IR_9){treb++;gr1=1;gr2=0;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка >>>>>>
if(ir.value==IR_4||ir.value==IR_10){treb--;gr1=0;gr2=1;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();}
lcd.setCursor(0,0);lcd.print("Treble ");
lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
if(w2==1){
for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
///////////////////////////////////////////////////////////
// индикация баланс + управление кнопками +\- 4 дБ ///////
if(menu==4){
if(ir.value==IR_3){balans++;gr1=1;gr2=0;cl();if(balans>4){balans=4;}if(balans<-4){balans=-4;}audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){balans++;gr2=0;cl();if(balans>4){balans=4;}if(balans<-4){balans=-4;}audio();}// кнопка >>>>>>
if(ir.value==IR_4){balans--;gr1=0;gr2=1;cl();if(balans>4){balans=4;}if(balans<-4){balans=-4;}audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){balans--;gr1=0;cl();if(balans>4){balans=4;}if(balans<-4){balans=-4;}audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(balans>4){balans=4;}if(balans<-4){balans=-4;}audio();}
lcd.setCursor(0,0);
if(balans>=0){lcd.print("-");}else{lcd.print("+");}
lcd.print(abs(balans));lcd.print(" dB ");
lcd.print(" <> ");
if(balans>=0){lcd.print("+");}else{lcd.print("-");}
lcd.print(abs(balans));lcd.print(" dB ");
lcd.setCursor(0,1);lcd.print("L");
lcd.setCursor(15,1);lcd.print("R");
if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}
}
///////////////////// input + gain
if(in==1&&standby==0){digitalWrite(17,HIGH);}else{digitalWrite(17,LOW);}
if(menu==5){
switch(in){
case 0: gain0 = gain1;break;
case 1: gain0 = gain2;break;
case 2: gain0 = gain3;break;
case 3: gain0 = gain4;break;
}
if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();lcd.clear();w2=1;gain_func();audio();}// кнопка >
if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();lcd.clear();w2=1;gain_func();audio();}// кнопка >>>>>>
if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();lcd.clear();w2=1;gain_func();audio();}// кнопка <
if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();lcd.clear();w2=1;gain_func();audio();}// кнопка <<<<<<
if (newPosition != oldPosition) {
oldPosition = newPosition;
gain0=gain0+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;www=1;gain_func();audio();}
switch(in){
case 0: gain1 = gain0;break;
case 1: gain2 = gain0;break;
case 2: gain3 = gain0;break;
case 3: gain4 = gain0;break;
}
if(www==1){audio();www=0;}
lcd.setCursor(0,0);
switch(in){
case 0: lcd.print(" CD ");break;
case 1: lcd.print(" AUX ");break;
case 2: lcd.print(" RADIO ");break;
case 3: lcd.print(" BLUETOOTH ");break;
}
lcd.setCursor(1,1);lcd.print("GAIN");lcd.print(gain0);lcd.print(" dB");
}
/////////////////////////////////////////////////////////////
if(millis()-time>10000 && w==1){// запись всех настроек в EEPROM
EEPROM.update(0,vol);
EEPROM.update(4,balans+4);
EEPROM.update(1,bass+7);
EEPROM.update(2,mids+7);
EEPROM.update(3,treb+7);
EEPROM.update(5,in);
EEPROM.update(6,gain1);EEPROM.update(7,gain2);EEPROM.update(8,gain3);EEPROM.update(9,gain4);
lcd.clear();w=0,w2=1;menu=100;spek=1;
}
if(spek==1){
urr = log(analogRead(0))*GAIN;if(urr>41){urr=41;}
ull = log(analogRead(1))*GAIN;if(ull>41){ull=41;}
if(RL==0){lcd.setCursor(0,0);lcd.write((uint8_t)4);lcd.setCursor(0,1);lcd.write((uint8_t)5);}
if(RL==1){lcd.setCursor(0,1);lcd.print("L");lcd.setCursor(0,0);lcd.print("R");}
if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);if(ur<39){lcd.print(" ");}}}
if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);}
if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);if(ul<39){lcd.print(" ");}}}
if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);}
//////////////////////////////////////////////////////////
i++;if(i<19){u_l0[i]=abs(ull);u_r0[i]=abs(urr);}else{i=1;}
if(i==18){u_maxr=0;u_maxl=0;
for(x=1;x<=15;x++){
u_maxl=max(u_maxl,u_l0[x]);
u_maxr=max(u_maxr,u_r0[x]);}}
if(u_maxl<ulll){ulll=ulll-1;}else{ulll = u_maxl;}
if(u_maxr<urrr){urrr=urrr-1;}else{urrr = u_maxr;}
if(u_maxl<=ul){u_maxl=ull+1;}
if(u_maxr<=ur){u_maxr=urr+1;}
lcd.setCursor(ulll/3+1,0);if(ulll/3>2){if(ulll/10%2==1){lcd.write((uint8_t)7);}if(ulll/10%2==0){lcd.write((uint8_t)6);}}lcd.print(" ");
lcd.setCursor(urrr/3+1,1);if(urrr/3>2){if(urrr/10%2==1){lcd.write((uint8_t)7);}if(urrr/10%2==0){lcd.write((uint8_t)6);}}lcd.print(" ");
delay(3);
}
}//void
void gain_func(){if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}
void to_Timer(){newPosition = myEnc.read()/4;}
void cl(){ir.value=0;delay(300);lcd.clear();spek=0;}
void cl2(){ir.value=0;delay(50);spek=0;}
void cl1(){ir.value=0;delay(200);spek=0;}
void audio(){
tda.setInput(in+1); // 1 to 4 // номер канала
tda.inputGain(gain0); // 0 to 15 // усиление
tda.setVolume(vol); // 0 to 48 ( 0 is mute) // громкость
tda.setSnd(bass, 1); //-7 to +7 , 1 - Bass | 2 - Mids | 3 - Trebble
tda.setSnd(mids, 2);
tda.setSnd(treb, 3);
tda.spkAtt(4-balans, 4+balans); // баланс R L от 0 to 79 (db)
}
forum.rcl-radio.ru → Переделки → TDA7439 + энкодер + ИК пульт + STANDBY + анализатор спектра
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|