На базе 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