TDA7449 + LCD дисплей 84×48 Nokia 5110 (Arduino)

ИМС TDA7449 – регулятор громкости и регулятор тембра, разработан для использования в HI-FI аппаратуре и качественных автомобильных аудиосистемах, обладает низким уровнем шумов и искажений.

На странице http://rcl-radio.ru/?p=56015 был показан пример использования ИМС TDA7449 с выводом информации на индикатор LCD1602 на базе контроллера HD44780. На этой странице будет показан пример использования TDA7449 с выводом информации на  LCD дисплей 84×48 Nokia 5110.

Регулятор тембра и громкости имеет четыре кнопки управления:

  • Кнопка «МЕНЮ» — пять основных регулировок: громкость, тембр НЧ, тембр СЧ, тембр ВЧ, баланс.
  • Кнопка «+» — увеличение громкости, тембра, рег. баланса, рег. усиления.
  • Кнопка «-» — уменьшение громкости, тембра, рег. баланса, рег. усиления.
  • Кнопка «INPUT» (режим INPUT) — выбор стерео канала и регулировка усиления для каждого канала.

Индикатор Nokia 5110 позволяет вывести все параметры настроек аудиопроцессора TDA7449: громкость, тембр НЧ, тембр ВЧ, балан, номер канала и усиление выбранного канала. Все настройки в МЕНЮ сохраняются в энергонезависимой памяти. Сохранение настроек происходит через 10 секунд неактивности кнопок управления. 

Подключение TDA7449 и кнопок управления  к Arduino Nano или Uno:

  • Nokia 5110 LCD  — RST,CE,DC,DIN,CLK  (цифровые выходы Arduino 3,4,5,6,7). На вход VCC необходимо подавать питание 3,3 В, а на выход BL (подсветка) можно подавать питание 5 В через сопротивление 330 Ом или 3,3 В через сопротивление 200 Ом.
  • Кнопка меню — подключена к цифровому выходу Arduino 12
  • Кнопка ПЛЮС выход 10
  • Кнопка МИНУС выход 11
  • Кнопка INPUT аналоговый выход А1
  • Выход ИМС TDA7449 SDA и SCL подключаются к аналоговым входам платы Arduino А4 и А5 соответственно.

В скетче используются две основные библиотеки, это библиотека TDA7449.zip и библиотека PCD8544 для индикатора Nokia 5110, стандартная библиотека была изменена, в ней заменены редко используемые символы на русские буквы, поэтому необходимо использовать именно эту библиотеку — pcd8544.zip

#include <Wire.h> 
#include <SPI.h>
#include <TDA7449.h>
#include <PCD8544.h>
#include <EEPROMex.h>
 TDA7449 tda;
 PCD8544 lcd; // RST,CE,DC,DIN,CLK   VCC,BL,GND (3,4,5,6,7   +3.3V,200 OM +3.3V, GND)
 static const byte asd[] = { B00111100,B00000000,B00000000,B00000000,B00000000 };
 static const byte asd1[] = { B00111100,B00111100,B00111100,B0000000,B11111111 };
 static const byte asd2[] = { B00111100,B00111100,B00111100,B0000000,B00111100 };
 int vol=20,bass=0,treb=0,balans=0,gain,gain1,gain2;
 int i,menu,in,in_d,w=0,w1=0,w2=0,w3=0,w4=0,eeprom;
 unsigned long time;
 
void setup() { 
  Serial.begin(9600);Wire.begin();
  lcd.begin(84, 48); 
  lcd.setContrast(60);//  контрастность 0-127
  pinMode(10,INPUT);pinMode(11,INPUT);pinMode(12,INPUT);
  lcd.createChar(0, asd);  lcd.createChar(1, asd1);lcd.createChar(2, asd2);
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass 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
  audio();
}          
 
void loop() {  
 
if(digitalRead(12)==HIGH){menu++;w_x();time_x();delay(200);if(menu>3||menu<0){menu=0;}}
if(analogRead(A1)>900){in++;menu=5;w_x();time_x();delay(200);if(in>2||in<1){in=1;}}// in
////////////////////////////// vol ///////////////////////////////////////////////////////  
if(menu==0){   
               if(digitalRead(10)==HIGH){vol++;w=0;time_x();delay(100);}
               if(digitalRead(11)==HIGH){vol--;w=0;time_x();delay(100);}
               if(vol>47){vol=47;}if(vol<0){vol=0;}
}
if(w==0){
  lcd.setCursor(0,0);lcd.print("}P");            
  for(i=15;i<68;i++){lcd.setCursor(i,0);lcd.write(0);}
  lcd.setCursor(vol+15,0);if(menu==0){lcd.write(1);}else{lcd.write(2);}lcd.setCursor(72,0);if(vol<10){lcd.print(" ");}lcd.print(vol);
  audio();w=1;
}
 
///////////////////////////////////////// bass ///////////////////////////////////
if(menu==1){
               if(digitalRead(10)==HIGH){bass++;w1=0;time_x();delay(100);}
               if(digitalRead(11)==HIGH){bass--;w1=0;time_x();delay(100);}
               if(bass>7){bass=7;}if(bass<-7){bass=-7;}
}
if(w1==0){ 
  lcd.setCursor(0,1);lcd.print("H'");            
  for(i=8;i<60;i=i+1){lcd.setCursor(i+7,1);lcd.write(0);}
  lcd.setCursor(bass*3+37,1);if(menu==1){lcd.write(1);}else{lcd.write(2);}lcd.setCursor(72,1);if(bass<10&&bass>=0){lcd.print(" ");}lcd.print(bass);
  audio();w1=1;
  }
 
//////////////////////////////////////////// treble /////////////////////////////
if(menu==2){
               if(digitalRead(10)==HIGH){treb++;w2=0;time_x();delay(100);}
               if(digitalRead(11)==HIGH){treb--;w2=0;time_x();delay(100);}
               if(treb>7){treb=7;}if(treb<-7){treb=-7;}
}
if(w2==0){ 
  lcd.setCursor(0,2);lcd.print("B'");            
  for(i=8;i<60;i=i+1){lcd.setCursor(i+7,2);lcd.write(0);}
  lcd.setCursor(treb*3+37,2);if(menu==2){lcd.write(1);}else{lcd.write(2);}lcd.setCursor(72,2);if(treb<10&&treb>=0){lcd.print(" ");}lcd.print(treb);
  audio();w2=1;
  }
 
//////////////////////////////////////////// balans /////////////////////////////
if(menu==3){
               if(digitalRead(10)==HIGH){balans++;w3=0;time_x();delay(100);}
               if(digitalRead(11)==HIGH){balans--;w3=0;time_x();delay(100);}
               if(balans>4){balans=4;}if(balans<-4){balans=-4;}
}
if(w3==0){ 
  lcd.setCursor(0,3);lcd.print(" R");            
  for(i=8;i<60;i=i+1){lcd.setCursor(i+7,3);lcd.write(0);}
  lcd.setCursor(balans*5+37,3);if(menu==3){lcd.write(1);}else{lcd.write(2);}lcd.setCursor(72,3);lcd.print("L");
  audio();w3=1;
  }  
/////////////////////////////////////////////////////////////////////////////////  
 lcd.setCursor(0,4);lcd.print("--------------");   
/////////// input + gain /////////////////////////////////////////
   if(menu==5){ g1(); 
   if(digitalRead(11)==HIGH){gain++;w4=0;time_x();delay(300);if(gain>15){gain=15;}}
   if(digitalRead(10)==HIGH){gain--;w4=0;time_x();delay(300);if(gain<0){gain=0;}}
   g2();}
   if(w4==0){ g1();
  lcd.setCursor(0,5);lcd.print("Bxo(");if(menu==5){lcd.print("=");}else{lcd.print(" ");}lcd.print(in);
  lcd.print(" @c>{.");lcd.print(gain);
  audio();w4=1;
 }
////////////////////////////////////////////////////////////  
 
if(millis()-time>10000 && eeprom==1){menu=0;
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass+7);
     EEPROM.update(3,treb+7);
     EEPROM.update(5,in);
     EEPROM.update(6,gain1);EEPROM.update(7,gain2);
w_x();eeprom=0;}
 
} // loop
 void g1(){if(in==1){gain=gain1;}if(in==2){gain=gain2;}}
 void g2(){if(in==1){gain1=gain;}if(in==2){gain2=gain;}}
 void w_x(){w=0;w1=0;w2=0,w3=0;w4=0;}
 void time_x(){time=millis();eeprom=1;}
void audio(){
  tda.setInput(in); //         int 1...2 //// номер входа
  tda.inputGain(gain); //        int 0...15 (шаг 2дБ)    0...30 дБ  //// усиление
  tda.setVolume(vol); //       int 0...47 (шаг 1 дБ)  -47...0 дБ  //// громкость
  tda.setBass(bass); //          int -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр НЧ
  tda.setTreble(treb); //        int -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр ВЧ
  tda.setAttL(4-balans); //          int 0...79 (шаг 1дБ)    
  tda.setAttR(4+balans); //          int 0...79 (шаг 1дБ)    
}


tda7449_encoder.zip — добавлен энкодер дублирующий кнопки «MENU», «+» и «-«. (не тестировалось!!!)

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

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