Аудиопроцессор BD3491FS (Arduino)

Аудиопроцессор BD3491FS совместно с Arduino позволяет собрать простой, но качественный регулятор громкости и тембра, так же аудиопроцессор в имеет электронный селектор входов на 6 стерео каналов с независимой регулировкой усиления для каждого канала.

Основные характеристики аудиопроцессора BD3491FS:

  • Напряжение питания от 4.75 до 9.5 В
  • Ток потребления (при Uвх = 0) не более 7 мА
  • Суммарный коэффициент гармоник при Vout=1Vrms, BW=400-30kHz  не более 0,002%
  • Перекрестные помехи между каналами -100 дБ
  • Входное сопротивление 50 кОм
  • Селектор входов на 6 каналов с независимой регулировкой усиления каждого канала
  • Максимальное входное напряжение 2.4 Vrms
  • Регулировка громкости от -87 до 0 дБ (шаг 1 дБ)
  • Регулировка тембра НЧ (100 Гц), ВЧ (10 кГц) от -14 до +14 дБ (шаг 2 дБ)
  • Управление цифровое (I2C)

Информация о текущих настройках будет выводится на LCD экран 1602 (I2C).

В качестве органов управления регулятором тембра и громкости используется энкодер и одна кнопка для переключения входов, которые дублируются ИК пультом.

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

Плата Пин SDA Пин SCL
Arduino Uno, Nano, Pro и Pro Mini A4 A5

Все параметры заносятся в энергонезависимую память.

Для нормальной загрузки скетча Вам понадобятся следующие библиотеки:

После загрузки скетча откройте монитор порта и нажмите на кнопку ИК-пульта для получения кода кнопки пульта, после чего укажите свои коды кнопок в скетче:

#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FD708F // Кнопка IN

Тестовый скетч

#include <Wire.h> 
#include <BD3491FS.h>
BD3491FS bd; 
 
void setup(){
   Wire.begin();
   audio();
}
 
void loop(){}
 
void audio(){
    bd.setSelect(0);// int 0...7 === A B C D E F INPUT_SHORT INPUT_MUTE
    bd.setIn_gain(0); // int 0...7 === 0...20 dB    
    bd.setVol_1(0); // int 0...87 === 0...-87 dB
    bd.setVol_2(0); // int 0...87 === 0...-87 dB
    bd.setBass(0); // int -7...0...+7 === -7...+7 dB
    bd.setTreb(0); // int -7...0...+7 === -7...+7 dB
    bd.setSurround(1); // int 0...3 === OFF LOW MIDDLE HIGH
  }
#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FD708F // Кнопка IN
 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <BD3491FS.h>
#include <Encoder.h>
#include <EEPROM.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
  BD3491FS bd; 
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(8, 9);//  CLK, DT
  decode_results ir; 
   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};  
   unsigned long time,oldPosition  = -999,newPosition; 
   int menu,w,w2,vol,vol_d,gr1,gr2,z,z0,z1,treb,treb_d,bass,bass_d,in,www,gain1,gain2,gain3,gain4,gain5,gain6,gain0,gain_d,sur; 
 
void setup(){
  irrecv.enableIRIn();lcd.init();lcd.backlight();
  lcd.setCursor(0,0);lcd.print("    BD3491FS    ");delay(2000);cl();
  Serial.begin(9600); lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
   vol = EEPROM.read(0)-87;treb = EEPROM.read(1)-7;bass = EEPROM.read(2)-7;
   in = EEPROM.read(3);sur = EEPROM.read(10);
   gain1 = EEPROM.read(4);gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);
   gain4 = EEPROM.read(7);gain5 = EEPROM.read(8);gain6 = EEPROM.read(9);
   audio();
}
 
void loop(){
  if(digitalRead(10)==LOW){menu++;cl();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню
  if(digitalRead(2)==HIGH){in++;;cl();time=millis();w=1;w2=1;www=1;if(in>5){in=0;};lcd.setCursor(0,0);lcd.print("    INPUT ");lcd.print(in+1);audio();delay(2000);}// КНОПКА ВЫБОРА ВХОДА I
 
 ////////////////////// IR /////////////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
  if(ir.value==IR_1){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню кнопка вверх 
  if(ir.value==IR_2){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// меню кнопка вниз
  if(ir.value==IR_5){in++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;www=1;if(in>5){in=0;};lcd.setCursor(0,0);lcd.print("    INPUT ");lcd.print(in+1);audio();delay(2000);}// КНОПКА ВЫБОРА ВХОДА IN
 
/////////////////////////////// VOLUME -87 ... +0 дБ | step 1 dB////////////////////////////////////////////////
 if(menu==0){
     if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl1();w2=1;vol_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl1();w2=1;vol_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();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(vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=vol+48;
   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;}}  
 
///////////////////////// TREBLE +/-14 dB | step 2 dB/////////////////////////////////////////////////////////
   if(menu==1){
     if(ir.value==IR_3){treb++;gr1=1;gr2=0;cl1();w2=1;treb_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){treb--;gr1=0;gr2=1;cl1();w2=1;treb_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();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+14;
   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;}}   
 
/////////////////////// BASS +/-14 dB | step 2 dB///////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==IR_3){bass++;gr1=1;gr2=0;cl1();w2=1;bass_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl1();w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){bass--;gr1=0;gr2=1;cl1();w2=1;bass_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl1();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+14;
   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;}} 
 
   //////////////// IN + GAIN /////////////////////////////////////////////////////////////
   if(menu==3){ 
       switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain4;break;
     case 4: gain0 = gain5;break;
     case 5: gain0 = gain6;break;
     }
     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();w2=1;gain_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();w2=1;gain_func();audio();}// кнопка <<<<<<
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     case 4: gain5 = gain0;break;
     case 5: gain6 = gain0;break;
     } 
    if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print("Gain IN ");lcd.print(in+1);
      lcd.setCursor(10,0);lcd.print(" ");lcd.print(gain0*2);lcd.print(" ");lcd.setCursor(14,0);lcd.print("dB");gain_d=gain0*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+6,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+6,1);lcd.print("   ");}}
   if(z1==3){lcd.setCursor(z0+6,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+6,1);lcd.write((uint8_t)2);}}w2=0;}
 
  ////////////////////////////// Surround ////////////////////////////////////////////////////
 if(menu==4){  
     if(ir.value==IR_3){sur++;gr1=1;gr2=0;cl1();w2=1;sur_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){sur++;gr2=0;cl1();w2=1;sur_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){sur--;gr1=0;gr2=1;cl1();w2=1;sur_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){sur--;gr1=0;cl1();w2=1;sur_func();audio();}// кнопка <<<<<< 
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    sur=sur+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;sur_func();audio();} 
 
    lcd.setCursor(0,0);lcd.print("Surround Gain");
    lcd.setCursor(0,1);
      switch(sur){
         case 0: lcd.print("OFF   ");break;
         case 1: lcd.print("LOW   ");break;
         case 2: lcd.print("MIDDLE");break;
         case 3: lcd.print("HIGH  ");break;}}  
 
 
 
 ///////////////////// EEPROM ///////////////////////////////////////////////////////////////         
  if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol+87);EEPROM.update(1,treb+7);EEPROM.update(2,bass+7);
     EEPROM.update(3,in);EEPROM.update(10,sur);
     EEPROM.update(4,gain1);EEPROM.update(5,gain2);EEPROM.update(6,gain3);
     EEPROM.update(7,gain4);EEPROM.update(8,gain5);EEPROM.update(9,gain6);
     menu=0;w=0;w2=1;cl();}
 
  }//loop
 
void sur_func(){if(sur>3){sur=0;}if(sur<0){sur=3;}}
void gain_func(){if(gain0<0){gain0=0;}if(gain0>7){gain0=7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} 
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void vol_func(){if(vol<-87){vol=-87;}if(vol>0){vol=0;}}
void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(100);}
void to_Timer(){newPosition = myEnc.read()/4;}  
 
void audio(){
    bd.setSelect(in);// int 0...7 === A B C D E F INPUT_SHORT INPUT_MUTE
    bd.setIn_gain(gain0); // int 0...7 === 0...14 dB    
    bd.setVol_1(abs(vol)); // int 0...87 === 0...-87 dB
    bd.setVol_2(abs(vol)); // int 0...87 === 0...-87 dB
    bd.setBass(bass); // int -7...0...+7 === -7...+7 dB
    bd.setTreb(treb); // int -7...0...+7 === -7...+7 dB
    bd.setSurround(sur); // int 0...3 === OFF LOW MIDDLE HIGH
  }

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

#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FD708F // Кнопка IN
 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <BD3491FS.h>
#include <Encoder.h>
#include <EEPROMex.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
  BD3491FS bd; 
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  Encoder myEnc(8, 9);//  CLK, DT
  decode_results ir; 
      byte v1[8] = {31,31,31,31,31,31,31,31};
      byte v2[8] = {31,31,31, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,31,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
      byte v7[8] = { 0, 0, 0, 0, 0, 0,31,31};
   unsigned long time,oldPosition  = -999,newPosition; 
   int menu,w,w2,vol,vol_d,gr1,gr2,z,z0,z1,treb,treb_d,bass,bass_d,in,www,gain1,gain2,gain3,gain4,gain5,gain6,gain0,gain_d,sur; 
    byte a[2];
    byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3;
 
void setup(){
  irrecv.enableIRIn();lcd.init();lcd.backlight();
  lcd.setCursor(0,0);lcd.print("    BD3491FS    ");delay(2000);cl();
  Serial.begin(9600); lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(7, v7);
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
   vol = EEPROM.read(0)-87;treb = EEPROM.read(1)-7;bass = EEPROM.read(2)-7;
   in = EEPROM.read(3);sur = EEPROM.read(10);
   gain1 = EEPROM.read(4);gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);
   gain4 = EEPROM.read(7);gain5 = EEPROM.read(8);gain6 = EEPROM.read(9);
   audio();
}
 
void loop(){
  if(digitalRead(10)==LOW){menu++;cl();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню
  if(digitalRead(2)==HIGH){in++;;cl();time=millis();w=1;w2=1;www=1;if(in>5){in=0;};lcd.setCursor(0,0);lcd.print("    INPUT ");lcd.print(in+1);audio();delay(2000);cl();}// КНОПКА ВЫБОРА ВХОДА I
 
 ////////////////////// IR /////////////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта
  if(ir.value==IR_1){menu++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu>4){menu=0;}}// меню кнопка вверх 
  if(ir.value==IR_2){menu--;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;if(menu<0){menu=4;}}// меню кнопка вниз
  if(ir.value==IR_5){in++;gr1=0;gr2=0;cl();time=millis();w=1;w2=1;www=1;if(in>5){in=0;};lcd.setCursor(0,0);lcd.print("    INPUT ");lcd.print(in+1);audio();delay(2000);cl();}// КНОПКА ВЫБОРА ВХОДА IN
 
/////////////////////////////// VOLUME -87 ... +0 дБ | step 1 dB////////////////////////////////////////////////
 if(menu==0){
     if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl1();w2=1;vol_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();w2=1;vol_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl1();w2=1;vol_func();audio();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();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();}
    vol_d = 87-abs(vol);
    a[0]= vol_d/10;a[1]=vol_d%10;
 
    for(i=0;i<2;i++){
      switch(i){
        case 0: e1=9,e2=10,e3=11;break;
        case 1: e1=13,e2=14,e3=15;break;}       
      switch(a[i]){
        case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
        case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
        case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
        case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
        case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
        case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
        case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
        case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
        case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
       case 11: d1=5,d2=5,d3=5,d4=5,d5=5,d6=5;break;
    }
 
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
   //   if(vol<0){lcd.setCursor(7,0);lcd.write((uint8_t)7);}else{lcd.setCursor(7,0);lcd.write((uint8_t)5);}
      lcd.setCursor(0,0);lcd.print("VOLUME");
      lcd.setCursor(0,1);lcd.print("IN ");lcd.print(in+1);
  }
 
///////////////////////// TREBLE +/-14 dB | step 2 dB/////////////////////////////////////////////////////////
   if(menu==1){
     if(ir.value==IR_3){treb++;gr1=1;gr2=0;cl1();w2=1;treb_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl1();w2=1;treb_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){treb--;gr1=0;gr2=1;cl1();w2=1;treb_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl1();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();}
 
    treb_d = abs(treb*2);
    a[0]= treb_d/10;a[1]=treb_d%10;
 
    for(i=0;i<2;i++){
      switch(i){
        case 0: e1=9,e2=10,e3=11;break;
        case 1: e1=13,e2=14,e3=15;break;}       
      switch(a[i]){
        case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
        case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
        case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
        case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
        case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
        case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
        case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
        case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
        case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
       case 11: d1=5,d2=5,d3=5,d4=5,d5=5,d6=5;break;
    }
 
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
 
       if(treb<0){lcd.setCursor(7,0);lcd.write((uint8_t)7);}else{lcd.setCursor(7,0);lcd.write((uint8_t)5);}
      lcd.setCursor(0,0);lcd.print("TREBLE");
      lcd.setCursor(0,1);lcd.print("10 kHz");
  }   
 
/////////////////////// BASS +/-14 dB | step 2 dB///////////////////////////////////////////////////////////
   if(menu==2){
     if(ir.value==IR_3){bass++;gr1=1;gr2=0;cl1();w2=1;bass_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl1();w2=1;bass_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){bass--;gr1=0;gr2=1;cl1();w2=1;bass_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl1();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();} 
 
   bass_d = abs(bass*2);
    a[0]= bass_d/10;a[1]=bass_d%10;
 
    for(i=0;i<2;i++){
      switch(i){
        case 0: e1=9,e2=10,e3=11;break;
        case 1: e1=13,e2=14,e3=15;break;}       
      switch(a[i]){
        case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
        case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
        case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
        case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
        case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
        case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
        case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
        case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
        case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
       case 11: d1=5,d2=5,d3=5,d4=5,d5=5,d6=5;break;
    }
 
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
 
       if(bass<0){lcd.setCursor(7,0);lcd.write((uint8_t)7);}else{lcd.setCursor(7,0);lcd.write((uint8_t)5);}
      lcd.setCursor(0,0);lcd.print("BASS  ");
      lcd.setCursor(0,1);lcd.print("100 Hz");
  }   
 
   //////////////// IN + GAIN /////////////////////////////////////////////////////////////
   if(menu==3){ 
       switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     case 3: gain0 = gain4;break;
     case 4: gain0 = gain5;break;
     case 5: gain0 = gain6;break;
     }
     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();w2=1;gain_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();w2=1;gain_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();w2=1;gain_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();w2=1;gain_func();audio();}// кнопка <<<<<<
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;gain_func();audio();} 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     case 3: gain4 = gain0;break;
     case 4: gain5 = gain0;break;
     case 5: gain6 = gain0;break;
     } 
    if(www==1){audio();www=0;}
  lcd.setCursor(0,0);lcd.print("Gain");
  lcd.setCursor(0,1);lcd.print("IN ");lcd.print(in+1);
 
     gain0 = abs(gain0*2);
    a[0]= gain0/10;a[1]=gain0%10;
 
    for(i=0;i<2;i++){
      switch(i){
        case 0: e1=9,e2=10,e3=11;break;
        case 1: e1=13,e2=14,e3=15;break;}       
      switch(a[i]){
        case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
        case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
        case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
        case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
        case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
        case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
        case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
        case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
        case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
       case 11: d1=5,d2=5,d3=5,d4=5,d5=5,d6=5;break;
    }
 
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}
   }
 
  ////////////////////////////// Surround ////////////////////////////////////////////////////
 if(menu==4){  
     if(ir.value==IR_3){sur++;gr1=1;gr2=0;cl1();w2=1;sur_func();audio();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){sur++;gr2=0;cl1();w2=1;sur_func();audio();}// кнопка >>>>>>
     if(ir.value==IR_4){sur--;gr1=0;gr2=1;cl1();w2=1;sur_func();audio();}// кнопка < 
     if(ir.value==0xFFFFFFFF and gr2==1){sur--;gr1=0;cl1();w2=1;sur_func();audio();}// кнопка <<<<<< 
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    sur=sur+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;sur_func();audio();} 
 
    lcd.setCursor(0,0);lcd.print("Surround Gain");
    lcd.setCursor(0,1);
      switch(sur){
         case 0: lcd.print("OFF   ");break;
         case 1: lcd.print("LOW   ");break;
         case 2: lcd.print("MIDDLE");break;
         case 3: lcd.print("HIGH  ");break;}}  
 
 
 
 ///////////////////// EEPROM ///////////////////////////////////////////////////////////////         
  if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol+87);EEPROM.update(1,treb+7);EEPROM.update(2,bass+7);
     EEPROM.update(3,in);EEPROM.update(10,sur);
     EEPROM.update(4,gain1);EEPROM.update(5,gain2);EEPROM.update(6,gain3);
     EEPROM.update(7,gain4);EEPROM.update(8,gain5);EEPROM.update(9,gain6);
     menu=0;w=0;w2=1;cl();}
 
  }//loop
 
void sur_func(){if(sur>3){sur=0;}if(sur<0){sur=3;}}
void gain_func(){if(gain0<0){gain0=0;}if(gain0>7){gain0=7;}}
void bass_func(){if(bass>7){bass=7;}if(bass<-7){bass=-7;}} 
void treb_func(){if(treb>7){treb=7;}if(treb<-7){treb=-7;}}
void vol_func(){if(vol<-87){vol=-87;}if(vol>0){vol=0;}}
void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(100);}
void to_Timer(){newPosition = myEnc.read()/4;}  
 
void audio(){
    bd.setSelect(in);// int 0...7 === A B C D E F INPUT_SHORT INPUT_MUTE
    bd.setIn_gain(gain0); // int 0...7 === 0...14 dB    
    bd.setVol_1(abs(vol)); // int 0...87 === 0...-87 dB
    bd.setVol_2(abs(vol)); // int 0...87 === 0...-87 dB
    bd.setBass(bass); // int -7...0...+7 === -7...+7 dB
    bd.setTreb(treb); // int -7...0...+7 === -7...+7 dB
    bd.setSurround(sur); // int 0...3 === OFF LOW MIDDLE HIGH
  }

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=89

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

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