| Ваш IP: 18.206.16.123 | Online(25) - гости: 10, боты: 15 | Загрузка сервера: 0.34 ::::::::::::


TDA7449 + энкодер + ИК пульт + анализатор спектра

Ранее на странице https://rcl-radio.ru/?p=56015 рассматривался пример использования аудиопроцессора на платформе Arduino, в качестве органов управления были кнопки и энкодер. На этой странице будет показан пример использования аудиопроцессора который имеет управление одновременно от кнопок, энкодера и ИК пульта, так же в скетч добавлен анализатор спектра который срабатывает после 10 секундной не активности органов управления. Аудио сигнал (линейный) необходимо подать на вход А0 через разделительный конденсатор 0,1 мкФ.

Основные технические характеристики ИМС TDA7449:

  • Громкость 47 уровней от -47 до 0 дБ
  • Регулировка тембра НЧ, ВЧ  ±14 дБ (±7 уровней)
  • Коммутация входов — 2 стерео канала
  • Усиление от 0 до 30 дБ независимое для каждого канала
  • Регулировка баланса ± 8 дБ (ограниченно программно)
  • Отношение сигнал\шум 106 дБ
  • Разделение каналов 100 дБ
  • Режим MUTE
  • Частотный диапазон от 20 до 20000 Гц
  • Напряжение питания от 6 до 10,2 В (типовое значение 9 В)
  • КНИ на частоте 1 кГц не более 0,01%

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

 

Библиотеки:

https://rcl-radio.ru/wp-content/uploads … Timer2.zip
https://rcl-radio.ru/wp-content/uploads … ncoder.zip
https://rcl-radio.ru/wp-content/uploads … DA7449.zip
https://rcl-radio.ru/wp-content/uploads … remote.zip

Получить коды кнопок своего ИК пульта можно в мониторе порта.

Скетч без анализатора спектра

#include <Wire.h>
#include <TDA7449.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>//#include <EEPROMex.h> для старых версий Arduino IDE
  TDA7449 tda;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  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,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
   byte a2[8]={0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
   byte a3[8]={0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  int menu,vol,vol_d,bass,bass_d,mids,treb,treb_d,balans,in,gain,gain_d,gain0,gain1;
  int att=8; // аттенюатор - если звук очень громкий увеличьте значение (72 mute), меньше 8 не делать.
  byte w,w1,w2,in_d,z,z0,z1,www,mute,gr1,gr2,mute_w;
  unsigned long time,oldPosition  = -999,newPosition;
 
void setup(){ Serial.begin(9600);
  Wire.begin(); lcd.begin(16, 2);irrecv.enableIRIn(); // запускаем модуль IR
  MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
  lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  lcd.setCursor(0,0);lcd.print("    TDA7449    ");delay(1000);// ЗАСТАВКА
  pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
  pinMode(11,INPUT);// ВЫБОР ВХОДА КНОПКА IN
  pinMode(13,INPUT);// КНОПКА MUTE
  /// считываем все настройки с памяти при включении
  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
  gain0 = EEPROM.read(6);// gain1 eeprom
  gain1 = EEPROM.read(7);// gain2 eeprom
  audio(); // заносим все параметры в tda7449
}
 
void loop() {
  if(digitalRead(10)==LOW&&mute==0){menu++;cl();w2=1;if(menu>4){menu=0;}}// меню
  if(digitalRead(11)==HIGH&&mute==0){in++;;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>1){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
  if(digitalRead(13)==HIGH&&mute==0){mute=1;cl();att=70;audio();lcd.setCursor(0,0);lcd.print("      MUTE      ");menu=100;}
  if(digitalRead(13)==HIGH&&mute==1){mute=0;cl();att=8;menu=0;w2=1;audio();}
 
  ////////////////// ИК приемник - обработка нажатий ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);time=millis();w=1;irrecv.resume();}// IR приемник - чтение
 
  if(ir.value==0x2FDD02F&&mute==0){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню кнопка вверх
  if(ir.value==0x2FD32CD&&mute==0){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// меню кнопка вниз
 
  if(ir.value==0x2FDEA15&&mute==0){mute=1;cl();att=70;audio();lcd.setCursor(0,0);lcd.print("      MUTE      ");menu=100;}
  if(ir.value==0x2FDEA15&&mute==1){mute=0;cl();att=8;menu=0;w2=1;audio();}
  if(mute==1){w=0;menu=100;gr1=0;}
 
  if(ir.value==0x2FD708F&&mute==0){in++;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>1){in=0;};gr1=0;gr2=0;audio();}// IN
 
  /////////////////////// VOLUME //////////////
   if(menu==0){
     if(ir.value==0x2FD906F){vol++;gr1=1;gr2=0;cl();w2=1;vol_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){vol--;gr1=0;gr2=1;cl();w2=1;vol_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();w2=1;vol_func();audio();}// кнопка <<<<<<
 
     if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print("Volume  ");
     lcd.print(" ");lcd.print(-47+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////////  BASS  //////////////
   if(menu==1){
     if(ir.value==0x2FD906F){bass++;gr1=1;gr2=0;cl();w2=1;bass_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl();w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){bass--;gr1=0;gr2=1;cl();w2=1;bass_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl();w2=1;bass_func();audio();}// кнопка <<<<<<  
 
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print("Bass    ");
   lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////// TREBLE //////////////////
   if(menu==2){
     if(ir.value==0x2FD906F){treb++;gr1=1;gr2=0;cl();w2=1;treb_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){treb--;gr1=0;gr2=1;cl();w2=1;treb_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();w2=1;treb_func();audio();}// кнопка <<<<<<
 
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print("Treble  ");
   lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 ///////////////////////////////////////////////////////////
 
 //////////////// BALANSE  +\- 4 dB /////////////
   if(menu==3){
     if(ir.value==0x2FD906F){balans++;gr1=1;gr2=0;cl();balans_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){balans++;gr2=0;cl();balans_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){balans--;gr1=0;gr2=1;cl();balans_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){balans--;gr1=0;cl();balans_func();audio();}// кнопка <<<<<<
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
  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("L");
  lcd.setCursor(15,1);lcd.print("R");
   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);}
 }
 
 /////////// input + gain /////////////////////////////////////////
 if(menu==4){
        switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     }
 
     if(ir.value==0x2FD906F){gain++;gr1=1;gr2=0;cl();w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain++;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){gain--;gr1=0;gr2=1;cl();w2=1;gain_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){gain--;gr1=0;cl();w2=1;gain_func();audio();}// кнопка <<<<<<
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} 
   switch(in){
     case 0: gain0 = gain;break;
     case 1: gain1 = gain;break;
     } 
     if(www==1){audio();www=0;}
   lcd.setCursor(0,0);lcd.print("Gain IN ");lcd.print(in);
      lcd.setCursor(10,0);lcd.print(" ");lcd.print(gain*2);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");gain_d=gain*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=gain_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}}w2=0;
  }
 /////////////////////////////////////////////////////////////
 
 // запись всех настроек в EEPROM при неактивности энкодера в течении 10 сек и выход в меню громкости
   if(millis()-time>10000 && w==1){
     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,gain0);EEPROM.update(7,gain1);
  menu=0;w=0;w2=1;cl();
 }
 }// loop
 
void gain_func(){if(gain<0){gain=0;}if(gain>15){gain=15;}}
void balans_func(){;if(balans>4){balans=4;}if(balans<-4){balans=-4;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} 
void vol_func(){if(vol<0){vol=0;}if(vol>47){vol=47;}}
void cl(){ir.value=0;delay(200);lcd.clear();}
 
void audio(){
  tda.setInput(in); //         int in 1...2 //// номер входа
  tda.inputGain(gain); //      int gain 0...15 (шаг 2дБ)    0...30 дБ  //// усиление
  tda.setVolume(vol); //       int vol 0...47 (шаг 1 дБ)  -47...0 дБ  //// громкость
  tda.setBass(bass); //        int bass -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр НЧ
  tda.setTreble(treb); //      int treb -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр ВЧ
  tda.setAttL(att-balans); //  int att 0...79 (шаг 1дБ)    
  tda.setAttR(att+balans); //  int att 0...79 (шаг 1дБ)    
}
 
void to_Timer(){newPosition = myEnc.read()/4;}

Скетч с анализатором спектра

Дополнительная библиотека — https://rcl-radio.ru/wp-content/uploads/2018/11/FHT.zip

#define AUTO_GAIN 1       // автонастройка по громкости
#define VOL_THR 35        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 30       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 80       // максимальный порог по умолчанию 
#define FHT_N 256         // ширина спектра х2
#define LOG_OUT 1
#include <FHT.h> 
#include <Wire.h>
#include <TDA7449.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <EEPROM.h>
  TDA7449 tda;
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(9, 8);//CLK, DT
  decode_results ir;
  LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
  byte posOffset[16] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30}; // вч выше
  int menu,vol,vol_d,bass,bass_d,mids,treb,treb_d,balans,in,gain,gain_d,gain0,gain1;
  int att=8; // аттенюатор - если звук очень громкий увеличьте значение (72 mute), меньше 8 не делать.
  byte w,w1,w2,in_d,z,z0,z1,www,mute,gr1,gr2,mute_w;
  unsigned long time,oldPosition  = -999,newPosition;
  unsigned long gainTimer;
  byte maxValue, maxValue_f,spek;
  float k = 0.1;
  byte gain_sp = DEF_GAIN;  
  int i1,yyy;
 
void setup(){ Serial.begin(9600);
  Wire.begin(); lcd.begin(16, 2);irrecv.enableIRIn(); // запускаем модуль IR
  lcd.setCursor(0,0);lcd.print("    TDA7449    ");delay(1000);// ЗАСТАВКА
  pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера
  pinMode(11,INPUT);// ВЫБОР ВХОДА КНОПКА IN
  pinMode(13,INPUT);// КНОПКА MUTE
  ADMUX  = 0b01100000; ADCSRA = 0b11010100; // https://rcl-radio.ru/?p=57478
  MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА
  /// считываем все настройки с памяти при включении
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass eeprom
  treb = EEPROM.read(3)-7;// treb eeprom
  balans = EEPROM.read(4)-8;// balans eeprom
  in = EEPROM.read(5);// in eeprom
  gain0 = EEPROM.read(6);// gain1 eeprom
  gain1 = EEPROM.read(7);// gain2 eeprom
  audio(); // заносим все параметры в tda7449
}
 
void loop() {
  if (newPosition != oldPosition) {if(spek==1){cl();menu=0;}}
  if(spek==0){
      byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
      byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
      byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
      lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
    }else{
      byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
      byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
      byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
      byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
      lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);
      }
 
  if(digitalRead(10)==LOW&&mute==0){menu++;cl();w2=1;if(menu>4){menu=0;}}// меню
  if(digitalRead(11)==HIGH&&mute==0){in++;;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>1){in=0;};audio();}// КНОПКА ВЫБОРА ВХОДА IN
  if(digitalRead(13)==HIGH&&mute==0){mute=1;cl();att=70;audio();lcd.setCursor(0,0);lcd.print("      MUTE      ");menu=100;}
  if(digitalRead(13)==HIGH&&mute==1){mute=0;cl();att=8;menu=0;w2=1;audio();}
 
  ////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;if(spek==1){menu=0;cl();}}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
 
  if(ir.value==0x2FDD02F&&mute==0){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню кнопка вверх
  if(ir.value==0x2FD32CD&&mute==0){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// меню кнопка вниз
 
  if(ir.value==0x2FDEA15&&mute==0){mute=1;cl();att=70;audio();lcd.setCursor(0,0);lcd.print("      MUTE      ");menu=100;}
  if(ir.value==0x2FDEA15&&mute==1){mute=0;cl();att=8;menu=0;w2=1;audio();}
  if(mute==1){spek=0;w=0;menu=100;gr1=0;}
 
  if(ir.value==0x2FD708F&&mute==0){in++;cl();time=millis()-7000;w=1;w2=1;www=1;menu=4;if(in>1){in=0;};gr1=0;gr2=0;audio();}// IN
 
  /////////////////////// VOLUME //////////////
   if(menu==0){
     if(ir.value==0x2FD906F){vol++;gr1=1;gr2=0;cl();w2=1;vol_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){vol--;gr1=0;gr2=1;cl();w2=1;vol_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();w2=1;vol_func();audio();}// кнопка <<<<<<
 
     if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();} 
     lcd.setCursor(0,0);lcd.print("Volume  ");
     lcd.print(" ");lcd.print(-47+vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////////  BASS  //////////////
   if(menu==1){
     if(ir.value==0x2FD906F){bass++;gr1=1;gr2=0;cl();w2=1;bass_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl();w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){bass--;gr1=0;gr2=1;cl();w2=1;bass_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl();w2=1;bass_func();audio();}// кнопка <<<<<<  
 
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} 
   lcd.setCursor(0,0);lcd.print("Bass    ");
   lcd.print(" ");lcd.print(bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=bass*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 
  ///////////////// TREBLE //////////////////
   if(menu==2){
     if(ir.value==0x2FD906F){treb++;gr1=1;gr2=0;cl();w2=1;treb_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){treb--;gr1=0;gr2=1;cl();w2=1;treb_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();w2=1;treb_func();audio();}// кнопка <<<<<<
 
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} 
   lcd.setCursor(0,0);lcd.print("Treble  ");
   lcd.print(" ");lcd.print(treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=treb*2+15;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}}
 ///////////////////////////////////////////////////////////
 
 //////////////// BALANSE  +\- 8 dB /////////////
   if(menu==3){
     if(ir.value==0x2FD906F){balans++;gr1=1;gr2=0;cl();balans_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){balans++;gr2=0;cl();balans_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){balans--;gr1=0;gr2=1;cl();balans_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){balans--;gr1=0;cl();balans_func();audio();}// кнопка <<<<<<
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;balans_func();audio();}
  lcd.setCursor(0,0);
   if(balans>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans));lcd.print(" dB ");
  if(balans==0){lcd.print(" <>  ");}
  if(balans<0){lcd.print(" <   ");}
  if(balans>0){lcd.print("  >  ");}
   if(balans>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans));lcd.print(" dB ");
  lcd.setCursor(0,1);lcd.print("L");
  lcd.setCursor(15,1);lcd.print("R");
   if(balans<0){lcd.setCursor(balans/2+7,1);lcd.write((uint8_t)0);}
   if(balans>0){lcd.setCursor(balans/2+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);}}
 
 /////////// input + gain /////////////////////////////////////////
 if(menu==4){
        switch(in){
     case 0: gain = gain0;break;
     case 1: gain = gain1;break;
     }
 
     if(ir.value==0x2FD906F){gain++;gr1=1;gr2=0;cl();w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain++;gr2=0;cl();w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==0x2FDF20D){gain--;gr1=0;gr2=1;cl();w2=1;gain_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){gain--;gr1=0;cl();w2=1;gain_func();audio();}// кнопка <<<<<<
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} 
   switch(in){
     case 0: gain0 = gain;break;
     case 1: gain1 = gain;break;
     } 
     if(www==1){audio();www=0;}
   lcd.setCursor(0,0);lcd.print("Gain IN ");lcd.print(in);
      lcd.setCursor(10,0);lcd.print(" ");lcd.print(gain*2);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");gain_d=gain*2;
   if(w2==1){
   for(z=0,z0=0,z1=0;z<=gain_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}}w2=0;
  }
 /////////////////////////////////////////////////////////////
 
 // запись всех настроек в EEPROM при неактивности энкодера в течении 10 сек и выход в меню громкости
   if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+8);
     EEPROM.update(1,bass+7);
     EEPROM.update(3,treb+7);
     EEPROM.update(5,in);
     EEPROM.update(6,gain0);EEPROM.update(7,gain1);
  menu=100;lcd.clear();w=0;w2=1;cl();spek=1;
 }
 
 if(spek==1){
  analyzeAudio();   // функция FHT, забивает массив fht_log_out[] величинами по спектру
 
  for (int pos = 0; pos < 16; pos++) {   // для окошек дисплея с 0 по 15
    // найти максимум из пачки тонов
    if (fht_log_out[posOffset[pos]] > maxValue) maxValue = fht_log_out[posOffset[pos]];
 
    lcd.setCursor(pos, 0);
 
    // преобразовать значение величины спектра в диапазон 0..15 с учётом настроек
    int posLevel = map(fht_log_out[posOffset[pos]], LOW_PASS, gain_sp, 0, 15);
    posLevel = constrain(posLevel, 0, 15);
  while(yyy<2){yyy++;
    if (posLevel > 7) {               // если значение больше 7 (значит нижний квадратик будет полный)
      lcd.write((uint8_t)posLevel - 8);    // верхний квадратик залить тем что осталось
      lcd.setCursor(pos, 1);          // перейти на нижний квадратик
      lcd.write((uint8_t)7);        // залить его полностью
  } 
    else {                          // если значение меньше 8
      lcd.print(" ");                 // верхний квадратик пустой
      lcd.setCursor(pos, 1);          // нижний квадратик
      lcd.write((uint8_t)posLevel);        // залить полосками
    }} yyy=0;
  }  
 
  if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer > 1500) {      // каждые 1500 мс
      // если максимальное значение больше порога, взять его как максимум для отображения
      if (maxValue_f > VOL_THR) gain_sp = maxValue_f;
 
      // если нет, то взять порог побольше, чтобы шумы вообще не проходили
      else gain_sp = 100;
      gainTimer = millis();
    }
  }else{gain_sp = DEF_GAIN;}
  }
  //////////////////////////////////
 }// loop
 
void gain_func(){if(gain<0){gain=0;}if(gain>15){gain=15;}}
void balans_func(){if(balans>8){balans=8;}if(balans<-8){balans=-8;}}
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} 
void vol_func(){if(vol<0){vol=0;}if(vol>47){vol=47;}}
void cl(){ir.value=0;delay(300);spek=0;lcd.clear();}
 
void audio(){
  tda.setInput(in); //         int in 1...2 //// номер входа
  tda.inputGain(gain); //      int gain 0...15 (шаг 2дБ)    0...30 дБ  //// усиление
  tda.setVolume(vol); //       int vol 0...47 (шаг 1 дБ)  -47...0 дБ  //// громкость
  tda.setBass(bass); //        int bass -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр НЧ
  tda.setTreble(treb); //      int treb -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр ВЧ
  tda.setAttL(att-balans); //  int att 0...79 (шаг 1дБ)    
  tda.setAttR(att+balans); //  int att 0...79 (шаг 1дБ)    
}
 
void to_Timer(){newPosition = myEnc.read()/4;}
 
void analyzeAudio() {  
  cli(); 
 while( i1 < FHT_N ) {  i1++; 
    do{ADCSRA |= (1 << ADSC);} 
    while((ADCSRA & (1 << ADIF)) == 0);
    fht_input[i1] = (ADCL|ADCH << 8); 
    //fht_input[i1] = ADCH; 
    }i1=0;
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
  sei();
}

Форум:

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

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

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

  • Схемы включения биполярных транзисторов

    Транзистор трех электродный прибор, его электроды: эмиттер, коллектор и база. При использовании транзистора в качестве усилителя напряжения, тока или мощности входной сигнал надо подавать на два других электрода и с двух электродов снимать сигнал (усиленный сигнал), при этом один из электродов будет обязательно общим. Это обстоятельство (общий электрод) и определяет …Подробнее...
  • Преобразователь частота-напряжение

    Преобразователь частота-напряжение преобразует импульсы с частотой от 0 до 9кГц в постоянное напряжение от 0 до 9В. Основа преобразователя микросхема ТС9401. Входной сигнал амплитуда которого не должна превышать напряжение питания (10…15В) подается на разъем CON1. Напряжение питания подается на разъем CON3. D2 препятствует протеканию тока в случае перепутывания полярности. Установка …Подробнее...
  • Ультралинейный усилитель мощности на 100Вт

    Ультралинейный усилитель мощности на 100Вт

    На рисунке представлена схема усилителя мощности НЧ в полосе частот от 10 до 600000Гц на 100Вт. Схема: Т1 Т2 и Т3 Т4 — входной усилитель выполненный по дифференциальной схеме, Т5 — каскад предварительного усиления, Т6 Т7 и Т8 Т9 — оконечный каскад с бестрансформаторым выходом по схеме с дополнительной симметрией …Подробнее...
  • Простой УМЗЧ (3)

    Простой УМЗЧ (3)

    Особенность данного УМЗЧ то, что в нем работают 3 составных транзистора. Это привело к минимуму используемых элементов. Такое построение пред оконечного каскада на VT2 обеспечило его высокое входное сопротивление и значительный коэффициент усиления и низкий уровень искажений при отсутствии ООС. Дополнительно увеличить коэффициент усиления позволила цепь R6 C5, что позволило …Подробнее...
  • Шестнадцатеричный дешифратор на одной микросхеме

    Широкодоступных микросхем дешифраторов способных отображать на цифровом табло числа от 0 до 15 соответственно поступающим на входы кодам от 0000 до 1111 практически нет. Для того что бы построить данное устройство необходимо несколько микросхем для индикации на семисегментном табло, но используя дешёвую микросхему ПЗУ К155РЕ3 и запрограммировать ее, можно получить …Подробнее...