ИМС PT2319 представляет собой аудиопроцессор специально разработанный для регулирования параметров аудиосигнала с минимальными искажениями. Аудиопроцессор включает в себя регулятор громкости, тембра, коммутатор входов и предусилители входа и выхода.
Более подробно об аудиопроцессоре можно узнать из статьи Аудиопроцессор PT2319 (Arduino).
Регулятор громкости и тембра построен на базе Arduino Nano.
Основные параметры регулятора громкости и тембра на PT2319:
- Регулировка громкости от 0 до 80 ед. (-80 дБ … 0 дБ с шагом 1 дБ)
- Регулировка тембра (BASS, TREBLE) от 0 до 14 ед. (±11.9 дБ)
- Регулировка SUPER BASS от 0 до 11 ед. (0 дБ … +20 дБ)
- 5-и канальный коммутатор входов
- Усилитель выхода 3 позиции: 0 дБ, +6.5 дБ, +8.5 дБ
- Предусилитель входа, с независимой регулировкой для каждого входа, диапазон регулировки от 0 дБ …+18.75 дБ с шагом 1.25 дБ
- Аттенюатор REAR (тыл) 0 дБ … -60 дБ
- 4-х канальный выход (FRONT, REAR)
- Напряжение питания аудиопроцессора 5…10 В (9 В — рекомендуемое)
- Ток потребления аудиопроцессора 15 мА
- Разделение каналов 110 дБ
- Отношение сигнал.шум 100 дБ
- Уровень MUTE -100 дБ
- КНИ не более 0,003% при выходном напряжении 1 Vrms
- Управление: 3 кнопки (INPUT, MENU, MUTE), энкодер
- ИК управление полностью дублирующее кнопки и энкодер
Регулятор громкости содержит два основных блока, первый блок микроконтроллерный (Arduino Nano) с органами управления и индикации, второй блок плата аудиопроцессора.
Основное управление параметрами аудиопроцессора будет осуществляться при помощи энкодера (KY-040) и 3-х кнопок, так же будет применен ИК пульт который будет дублировать энкодер и кнопки управления. Вся информация будет выводится на дисплей LCD1602 + I2C (I2C модуль на базе микросхем PCF8574 позволяют подключить символьный дисплей 1602 к плате Arduino всего по двум проводам SDA и SCL (А4 и А5), что дает возможность не использовать цифровые выходы Arduino при подключении дисплея.)
Регулятор тембра имеет два меню, первое основное (main menu), содержит регуляторы громкости и тембра, второе меню (setting menu), содержит редко изменяемые параметры, такие как аттенюаторы и предусилители.
Схема регулятора громкости и тембра
Блок микроконтроллера
Плата аудиопроцессора
#define CE 2 #define DI 3 #define CL 4 #define IR1 0x2FDF00F // main/setting menu #define IR2 0x2FDB24D // button encoder #define IR3 0x2FDB04F // mute #define IR4 0x2FD906F // >>> #define IR5 0x2FDF20D // <<< #define IR6 0x2FD6A95 // INPUT #include <Wire.h> #include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1 #include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip #include <EEPROM.h> #include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip #include <boarddefs.h> // входит в состав библиотеки IRremote #include <IRremote.h> // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей Encoder myEnc(8, 9);// DT, CLK IRrecv irrecv(12); // указываем вывод модуля IR приемника decode_results ir; byte fader_m[16]={0b1111,0b0111,0b1011,0b0011,0b1101,0b0101,0b1001,0b0001,0b1110,0b0110,0b1010,0b0010,0b1100,0b0100,0b1000,0b0000}; byte sup_bass_m[11]={0b0000,0b1000,0b0100,0b1100,0b0010,0b1010,0b0110,0b1110,0b0001,0b1001,0b0101}; byte tembr_m[15]={0b1111,0b0111,0b1011,0b0011,0b1101,0b0101,0b1001,0b0000,0b1000,0b0100,0b1100,0b0010,0b1010,0b0110,0b1110}; byte in_gain_m[16]={0b0000,0b1000,0b0100,0b1100,0b0010,0b1010,0b0110,0b1110,0b0001,0b1001,0b0101,0b1101,0b0011,0b1011,0b0111,0b1111}; byte vol_m[81]={0b00100101,0b11000101,0b01000101,0b10000101,0b00111001,0b11011001,0b01011001,0b10011001,0b00101001, 0b11001001,0b01001001,0b10001001,0b00110001,0b11010001,0b01010001,0b10010001,0b00100001,0b11000001, 0b01000001,0b10000001,0b00111110,0b11011110,0b01011110,0b10011110,0b00101110,0b11001110,0b01001110, 0b10001110,0b00110110,0b11010110,0b01010110,0b10010110,0b00100110,0b11000110,0b01000110,0b10000110, 0b00111010,0b11011010,0b01011010,0b10011010,0b00101010,0b11001010,0b01001010,0b10001010,0b00110010, 0b11010010,0b01010010,0b10010010,0b00100010,0b11000010,0b01000010,0b10000010,0b00111100,0b11011100, 0b01011100,0b10011100,0b00101100,0b11001100,0b01001100,0b10001100,0b00110100,0b11010100,0b01010100, 0b10010100,0b00100100,0b11000100,0b01000100,0b10000100,0b00111000,0b11011000,0b01011000,0b10011000, 0b00101000,0b11001000,0b01001000,0b10001000,0b00110000,0b11010000,0b01010000,0b10010000,0b00000000}; byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111}; byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000}; byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111}; byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111}; byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100}; byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100}; byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111}; byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000}; int menu0=100,menu,vol_reg,in_reg,treb_reg,bass_reg,super_bass_reg,gain0,gain1,gain2,gain3,gain4,gain5,out_gain_reg,att_rear,mute_reg; byte a[6],d1,d2,d3,d4,d5,d6,e1,e2,e3,w,w2,x,www,gr1,gr2; unsigned long times,oldPosition = -999,newPosition; void setup() { irrecv.enableIRIn();lcd.init();lcd.backlight(); lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4); lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8); pinMode(CE,OUTPUT);pinMode(DI,OUTPUT);pinMode(CL,OUTPUT); pinMode(10,INPUT);// encoder SW pinMode(11,INPUT_PULLUP);// input button pinMode(A0,INPUT_PULLUP);// menu set/main button pinMode(A1,INPUT_PULLUP);// mute button digitalWrite(CL,LOW);digitalWrite(CE,LOW);digitalWrite(DI,LOW); MsTimer2::set(1, to_Timer);MsTimer2::start(); if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении Serial.begin(9600); Write(0,0,0,0,0,0,0,0,0,0,0);delay(100);// clear register vol_reg = EEPROM.read(0);treb_reg = EEPROM.read(1);bass_reg = EEPROM.read(2);super_bass_reg = EEPROM.read(3); gain1 = EEPROM.read(4);gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);gain4 = EEPROM.read(7);gain5 = EEPROM.read(8); in_reg = EEPROM.read(9);out_gain_reg = EEPROM.read(10);out_gain_reg = EEPROM.read(10);att_rear = EEPROM.read(11); audio(); } void loop() { /// IR if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта /// BUTTON if((digitalRead(10)==LOW||ir.value==IR2)&&menu0==100){menu++;menu0=100;cl();times=millis();w=1;if(menu>3){menu=0;}} if((digitalRead(10)==LOW||ir.value==IR2)&&menu==100){menu0++;menu=100;cl();times=millis();w=1;if(menu0>2){menu0=0;}} if((digitalRead(11)==LOW||ir.value==IR6)){in_reg++;cl();times=millis();w=1;if(in_reg>5){in_reg=1;}audio();lcd.setCursor(4,0);lcd.print("INPUT ");lcd.print(in_reg);delay(1000);cl();} if((digitalRead(A0)==LOW||ir.value==IR1)&&menu<100){menu=100;menu0=0;gr1=0;gr2=0;cl();times=millis();w=1;lcd.setCursor(2,0);lcd.print("SETTING MENU");delay(1000);cl();} if((digitalRead(A0)==LOW||ir.value==IR1)&&menu0<100){menu0=100;menu=0;gr1=0;gr2=0;cl();times=millis();w=1;lcd.setCursor(3,0);lcd.print("MAIN MENU");delay(1000);cl();} if((digitalRead(A1)==LOW||ir.value==IR3)&&mute_reg==0){mute_reg=1;menu0=100;menu=0;cl();audio();} if((digitalRead(A1)==LOW||ir.value==IR3)&&mute_reg==1){mute_reg=0;menu0=100;menu=0;cl();audio();} ////////////// VOLUME /////////////////////////////////////////////////////////////////// if(menu==0){ if(ir.value==IR4){vol_reg++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка > if(ir.value==0xFFFFFFFF and gr1==1){vol_reg++;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>> if(ir.value==IR5){vol_reg--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка < if(ir.value==0xFFFFFFFF and gr2==1){vol_reg--;gr1=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition){oldPosition = newPosition;vol_reg=vol_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();} a[0]= vol_reg/10;a[1]=vol_reg%10; for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();} if(mute_reg==0){lcd.setCursor(0,0);lcd.print("VOLUME");}else{lcd.setCursor(0,0);lcd.print("MUTE");} lcd.setCursor(0,1);lcd.print("INPUT ");lcd.print(in_reg); } ////////////// TREBLE /////////////////////////////////////////////////////////////////// if(menu==1){ if(ir.value==IR4){treb_reg++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка > if(ir.value==0xFFFFFFFF and gr1==1){treb_reg++;gr2=0;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >>>>>> if(ir.value==IR5){treb_reg--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка < if(ir.value==0xFFFFFFFF and gr2==1){treb_reg--;gr1=0;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition){oldPosition = newPosition;treb_reg=treb_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func(); audio();} a[0]= treb_reg/10;a[1]=treb_reg%10; for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();} lcd.setCursor(0,0);lcd.print("TREBLE");lcd.setCursor(0,1);lcd.print("CONTROL"); } ////////////// BASS /////////////////////////////////////////////////////////////////// if(menu==2){ if(ir.value==IR4){bass_reg++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка > if(ir.value==0xFFFFFFFF and gr1==1){bass_reg++;gr2=0;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >>>>>> if(ir.value==IR5){bass_reg--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка < if(ir.value==0xFFFFFFFF and gr2==1){bass_reg--;gr1=0;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition){oldPosition = newPosition;bass_reg=bass_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();} a[0]= bass_reg/10;a[1]=bass_reg%10; for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();} lcd.setCursor(0,0);lcd.print("BASS");lcd.setCursor(0,1);lcd.print("CONTROL"); } ////////////// SUPER BASS /////////////////////////////////////////////////////////////////// if(menu==3){ if(ir.value==IR4){super_bass_reg++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;super_bass_func();audio();}// кнопка > if(ir.value==0xFFFFFFFF and gr1==1){super_bass_reg++;gr2=0;cl1();times=millis();w=1;w2=1;super_bass_func();audio();}// кнопка >>>>>> if(ir.value==IR5){super_bass_reg--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;super_bass_func();audio();}// кнопка < if(ir.value==0xFFFFFFFF and gr2==1){super_bass_reg--;gr1=0;cl1();times=millis();w=1;w2=1;super_bass_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition){oldPosition = newPosition;super_bass_reg=super_bass_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;super_bass_func();audio();} a[0]= super_bass_reg/10;a[1]=super_bass_reg%10; for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();} lcd.setCursor(0,0);lcd.print("SUPER BASS");lcd.setCursor(0,1);lcd.print("CONTROL"); } ////// MENU SET /////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////// INPUT GAIN /////////////////////////////////////////////////////////////////// if(menu0==0){ switch(in_reg){ case 1: gain0 = gain1;break; case 2: gain0 = gain2;break; case 3: gain0 = gain3;break; case 4: gain0 = gain4;break; case 5: gain0 = gain5;break;} if(ir.value==IR4){gain0++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;gain_func();audio();}// кнопка > if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();times=millis();w=1;w2=1;gain_func();audio();}// кнопка >>>>>> if(ir.value==IR5){gain0--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;gain_func();audio();}// кнопка < if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();times=millis();w=1;w2=1;gain_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition){oldPosition = newPosition;gain0=gain0+newPosition;myEnc.write(0);newPosition=0;times=millis();www=1;w=1;gain_func();} switch(in_reg){ case 1: gain1 = gain0;break; case 2: gain2 = gain0;break; case 3: gain3 = gain0;break; case 4: gain4 = gain0;break; case 5: gain5 = gain0;break;} a[0]= gain0/10;a[1]=gain0%10; for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();} if(www==1){audio();www=0;} lcd.setCursor(0,0);lcd.print("IN GAIN"); lcd.setCursor(0,1);lcd.print("INPUT ");lcd.print(in_reg);} ////////////// OUT GAIN /////////////////////////////////////////////////////////////////// if(menu0==1){ if(ir.value==IR4){out_gain_reg++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;out_gain_func();audio();}// кнопка > if(ir.value==0xFFFFFFFF and gr1==1){out_gain_reg++;gr2=0;cl1();times=millis();w=1;w2=1;out_gain_func();audio();}// кнопка >>>>>> if(ir.value==IR5){out_gain_reg--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;out_gain_func();audio();}// кнопка < if(ir.value==0xFFFFFFFF and gr2==1){out_gain_reg--;gr1=0;cl1();times=millis();w=1;w2=1;out_gain_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition){oldPosition = newPosition;out_gain_reg=out_gain_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;out_gain_func();audio();} a[0]= out_gain_reg; for(x=0;x<1;x++){switch(x){case 0: e1=13,e2=14,e3=15;;break;case 1: e1=13,e2=14,e3=15;break;}digit();} lcd.setCursor(0,0);lcd.print("OUT GAIN"); } ////////////// ATT REAR /////////////////////////////////////////////////////////////////// if(menu0==2){ if(ir.value==IR4){att_rear++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;rear_func();audio();}// кнопка > if(ir.value==0xFFFFFFFF and gr1==1){att_rear++;gr2=0;cl1();times=millis();w=1;w2=1;rear_func();audio();}// кнопка >>>>>> if(ir.value==IR5){att_rear--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;rear_func();audio();}// кнопка < if(ir.value==0xFFFFFFFF and gr2==1){att_rear--;gr1=0;cl1();times=millis();w=1;w2=1;rear_func();audio();}// кнопка <<<<<< if (newPosition != oldPosition){oldPosition = newPosition;att_rear=att_rear+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;rear_func();audio();} a[0]= att_rear/10;a[1]=att_rear%10; for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();} lcd.setCursor(0,0);lcd.print("ATT REAR"); } //////////////////////////////////////////////////////////////////////////////////////////// if(millis()-times>10000 && w==1){ EEPROM.write(0,vol_reg);EEPROM.write(1,treb_reg);EEPROM.write(2,bass_reg);EEPROM.write(3,super_bass_reg); EEPROM.update(4,gain1);EEPROM.update(5,gain2);EEPROM.update(6,gain3);EEPROM.update(7,gain4);EEPROM.update(8,gain5); EEPROM.update(9,in_reg);EEPROM.update(10,out_gain_reg);EEPROM.update(11,att_rear); if(menu!=0){lcd.clear();menu=0;menu0=100;w=0;}} }// loop void audio(){Write(att_rear,super_bass_reg,bass_reg,treb_reg,80-vol_reg,gain0,in_reg,0,out_gain_reg,3,mute_reg);} void cl(){ir.value=0;delay(300);lcd.clear();} void cl1(){ir.value=0;delay(300);} void vol_func(){if(vol_reg<0){vol_reg=0;}if(vol_reg>80){vol_reg=80;}} void treb_func(){if(treb_reg<0){treb_reg=0;}if(treb_reg>14){treb_reg=14;}} void bass_func(){if(bass_reg<0){bass_reg=0;}if(bass_reg>14){bass_reg=14;}} void out_gain_func(){if(out_gain_reg<0){out_gain_reg=0;}if(out_gain_reg>2){out_gain_reg=2;}} void super_bass_func(){if(super_bass_reg<0){super_bass_reg=0;}if(super_bass_reg>10){super_bass_reg=10;}} void gain_func(){{if(gain0<0){gain0=0;}if(gain0>15){gain0=15;}}} void rear_func(){{if(att_rear<0){att_rear=0;}if(att_rear>15){att_rear=15;}}} void to_Timer(){newPosition = myEnc.read()/4;} void digit(){switch(a[x]){ case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break; case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break; case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break; case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break; case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;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);} void Write(byte fader, byte sup_bass,byte bass, byte treb, int vol, byte in_gain,long in,long f_r,long out_gain,long c_set,long mute){ // fader 0...-60 ∞ dB >> byte 0...15 - ослабление тыл // sup_bass step0...step10 >> byte 0...10 // bass step1...step15 >> byte 0...14 // treb step1...step15 >> byte 0...14 // vol 0...-79 ∞ dB >> int 0...81 // in_gain 0...18.75 dB step 1.25dB >> int 0...15 // in 1...5 >> int 1...5 // f_r - Fader resr/front control >> int 0 >> не менять // out_gain 0, 6.5, 8.5 dB >> int 0...2 // c_set >> int 0...3 >> 3 - не менять // mute >> 0 - off, 1 - on digitalWrite(CL,LOW); digitalWrite(CE,LOW); byte addr = 0b10000001; for(int i = 7; i >= 0; i--){ digitalWrite(CL,LOW); digitalWrite(DI, (addr >> i) & 0x01); digitalWrite(CL,HIGH); } digitalWrite(CE,HIGH); for(int i = 3; i >= 0; i--){ digitalWrite(CL,LOW); digitalWrite(DI, (fader_m[fader] >> i) & 0x01); digitalWrite(CL,HIGH); } for(int i = 3; i >= 0; i--){ digitalWrite(CL,LOW); digitalWrite(DI, (sup_bass_m[sup_bass] >> i) & 0x01); digitalWrite(CL,HIGH); } for(int i = 3; i >= 0; i--){ digitalWrite(CL,LOW); digitalWrite(DI, (tembr_m[bass] >> i) & 0x01); digitalWrite(CL,HIGH); } for(int i = 3; i >= 0; i--){ digitalWrite(CL,LOW); digitalWrite(DI, (tembr_m[treb] >> i) & 0x01); digitalWrite(CL,HIGH); } for(int i = 7; i >= 0; i--){ digitalWrite(CL,LOW); digitalWrite(DI, (vol_m[vol] >> i) & 0x01); digitalWrite(CL,HIGH); } for(int i = 3; i >= 0; i--){ digitalWrite(CL,LOW); digitalWrite(DI, (in_gain_m[in_gain] >> i) & 0x01); digitalWrite(CL,HIGH); } long in1,in2,out_gain1,out_gain2; switch(in){ case 1: in1=0b00;in2=1;break; case 2: in1=0b10;in2=1;break; case 3: in1=0b01;in2=1;break; case 4: in1=0b11;in2=1;break; case 5: in1=0b00;in2=0;break; } switch(out_gain){ case 0: out_gain1=0;out_gain2=1;break; case 1: out_gain1=1;out_gain2=0;break; case 2: out_gain1=1;out_gain2=1;break; } long grup = (in1<<14)+(f_r<<13)+(out_gain1<<12)+(in2<<11)+(c_set<<9)+(mute<<8)+(out_gain2<<4); for(int i = 15; i >= 0; i--){ digitalWrite(CL,LOW); digitalWrite(DI, (grup >> i) & 0x01); digitalWrite(CL,HIGH); } digitalWrite(CL,LOW); digitalWrite(CE,LOW); }
ИК пульт дублирует работу энкодера и кнопок. Для управления регулятором подойдет практически любой пульт ИК, для поддержки Вашего пульта необходимо прописать коды кнопок в скетч:
#define IR1 0x2FDF00F // main/setting menu #define IR2 0x2FDB24D // button encoder #define IR3 0x2FDB04F // mute #define IR4 0x2FD906F // >>> #define IR5 0x2FDF20D // <<< #define IR6 0x2FD6A95 // INPUT
Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.
Регулировка предусилителя входовАттенюатор REARУсилитель выхода
РежимMUTEРегулировка SUPER BASS
Регулировка BASSРегулировка TREBLEРегулировка громкости
Доработка 1
В доработанной версии регулятора громкости и тембра появились несколько дополнительный функций:
- Добавлены кнопки пульта для переключения входов: кнопки 1.2.3.4.5 включают одноименный вход.
- Режим STANBDY: добавлена кнопка POWER, при ее нажатии затемняется подсветка экрана и на экран выводится время, на выходе D13 появляется сигнал управления STANDBY для усилителя.
- Добавлены в меню SETTING два пункта для управления яркостью экрана в обычном режиме и в режиме STANDBY.
- Добавлен модуль часов реального времени DS3231.
Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=4470#p4470
Для работы подсветки дисплея необходимо убрать перемычку с модуля I2C PCF8574, и подать с D6 на LED pin ШИМ сигнал.
Коррекция (установка времени): в режиме STANDBY нажать и удерживать кнопку энкодера, далее нажмите кнопку BYTTON для коррекции часов, кнопку MENU для коррекции минут и кнопку MUTE для обнуления секунд.
Доработка 2
В доработанной версии регулятора громкости и тембра появились несколько дополнительный функций, а так же изменены некоторые функции:
- Добавлена кнопка пульта POWER 10 MIN — при нажатии на нее через 10 минут регулятор громкости тембра перейдет в режим STANDBY (POWER OFF)
- Изменена функция установки или коррекции времени, теперь в режиме STANDBY не нужно нажимать и удерживать кнопку энкодера для установки или коррекции времени.
- Добавлен будильник включения. Для установки времени будильника включения времени в режиме STANDBY нажать и удерживать кнопку энкодера, во время удержания кнопки энкодера на дисплее будет показано время будильника и его состояние (вкл/откл). Коррекция времени будильника и изменение его состояния (вкл/откл), осуществляется кнопками INPUT(корр.часы), MENU(корр.мин) и MUTE(вкл/откл ON/—).
Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=4490#p4490