Регулятор громкости и тембра на BD37033FV + 0.96′ I2C 128X64 OLED (Arduino)

На базе Arduino и аудиопроцессоре BD37033FV можно собрать довольно качественный регулятор тембра и громкости. В качестве органов управления регулятором тембра и громкости применены кнопки, энкодер и ИК пульт.

Аудиопроцессор BD37033FV имеет несколько входов и выходов, в данном случае будет использовано только три стерео входа и шесть выходов (ПК ЛК фронт, ПК ЛК тыл, два выхода сабвуфера).

Ранее в статье рассматривался пример создания на основе аудиопроцессора BD37033FV регулятора громкости и тембра с использованием дисплея LCD1602 + I2C, в этой статье аналогичный пример, но с использованием дисплея 0.96′ I2C 128X64 OLED.

В OLED дисплее отсутствует дополнительный слой подсветки всей поверхности экрана. Каждый пиксель, формирующий изображение, испускает самостоятельное свечение. При этом картинка получается яркой и более контрастной.

Управление OLED дисплеем в данном примере осуществляется при помощи шины I2C.

Параметры дисплея SSD1306:

  • Технология дисплея: OLED
  • Разрешение дисплея: 128 на 64 точки
  • Диагональ дисплея: 0,96 дюйма
  • Угол обзора: 160°
  • Напряжение питания: 2.8 В ~ 5.5 В
  • Мощность: 0,08 Вт
  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм

Регулятор тембра и громкости на BD37033FV имеет следующие характеристики:

  • Напряжение питания от 7.0 до 9.5  В
  • Ток потребления  31 мА
  • КНИ 0,002% (VOUT=1Vrms BW=400-30KHz)
  • Выходное напряжение шума 5,5 µVrms
  • Перекрестные помехи между каналами -100 дБ
  • Входное сопротивление 100 кОм
  • Максимальное входное напряжение 2,1 Vrms
  • Перекрестные помехи между селекторами -100 дБ
  • Входной предварительный усилитель (независимый для каждого входа) 0…16 дБ
  • Диапазон регулировки громкости от -79 до +15 дБ
  • Режим MUTE — 100 дБ
  • Регулировка тембра по ВЧ СЧ и НЧ -15…+15 дБ, регулируемые частотные полосы и скважность
  • Тонкомпенсация 0…15 дБ, регулируемые частотные полосы
  • ФНЧ сабвуфера — регулируемые частотные полосы
  • Независимый для каждого выхода аттенюатор -79…15 дБ
  • Управление:
    • Энкодер — регулировка всех основных параметров
    • Кнопки — MUTE, MENU_SET, INPUT
    • ИК пульт — Работает только в основном меню (регулировка громкости, тембра и переключение входов)

Основное меню

В основное меню собраны основные параметры такие как громкость, тембр (ВЧ, СЧ, НЧ), выбор входа и регулировка предусилителя входа (независимый для каждого входа). Выбор параметра осуществляется при помощи кнопки энкодера, а изменение параметра при помощи поворота ручки энкодера, дополнительно для управления аудиопроцессором используются кнопки выбора входа, активация режима MUTE и переключения с основного меню на вспомогательное (и наоборот). В основном меню так же все параметры можно изменить при помощи ИК пульта.

Второе  меню

Во втором меню находятся редко изменяемые параметры, в нем ИК пульт недоступен. Для перехода во второе меню нужно нажать кнопку MENU_SET, выбор параметра меню осуществляется при помощи кнопки энкодера, а изменение параметра при помощи поворота ручки энкодера и кнопки INPUT (кнопка отвечает за изменение дополнительно параметра пункта меню).

#define IR2    0x33B820DF // button encoder
#define IR3    0x33B8946B // mute
#define IR4    0x33B810EF // >>>
#define IR5    0x33B8E01F // <<<
#define IR6    0x33B844BB // INPUT
 
#include <Wire.h>              
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <OLED_I2C.h>          // http://rcl-radio.ru/wp-content/uploads/2022/01/OLED_I2C.zip
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <EEPROM.h>
#include <BD37033FV.h>         // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=134&download=1
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
 
  OLED  myOLED(SDA, SCL, 8);
  extern uint8_t SmallFont[],BigNumbers[];
  BD37033FV tda; 
  Encoder myEnc(9, 8);// DT, CLK
  IRrecv irrecv(12); // указываем вывод модуля IR приемника
  decode_results ir; 
 
long times,oldPosition  = -999,newPosition;
int vol_reg,bass_reg,mid_reg,treb_reg,menu,menu2=100,in_reg,gain0,gain1,gain2,gain3,lon_f,lon,lon_d;
int out,vol_out,rf,lf,rt,lt,sab1,sab2,treb_c,mid_c,bas_c,sab_f,treb_q,mid_q,bas_q,faza;
byte mute_reg,power,gr1,gr2,w,w2,www;
 
void setup(){
  Wire.begin();Wire.setClock(400000L);
  irrecv.enableIRIn();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  myOLED.begin();
  myOLED.setBrightness(100);
  Serial.begin(9600);
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("Sound Processors"), CENTER, 10);
  myOLED.print(F("BD37033FV"), CENTER, 30);
  myOLED.update();
  pinMode(10,INPUT);        // encoder SW
  pinMode(7,INPUT_PULLUP);  // mute button
  pinMode(6,INPUT_PULLUP);  // input button 
  pinMode(5,INPUT_PULLUP);  // menu2 button 
  delay(2000);
  vol_reg = EEPROM.read(0)-79;treb_reg = EEPROM.read(1)-15;mid_reg = EEPROM.read(2)-15;bass_reg = EEPROM.read(3)-15;in_reg = EEPROM.read(4);
  gain1 = EEPROM.read(5);gain2 = EEPROM.read(6);gain3 = EEPROM.read(7);lon = EEPROM.read(8);lon_f = EEPROM.read(9);
  rf = EEPROM.read(10)-79;lf = EEPROM.read(11)-79;rt = EEPROM.read(12)-79;lt = EEPROM.read(13)-79;sab1 = EEPROM.read(14)-79;sab2 = EEPROM.read(24)-79;
  treb_c = EEPROM.read(15);mid_c = EEPROM.read(16);bas_c = EEPROM.read(17);sab_f = EEPROM.read(18);
  treb_q = EEPROM.read(19);mid_q = EEPROM.read(20);bas_q = EEPROM.read(21);faza = EEPROM.read(22);
    switch(in_reg){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
  audio();
  }
 
void loop(){
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта     
 
//////// BUTTON /////////////////////////////////////////////////////////////////////////////////////////////////////////////
 if(mute_reg==0){
   if(digitalRead(5)==LOW&&menu2==100){menu2=0;menu=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;
     myOLED.clrScr();myOLED.setFont(SmallFont);myOLED.print(F("SECOND MENU"), CENTER, 25);myOLED.update();delay(2000);}
   if(digitalRead(5)==LOW&&menu==100){menu=0;menu2=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;
     myOLED.clrScr();myOLED.setFont(SmallFont);myOLED.print(F("MAIN MENU"), CENTER, 25);myOLED.update();delay(2000);}
 
   if((digitalRead(10)==LOW||ir.value==IR2)&&menu2==100){menu++;gr1=0;gr2=0;cl();delay(200);times=millis();w=1;w2=1;if(menu>3){menu=0;}}
   if((digitalRead(6)==LOW||ir.value==IR6)&&menu2==100){in_reg++;menu=4;cl();times=millis();w=1;w2=1;www=1;if(in_reg>2){in_reg=0;}}
 
   if((digitalRead(10)==LOW||ir.value==IR2)&&menu==100){menu2++;gr1=0;gr2=0;cl();delay(200);times=millis();w=1;w2=1;if(menu2>5){menu2=0;}}
 }
   if((digitalRead(7)==LOW||ir.value==IR3)&&mute_reg==0){mute_reg=1;menu2=100;menu=100;cl();delay(200);audio();
       myOLED.clrScr();myOLED.setFont(SmallFont);myOLED.print(F("MUTE"), CENTER, 25);myOLED.update();}
   if((digitalRead(7)==LOW||ir.value==IR3)&&mute_reg==1){mute_reg=0;w=1;menu=0;cl();delay(200);audio();}
 
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  vol_reg=vol_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();}
 
   if(ir.value==IR4){vol_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol_reg++;gr2=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
   if(ir.value==IR5){vol_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol_reg--;gr1=0;cl();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("VOLUME"), LEFT, 0);myOLED.setFont(BigNumbers);myOLED.printNumI(vol_reg, 65, 0);
  myOLED.setFont(SmallFont);myOLED.print(F("dB"), RIGHT, 20);
  myOLED.setFont(SmallFont);myOLED.print(F("IN"), LEFT, 10);
  myOLED.printNumI(in_reg+1, 20, 10);myOLED.print(F("GAIN"), LEFT, 20);myOLED.printNumI(gain0, 30, 20);
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("TREBLE"), LEFT, 35);myOLED.printNumI(treb_reg, 70, 35);myOLED.print(F("dB"), RIGHT, 35);
  myOLED.setFont(SmallFont);myOLED.print(F("MIDDLE"), LEFT, 45);myOLED.printNumI(mid_reg, 70, 45);myOLED.print(F("dB"), RIGHT, 45);
  myOLED.setFont(SmallFont);myOLED.print(F("BASS"), LEFT, 55);myOLED.printNumI(bass_reg, 70, 55);myOLED.print(F("dB"), RIGHT, 55);
  myOLED.update();
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
 
//////// TREBLE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==1){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  treb_reg=treb_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();}
 
   if(ir.value==IR4){treb_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
   if(ir.value==IR5){treb_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("TREBLE"), LEFT, 0);;myOLED.setFont(BigNumbers);myOLED.printNumI(treb_reg, 65, 0);
  myOLED.setFont(SmallFont);myOLED.print(F("dB"), RIGHT, 0);
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("MIDDLE"), LEFT, 35);myOLED.printNumI(mid_reg, 70, 35);myOLED.print(F("dB"), RIGHT, 35);
  myOLED.setFont(SmallFont);myOLED.print(F("BASS"), LEFT, 45);myOLED.printNumI(bass_reg, 70, 45);myOLED.print(F("dB"), RIGHT, 45);
  myOLED.setFont(SmallFont);myOLED.print(F("VOLUME"), LEFT, 55);myOLED.printNumI(vol_reg, 70, 55);myOLED.print(F("dB"), RIGHT, 55);
  myOLED.update();
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
//////// MIDDLE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==2){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  mid_reg=mid_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;mid_func();audio();}
 
   if(ir.value==IR4){mid_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;mid_func();audio();}// кнопка > 
   if(ir.value==IR5){mid_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;mid_func();audio();}// кнопка <
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("MIDDLE"), LEFT, 0);;myOLED.setFont(BigNumbers);myOLED.printNumI(mid_reg, 65, 0);
  myOLED.setFont(SmallFont);myOLED.print(F("dB"), RIGHT, 0);
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("BASS"), LEFT, 35);myOLED.printNumI(bass_reg, 70, 35);myOLED.print(F("dB"), RIGHT, 35);
  myOLED.setFont(SmallFont);myOLED.print(F("VOLUME"), LEFT, 45);myOLED.printNumI(vol_reg, 70, 45);myOLED.print(F("dB"), RIGHT, 45);
  myOLED.setFont(SmallFont);myOLED.print(F("TREBLE"), LEFT, 55);myOLED.printNumI(treb_reg, 70, 55);myOLED.print(F("dB"), RIGHT, 55);
  myOLED.update();
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
//////// BASS //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==3){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
  bass_reg=bass_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();}
 
   if(ir.value==IR4){bass_reg++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
   if(ir.value==IR5){bass_reg--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("BASS"), LEFT, 0);;myOLED.setFont(BigNumbers);myOLED.printNumI(bass_reg, 65, 0);
  myOLED.setFont(SmallFont);myOLED.print(F("dB"), RIGHT, 0);
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("VOLUME"), LEFT, 35);myOLED.printNumI(vol_reg, 70, 35);myOLED.print(F("dB"), RIGHT, 35);
  myOLED.setFont(SmallFont);myOLED.print(F("TREBLE"), LEFT, 45);myOLED.printNumI(treb_reg, 70, 45);myOLED.print(F("dB"), RIGHT, 45);
  myOLED.setFont(SmallFont);myOLED.print(F("MIDDLE"), LEFT, 55);myOLED.printNumI(mid_reg, 70, 55);myOLED.print(F("dB"), RIGHT, 55);
  myOLED.update();
  }}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
////////////// INPUT GAIN ///////////////////////////////////////////////////////////////////
 if(menu==4){
  switch(in_reg){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
 
  if (newPosition != oldPosition){oldPosition = newPosition;gain0=gain0+newPosition;myEnc.write(0);newPosition=0;times=millis();www=1;w=1;w2=1;gain_func();}
 
   if(ir.value==IR4){gain0++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;gain_func();audio();}// кнопка > 
   if(ir.value==IR5){gain0--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;gain_func();audio();}// кнопка <
 
  switch(in_reg){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     }  
  if(www==1){audio();www=0;}
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("INPUT"), LEFT, 0);myOLED.setFont(BigNumbers);myOLED.printNumI(in_reg+1, 65, 0);
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("GAIN"), LEFT, 35);myOLED.setFont(BigNumbers);myOLED.printNumI(gain0, 65, 35);
  myOLED.setFont(SmallFont);myOLED.print(F("dB"), RIGHT, 35);
  myOLED.update();
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// SECOND MENU /////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
 
///////////////// loudness /////////////////////////////////////////////////////////////
 if(menu2==0){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   lon=lon+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;if(lon<0){lon=0;}if(lon>15){lon=15;}audio();}
 
  if(digitalRead(6)==LOW){lon_f++;cl();delay(200);times=millis();w=1;w2=1;if(lon_f<0){lon_f=3;}if(lon_f>3){lon_f=0;}audio();}// button IN
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("LOUDNESS"), CENTER, 0);
  myOLED.drawLine(0, 15, 128, 15);
  myOLED.print(F("FREQUENCY"), LEFT, 25);
  switch(lon_f){
         case 0: myOLED.print(F("400 "), 70, 25);break;
         case 1: myOLED.print(F("800 "), 70, 25);break;
         case 2: myOLED.print(F("2400"), 70, 25);break;
         case 3: myOLED.print(F("FLAT"), 70, 25);break;
         }
  if(lon_f<3){myOLED.print(F("Hz"), 100, 25);}
    else{myOLED.print(F("  "), 100, 25);}
  myOLED.print(F("GAIN"), LEFT, 40);
  myOLED.printNumI(lon, 70, 40);myOLED.print(F("dB"), 100, 40);
  myOLED.update();
  }}
////////////////////////////////////////////////////////////////////////////////////////
 
////////////// OUTPUT GAIN ///////////////////////////////////////////////////////////////////
 if(menu2==1){
 
  if(digitalRead(6)==LOW){out++;cl();delay(200);times=millis();w=1;w2=1;if(out>5){out=0;}www=1;}// button IN
 
  switch(out){
          case 0:vol_out=rf;break;
          case 1:vol_out=lf;break;
          case 2:vol_out=rt;break;
          case 3:vol_out=lt;break;
          case 4:vol_out=sab1;break;
          case 5:vol_out=sab2;break;
          }
 
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   vol_out=vol_out+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_out_func();audio();}
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("OUTPUT ATT"), CENTER, 0);
  myOLED.drawLine(0, 15, 128, 15);
 
   switch(out){
     case 0:rf=vol_out; myOLED.print(F("FRONT R"), LEFT, 25);myOLED.printNumI(rf, 70, 25);break;
     case 1:lf=vol_out; myOLED.print(F("FRONT L"), LEFT, 25);myOLED.printNumI(lf, 70, 25);break;
     case 2:rt=vol_out; myOLED.print(F("REAR R "), LEFT, 25);myOLED.printNumI(rt, 70, 25);break;
     case 3:lt=vol_out; myOLED.print(F("REAR L "), LEFT, 25);myOLED.printNumI(lt, 70, 25);break;
     case 4:sab1=vol_out; myOLED.print(F("SUB_1 "), LEFT, 25);myOLED.printNumI(sab1, 70, 25);break;
     case 5:sab2=vol_out; myOLED.print(F("SUB_2 "), LEFT, 25);myOLED.printNumI(sab2, 70, 25);break;
   }
  myOLED.print(F("dB"), 100, 25);
  myOLED.update();
  if(www==1){audio();www=0;}
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
///////////////// TREBLE SETUP /////////////////////////////////////////////////////////////
 if(menu2==2){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   treb_c=treb_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_c_func();audio();}
 
  if(digitalRead(6)==LOW){treb_q++;cl();delay(200);times=millis();w=1;w2=1;treb_q_func();audio();}// button IN
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("TREBLE SETUP"), CENTER, 0);
  myOLED.drawLine(0, 15, 128, 15);
  myOLED.print(F("FREQUENCY"), LEFT, 25);
    switch(treb_c){
         case 0: myOLED.print(F("7.5 "), 70, 25);break;
         case 1: myOLED.print(F("10.0"), 70, 25);break;
         case 2: myOLED.print(F("12.5"), 70, 25);break;
         case 3: myOLED.print(F("15.0"), 70, 25);break;
         }
  myOLED.print(F("kHz"), 100, 25);       
  myOLED.print(F("TREBLE Q"), LEFT, 40);
    switch(treb_q){
         case 0: myOLED.print(F("0.75"), 70, 40);break;
         case 1: myOLED.print(F("1.25"), 70, 40);break;
         }
  myOLED.update();
  }}
////////////////////////////////////////////////////////////////////////////////////////
 
///////////////// MIDDLE SETUP /////////////////////////////////////////////////////////////
 if(menu2==3){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   mid_c=mid_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;mid_c_func();audio();}
 
  if(digitalRead(6)==LOW){mid_q++;cl();delay(200);times=millis();w=1;w2=1;mid_q_func();audio();}// button IN
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("MIDDLE SETUP"), CENTER, 0);
  myOLED.drawLine(0, 15, 128, 15);
  myOLED.print(F("FREQUENCY"), LEFT, 25);
    switch(mid_c){
         case 0: myOLED.print(F("0.5"), 70, 25);break;
         case 1: myOLED.print(F("1.0"), 70, 25);break;
         case 2: myOLED.print(F("1.5"), 70, 25);break;
         case 3: myOLED.print(F("2.5"), 70, 25);break;
         }
  myOLED.print(F("kHz"), 100, 25);       
  myOLED.print(F("MIDDLE Q"), LEFT, 40);
    switch(mid_q){
         case 0: myOLED.print(F("0.75"), 70, 40);break;
         case 1: myOLED.print(F("1.00"), 70, 40);break;
         case 2: myOLED.print(F("1.25"), 70, 40);break;
         case 3: myOLED.print(F("1.50"), 70, 40);break;         
         }
  myOLED.update();
  }}
////////////////////////////////////////////////////////////////////////////////////////
 
///////////////// BASS SETUP /////////////////////////////////////////////////////////////
 if(menu2==4){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   bas_c=bas_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bas_c_func();audio();}
 
  if(digitalRead(6)==LOW){bas_q++;cl();delay(200);times=millis();w=1;w2=1;bas_q_func();audio();}// button IN
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("BASS SETUP"), CENTER, 0);
  myOLED.drawLine(0, 15, 128, 15);
  myOLED.print(F("FREQUENCY"), LEFT, 25);
    switch(bas_c){
         case 0: myOLED.print(F("60 "), 70, 25);break;
         case 1: myOLED.print(F("80 "), 70, 25);break;
         case 2: myOLED.print(F("100"), 70, 25);break;
         case 3: myOLED.print(F("120"), 70, 25);break;
         }
  myOLED.print(F("Hz"), 100, 25);       
  myOLED.print(F("BASS Q"), LEFT, 40);
    switch(bas_q){
         case 0: myOLED.print(F("0.75"), 70, 40);break;
         case 1: myOLED.print(F("1.00"), 70, 40);break;
         case 2: myOLED.print(F("1.25"), 70, 40);break;
         case 3: myOLED.print(F("1.50"), 70, 40);break;         
         }
  myOLED.update();
  }}
////////////////////////////////////////////////////////////////////////////////////////  
 
///////////////// SUBWOOFER SETUP /////////////////////////////////////////////////////////////
 if(menu2==5){
  if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   sab_f=sab_f+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;sab_f_func();audio();}
 
  if(digitalRead(6)==LOW){faza++;cl();delay(200);times=millis();w=1;w2=1;faza_func();audio();}// button IN
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("SUBWOOFER SETUP"), CENTER, 0);
  myOLED.drawLine(0, 15, 128, 15);
  myOLED.print(F("FREQUENCY"), LEFT, 25);
    switch(sab_f){
         case 0: myOLED.print(F("FLAT"), 70, 25);break;
         case 1: myOLED.print(F("55  "), 70, 25);break;
         case 2: myOLED.print(F("85  "), 70, 25);break;
         case 3: myOLED.print(F("120 "), 70, 25);break;
         case 4: myOLED.print(F("160 "), 70, 25);break;
         }
  if(sab_f>0){myOLED.print(F("Hz"), 100, 25);}
    else{myOLED.print(F("  "), 100, 25);}      
  myOLED.print(F("LPF PHASE"), LEFT, 40);
    switch(faza){
         case 0: myOLED.print(F("0  "), 70, 40);break;
         case 1: myOLED.print(F("180"), 70, 40);break;       
         }
  myOLED.update();
  }}
//////////////////////////////////////////////////////////////////////////////////////// 
 
////////////////// EEPROM //////////////////////////////////////////////////////////////
 if(millis()-times>50000 && w2==1 && mute_reg==0 && power==0){
     EEPROM.update(0,vol_reg+79);EEPROM.update(1,treb_reg+15);EEPROM.update(2,mid_reg+15);EEPROM.update(3,bass_reg+15);EEPROM.update(4,in_reg);
     EEPROM.update(5,gain1);EEPROM.update(6,gain2);EEPROM.update(7,gain3);EEPROM.update(8,lon);EEPROM.update(9,lon_f);
     EEPROM.update(10,rf+79);EEPROM.update(11,lf+79);EEPROM.update(12,rt+79);EEPROM.update(13,lt+79);EEPROM.update(14,sab1+79);EEPROM.update(24,sab2+79);
     EEPROM.update(15,treb_c);EEPROM.update(16,mid_c);EEPROM.update(17,bas_c);EEPROM.update(18,sab_f);EEPROM.update(19,treb_q);
     EEPROM.update(20,mid_q);EEPROM.update(21,bas_q);EEPROM.update(22,faza);
     if(menu!=0){menu=0;}menu2=100;w=1;w2=0;}     
  }// end loop 
 
void cl(){myOLED.clrScr();ir.value=0;delay(300);}
void to_Timer(){newPosition = myEnc.read()/4;} 
void vol_func(){if(vol_reg<-79){vol_reg=-79;}if(vol_reg>15){vol_reg=15;}}
void treb_func(){if(treb_reg>15){treb_reg=15;}if(treb_reg<-15){treb_reg=-15;}}
void mid_func(){if(mid_reg>15){mid_reg=15;}if(mid_reg<-15){mid_reg=-15;}}
void bass_func(){if(bass_reg>15){bass_reg=15;}if(bass_reg<-15){bass_reg=-15;}}
void gain_func(){if(gain0<0){gain0=0;}if(gain0>16){gain0=16;}}
void vol_out_func(){if(vol_out>15){vol_out=15;}if(vol_out<-79){vol_out=-79;}}
void treb_c_func(){if(treb_c>3){treb_c=0;}if(treb_c<0){treb_c=3;}}
void treb_q_func(){if(treb_q>1){treb_q=0;}if(treb_q<0){treb_q=1;}}
void mid_c_func(){if(mid_c>3){mid_c=0;}if(mid_c<0){mid_c=3;}}
void mid_q_func(){if(mid_q>3){mid_q=0;}if(mid_q<0){mid_q=3;}}
void bas_c_func(){if(bas_c>3){bas_c=0;}if(bas_c<0){bas_c=3;}}
void bas_q_func(){if(bas_q>3){bas_q=0;}if(bas_q<0){bas_q=3;}}
void faza_func(){if(faza>1){faza=0;}if(faza<0){faza=1;}}
void sab_f_func(){if(sab_f>4){sab_f=0;}if(sab_f<0){sab_f=4;}}
 
void audio(){
        tda.setInitial();
        tda.setSub_setup(sab_f,3,faza); // off 55hz 85hz 120hz 160hz pass = int sub_f(0...5) || LPF front rear sub = int sub_out(0...3) 0 - default || 0 180 = int faza(0...1)
        tda.setLoud_f(3,lon_f,1,1); // mix_in 0...3 (3=OFF) || 400hz 800hz 2400hz Prohibition = int loud_f(0...3) || MIXING 1ch 2ch -- on off = mix_ch1(0...1) mix_ch2 (0..1)
        tda.setIn(in_reg); // in1 in2 in3 = int in_reg(0...2)
        tda.setIn_gain(gain0,mute_reg); // 0...16 dB = int in_gain(0...16) || off on = int mute(0...1)
        tda.setVol(vol_reg); // -79...+15 dB = int vol(-79...15)
        tda.setFront_1(rf); // -79...+15 dB = int -79...15
        tda.setFront_2(lf); // -79...+15 dB = int -79...15
        tda.setRear_1(rt); // -79...+15 dB = int -79...15
        tda.setRear_2(lt); // -79...+15 dB = int -79...15
        tda.setSub1(sab1); // -79...+15 dB = int -79...15
        tda.setSub2(sab2); // -79...+15 dB = int -79...15
        tda.setBass_setup(bas_q,bas_c); // 0.5 1.0 1.5 2.0 --- int 0...3, 60Hz 80Hz 100Hz 120Hz --- int 0...3
        tda.setMiddle_setup(mid_q,mid_c); // 0.75 1.0 1.25 1.5 --- int 0...3, 500Hz 1kHz 1.5kHz 2.5kHz --- int 0...3
        tda.setTreble_setup(treb_q,treb_c); // 0.75 1.25  --- int 0...1, 7.5kHz 10kHz 12.5kHz 15kHz --- int 0...3
        tda.setBass_gain(bass_reg); // --15 ... +15 dB = int -15 ... 15 
        tda.setMiddle_gain(mid_reg); // --15 ... +15 dB = int -15 ... 15
        tda.setTreble_gain(treb_reg); // --15 ... +15 dB = int -15 ... 15
        tda.setLoudness_gain(lon); // 0 ... 15 dB = int 0 ... 15 
  }

Для управления регулятором подойдет практически любой пульт ИК, для поддержки Вашего пульта необходимо прописать коды кнопок в скетч:

#define IR2 0x33B820DF // button encoder
#define IR3 0x33B8946B // mute
#define IR4 0x33B810EF // >>>
#define IR5 0x33B8E01F // <<<
#define IR6 0x33B844BB // INPUT

Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.

Даташит — BD37033FV

Плата — http://forum.rcl-radio.ru/viewtopic.php?pid=5702#p5702

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

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