| Ваш IP: 3.231.229.89 | Online(31) - гости: 12, боты: 19 | Загрузка сервера: 0.53 ::::::::::::


Регулятор тембра на микросхеме TDA7439+VS1838B+KY-040 (Arduino)

ИК-модуль 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 подается при удержании любой кнопки. В других пультах для каждой кнопки код удержания кнопки может быть свой для каждой кнопки.

При помощи кнопки энкодера можно переходить по пунктам меню:

  1. Громкость
  2. Тембр НЧ
  3. Тембр СЧ
  4. Тембр ВЧ
  5. Баланс

Регулировка параметров громкости, тембра и баланса осуществляется при помощи ручки энкодера. При нажатии на кнопку «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 — библиотека изменена

Дополнительные файлы:

Комментарии

  • andros:

    Проверил новый скетч. Также при включении включается сразу, без заставки «Power Off». И есть лишние символы и значение странное в Treble. Остальные функции нормально. Видео могу выслать на почту.

  • andros:

    Проверил новый скетч. Также при включении включается сразу Power On, без заставки
    «Power Off». И есть лишние символы и значение странное в Treble. Остальные функции нормально. Видео могу выслать на почту.

    • liman28:

      Вставьте строчку:
      Serial.println(analogRead(A1));
      перед:
      if(analogRead(A1)>1000&&standby==1){standby=0;spek=0;time=millis();w=1;w2=1;lcd.clear();lcd.setCursor(0,0);lcd.print(» POWER ON «);digitalWrite(12,HIGH);delay(1000);menu=0;w2=1;}
      if(analogRead(A1)>1000&&standby==0){standby=1;spek=0;time=millis();w=1;w2=1;lcd.clear();digitalWrite(12,LOW);delay(500);menu=100;}

      мне это помогло, при включении POWER OFF

      Покрутите регулировку тембра, наверное в памяти eeprom большая цифра.

  • andros:

    Поставил энкодер все стало нормально. Теперь появился новый глюк. Когда выключаю кнопкой на дисплее появляется POWER OFF и через 8 секунд появляется анализатор спектра с надписью POWER OFF.

  • andros:

    Спасибо теперь всё отлично.

  • Здравствуйте.Отличный проект.Собрал для саундбара.Собрал версию с stby.Немного не разобрался с пульта можно управлять режимом stby или нет.

  • Немного изменил код, может Вам пригодится в дальнейшем.Убрал из строк spek=0.Иначе компилятор выдавал ошибку ‘spek’ was not declared in this scope.

  • Can I get a pdf of this image for doing toner transfer and PCB etching?

  • CyberDeD:

    Здраствуйте! У вас проект отличный, но у меня возникли проблемки с его работой. Собирал не на ардуино, а на голом микроконтроллере c резистором на ресет и кварцем(схему приложил). Прошил в него прошивку и загрузчик ардуины. При включении схемы микроконтроллер намертво зависает на экране приветствия, там где написано «TDA7439». Если отключить от I2C аудиопроц, то прошивка вроде как загружается, но циклически пролистывает меню и не реагирует на кнопки и энкодер. Автор, помогите пожалуйста решить хоть как-то эту проблему, неохота делать новое управление на известном pic16f628a. Заранее спасибо!
    Если с моих слов непонятна проблема, то я приложил видео работы.
    https://youtu.be/7MqXLNfLmSw

    • liman28:

      Здравствуйте!
      Пролистывается меню — частая проблема, проверьте подтягивающие резисторы 3 шт по clk dt sw 10 ком на +5 В. Если у Вас резистор на SW подтянут к минус питания то надо исправить if(digitalRead(12)==LOW) на if(digitalRead(12)==HIGH)

      Зависание I2C при подключении аудиопроцессора, с этим сложнее, подключите к scl sda резисторы 4,7 К на +5В

      GND микроконтроллера и аудиопроцессора должны быть общими.

      Дополнительно в секцию setup() в самое начало вставьте следующий код:
      http://forum.rcl-radio.ru/viewtopic.php?id=77

  • CyberDeD:

    Подтягивающие на энкодере стоят(припаял с обратной стороны платы). Кнопку я припаял,как на схеме модуля ky-040 и тоже подтянул к +5в
    SCL И SDA к питанию через резисторы еще не подключал, надо попробовать. В ардуине, насколько я помню эти резисторов нет. Или я ошибаюсь?
    Минус питания у меня общий.

    • liman28:

      Подайте на вход D12 (кнопка энкодера) +5В, меню не должно переключаться.
      Очистите память EEPROM (ссылку я опубликовал), при старте все параметры аудиопроцессора берутся из памяти, а так как у Вас новая микросхема вся память забита числом 255, возможно аудиопроцессор получает не корректные команды и шина i2c виснет.

      Резисторов на А4 А5 на ардуине нет, но есть рекомендация их ставить при использовании отдельного микроконтроллера.

      • CyberDeD:

        Резисторы я поставил по вашей рекомендации и подключил d12 к +5в, теперь появляется приветствие «TDA7439»,далее появляется шкала и ‘Volume’ и контроллер вроде как повисает на этом, не реагируя на энкодер и кнопку.
        Код для очистки EEPROM еще не применял. Проявляется это без подключенного аудиопроца.

        • CyberDeD:

          Подставил я строчку для очистки EEPROM, все равно висит на приветствии, а без аудиопроца меню с ума сходит. Может, у меня микроконтроллер или аудиопроц битый?

          • liman28:

            Скетч должен работать без аудиопроцессора, я так обычно доделываю скетчи по просьбе пользователей. Да же если подключить аудиопроцессор с перепутанными sda scl все равно скетч должен работать, только звука не будет.

            В скетче исправьте сроку:
            #include «EEPROMex.h»
            на
            #include «EEPROM.h»

            • CyberDeD:

              Я исправлял, не помогло

              • liman28:

                Разделите проблему на две части, без аудиопроцессора надо добиться нормальной работы скетча, перепроверить подключение. Скетч нормально работает, уже много человек повторили этот проект.

                Как Вы прошиваете микроконтроллер?

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

                • CyberDeD:

                  Я так и поступаю, я делаю не все сразу.
                  Прошиваю микроконтроллер через USBasp в arduino IDE
                  Может поменять камень? Есть такое подозрение, что он глючный.

  • CyberDeD:

    Я так и поступаю, я делаю не все сразу.
    Прошиваю микроконтроллер через USBasp в arduino IDE
    Может поменять камень? Есть такое подозрение, что он глючный.

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • Экономичный усилитель для наушников (3В)

    Экономичный усилитель для наушников (3В)

    Усилитель для наушников может быть напрямую подключен к CD-проигрывателю, тюнеру и магнитофону. Подходит к разным моделям наушников различный — импеданс: 32, 100, 245, 300, 600 & 2000 Ом. R3 рассчитан для импеданса наушников до 300 ом. Свыше 600 ом нагрузки или выше необходимо изменить R3 на 100K. Технические данные: Потребляемый …Подробнее...
  • ЭЛЕКТРИЧЕСКИЕ ПАРАМЕТРЫ ТРИОДНЫХ ТИРИСТОРОВ ТИПОВ КУ104А — КУ104Г

    Тип Наибольшее прямое напряжение, В КУ104А 15 КУ104Б 30 КУ104В 60 КУ104Г 100 Для тиристоров этого типа Ток в закрытом состоянии 1 не более…… 0,12 мА Обратное постоянное напряжение не более …. 6 В Импульсный отпирающий ток управления 1 не более . . 15 мА Импульсное отпирающее напряжение управления 1 …Подробнее...
  • Регулятор для паяльника

    Регулятор позволяет плавно регулировать температуру от 50 до 100% от номинальной. Открыванием тиристора управляет мультивибратор с регулируемой R3 скважностью. Транзисторы любые германиевые НЧ — МП39-42, диоды Д226 Д237 и др., тиристор КУ201 КУ202 И-Н. Общее сопротивление гасящих резисторов R6-R8 — 12…14кОм, суммарная мощность рассеивания не менее 5 Вт. Внимание!!! Схема …Подробнее...
  • Приставка — стереодетектор

    Монофонический приемник можно легко переделать в стереофонический с помощью простой приставки.  Подробнее...
  • Регулируемый импульсный стабилизатор напряжения LM2576HV-ADJ

    Регулируемый импульсный стабилизатор напряжения LM2576HV-ADJ

    Регулируемый импульсный стабилизатор напряжения LM2576HV-ADJ (микросхема понижающего широтно-импульсного (ШИМ) регулируемого стабилизатора напряжения) имеет широкий диапазон регулируемого выходного напряжения от 1,2 до 50В с выходным максимальным током 3А. Так как стабилизатор работает в импульсном режиме, он имеет высокий КПД и как правило оснащается небольшим радиатором площадью не более 100 см2. Устройство …Подробнее...