ИМС TDA7439 – регулятор громкости и трехполосный регулятор тембра, разработан для использования в HI-FI аппаратуре и качественных автомобильных аудиосистемах, обладает низким уровнем шумов и искажений.
Основные технические характеристики ИМС TDA7439:
- Громкость 48 уровней от -48 до 0 дБ
- Регулировка тембра НЧ, СЧ, ВЧ ±14 дБ (±7 уровней)
- Коммутация входов — 4 стерео канала
- Усиление от 0 до 30 дБ независимое для каждого канала
- Регулировка баланса ±4 дБ (ограниченно программно)
- Напряжение питания от 6 до 10,2 В (типовое значение 9 В)
- КНИ на частоте 1 кГц не более 0,01%
Плата Arduino Nano аудиопроцессор TDA7439 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
На странице http://rcl-radio.ru/?p=54921 показан пример использования ИМС TDA7439, в качестве органов управления используются кнопки. На этой странице показан пример управления регулятором тембра при помощи энкодера на базе модуля KY-040 и ИК-модуля VS1838B.
Технические характеристики ИК-модуля VS1838B:
- Потребляемый ток: 0,5 мА
- Рабочая частота: 38 КГц
- Расстояние приема сигнала: 20 м
- Эффективный угол приема сигнала: 90˚
- Рабочее напряжение (приемник): 2,7 — 5,5 В
- Рабочее напряжение (модуль): 2,7 — 5,5 В
На рисунке показано изображения пульта под команды которого написан скетч, но пульт можно применить другой, при этом коды кнопок будут соответственно другие. Даже если Вы будете использовать такой же пульт, то вероятней всего коды кнопок будут отличатся. Но в мониторе порта Вы сможете посмотреть коды кнопок и вписать в скетч свои значения.
Стоит обратить внимание на то, что в рассматриваемом пульте при удержании кнопки длительное время сначала следует код команды кнопки, а далее код 0xFFFFFFFF как код удержания нажатой кнопки, при этом код 0xFFFFFFFF подается при удержании любой кнопки. В других пультах для каждой кнопки код удержания кнопки может быть свой для каждой кнопки.
При помощи кнопки энкодера можно переходить по пунктам меню:
- Громкость
- Тембр НЧ
- Тембр СЧ
- Тембр ВЧ
- Баланс
Регулировка параметров громкости, тембра и баланса осуществляется при помощи ручки энкодера. При нажатии на кнопку «INPUT» можно переключить номер канала и при помощи ручки энкодера изменить усиление для каждого канала.
При помощи пульта управления и ИК-датчика так же можно управлять основными настройками регулятора тембра:
- Кнопка 1 — управление громкостью
- Кнопка 2 — управление тембром НЧ
- Кнопка 3 — управление тембром СЧ
- Кнопка 4 — управление тембром ВЧ
- Кнопка 5 — управление балансом
- При помощи кнопок «вверх» и «вниз» происходит перемещение по пунктам меню.
- Кнопки < и > позволяют регулировать параметры громкости, тембра и баланса
- Кнопка # — MUTE
- Кнопка OK позволяет изменять номер канала (регулировка усиления каналов осуществляется при помощи ручки энкодера)
При неактивности органов управления через 10 секунд происходит переход в пункт меню «Громкость», а при неактивности органов управления в течение 60 секунд происходит запись всех параметров (громкость , тембр, баланс, номер канала и усиление каналов) в энергонезависимую память.
TDA7439.zip — скачайте и установите измененную библиотеку для данного скетча
#include <Wire.h> #include <TDA7439.h> #include <LiquidCrystal.h> #include <EEPROMex.h> #include <Encoder.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 byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000}; byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000}; int vol,vol_ram,vol_d,z,bass,bass_ram,mids,mids_ram,treb,treb_ram,balans,balans_ram,in,in_ram,gain,gain1_ram,gain1,gain2,gain2_ram,gain3,gain3_ram,gain4,gain4_ram; byte menu,w,w1,in_d,gr1,gr2,n1,n2,s1,s2,v1,v2,b1,b2; unsigned long time,time1,time3,time4;long oldPosition = -999; void setup() { Serial.begin(9600); Serial.println("TDA7439"); lcd.begin(16, 2); irrecv.enableIRIn(); // запускаем модуль IR lcd.setCursor(0,0);lcd.print(" TDA7439 ");delay(1000); pinMode(12,INPUT);// меню кнопка энкодера SW pinMode(11,INPUT);// in 1-4 lcd.createChar(0,a1); lcd.createChar(1,a2); 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);// gain1 eeprom gain2 = EEPROM.read(7);// gain2 eeprom gain3 = EEPROM.read(8);// gain3 eeprom gain4 = EEPROM.read(9);// gain4 eeprom g1();audio();ram(); } void loop() { if(millis()-time3>200){ if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);time1=millis();time=millis();w=1;w1=1;irrecv.resume();}// IR приемник if(digitalRead(12)==LOW){menu++;ram();in_d=0;myEnc.write(0);oldPosition = -999;time1=millis();w=1;if(menu>4){menu=0;}}// меню if(digitalRead(11)==HIGH){in++;;ram();in_d=1;g2();myEnc.write(0);oldPosition = -999;menu=5;w=1;time1=millis();if(in>4||in<1){in=1;}}// in if(ir.value==0xFF18E7){in_d=0;menu++;cl();if(menu>4){menu=0;}}// меню кнопка вверх 0xFF18E7 if(ir.value==0xFF4AB5){in_d=0;menu--;cl();if(menu==255){menu=4;}}// меню кнопка вниз 0xFF4AB5 if(ir.value==0xFFA25D){menu=0;cl();gr1=0;gr2=0;in_d=0;}// меню кнопка 1(ГРОМКОСТЬ) 0xFFA25D if(ir.value==0xFF629D){menu=1;cl();n1=0;n2=0;in_d=0;}// меню кнопка 2(НЧ) 0xFF629D if(ir.value==0xFFE21D){menu=2;cl();s1=0;s2=0;in_d=0;}// меню кнопка 3(СЧ) 0xFFE21D if(ir.value==0xFF22DD){menu=3;cl();v1=0;v2=0;in_d=0;}// меню кнопка 4(ВЧ) 0xFF22DD if(ir.value==0xFF02FD){menu=4;cl();b1=0;b2=0;in_d=0;}// меню кнопка 5(БАЛАНС) 0xFF02FD if(ir.value==0xFFB04F){menu=0;vol=0;cl();in_d=0;}// кнопка #(MUTE) 0xFFB04F if(ir.value==0xFF38C7){in++;;ram();in_d=1;g2();myEnc.write(0);oldPosition = -999;menu=5;w=1;time1=millis();if(in>4||in<1){in=1;}ir.value=0;}// кнопка OK(IN) 0xFF38C7 time3=millis();} // индикация громкости + управление ////////////// if(menu==0){ if(millis()-time3>100){ if(ir.value==0xFF5AA5){vol++;gr1=1;gr2=0;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){vol--;gr1=0;gr2=1;cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();}// кнопка <<<<<< } long newPosition = myEnc.read()/4+vol_ram; if (newPosition != oldPosition) { oldPosition = newPosition; if(millis()-time4>50){ lcd.clear();vol=newPosition; if(vol>48){vol=48;} if(vol<0){vol=0;}// 48 максимальная громкость, 0 минимум громкости lcd.setCursor(0,0);lcd.print("Volume "); lcd.print(-48+vol);lcd.setCursor(13,0);lcd.print("dB"); vol_d=vol/2; if(vol_d>=0){for(z=0;z<=vol_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if(vol_d%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} lcd.setCursor(13,1);lcd.print(vol); audio();time=millis();time1=millis();w=1;w1=1; time4=millis();} }} // индикация тембр НЧ + управление кнопками ////////////// if(menu==1){ if(ir.value==0xFF5AA5){bass++;n1=1;n2=0;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and n1==1){bass++;n2=0;cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){bass--;n1=0;n2=1;cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and n2==1){bass--;n1=0;cl();}// кнопка <<<<<< long newPosition = myEnc.read()/4+bass_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();bass=newPosition; if(bass>7){bass=7;}if(bass<-7){bass=-7;} lcd.setCursor(0,0);lcd.print("Bass "); lcd.print(bass*2);lcd.setCursor(13,0);lcd.print("dB"); for(z=-7;z<=bass;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);} audio();time=millis();time1=millis();w=1;w1=1; }} /////////////////////////////////////////////////////////// // индикация тембр CЧ + управление кнопками ////////////// if(menu==2){ if(ir.value==0xFF5AA5){mids++;s1=1;s2=0;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and s1==1){mids++;s2=0;cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){mids--;s1=0;s2=1;cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and s2==1){mids--;s1=0;cl();}// кнопка <<<<<< long newPosition = myEnc.read()/4+mids_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();mids=newPosition; if(mids>7){mids=7;}if(mids<-7){mids=-7;} lcd.setCursor(0,0);lcd.print("Mids "); lcd.print(mids*2);lcd.setCursor(13,0);lcd.print("dB"); for(z=-7;z<=mids;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);} audio();time=millis();time1=millis();w=1;w1=1; }} /////////////////////////////////////////////////////////// // индикация тембр BЧ + управление кнопками ////////////// if(menu==3){ if(ir.value==0xFF5AA5){treb++;v1=1;v2=0;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and v1==1){treb++;v2=0;cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){treb--;v1=0;v2=1;cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and v2==1){treb--;v1=0;cl();}// кнопка <<<<<< long newPosition = myEnc.read()/4+treb_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();treb=newPosition; if(treb>7){treb=7;}if(treb<-7){treb=-7;} lcd.setCursor(0,0);lcd.print("Trebble "); lcd.print(treb*2);lcd.setCursor(13,0);lcd.print("dB"); for(z=-7;z<=treb;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);} audio();time=millis();time1=millis();w=1;w1=1; }} /////////////////////////////////////////////////////////// // индикация баланс + управление кнопками +\- 4 дБ /////// if(menu==4){ if(ir.value==0xFF5AA5){balans++;b1=1;b2=0;cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and b1==1){balans++;b2=0;cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){balans--;b1=0;b2=1;cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and b2==1){balans--;b1=0;cl();}// кнопка <<<<<< long newPosition = myEnc.read()/4+balans_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();balans=newPosition; if(balans>4){balans=4;}if(balans<-4){balans=-4;} 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("R"); lcd.setCursor(15,1);lcd.print("L"); 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);} audio();time=millis();time1=millis();w=1;w1=1; }} ///////////////////////////////////////////////////////////// /////////// input + gain1 ///////////////////////////////////////// if(in_d==1&&in==1){ long newPosition = myEnc.read()/4+gain1_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();gain1=newPosition; if(gain1>15){gain1=15;}if(gain1<0){gain1=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain1); g1();audio();time=millis();time1=millis();w=1;w1=1; g2(); }} //////////////////////////////////////////////////////////// /////////// input + gain2 ///////////////////////////////////////// if(in_d==1&&in==2){ long newPosition = myEnc.read()/4+gain2_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();gain2=newPosition; if(gain2>15){gain2=15;}if(gain2<0){gain2=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain2); g1();audio();time=millis();time1=millis();w=1;w1=1; g2(); }} //////////////////////////////////////////////////////////// /////////// input + gain3 ///////////////////////////////////////// if(in_d==1&&in==3){ long newPosition = myEnc.read()/4+gain3_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();gain3=newPosition; if(gain3>15){gain3=15;}if(gain3<0){gain3=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain3); g1();audio();time=millis();time1=millis();w=1;w1=1; g2(); }} //////////////////////////////////////////////////////////// /////////// input + gain4 ///////////////////////////////////////// if(in_d==1&&in==4){ long newPosition = myEnc.read()/4+gain4_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();gain4=newPosition; if(gain4>15){gain4=15;}if(gain4<0){gain4=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain4); g1();audio();time=millis();time1=millis();w=1;w1=1; }} //////////////////////////////////////////////////////////// if(millis()-time>10000 && w1==1){// возврат в меню громкости через 10 сек неактивности ram();myEnc.write(0);menu=0;w1=0;in_d=0; } if(millis()-time1>60000 && w==1){// запись всех настроек в EEPROM через 60 сек неактивности 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);w=0; } }//void void ram(){vol_ram=vol,bass_ram=bass,mids_ram=mids,treb_ram=treb,balans_ram=balans,in_ram=in,gain1_ram=gain1;gain2_ram=gain2;gain3_ram=gain3;gain4_ram=gain4;} void g1(){if(in==1){gain=gain1;}if(in==2){gain=gain2;}if(in==3){gain=gain3;}if(in==4){gain=gain4;}} void g2(){if(in==1){gain1=gain;}if(in==2){gain2=gain;}if(in==3){gain3=gain;}if(in==4){gain4=gain;}} void cl(){ir.value=0;ram();delay(100);lcd.clear();myEnc.write(0);oldPosition = -999;} void audio(){ tda.setInput(in); // 1 to 4 // номер канала tda.inputGain(gain); // 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) }
Следующий скетч аналогичен первому, но в нем в качестве управления используется только энкодер и одна кнопка «INPUT».
TDA7439.zip — скачайте и установите измененную библиотеку для данного скетча
#include <Wire.h> #include <TDA7439.h> #include <LiquidCrystal.h> #include <EEPROMex.h> #include <Encoder.h> TDA7439 tda; Encoder myEnc(9, 8);//CLK, DT LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000}; byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000}; int vol,vol_ram,vol_d,z,bass,bass_ram,mids,mids_ram,treb,treb_ram,balans,balans_ram,in,in_ram,gain,gain1_ram,gain1,gain2,gain2_ram,gain3,gain3_ram,gain4,gain4_ram; byte menu,w,w1,in_d; unsigned long time,time1;long oldPosition = -999; void setup() { Serial.begin(9600); Serial.print("TDA7439"); lcd.begin(16, 2); lcd.setCursor(0,0);lcd.print(" TDA7439 ");delay(1000); pinMode(12,INPUT);// меню кнопка энкодера SW pinMode(11,INPUT);// in 1-4 lcd.createChar(0,a1); lcd.createChar(1,a2); 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);// gain1 eeprom gain2 = EEPROM.read(7);// gain2 eeprom gain3 = EEPROM.read(8);// gain3 eeprom gain4 = EEPROM.read(9);// gain4 eeprom g1();audio();ram(); } void loop() { if(digitalRead(12)==LOW){menu++;ram();in_d=0;myEnc.write(0);oldPosition = -999;delay(300);time1=millis();w=1;if(menu>4){menu=0;}}// меню if(digitalRead(11)==HIGH){in++;;ram();in_d=1;g2();myEnc.write(0);oldPosition = -999;menu=5;w=1;delay(300);time1=millis();if(in>4||in<1){in=1;}}// in // индикация громкости + управление ////////////// if(menu==0){ long newPosition = myEnc.read()/4+vol_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();vol=newPosition; if(vol>48){vol=48;} if(vol<0){vol=0;}// 48 максимальная громкость, 0 минимум громкости lcd.setCursor(0,0);lcd.print("Volume "); lcd.print(-48+vol);lcd.setCursor(13,0);lcd.print("dB"); vol_d=vol/2; if(vol_d>=0){for(z=0;z<=vol_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if(vol_d%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} lcd.setCursor(13,1);lcd.print(vol); audio();time=millis();time1=millis();w=1;w1=1; }} // индикация тембр НЧ + управление кнопками ////////////// if(menu==1){ long newPosition = myEnc.read()/4+bass_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();bass=newPosition; if(bass>7){bass=7;}if(bass<-7){bass=-7;} lcd.setCursor(0,0);lcd.print("Bass "); lcd.print(bass*2);lcd.setCursor(13,0);lcd.print("dB"); for(z=-7;z<=bass;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);} audio();time=millis();time1=millis();w=1;w1=1; }} /////////////////////////////////////////////////////////// // индикация тембр CЧ + управление кнопками ////////////// if(menu==2){ long newPosition = myEnc.read()/4+mids_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();mids=newPosition; if(mids>7){mids=7;}if(mids<-7){mids=-7;} lcd.setCursor(0,0);lcd.print("Mids "); lcd.print(mids*2);lcd.setCursor(13,0);lcd.print("dB"); for(z=-7;z<=mids;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);} audio();time=millis();time1=millis();w=1;w1=1; }} /////////////////////////////////////////////////////////// // индикация тембр BЧ + управление кнопками ////////////// if(menu==3){ long newPosition = myEnc.read()/4+treb_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();treb=newPosition; if(treb>7){treb=7;}if(treb<-7){treb=-7;} lcd.setCursor(0,0);lcd.print("Trebble "); lcd.print(treb*2);lcd.setCursor(13,0);lcd.print("dB"); for(z=-7;z<=treb;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);} audio();time=millis();time1=millis();w=1;w1=1; }} /////////////////////////////////////////////////////////// // индикация баланс + управление кнопками +\- 4 дБ /////// if(menu==4){ long newPosition = myEnc.read()/4+balans_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();balans=newPosition; if(balans>4){balans=4;}if(balans<-4){balans=-4;} 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("R"); lcd.setCursor(15,1);lcd.print("L"); 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);} audio();time=millis();time1=millis();w=1;w1=1; }} ///////////////////////////////////////////////////////////// /////////// input + gain1 ///////////////////////////////////////// if(in_d==1&&in==1){ long newPosition = myEnc.read()/4+gain1_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();gain1=newPosition; if(gain1>15){gain1=15;}if(gain1<0){gain1=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain1); g1();audio();time=millis();time1=millis();w=1;w1=1; g2(); }} //////////////////////////////////////////////////////////// /////////// input + gain2 ///////////////////////////////////////// if(in_d==1&&in==2){ long newPosition = myEnc.read()/4+gain2_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();gain2=newPosition; if(gain2>15){gain2=15;}if(gain2<0){gain2=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain2); g1();audio();time=millis();time1=millis();w=1;w1=1; g2(); }} //////////////////////////////////////////////////////////// /////////// input + gain3 ///////////////////////////////////////// if(in_d==1&&in==3){ long newPosition = myEnc.read()/4+gain3_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();gain3=newPosition; if(gain3>15){gain3=15;}if(gain3<0){gain3=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain3); g1();audio();time=millis();time1=millis();w=1;w1=1; g2(); }} //////////////////////////////////////////////////////////// /////////// input + gain4 ///////////////////////////////////////// if(in_d==1&&in==4){ long newPosition = myEnc.read()/4+gain4_ram; if (newPosition != oldPosition) { oldPosition = newPosition;lcd.clear();gain4=newPosition; if(gain4>15){gain4=15;}if(gain4<0){gain4=0;} lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain4); g1();audio();time=millis();time1=millis();w=1;w1=1; }} //////////////////////////////////////////////////////////// if(millis()-time>10000 && w1==1){// возврат в меню громкости через 10 сек неактивности ram();myEnc.write(0);menu=0;w1=0;in_d=0; } if(millis()-time1>60000 && w==1){// запись всех настроек в EEPROM через 60 сек неактивности EEPROM.update(0,vol_ram); 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);w=0; } }//void void ram(){vol_ram=vol,bass_ram=bass,mids_ram=mids,treb_ram=treb,balans_ram=balans,in_ram=in,gain1_ram=gain1;gain2_ram=gain2;gain3_ram=gain3;gain4_ram=gain4;} void g1(){if(in==1){gain=gain1;}if(in==2){gain=gain2;}if(in==3){gain=gain3;}if(in==4){gain=gain4;}} void g2(){if(in==1){gain1=gain;}if(in==2){gain2=gain;}if(in==3){gain3=gain;}if(in==4){gain4=gain;}} void audio(){ tda.setInput(in); // 1 to 4 // номер канала tda.inputGain(gain); // 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) }
Форумы:
Обновленный скетч TDA7439_01.zip
Улучшена работа энкодера, изменено графическое исполнение шкал регулировок, добавлен ИК пульт (прокрутка меню и кнопки <>), при нажатии кнопки IN можно регулировать усиление каждого входа, для выхода из режима IN нужно подождать 5 сек.
Скетч протестирован!!!
Для нормальной работы скетча необходимо скачать дополнительные библиотеку:
IRremote.zip — библиотека изменена
Дополнительные файлы:
- 7439.lay6.zip
- Фото (автор: Анатолий Постоленко)
Здравствуйте,возможно ли подцепить TDA439 к OLED 1,3″ + ENKODER + IR.
Сам в написании программ не силен. Уж очень понравилась как «tdaшка» звучит.
Спасибо за ответ.
Придется полностью переписывать весь код, нужно тестирования с Вашей стороны, у меня нет сейчас этой микросхемы.
Добрый вечер. Я готов.У меня и микруха есть и NANO 3 и LGT8F328P-LQFP32 и дисплей. Все есть только скетч нужен и будем тестировать. Спасибо.
Хорошо, я на днях постараюсь подготовить скетч.
Тестируйте — http://forum.rcl-radio.ru/viewtopic.php?pid=8895#p8895
NANO 3 | LGT8F328P-
TDA7439 Опечатался.
Добрый вечер! Большое Спасибо за проект!!! Я взял из старого муз центра TDA7440d. Дата шит с интернета скачал и распаял на макетке согласно схеме. С Ардуино нано разобрался и с программой управления на Ардуино нано от ТДА 7439 тоже. Программа работает енкодер и кнопка всё переключается. А вот при подключении SDA CSL на к аудиопроцессору не реагирует. Проверил программой сканер ардуино, с аудиопроцессора вообще не идет сигнал и аудиопроцессор при этом сильно греется при работе, на него питание 9 вольт подал. Я начинающий и просто старался как на схеме всё делать. Скажите пожалуйста,то ли я неправильно что-то сделал или процессор просто не работает? Или прошивка от TDA 7439 не подходит под него? Вот фото распайки и схемы:
Установите подтягивающие резисторы к шине I2C SDA SCL по 4,7 кОм к +5V , Вы должны получить I2C адрес микросхемы в сканере I2C.
Спасибо! Всё-таки проц. не заработал. Я спаял другую схему точь в точь как на сайте с TDA 7439. Заработало, долго маялся не мог понять почему перелистывает и экран мерцает, оказалось плохой контакт проводов и неотмытый флю. Сейчас проц определился по шине I2C т.е. связь ардуино с процом есть, но когда подключаю усилитель к темброблоку для тестирования, звука почему-то нет. никак не могу понять из-за чего это может быть? В схеме что-то замыкает или искать причину в прошивке?
т.е. нормально всё регулируется громкость инпут переключается кнопкой, а звука при этом нет от источника
Тестовый скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=10554#p10554
Спасибо большое! Проверил. Сначала шуршания были и пробивался звук с одного канала ну и со второго чуть-чуть, потом я почистил плату спиртом, шуршания исчезли, но звук только с одного канала, прошил прошивкой которая не тестовая и тоже, звук очень хороший регулируется бас ср. и высок. частоты, но с одного канала. причём переключаю на второй выход и тоже самое. И провода меняю местами левый и правый но звук почему-то с одной колонки идёт что левый провод, что правый.Если напрямую на усилитель с источника играют оба канала стерео. Я кондёры припаивал только к двум инпутам, т.е. 4 шт., т.к. мне нужны только 2 инпута, а те, что не задействованы просто ножки торчат пустые. Может надо все 8 шт. припаять., чтобы звук был с обоих каналов?
Я кажется нашёл причину. Мультиметром прозвонил. У самого процессора на ножках между 1-м левым и 1-м правым каналом короткое замыкание.
Поменял аудиопроцессор, перепаял, всё замечательно звучит!
Спасибо этому сайту!
Спасибо за Ваш труд!!!
Решил ещё усовершенствовать схему и хотел поинтересоваться, если анализатор спектра делать и задействовать при этом 2 источника звука мп3 плеер и интернет радио т.е.2 линейных выхода на два инпута, надо на A0 скрутить вместе два провода с двух разных источников? через конденсатор 0.1.мкф? Чтобы анализатор работал с 1 и 2-го инпута? Или их просто вместе нельзя соединять надо через резистор ? И ещё хотел поинтересоваться, если на одном инпуте одновременно с двух каналов левый и правый снимать звук на анализатор надо через 2 резистора их пустить и потом объединить?
или лучше просто снять звук через выход с темброблока на усилитель? и при этом наверное анализатор будет неточную шкалу выдавать, будет зависеть от регулировок громкости и тембра ?
Попробуйте взять сигнал с выводом микросхемы 15 17 через конденсаторы 0,1 мкФ
Благодарю! Спаисбо! Всё получилось. Интернет радио, мп3 модуль, оптический вход и аукс 3.5 джек сделал управляется всё этим темброблоком. Звук чистый, анализатор спектра работает отлично!