#include <Wire.h>
#include <TDA7719.h>
#include <EEPROM.h>
#include <Encoder.h>
#include <MsTimer2.h>
TDA7719 tda;
Encoder myEnc(9, 8);//CLK, DT подключение энкодера
byte a1,a2,b1,b2,param,data;
int w,i,vol,treb,treb_f,mid,mid_f,bas,bass_f,in,eeprom,loun,loun_f,vol_att,vol0,vol1,att_RF,att_LF,att_RR,att_LR;
unsigned long newPosition,time,oldPosition = -999;
void setup(){
Serial.begin(115200);Wire.begin();
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
vol = EEPROM.read(0);treb = EEPROM.read(1);mid = EEPROM.read(2);bas = EEPROM.read(3);in = EEPROM.read(4);
loun = EEPROM.read(5);loun_f = EEPROM.read(6);
vol0=EEPROM.read(7);vol1=EEPROM.read(8);treb_f=EEPROM.read(9);mid_f=EEPROM.read(10);bass_f=EEPROM.read(11);
att_RF=EEPROM.read(12);att_LF=EEPROM.read(13);att_RR=EEPROM.read(14);att_LR=EEPROM.read(15);
MsTimer2::set(3, to_Timer);MsTimer2::start();
in_att();audio();
}
void loop(){
/////////// Serial Port - получение данных //////////////////////////////////////////////////////////
if(Serial.available()){w++;time=millis(); delay(10);
switch(i){
case 0: a1 = Serial.read()-48;
case 1: a2 = Serial.read()-48;
case 2: b1 = Serial.read()-48;
case 3: b2 = Serial.read()-48;}
param = a1*10+a2;data = b1*10+b2;// получение кода команды и значение
switch(param){
case 10: vol=data;break; // передаем переменной vol значение byte = 79...0 === громкость от -79 до 0 дБ === 1079...1000
case 11: treb=data;break; // передаем переменной treb значение byte = 0...30 === тебр ВЧ от -15 до +15 дБ === 1100...1130
case 12: mid=data;break; // передаем переменной mid значение byte = 0...30 === тебр СЧ от -15 до +15 дБ === 1200...1230
case 13: bas=data;break; // передаем переменной bas значение byte = 0...30 === тебр НЧ от -15 до +15 дБ === 1300...1330
case 14: in=data;break; // передаем переменной in значение byte = 1...2 === выбор входа от 0 до 1 === 1401...1402
case 15: loun=data;break; // передаем переменной loun значение byte = 0...15 === тонкомпенсация ослабление от -15 до 0 дБ === 1500...1515
case 16: loun_f=data;break; // передаем переменной loun_f значение byte = 0...3 === тонкомпенсация центральная частота FLAT 400 800 2400 Гц === 1600...1603
case 17: vol0=data;break; // аттенюатор входа 0 от -15 до +15 дБ === 1700...1730
case 18: vol1=data;break; // аттенюатор входа 1 от -15 до +15 дБ === 1800...1830
case 19: treb_f=data;break; // передаем переменной treb_f значение byte = 0...3 === ВЧ центральная частота 10 12.5 15 17.5 кГц === 1900...1903
case 20: mid_f=data;break; // передаем переменной mid_f значение byte = 0...3 === CЧ центральная частота 0.5 1 1.5 2.5 кГц === 2000...2003
case 21: bass_f=data;break; // передаем переменной bass_f значение byte = 0...3 === НЧ центральная частота 60 80 100 200 Гц === 2100...2103
//// attenuator output
case 22: att_RF=data;break; // 2200...2215
case 23: att_LF=data;break; // 2300...2315
case 24: att_RR=data;break; // 2400...2415
case 25: att_LR=data;break; // 2500...2515
case 99: eeprom=data;break; // EEPROM === 9901 отправить в данные в EEPROM
i++;}}i=0;
//////////////////////////////////////////////////////////////////////////////////////////////////////
in_att();
if (newPosition != oldPosition) {
oldPosition = newPosition;
vol=vol-newPosition;myEnc.write(0);newPosition=0;w=1;if(vol<0){vol=0;}if(vol>79){vol=79;}audio();}
//////////// EEPROM ////////////////////////////////////////////////////////////////////////////////////
if(eeprom==1){eeprom=0;
EEPROM.update(0,vol);EEPROM.update(1,treb);EEPROM.update(2,mid);EEPROM.update(3,bas);EEPROM.update(4,in);
EEPROM.update(5,loun);EEPROM.update(6,loun_f);EEPROM.update(7,vol0);EEPROM.update(8,vol1);
EEPROM.update(9,treb_f);EEPROM.update(10,mid_f);EEPROM.update(11,bass_f);
EEPROM.update(12,att_RF);EEPROM.update(13,att_LF);EEPROM.update(14,att_RR);EEPROM.update(15,att_LR);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
//////////// Отправка данных в минитор порта и аудиопроцессор /////////////////////////////////////////
if(w==1){audio();
Serial.print("vol= ");Serial.print(vol);Serial.print(" treb= ");Serial.print(treb);Serial.print(" mid= ");Serial.print(mid);Serial.print(" bas= ");Serial.print(bas);
Serial.print(" in= ");Serial.print(in);Serial.print(" loun= ");Serial.print(loun);Serial.print(" loun_f= ");Serial.print(loun_f);
Serial.print(" vol0= ");Serial.print(vol0);Serial.print(" vol1= ");Serial.print(vol1);Serial.print(" treb_f");Serial.print(treb_f);Serial.print(" mid_f= ");
Serial.print(mid_f);Serial.print(" bass_f= ");Serial.print(bass_f);Serial.print(" rf= ");
Serial.print(att_RF);Serial.print(" lf= ");Serial.print(att_LF);Serial.print(" rr= ");Serial.print(att_RR);Serial.print(" lr= ");Serial.print(att_LR);
Serial.print(" vol_att=");Serial.print(vol_att);Serial.print(" общая гром= ");Serial.print(vol+15-att_LR);Serial.println("");
w=0;}
///////////////////////////////////////////////////////////////////////////////////////////////////////
}//LOOP
void audio(){
tda.setInput(in,1,1,7); // 0...7, 0...1, 0...1, 0...7
tda.setInput_2(2,1,1,1,1,1); // 0...7, 0...1, 0...1, 0...1, 0...1, 0...1
tda.setMix_source(7,0); // 0...7, 0...-31
tda.setMix_cont(1,1,1,1,1,1,1,1); // all 0...1
tda.setMute(1,0,0,1,1,1,1); // 0...1, 0...1, 0...3, 0...1, 0...1, 0...1, 0...1
tda.setSoft_1(1,1,1,1,1,1,1,1); //all 0...1
tda.setSoft_2(1,1,1,1,0,3); // 0...1, 0...1, 0...1, 0...1, 0...2, 0...3
tda.setLoudness(-loun,loun_f,1,1); // 0...-15, 0...3, 0...1, 0...1
tda.setVol(vol_att-15,1,1); // -15...+15, 0...1, 0...1
tda.setTreble(treb-15,treb_f,1); // -15...+15, 0...3, 0...1
tda.setMiddle(mid-15,3,1); // -15...+15, 0...3, 0...1
tda.setBass(bas-15,3,1); // -15...+15, 0...3, 0...1
tda.setSMB(0,1,mid_f,bass_f,1); // 0...3, 0...1, 0...3, 0...3, 0...1
tda.setVol_LF(vol+15-att_LR,1); // 0...-79, 0...1
tda.setVol_RF(vol+15-att_RF,1); // 0...-79, 0...1
tda.setVol_LR(vol+15-att_LR,1); // 0...-79, 0...1
tda.setVol_RR(vol+15-att_RR,1); // 0...-79, 0...1
tda.setVol_SUB_L(vol,1); // 0...-79, 0...1
tda.setVol_SUB_R(vol,1); // 0...-79, 0...1
tda.setTest1(0,14,1,1); // 0...1, 0...15, 0...1, 0...1
tda.setTest2(0,1,1,3); // 0...1, 0...1, 0...1, 0...3
}
void in_att(){
switch(in){
case 1: vol_att = vol0;break;
case 2: vol_att = vol1;break;
}
}
void to_Timer(){newPosition = myEnc.read()/4;}