
ИК-модуль VS1838B
ИМС TDA7439 – регулятор громкости и трехполосный регулятор тембра, разработан для использования в HI-FI аппаратуре и качественных автомобильных аудиосистемах, обладает низким уровнем шумов и искажений.
Основные технические характеристики ИМС TDA7439:
- Громкость 48 уровней от -48 до 0 дБ
- Регулировка тембра НЧ, СЧ, ВЧ ±14 дБ (±7 уровней)
- Коммутация входов — 4 стерео канала

Энкодер ky-040
- Усиление от 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 |
На странице https://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
- Фото (автор: Анатолий Постоленко)





Спасибо теперь всё отлично.
Здравствуйте.Отличный проект.Собрал для саундбара.Собрал версию с stby.Немного не разобрался с пульта можно управлять режимом stby или нет.
if(ir.value==0x5555555&&standby==1){standby=0;spek=0;time=millis();w=1;w2=1;cl();lcd.setCursor(0,0);lcd.print(" POWER ON ");digitalWrite(12,HIGH);delay(1000);menu=0;w2=1;}if(ir.value==0x5555555&&standby==0){standby=1;spek=0;time=millis();w=1;w2=1;cl();digitalWrite(12,LOW);delay(500);menu=100;}
Спасибо большое.К сожалению с Arduino только начал разбираться.Подскажите пожалуйста как правильно вставить этот кусок кода 🙂
Подставил я строчку для очистки EEPROM, все равно висит на приветствии, а без аудиопроца меню с ума сходит. Может, у меня микроконтроллер или аудиопроц битый?
Скетч должен работать без аудиопроцессора, я так обычно доделываю скетчи по просьбе пользователей. Да же если подключить аудиопроцессор с перепутанными sda scl все равно скетч должен работать, только звука не будет.
В скетче исправьте сроку:
#include «EEPROMex.h»
на
#include «EEPROM.h»
Я исправлял, не помогло
Разделите проблему на две части, без аудиопроцессора надо добиться нормальной работы скетча, перепроверить подключение. Скетч нормально работает, уже много человек повторили этот проект.
Как Вы прошиваете микроконтроллер?
Если скетч нормально заработает, то можно уже заниматься аудиопроцессором, я подготовлю тестовые скетчи и тогда станет ясно что не так.
Я так и поступаю, я делаю не все сразу.
Прошиваю микроконтроллер через USBasp в arduino IDE
Может поменять камень? Есть такое подозрение, что он глючный.
Я так и поступаю, я делаю не все сразу.
Прошиваю микроконтроллер через USBasp в arduino IDE
Может поменять камень? Есть такое подозрение, что он глючный.
Если на D12 подаете +5В, меню самопроизвольно не переключается?
Микроконтроллер повисает после приветствия на регулировке громкости.
На энкодер и кнопку не реагирует. Даже когда самопроизвольно переключается, он не реагирует на энкодер.
ATmega328 ?
Более простые скетчи работают?
Да, ATmega328
А работу простых скетчей я не проверял. Blink обычный подойдет?
http://forum.rcl-radio.ru/viewtopic.php?pid=320#p320
Ни чего отключать не надо, вывод на экран текста, подключение экрана такое же как в скетче TDA7439
Я проверил ваш скетч, он работает нормально.
Уточните какой именно скетч для TDA7439 Вы используете. Соберу схему без TDA буду тестировать.
Я использовал оба скетча, работают одинаково.
Ради интереса пробовал собрать аудиопроцессор на PT7313(TDA7313). Выпаял его из китайской магнитолы. Даже с этим аудиопроцессором и скетчем под него, микроконтроллер ведет себя также как и с предыдущим аудиопроцессором на TDA7439
Дело, не скетче. Все протестировано по много раз. Единственное что может быть не так это библиотеки которые Вы используете. Скачайте удалите свои библиотеки (энкодер, таймер2 и ИК) и установите новые:
http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
Возможно Вы используете более новые версии, которые не совместимы со скетчем
will you please tell me how to change these values
кнопка энкодера D13
кнопка IN D11
кнопка POWER A1
управление STANDBY D12
http://forum.rcl-radio.ru/viewtopic.php?id=49
I am using the above sketch it showing only power off nothing else.how to power on, the encoder at D12 and push button at D11 not working
I put encoder on D13 also but no change
Библиотеки я поставил ваши. С макетной платы перенес это добро на нормальную. Энкодер заработал, но начинает спустя 10 секунд. Кнопка энкодера и выбора входа заработала, но основные регулировки работают, а регулировка усиления нет. EEPROM работает, все сохраняется.При подключении аудиопроцессора по-прежнему зависает
А может ли это быть из-за неправильного кварца? Он у меня стоит на 18.4. Я прошил именно под этот кварц или эти настройки на это не влияют. Тут нужен исключительно на 16?
Прошейте микроконтроллер как Arduino UNO (просто выбрать из списка плат) без корректировки частоты кварца.
Работает все кроме аудиопроцессора на i2c. По-прежнему зависает.
Понизьте скорость шины i2c, после wire.begin() вставить:
Wire.setClock(31000L);
В скетче я этой строчки не нашел. Надо в библиотеке к TDA вставить?
Да. В секции setup() после wire.begin();
Так же замерьте сопротивление между корпусом и sda и scl аудиопроцессора
Можно в скетче, можно в библиотеке.
В скетче просто в секции setup, в библиотеке после wire.begin();
Спасибо вам за помощь, все работает! Косяк в зависании МК был с моей стороны, так как ножка SCL замыкала на минус питания из-за кусочка проволочки от провода, который каким то образом попал в канифоль. Ели заметил,блин)) Еще раз спасибо!
Отлично! Если возникнут вопросы, обращайтесь.
Возможно ли в обновленный скетч TDA7439_01 внести переключение каналов напрямую с кнопок пульта? 1,2,3 для каналов 1,2,3
Вам нужно просто добавить несколько строк типа:
if(ir.value==_КОД_КНОПКИ1){in=0;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;audio();}// меню кнопка вверх
if(ir.value==_КОД_КНОПКИ2){in=1;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;audio();}// меню кнопка вверх
if(ir.value==_КОД_КНОПКИ3){in=2;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;audio();}// меню кнопка вверх
ничего не получается, ставлю в void loop
Вставьте код после опроса IR датчика:
if ( irrecv.decode( &ir )) {Serial.print(«0x»);Serial.println( ir.value,HEX);time1=millis();time=millis();w=1;w1=1;irrecv.resume();}// IR приемник
Откройте монитор порта, нажмите 123, получите код кнопок.
Если не получится, то на выходных постараюсь сделать.
мне пришли наконец то исправная 7449, пошел ее терзать, эту на потом оставлю
hello sir’
I tried this sketch but remote not workig. serial monitor doesnot shows any hex codes while pressing remote. what may be the problem?. I think the fuction on the loop irrecv.decode not working. Sir can u please me a solution.
thanks
delete the IR library, and install it from this source http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
thanks sir. Remote is worked fine. but the audio processor is not working.circuit and connections are correct. what may be the problem. is there need any pullup resistor to 5v from SDA SCL lines? what may be the problem? thanks
GND ARDUINO and GND audio processor common?
yes sir common…
yes sir common
does it need pullup resistor ?
no
test I2C — http://forum.rcl-radio.ru/viewtopic.php?id=64
sir i tested this code. it shows no i2c devices found. SDA is connected to A4 and SCL is connected to A5 of arduino. I also tested this code with another processor R2S 15902 FP’s data and cock, but shows no i2c devies found.What may be the problem?
The R2S 15902 FP does not use the I2C bus, but the chip uses D2 D3 inputs
Sir then what may be the reason behind i2c not found. Is the problem of arduino or 7439 processor circuit that i made?
if the i2c scanner does not show the address, then check the SDA scl gnd connection
The speed of the port monitor corresponds to 9600?Serial.begin(9600);
Hello sir. Its worked fine. Everything working fine except bass. there is no change in bass. -14 to +14 bass have same effect,no change in sound. what may be the problem?
treble and middle working perfectly. Please help?
Check the correct settings and values of the correction elements related to bass adjustment
Sir. The circuit elements are correct. No change in values 100nF as 104 disc capacitor used. Remaining all things are working perfectly. But bass adjustments have no change. I think bass is high or full from the starting of the processor . No change in bass from -14db to +14 db. ?
yes sir worked fine. i replaced 100nF with 222nF.so the problem solved.Thank you so much sir for valuable feedback.