| Ваш IP: 54.167.18.170 | Online(19) - гости: 13, боты: 6 | Загрузка сервера: 0.88 ::::::::::::

Темброблок на TDA8425 (Arduino)

ИМС TDA8425 представляет собой двухканальный (стереофонический) регулятор громкости и тембра с микропроцессорным управлением.

Технические характеристики:

  • Производитель: Philips
  • Напряжение питания минимальное 7 В
  • Напряжение питания максимальное 13,2 В
  • Частотный диапазон 35…20000 Гц
  • Коэффициент гармоник 0,05%
  • Выходное напряжение максимальное 1 В
  • Регулировка громкости 48 уровней от -88 дБ до +6 дБ с шагом 2 дБ
  • Регулировка тембра НЧ  от -12 дБ до +15 дБ с шагом 3 дБ
  • Регулировка тембра ВЧ  от -12 дБ до +12 дБ с шагом 3 дБ
  • Регулировка баланса 8 дБ с шагом 2 дБ

 

Плата Arduino Nano аудиопроцессор TDA8425 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).

Темброблок имеет пять кнопок управления:

  • МЕНЮ — перебор параметров (громкость, баланс, тембр НЧ, тембр ВЧ, выбор канала)
  • ПЛЮС — прибавление громкости, тембра и др.
  • МИНУС  — уменьшение громкости, тембра и др.
  • MUTE — включение/выключение режима MUTE
  • — 20 дБ — при нажатии на кнопку громкость уменьшается на 20 дБ

Если кнопки регулировок «ПЛЮС» и «МИНУС» и кнопка «МЕНЮ» не были активны в течении 10 секунд, то происходит запись всех настроек в энергонезависимую память (функция EEPROM.update не перезаписывает ячейку памяти если значение переменной не менялось), так же происходит переход из режима регулировок тембра, баланса, выбора входа в режим регулировки громкости.

Если в режиме MUTE нет необходимости, то выход D9 необходимо подключить к GND.

  #include <Wire.h>
  #include <TDA8425.h>
  #include <LiquidCrystal.h>
  #include <EEPROM.h>//#include <EEPROMex.h>
  TDA8425 tda;
  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 menu,vol_d,z,w,w1,bass_d,treb,treb_d,balans;
  byte vol,bass,in,mute=0;
  unsigned long time;
 
void setup(){
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(12,INPUT);// меню
  pinMode(11,INPUT);// плюс
  pinMode(10,INPUT);// минус
  pinMode(9,INPUT);// mute
  pinMode(8,INPUT);// -20дБ
  lcd.createChar(0,a1); lcd.createChar(1,a2); 
  vol = EEPROM.read(0);// vol eeprom
  bass = EEPROM.read(1);// bass eeprom
  treb = EEPROM.read(2);// treb eeprom
  in = EEPROM.read(3);// in eeprom
  balans = EEPROM.read(4)-4;// balans eeprom
   audio();
  lcd.setCursor(4,0);lcd.print("TDA8425");delay(500);
 }
 
void loop(){
   if(digitalRead(12)==HIGH){menu++;mute=0;audio();cl();time=millis();w1=1;if(menu>4){menu=0;}}// меню
 
 // индикация громкости + управление кнопками //////////////
   if(menu==0){
   if(digitalRead(11)==HIGH){vol++;w=1;if(vol>63){vol=63;}}// 63 максимальная громкость = +6 дБ 
   if(digitalRead(10)==HIGH){vol--;w=1;if(vol<=16){vol=16;}}// 16 минимум громкости = -88 дБ
  lcd.setCursor(0,0);lcd.print("Volume    ");
  vol_d=vol*2-120;
   if(vol_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(vol_d>-10){{lcd.print(" ");}}
  lcd.print(abs(vol_d));lcd.print(" dB   ");
 // ползунок громкости начинает работать с -56 дБ
   if(vol-32>0){for(z=0;z<=vol-33;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol-32)%2==0&&vol-32>=0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
 ///////////////////////////////////////////////////////////
 
 // индикация баланс + управление кнопками +\- 8 дБ ///////
   if(menu==1){
   if(digitalRead(11)==HIGH){balans++;w=1;if(balans>4){balans=4;}}
   if(digitalRead(10)==HIGH){balans--;w=1;if(balans<-4){balans=-4;}}
  lcd.setCursor(0,0);
   if(balans*2>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(balans*2>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans*2));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);}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
 /////////////////////////////////////////////////////////////
 
 // индикация тембр НЧ + управление кнопками //////////////
   if(menu==2){
   if(digitalRead(11)==HIGH){bass++;w=1;if(bass>11){bass=11;}}// 11 максимум тембр = +15 дБ 
   if(digitalRead(10)==HIGH){bass--;w=1;if(bass<2||bass==255){bass=2;}}// 2 минимум тембр = -12 дБ
  lcd.setCursor(0,0);lcd.print("Bass      ");
  bass_d=bass*3-18;
   if(bass_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}}
  lcd.print(abs(bass_d));lcd.print(" dB   ");
   if(bass>1){for(z=3;z<=bass+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
 ///////////////////////////////////////////////////////////
 
 // индикация тембр ВЧ + управление кнопками //////////////
   if(menu==3){
   if(digitalRead(11)==HIGH){treb++;w=1;if(treb>10){treb=10;}}// 10 максимум тембр = +12 дБ 
   if(digitalRead(10)==HIGH){treb--;w=1;if(treb<2||treb==255){treb=2;}}// 2 минимум тембр = -12 дБ
  lcd.setCursor(0,0);lcd.print("Treble    ");
  treb_d=treb*3-18;
   if(treb_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}}
  lcd.print(abs(treb_d));lcd.print(" dB   ");
   if(treb>1){for(z=3;z<=treb+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
 ///////////////////////////////////////////////////////////
 
 /////////// input /////////////////////////////////////////
   if(menu==4){
   if(digitalRead(11)==HIGH){in++;w=1;if(in>1&&in<255){in=0;}}
   if(digitalRead(10)==HIGH){in--;w=1;if(in>2){in=1;}}
  lcd.setCursor(0,0);lcd.print("Source selector");
  lcd.setCursor(0,1);lcd.print("Input: ");lcd.print(in);
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
////////////////////////////////////////////////////////////
 
////////////////// mute //////////////////////////////////
   if(digitalRead(9)==HIGH){mute++;if(mute>1){mute=0;}
   if(mute==1){menu=-1;}else{menu=0;}
  audio();cl();
  lcd.setCursor(6,0);lcd.print("MUTE");
 }
///////////////////////////////////////////////////////////
 
///////////////////  -20 dB ///////////////////////////////
   if(digitalRead(8)==HIGH){vol=vol-10;delay(500);audio();cl();}
//////////////////////////////////////////////////////////
 
// запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
// если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
   if(millis()-time>10000 && w1==1){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass);
     EEPROM.update(2,treb);
     EEPROM.update(3,in);
  menu=0;w1=0;cl();
 }
}
 
void cl(){
  delay(200);
  lcd.clear();
 }
 
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
 }

Библиотека TDA8425.ZIP 


Следующий вариант темброблока аналогичен первому, только вместо кнопок управления «ПЛЮС» и «МИНУС» и  «МЕНЮ» применен энкодер. При нажатии на кнопку энкодера происходит смена регулировок параметров.

Если энкодер не активен в течении 10 секунд происходит переход на регулировку громкости, а если энкодер неактивен в течении 60 секунд происходит запись всех настроек в энергонезависимую память.

  #include <Wire.h>
  #include <TDA8425.h>
  #include <Encoder.h>
  #include <LiquidCrystal.h>
  #include <EEPROM.h>//#include <EEPROMex.h>
   Encoder myEnc(11, 10);//CLK, DT
   TDA8425 tda;
   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 z,vol,vol_d,vol_ram,balans,balans_ram,bass,bass_ram,bass_d,treb,treb_d,treb_ram,in,in_ram,mute;
   byte menu,w1,w;
   long oldPosition  = -999;
   unsigned long time,time1;
 
 
void setup() {
  Serial.begin(9600);
   lcd.begin(16, 2);
   pinMode(12,INPUT);// меню кнопка энкодера SW
   lcd.createChar(0,a1); lcd.createChar(1,a2); 
   vol = EEPROM.read(0);// vol eeprom
   bass = EEPROM.read(1);// bass eeprom
   treb = EEPROM.read(2);// treb eeprom
   in = EEPROM.read(3);// in eeprom
   balans = EEPROM.read(4)-4;// balans eeprom
   audio();ram();
   lcd.setCursor(4,0);lcd.print("TDA8425");delay(500);
}
 
void loop() {
   if(digitalRead(12)==LOW){menu++;ram();myEnc.write(0);oldPosition  = -999;delay(300);time1=millis();w=1;if(menu>4){menu=0;}}// меню
   ///////////////////////// громкость /////////////////////////////
   if(menu==0){
  long newPosition = myEnc.read()/4+vol_ram;
   if (newPosition != oldPosition) {
  oldPosition = newPosition;lcd.clear();vol=newPosition;
   if(vol>63){vol=63;};if(vol<=16){vol=16;}
  lcd.setCursor(0,0);lcd.print("Volume    ");
  vol_d=vol*2-120;
   if(vol_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(vol_d>-10){{lcd.print(" ");}}
  lcd.print(abs(vol_d));lcd.print(" dB   ");
 // ползунок громкости начинает работать с -56 дБ
   if(vol-32>0){for(z=0;z<=vol-33;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol-32)%2==0&&vol-32>=0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
  audio();time=millis();time1=millis();w1=1;w=1;
  }}
   ///////////////////////// баланс /////////////////////////////
  if(menu==1){
  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*2>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(balans*2>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans*2));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();w1=1;
}}
  ///////////////////////// тембр нч /////////////////////////////
  if(menu==2){
   long newPosition = myEnc.read()/4+bass_ram;
   if (newPosition != oldPosition) {
  oldPosition = newPosition;lcd.clear();bass=newPosition;
   if(bass>11){bass=11;}if(bass<2||bass==255){bass=2;}
  lcd.setCursor(0,0);lcd.print("Bass      ");
  bass_d=bass*3-18;
   if(bass_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}}
  lcd.print(abs(bass_d));lcd.print(" dB   ");
   if(bass>1){for(z=3;z<=bass+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
  audio();time=millis();w1=1;
 }}
   ///////////////////////// тембр вч /////////////////////////////
  if(menu==3){
   long newPosition = myEnc.read()/4+treb_ram;
   if (newPosition != oldPosition) {
  oldPosition = newPosition;lcd.clear();treb=newPosition;
   if(treb>10){treb=10;}if(treb<2||treb==255){treb=2;}
  lcd.setCursor(0,0);lcd.print("Treble    ");
  treb_d=treb*3-18;
   if(treb_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}}
  lcd.print(abs(treb_d));lcd.print(" dB   ");
   if(treb>1){for(z=3;z<=treb+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
  audio();time=millis();w1=1;
 }}
  ///////////////////////// input /////////////////////////////
  if(menu==4){
    long newPosition = myEnc.read()/4+in_ram;
   if (newPosition != oldPosition) {
  oldPosition = newPosition;lcd.clear();in=newPosition;
   if(in>1&&in<255){in=0;}if(in>2){in=1;}
  lcd.setCursor(0,0);lcd.print("Source selector");
  lcd.setCursor(0,1);lcd.print("Input: ");lcd.print(in);
  audio();time=millis();w1=1;
 }}
////////////////// mute //////////////////////////////////
   if(digitalRead(9)==HIGH){mute++;if(mute>1){mute=0;}
   if(mute==1){menu=-1;}else{oldPosition  = -999;menu=0;}
  audio(); delay(200);lcd.clear();
  lcd.setCursor(6,0);lcd.print("MUTE");
 }
///////////////////////////////////////////////////////////
 
///////////////////  -20 dB ///////////////////////////////
   if(digitalRead(8)==HIGH){vol=vol-10;delay(500);ram();audio();myEnc.write(0);menu=0;}
//////////////////////////////////////////////////////////
 
   if(millis()-time>10000 && w1==1){// возврат в меню громкости через 10 сек неактивности
     menu=0;w1=0; }
   if(millis()-time1>60000 && w==1){// сохранение всех настроек в eeprom через 60 сек неактивности
     ram();myEnc.write(0);
     EEPROM.update(0,vol_ram);
     EEPROM.update(4,balans_ram+4);
     EEPROM.update(1,bass_ram);
     EEPROM.update(2,treb_ram);
     EEPROM.update(3,in_ram);
     w=0; }
 
 }// loop
 
void ram(){vol_ram=vol;in_ram=in;balans_ram=balans;treb_ram=treb;bass_ram=bass;} 
 
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
 }

Видео

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

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

  • Измеритель индуктивности

    При изготовлении и настройке различной радиоаппаратуры часто возникает необходимость в измерении индуктивности. Большинство современных мультиметров или, вообще, не имеют режима измерения индуктивности, или не обеспечивают возможность измерения малых индуктивностей, применяемых в УКВ аппаратуре. Предлагаемый прибор позволяет измерять индуктивность на пяти поддиапазонах: 0-1, 0-10, 0-100, 0-1000, 0-10000 мкГн (см. рисунок) . …Подробнее...
  • Малогабаритный ИИП 24Вт

    Малогабаритный ИИП 24Вт

    Предлагаемый автогенераторный ИИП (импульсный источник питания) имеет малые габариты и высокий КПД. Его особенностью является то, что магнитопровод импульсного трансформатора работает с заходом в область насыщения. При проектировании автогенераторных ИИП в большинстве случаев мощный трансформатор используют в линейном режиме, а маломощный переключательный — в режиме насыщении магнитопровода. Отдельные обмотки этих …Подробнее...
  • Яркая светодиодная лампа

    Яркая светодиодная лампа

    На рисунке показана схема простой светодиодной лампы работающей от сетевого напряжения 220 В. Конденсатор С1 и сопротивление R1 образуют схему ограничения тока. 10 сверх ярких светодиодов белого свечения подключаются последовательно, полевой транзистор используется для автоматического отключения лампы в дневное время. Сопротивление фоторезистора 100 кОм при полном освещении и уменьшается в …Подробнее...
  • Стереодин

    При включении головок громкоговорителей по схеме, показанной на рис., можно поучить псевдостереофоническое звучание. Головки 1 и 2 включены синфазно в области НЧ звукового диапазона и противофазно в области ВЧ, за счет чего и осуществляется стерео эффект. Головки вместе с деталями стереодина помещены в одном ящике на фронтальной панели. Необходимо что …Подробнее...
  • Автомат освещения лестничной площадки

    Автомат лестничного освещения построен на основе таймера NE555. Таймер используется в качестве моностабильного генератора, время задающая цепь которого состоит из элементов R3 R7 C3. Таймер управляет исполнительным элементом — транзистором VT2 который в свою очередь управляет работой электромагнитного реле. Кнопки Кн1…Кн3 (их может быть неограниченное кол-во) включают лестничное освещение. Вывод …Подробнее...