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

PT2318 — представляет собой аудиопроцессор специально разработанный для использования в Hi-Fi системах. Аудиопроцессор имеет 4 стерео входа и один монофонический вход, 4-х канальный выход (FRONT, REAR), регулятор громкости и тембра, систему тонкомпенсации (loudness), независимый для каждого выхода аттенюатор.

Основные параметры аудиопроцессора PT2318:

  • Напряжение питания от 7.5 В до 9.5 В  (9 В — рекомендуемое)
  • Ток потребления от 26 мА до 32 мА
  • Диапазон регулировки громкости от -31 дБ до +20 дБ (шаг 1 дБ)
  • Разделение каналов 96 дБ
  • Коэффициент гармонических искажений не более 0,05 % (20Hz to 12.5KHz, Vi=1V, Gv=0dB )
  • Отношение сигнал\шум не менее 99 дБ (Vo=2.0V, Gv=0dB)
  • Перекрестные помехи -110 дБ
  • Входное сопротивление 30 кОм (Input impedance)
  • Максимальное входное напряжение 2,7 В (THD<0.5%, Vcc=8.5V)
  • Выходное сопротивление 130 Ом (Output impedance)
  • Уровень MUTE -100 дБ
  • Регулировка тембра:
    • BASS ±15 дБ (шаг 1,5 дБ, неточность регулирования не более 1 дБ)
    • TREBLE ±12 дБ (шаг 1,5 дБ, неточность регулирования не более 1 дБ)
  • Регулировка аттенюаторов от 0 до 55 дБ (независимая для каждого выхода)
  • Управление цифровое I2C

Схема подключения PT2318

На базе Arduino используя PT2318 можно собрать простой регулятор громкости и тембра. Основное управление параметрами аудиопроцессора будет осуществляться при помощи энкодера (KY-040) и 3-х кнопок, так же будет применен ИК пульт который будет дублировать энкодер и кнопки управления. Вся информация будет выводится на дисплей LCD1602 + I2C (I2C модуль на базе микросхем PCF8574 позволяют подключить символьный дисплей 1602 к плате Arduino всего по двум проводам SDA и SCL (А4 и А5), что дает возможность не использовать цифровые выходы Arduino при подключении дисплея.)

В цифровая части регулятора громкости используется плата Arduino Nano, дисплей LCD1602 c I2C модулем PCF8574, энкодер KY-040 (модуль), модуль IR, модуль часов реального времени DS3213.

Меню управления регулятором громкости состоит из нескольких пунктов:

  • Регулятор громкости

  • Регулятор BASS

  • Регулятор TREBLE

  • Регулировка аттенюатора выход FR

  • Регулировка аттенюатора выход FL

  • Регулировка аттенюатора выход RR

  • Регулировка аттенюатора выход RL

  • Вкл \ выкл тонкомпенсации Loudness

Управление всеми параметрами осуществляется через кнопки и энкодер, а так же через ИК пульт. ИК пульт позволяет пролистывать пункты меню, кнопками <> менять параметры, активировать функцию MUTE, переводить регулятор громкости в режим STANDBY, так же есть кнопки прямого доступа к основным параметрам, к таким как громкость, тембр НЧ, тембр ВЧ и коммутатор входа, что позволяет например изменить тембр НЧ кнопками BASS_MIN и BASS_MAX не заходя предварительно в пункт меню BASS.

Меню имеет два режима работы, сокращенное и расширенное (MENU_SMALL, MENU_BIG). В сокращенном меню будут доступны только пункты меню громкости, тембра НЧ и тембра ВЧ. В расширенном меню будут доступны все пункты меню. Для переключения режима работы меню необходимо нажать кнопку MUTE и после кнопку энкодера.

В режиме STANDBY (POWER OFF) на дисплей выводятся часы.

Коррекция времени часов: в режиме STANDBY нажать и удерживать кнопку энкодера, далее нажать кнопки INPUT, MUTE, POWER для изменения времени часов, минут и обнуления секунд.

Так же предусмотрено изменение яркости дисплея в режиме STANDBY: выход D6 Arduino подключить к пину управления подсветки:

Подсветка — убрать перемычку с модуля I2C PCF8574 и подключить вывод модуля к цифровому выходу Arduino D6. Перед подключением замерить ток подсветки который не должен превышать 20 мА (у моего модуля ток не более 15 мА, замер производить между контактами перемычки).

Максимальный выходной ток одного выхода Arduino Nano не должен превышать 40 мА.

Яркость подсветки можно настроить через скетч:

#define BRIG_L 50
#define BRIG_H 250
  • BRIG_L — яркость в режиме STANDBY (0-250)
  • BRIG_H — яркость в рабочем режиме (0-250)

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

#define VOLUME_MAX  0x33B85AA5 // громкость прибавить
#define VOLUME_MIN  0x33B8D42B // громкость убавить
#define BASS_MAX    0x33B87A85 // НЧ прибавить
#define BASS_MIN    0x33B854AB // НЧ убавить
#define TREB_MAX    0x33B8BA45 // ВЧ прибавить
#define TREB_MIN    0x33B832CD // ВЧ убавить

#define IN1         0x33B88877  // выбор вход 1
#define IN2         0x33B848B7  // выбор вход 2
#define IN3         0x33B8C837  // выбор вход 3
#define IN4         0x33B828D7  // выбор вход 4
#define IN5         0x33B8A857  // выбор вход 5 (моно)

#define LEFT        0x33B8E01F  // убавить в любом меню
#define RIGHT       0x33B810EF  // прибавить в любом меню

#define MENU_DOWN   0x33B8609F  // навигация по меню
#define MENU_UP     0x33B8A05F  // навигация по меню

#define LOUD        0x33B850AF  // Loudness
#define MUTE        0x33B8946B  // MUTE
#define POWER       0x33B800FF  // STANDBY

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

#define VOLUME_MAX  0x33B85AA5 // громкость прибавить
#define VOLUME_MIN  0x33B8D42B // громкость убавить
#define BASS_MAX    0x33B87A85 // НЧ прибавить
#define BASS_MIN    0x33B854AB // НЧ убавить
#define TREB_MAX    0x33B8BA45 // ВЧ прибавить
#define TREB_MIN    0x33B832CD // ВЧ убавить
 
#define IN1         0x33B88877  // выбор вход 1
#define IN2         0x33B848B7  // выбор вход 2
#define IN3         0x33B8C837  // выбор вход 3
#define IN4         0x33B828D7  // выбор вход 4
#define IN5         0x33B8A857  // выбор вход 5 (моно)
 
#define LEFT        0x33B8E01F  // убавить в любом меню
#define RIGHT       0x33B810EF  // прибавить в любом меню
 
#define MENU_DOWN   0x33B8609F  // навигация по меню
#define MENU_UP     0x33B8A05F  // навигация по меню
 
#define LOUD        0x33B850AF  // Loudness
#define MUTE        0x33B8946B  // MUTE
#define POWER       0x33B800FF  // STANDBY
 
#define BRIG_L 50
#define BRIG_H 250
 
#include <Wire.h>              // Входит в состав Arduino IDE
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <EEPROM.h>            // Входит в состав Arduino IDE
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <boarddefs.h>         // Входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip 
#include <DS3231.h>            // https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
#include <PT2318.h>            // http://rcl-radio.ru/wp-content/uploads/2021/10/PT2318.zip
 PT2318 pt;
 LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
 Encoder myEnc(9, 8);//CLK, DT подключение энкодера
 decode_results ir;
 IRrecv irrecv(12); // указываем вывод модуля IR приемника
 DS3231 clock;RTCDateTime DateTime;
 
 byte v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07};
 byte v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00};      
 byte v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
 byte v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F};
 byte v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C};
 byte v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
 byte v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07};
 byte v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00}; 
 unsigned long time,oldPosition  = -999,newPosition;
 int a[6],menu,fun_d,vol,in,bass,treb,hour,secon,minut,x,fr,fl,rl,rr,loud;
 byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3,w,w1,mute,power,main_menu,gr1,gr2;
 
void setup() {
 Wire.begin();Serial.begin(9600);irrecv.enableIRIn();
 MsTimer2::set(3, to_Timer);MsTimer2::start();
 lcd.init();lcd.backlight();clock.begin(); 
 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);
 //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
 pinMode(6,OUTPUT);        // PWM output
 analogWrite(6,BRIG_H);
 Encoder myEnc(9, 8);//CLK, DT подключение энкодера
 lcd.setCursor(5,0);lcd.print("PT2318");
 lcd.setCursor(0,1);lcd.print("audio  processor");
 delay(2000);lcd.clear();
 pinMode(10,INPUT);        // КНОПКА ЭНКОДЕРA
 pinMode(2,INPUT_PULLUP);  // INPUT
 pinMode(3,INPUT_PULLUP);  // MUTE
 pinMode(4,INPUT_PULLUP);  // POWER
 pinMode(13,OUTPUT);       // OUTPUT STANDBY
 delay(500);
 if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
 vol = EEPROM.read(0);bass = EEPROM.read(1)-12;treb = EEPROM.read(2)-8;in = EEPROM.read(3);
 main_menu = EEPROM.read(4);if(main_menu>1){main_menu=0;}
 fr = EEPROM.read(5);fl = EEPROM.read(6);rr = EEPROM.read(7);rl = EEPROM.read(8);
 loud = EEPROM.read(9);if(loud>1){loud=0;}
 audio();
}
 
void loop() {
////////////////// ИК приемник - обработка кодов кнопок ///////////////////////////////////////
 if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time=millis();w=1;w1=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
 if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта 
 
 if(ir.value==VOLUME_MAX && menu!=0){vol++;menu=0;gr1=1;gr2=0;cl();time=millis();w=1;w1=1;vol_fun();audio();}// vol_max
 if(ir.value==VOLUME_MIN && menu!=0){vol--;menu=0;gr1=0;gr2=1;cl();time=millis();w=1;w1=1;vol_fun();audio();}// vol_min
 if(ir.value==BASS_MAX && menu!=1){bass++;menu=1;gr1=1;gr2=0;cl();time=millis();w=1;w1=1;vol_fun();audio();}// bass_max
 if(ir.value==BASS_MIN && menu!=1){bass--;menu=1;gr1=0;gr2=1;cl();time=millis();w=1;w1=1;vol_fun();audio();}// bass_min
 if(ir.value==TREB_MAX && menu!=2){treb++;menu=2;gr1=1;gr2=0;cl();time=millis();w=1;w1=1;vol_fun();audio();}// treb_max
 if(ir.value==TREB_MIN && menu!=2){treb--;menu=2;gr1=0;gr2=1;cl();time=millis();w=1;w1=1;vol_fun();audio();}// treb_min 
 
if(main_menu==0){
 if(ir.value==MENU_DOWN){menu++;cl();myEnc.write(0);time=millis();gr1=0;gr2=0;w=1;w1=1;if(menu>2){menu=0;}}// menu_down
 if(ir.value==MENU_UP){menu--;cl();myEnc.write(0);time=millis();gr1=0;gr2=0;w=1;w1=1;if(menu<0){menu=2;}}// menu_up
}
if(main_menu==1){
 if(ir.value==MENU_DOWN){menu++;cl();myEnc.write(0);time=millis();gr1=0;gr2=0;w=1;w1=1;if(menu>7){menu=0;}}// menu_down
 if(ir.value==MENU_UP){menu--;cl();myEnc.write(0);time=millis();gr1=0;gr2=0;w=1;w1=1;if(menu<0){menu=7;}}// menu_up
}
 
 if(ir.value==IN1){in=0;menu=0;cl1();time=millis();w=1;w1=1;gr1=0;gr2=0;audio();}// IN1
 if(ir.value==IN2){in=1;menu=0;cl1();time=millis();w=1;w1=1;gr1=0;gr2=0;audio();}// IN2
 if(ir.value==IN3){in=2;menu=0;cl1();time=millis();w=1;w1=1;gr1=0;gr2=0;audio();}// IN3
 if(ir.value==IN4){in=3;menu=0;cl1();time=millis();w=1;w1=1;gr1=0;gr2=0;audio();}// IN4
 if(ir.value==IN5){in=4;menu=0;cl1();time=millis();w=1;w1=1;gr1=0;gr2=0;audio();}// IN5
 
 if(ir.value==LOUD && loud==0){loud=1;cl();time=millis();w=1;w1=1;gr1=0;gr2=0;audio();cl();menu=7;}// loud_on
 if(ir.value==LOUD && loud==1){loud=0;cl();time=millis();w=1;w1=1;gr1=0;gr2=0;audio();cl();menu=7;}// loud_off
 
  //////// BUTTON ///////////////////////////////////////////////
 if(power==0){ 
 if(digitalRead(10)==LOW && mute==0 && main_menu==0){menu++;cl();myEnc.write(0);time=millis();w=1;w1=1;if(menu>2){menu=0;}}// SMALL MENU
 if(digitalRead(10)==LOW && mute==0 && main_menu==1){menu++;cl();myEnc.write(0);time=millis();w=1;w1=1;if(menu>7){menu=0;}}// BIG MENU
 if((digitalRead(2)==LOW) && mute==0){in++;cl();myEnc.write(0);time=millis();w=1;w1=1;if(in>4){in=0;}lcd.setCursor(4,0);lcd.print("INPUT ");lcd.print(in+1);delay(2000);audio();cl();}// IN
 if((digitalRead(3)==LOW||ir.value==MUTE)&&mute==0){mute=1;cl();menu=100;myEnc.write(0);audio();lcd.setCursor(6,0);lcd.print("MUTE");}
 if((digitalRead(3)==LOW||ir.value==MUTE)&&mute==1){mute=0;cl();menu=0;w=1;myEnc.write(0);time=millis();audio();cl();}
 
 if(mute==1 && digitalRead(10)==LOW && main_menu==0){main_menu=1;mute=0;menu=0;cl();myEnc.write(0);time=millis();w=1;w1=1;lcd.setCursor(2,0);lcd.print("  BIG MENU ");audio();delay(2000);cl();}
 if(mute==1 && digitalRead(10)==LOW && main_menu==1){main_menu=0;mute=0;menu=0;cl();myEnc.write(0);time=millis();w=1;w1=1;lcd.setCursor(2,0);lcd.print("SMALL  MENU");audio();delay(2000);cl();}
 
 }else{menu=100;}
  // standby output
 if(power==0){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
 /// power ///
 if((digitalRead(4)==LOW||ir.value==POWER)&&power==0){power=1;w=1;menu=100;analogWrite(6,BRIG_L);cl();myEnc.write(0);mute=1;
  lcd.setCursor(3,0);lcd.print("POWER OFF");audio();delay(2000);cl();}
 if((digitalRead(4)==LOW||ir.value==POWER)&&power==1&&digitalRead(10)==HIGH){power=0;w=1;menu=0;analogWrite(6,BRIG_H);cl();myEnc.write(0);mute=0;
  lcd.setCursor(3,0);lcd.print("POWER  ON");audio();delay(2000);cl();}  
 
//////// VOLUME ////////////////////////////////////////////////////////////////  
 if(menu==0){ 
   if(ir.value==VOLUME_MAX || ir.value==RIGHT){vol++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;vol_fun();audio();}// кнопка > 
   if((ir.value==0xFFFFFFFF) and gr1==1){vol++;gr2=0;cl1();time=millis();w=1;w1=1;vol_fun();audio();}// кнопка >>>>>>
   if(ir.value==VOLUME_MIN || ir.value==LEFT){vol--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;vol_fun();audio();}// кнопка <
   if((ir.value==0xFFFFFFFF) and gr2==1){vol--;gr1=0;cl1();time=millis();w=1;w1=1;vol_fun();audio();}// кнопка <<<<<< 
 
 if (newPosition != oldPosition){oldPosition = newPosition;
 vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;vol_fun();audio();}
 lcd.setCursor(0,0);lcd.print(F("VOLUME "));lcd.setCursor(0,1);
 if(in==4){lcd.print("MONO");}else{lcd.print("INPUT ");lcd.print(in+1);}
 
 fun_d = vol-12;if(w==1){w=0;a[0]=(fun_d)/10;a[1]=(fun_d)%10;cif();}}
 
//////// BASS ////////////////////////////////////////////////////////////////  
 if(menu==1){ 
   if(ir.value==BASS_MAX || ir.value==RIGHT){bass++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;bass_fun();audio();}// кнопка > 
   if((ir.value==0xFFFFFFFF) and gr1==1){bass++;gr2=0;cl1();time=millis();w=1;w1=1;bass_fun();audio();}// кнопка >>>>>>
   if(ir.value==BASS_MIN || ir.value==LEFT){bass--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;bass_fun();audio();}// кнопка <
   if((ir.value==0xFFFFFFFF) and gr2==1){bass--;gr1=0;cl1();time=millis();w=1;w1=1;bass_fun();audio();}// кнопка <<<<<< 
 
 if (newPosition != oldPosition){oldPosition = newPosition;
 bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;bass_fun();audio();}
 lcd.setCursor(0,0);lcd.print(F("BASS "));fun_d = bass;
 if(fun_d<0){lcd.setCursor(7,0);fun_d=abs(fun_d);lcd.write((uint8_t)3);}else{lcd.setCursor(7,0);lcd.print(" ");}
 if(w==1){w=0;a[0]=(fun_d)/10;a[1]=(fun_d)%10;cif();}} 
 
//////// TREBLE ////////////////////////////////////////////////////////////////  
 if(menu==2){
   if(ir.value==TREB_MAX || ir.value==RIGHT){treb++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;treb_fun();audio();}// кнопка > 
   if((ir.value==0xFFFFFFFF) and gr1==1){treb++;gr2=0;cl1();time=millis();w=1;w1=1;treb_fun();audio();}// кнопка >>>>>>
   if(ir.value==TREB_MIN || ir.value==LEFT){treb--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;treb_fun();audio();}// кнопка <
   if((ir.value==0xFFFFFFFF) and gr2==1){treb--;gr1=0;cl1();time=millis();w=1;w1=1;treb_fun();audio();}// кнопка <<<<<<    
 
 if (newPosition != oldPosition){oldPosition = newPosition;
 treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;treb_fun();audio();}
 lcd.setCursor(0,0);lcd.print(F("TREBLE "));fun_d = treb;
 if(fun_d<0){lcd.setCursor(7,0);fun_d=abs(fun_d);lcd.write((uint8_t)3);}else{lcd.setCursor(7,0);lcd.print(" ");}
 if(w==1){w=0;a[0]=(fun_d)/10;a[1]=(fun_d)%10;cif();}} 
 
//////// ATT_FR ////////////////////////////////////////////////////////////////  
 if(menu==3){ 
   if(ir.value==RIGHT){fr++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;fr_fun();audio();}// кнопка > 
   if((ir.value==0xFFFFFFFF) and gr1==1){fr++;gr2=0;cl1();time=millis();w=1;w1=1;fr_fun();audio();}// кнопка >>>>>>
   if(ir.value==LEFT){fr--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;fr_fun();audio();}// кнопка <
   if((ir.value==0xFFFFFFFF) and gr2==1){fr--;gr1=0;cl1();time=millis();w=1;w1=1;fr_fun();audio();}// кнопка <<<<<<   
 
 if (newPosition != oldPosition){oldPosition = newPosition;
 fr=fr+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;fr_fun();audio();}
 lcd.setCursor(0,0);lcd.print(F("ATT_FR "));fun_d = fr;
 if(fun_d<0){lcd.setCursor(7,0);fun_d=abs(fun_d);lcd.write((uint8_t)3);}else{lcd.setCursor(7,0);lcd.print(" ");}
 if(w==1){w=0;a[0]=(fun_d)/10;a[1]=(fun_d)%10;cif();}} 
 
//////// ATT_FL ////////////////////////////////////////////////////////////////  
 if(menu==4){ 
   if(ir.value==RIGHT){fl++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;fl_fun();audio();}// кнопка > 
   if((ir.value==0xFFFFFFFF) and gr1==1){fl++;gr2=0;cl1();time=millis();w=1;w1=1;fl_fun();audio();}// кнопка >>>>>>
   if(ir.value==LEFT){fl--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;fl_fun();audio();}// кнопка <
   if((ir.value==0xFFFFFFFF) and gr2==1){fl--;gr1=0;cl1();time=millis();w=1;w1=1;fl_fun();audio();}// кнопка <<<<<<     
 
 if (newPosition != oldPosition){oldPosition = newPosition;
 fl=fl+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;fl_fun();audio();}
 lcd.setCursor(0,0);lcd.print(F("ATT_FL "));fun_d = fl;
 if(fun_d<0){lcd.setCursor(7,0);fun_d=abs(fun_d);lcd.write((uint8_t)3);}else{lcd.setCursor(7,0);lcd.print(" ");}
 if(w==1){w=0;a[0]=(fun_d)/10;a[1]=(fun_d)%10;cif();}} 
 
//////// ATT_RR ////////////////////////////////////////////////////////////////  
 if(menu==5){ 
   if(ir.value==RIGHT){rr++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;rr_fun();audio();}// кнопка > 
   if((ir.value==0xFFFFFFFF) and gr1==1){rr++;gr2=0;cl1();time=millis();w=1;w1=1;rr_fun();audio();}// кнопка >>>>>>
   if(ir.value==LEFT){rr--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;rr_fun();audio();}// кнопка <
   if((ir.value==0xFFFFFFFF) and gr2==1){rr--;gr1=0;cl1();time=millis();w=1;w1=1;rr_fun();audio();}// кнопка <<<<<<   
 
 if (newPosition != oldPosition){oldPosition = newPosition;
 rr=rr+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;rr_fun();audio();}
 lcd.setCursor(0,0);lcd.print(F("ATT_RR "));fun_d = rr;
 if(fun_d<0){lcd.setCursor(7,0);fun_d=abs(fun_d);lcd.write((uint8_t)3);}else{lcd.setCursor(7,0);lcd.print(" ");}
 if(w==1){w=0;a[0]=(fun_d)/10;a[1]=(fun_d)%10;cif();}}
 
//////// ATT_RL ////////////////////////////////////////////////////////////////  
 if(menu==6){
   if(ir.value==RIGHT){rl++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;rl_fun();audio();}// кнопка > 
   if((ir.value==0xFFFFFFFF) and gr1==1){rl++;gr2=0;cl1();time=millis();w=1;w1=1;rl_fun();audio();}// кнопка >>>>>>
   if(ir.value==LEFT){rl--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;rl_fun();audio();}// кнопка <
   if((ir.value==0xFFFFFFFF) and gr2==1){rl--;gr1=0;cl1();time=millis();w=1;w1=1;rl_fun();audio();}// кнопка <<<<<< 
 
 if (newPosition != oldPosition){oldPosition = newPosition;
 rl=rl+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;rl_fun();audio();}
 lcd.setCursor(0,0);lcd.print(F("ATT_RL "));fun_d = rl;
 if(fun_d<0){lcd.setCursor(7,0);fun_d=abs(fun_d);lcd.write((uint8_t)3);}else{lcd.setCursor(7,0);lcd.print(" ");}
 if(w==1){w=0;a[0]=(fun_d)/10;a[1]=(fun_d)%10;cif();}}  
 
 
//////// Loudness ////////////////////////////////////////////////////////////////  
 if(menu==7){ 
   if(ir.value==RIGHT){loud++;gr1=1;gr2=0;cl1();time=millis();w=1;w1=1;loud_fun();audio();}// кнопка > 
   if(ir.value==LEFT){loud--;gr1=0;gr2=1;cl1();time=millis();w=1;w1=1;loud_fun();audio();}// кнопка <
 
 if (newPosition != oldPosition){oldPosition = newPosition;
 loud=loud+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;loud_fun();audio();}
 if(loud==0){lcd.setCursor(2,0);lcd.print(F("LOUDNESS ON "));}
 if(loud==1){lcd.setCursor(2,0);lcd.print(F("LOUDNESS OFF"));}
 }      
 
/////////////////// ЧАСЫ ///////////////////////////////////////////////////////////////////
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;   
if(power==1){
     a[0]=DateTime.hour/10;
     a[1]=DateTime.hour%10;
     a[2]=DateTime.minute/10;
     a[3]=DateTime.minute%10;
     a[4]=DateTime.second/10;
     a[5]=DateTime.second%10;
   for(x=0;x<4;x++){
    switch(x){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
   }digit();}
 
   lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");
   lcd.setCursor(14,1);lcd.print(a[4]);lcd.setCursor(15,1);lcd.print(a[5]);   
//// set time ////
  if(digitalRead(10)==LOW&&digitalRead(2)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2021, 8, 28, hour, minut, secon);delay(100);}// input button HH++
  if(digitalRead(10)==LOW&&digitalRead(3)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2021, 8, 28, hour, minut, secon);delay(100); }// mute MM++
  if(digitalRead(10)==LOW&&digitalRead(4)==LOW){secon=0; clock.setDateTime(2021, 8, 28, hour, minut, secon);delay(100); }//  power SS=0
}    
 
/////// EEPROM //////////////////////////////////////////////////
 if(millis()-time>10000 && w1==1&&mute==0&&power==0){
     EEPROM.update(0,vol);EEPROM.update(1,bass+12);EEPROM.update(2,treb+8);EEPROM.update(3,in);EEPROM.update(4,main_menu);
     EEPROM.update(5,fr);EEPROM.update(6,fl);EEPROM.update(7,rr);EEPROM.update(8,rl);EEPROM.update(9,loud);
     if(menu!=0){lcd.clear();}menu=0;w=1;w1=0;}
}// end loop
 
void cl(){ir.value=0;delay(300);lcd.clear();}  
void cl1(){ir.value=0;delay(300);} 
void vol_fun(){if(vol>63){vol=63;}if(vol<12){vol=12;}}
void bass_fun(){if(bass<-12){bass=-12;}if(bass>12){bass=12;}}
void treb_fun(){if(treb<-8){treb=-8;}if(treb>8){treb=8;}}
void fr_fun(){if(fr<0){fr=0;}if(fr>63){fr=63;}}
void fl_fun(){if(fl<0){fl=0;}if(fl>63){fl=63;}}
void rr_fun(){if(rr<0){rr=0;}if(rr>63){rr=63;}}
void rl_fun(){if(rl<0){rl=0;}if(rl>63){rl=63;}}
void loud_fun(){if(loud<0){loud=1;}if(loud>1){loud=0;}}
void to_Timer(){newPosition = myEnc.read()/4;}
 
void cif(){
  for(i=0;i<2;i++){
      switch(i){
        case 0: e1=9,e2=10,e3=11;break;
        case 1: e1=12,e2=13,e3=14;break;
        }
      switch(a[i]){
        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 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 audio(){
    pt.setVolume(vol, loud, 0);  
    // int 12...63 === -31...+20 dB
    // Loudness 0 = on, 1 = off
    // не менять
    pt.setFader_FR(fr);  // int 0...63 
    pt.setFader_FL(fl);  // int 0...63 
    pt.setFader_RR(rr);  // int 0...63 
    pt.setFader_RL(rl);  // int 0...63 
    pt.setBass(bass);    // int -12...0...+12
    pt.setTreble(treb);// int -8...0...+8
    pt.setIn(in, mute); 
    // IN = int 0...3, MONO = int 4
    // MUTE 0 = off, 1 = on
  }

Datasheetpt2318.pdf

Comments

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

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