Доброго времени суток, использую скетч:
#define SW 10 // pin SW ENCODER
#define CLK 9 // pin CLK ENCODER
#define DT 8 // pin CLK ENCODER
#define IR 12 // pin IR input
#include <Wire.h>
#include <TDA7419.h>
#include <EEPROM.h>
#include <Encoder.h>
#include <MsTimer2.h>
#include <IRremote.h> // http://rcl-radio.ru/wp-content/uploads/ … remote.zip
#include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?acti … download=1
Encoder myEnc(CLK, DT);
LiquidCrystal_I2C lcd(0x27,16,2);
IRrecv irrecv(IR);
TDA7419 tda;
decode_results ir;
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};
unsigned long times,oldPosition = -999,newPosition,tim;
byte a[6],d1,d2,d3,d4,d5,d6,e1,e2,e3,x;
int menu,bas,w,w1,vol_d,bass_d,treble_d,middle,middle_reg,z,in,treb,bass_reg,bass;
int gain0,gain1,gain2,gain3,gain_d,set,vol_reg,mute_reg,in_reg,treb_reg,menu0,power;
int lon, lon_f, lon_d,out,vol_out,rf,lf,rt,lt,sab,treb_c,mid_c,bas_c,sab_f,mute=1;
bool w2,w3,w4;
int tic;
void setup(){
lcd.init();lcd.backlight();Serial.begin(9600);irrecv.enableIRIn();
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(SW,INPUT);// SW ENCODER
MsTimer2::set(3, to_Timer);MsTimer2::start();
if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
vol_reg = EEPROM.read(0);treb_reg = EEPROM.read(1)-100;middle_reg = EEPROM.read(2)-100;bass_reg = EEPROM.read(3)-100;in = EEPROM.read(4);
lon_f = EEPROM.read(5);lon = EEPROM.read(6);
rf = EEPROM.read(7);lf = EEPROM.read(8);rt = EEPROM.read(9);lt = EEPROM.read(10);sab = EEPROM.read(11);
}
void loop(){
//// BUTTON ENCODER MENU MENU2 //////////////////////////////////////////////////////////
if(digitalRead(SW)==LOW && w3==0){menu++;tic++;if(menu>4){menu=0;}delay(200);times=millis();w=1;w2=1;cl();}
if(digitalRead(SW)==HIGH){tic=0;}
if(tic==4){menu=100;w3=1;lcd.setCursor(0,0);lcd.print(" МЕНЮ 2 ");delay(1500);cl();menu0=1;}
if(digitalRead(SW)==LOW && w3==1){menu0++;if(menu0>11){menu0=1;}delay(200);times=millis();w=1;w2=1;cl();}
////////////// VOLUME ///////////////////////////////////////////////////////////////////
if(menu==0){
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]= (80-vol_reg)/10;a[1]=(80-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);
}
////////////// TREBLE ///////////////////////////////////////////////////////////////////
if(menu==1){
if (newPosition != oldPosition){oldPosition = newPosition;treb_reg=treb_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();}
if(treb_reg<0){lcd.setCursor(9,0);treb=abs(treb_reg);lcd.write((uint8_t)3);}else{treb=treb_reg;lcd.setCursor(9,0);lcd.print(" ");}
a[0]= treb/10;a[1]=treb%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");
}
////////////// MIDDLE ///////////////////////////////////////////////////////////////////
if(menu==2){
if (newPosition != oldPosition){oldPosition = newPosition;middle_reg=middle_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;mid_func();audio();}
if(middle_reg<0){lcd.setCursor(9,0);middle=abs(middle_reg);lcd.write((uint8_t)3);}else{middle=middle_reg;lcd.setCursor(9,0);lcd.print(" ");}
a[0]= middle/10;a[1]=middle%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("MIDDLE");lcd.setCursor(0,1);lcd.print("CONTROL");
}
////////////// BASS ///////////////////////////////////////////////////////////////////
if(menu==3){
if (newPosition != oldPosition){oldPosition = newPosition;bass_reg=bass_reg+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();}
if(bass_reg<0){lcd.setCursor(9,0);bass=abs(bass_reg);lcd.write((uint8_t)3);}else{bass=bass_reg;lcd.setCursor(9,0);lcd.print(" ");}
a[0]= bass/10;a[1]=bass%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");
}
////////////// INPUT ///////////////////////////////////////////////////////////////////
if(menu==4){
if (newPosition != oldPosition){oldPosition = newPosition;in=in+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;in_func();audio();}
a[0]= in;
for(x=0;x<1;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("INPUT");lcd.setCursor(0,1);lcd.print("CONTROL");
}
////////////////////////////////////////////////////////////////////////////////////////
///// MENU2 ////////////////////////////////////////////////////////////////////////////
////////////// LOUDNESS ///////////////////////////////////////////////////////////////////
if(menu0==1){
if (newPosition != oldPosition){oldPosition = newPosition;lon_f=lon_f+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;lon_f_func();audio();}
lcd.setCursor(0,0);lcd.print("LOUDNESS");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
lcd.setCursor(10,0);
switch(lon_f){
case 0: lcd.print("FLAT ");break;
case 1: lcd.print("400Hz ");break;
case 2: lcd.print("800Hz ");break;
case 3: lcd.print("2400Hz");break;}
}
////////////// LOUDNESS GAIN ///////////////////////////////////////////////////////////////////
if(menu0==2){
if (newPosition != oldPosition){oldPosition = newPosition;lon=lon+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;lon_func();audio();}
a[0]= lon/10;a[1]=lon%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("LOUDNESS");lcd.setCursor(0,1);lcd.print("GAIN");
}
//////////////// TREBLE FREQ /////////////////////////////////////////////////////////////////////
if(menu0==3){
if (newPosition != oldPosition){oldPosition = newPosition;treb_c=treb_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_c_func();audio();}
lcd.setCursor(0,0);lcd.print("TREBLE");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
lcd.setCursor(8,0);
switch(treb_c){
case 0: lcd.print("10.0 kHz");break;
case 1: lcd.print("12.5 kHz");break;
case 2: lcd.print("15.0 kHz");break;
case 3: lcd.print("17.5 kHz");break;}
}
//////////////// MIDDLE FREQ /////////////////////////////////////////////////////////////////////
if(menu0==4){
if (newPosition != oldPosition){oldPosition = newPosition;mid_c=mid_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;mid_c_func();audio();}
lcd.setCursor(0,0);lcd.print("MIDDLE");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
lcd.setCursor(9,0);
switch(mid_c){
case 0: lcd.print("0.5 kHz");break;
case 1: lcd.print("1.0 kHz");break;
case 2: lcd.print("1.5 kHz");break;
case 3: lcd.print("2.5 kHz");break;}
}
//////////////// BASS FREQ /////////////////////////////////////////////////////////////////////
if(menu0==5){
if (newPosition != oldPosition){oldPosition = newPosition;bas_c=bas_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bas_c_func();audio();}
lcd.setCursor(0,0);lcd.print("BASS");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
lcd.setCursor(9,0);
switch(bas_c){
case 0: lcd.print("60 Hz");break;
case 1: lcd.print("80 Hz");break;
case 2: lcd.print("100 Hz");break;
case 3: lcd.print("200 Hz");break;}
}
//////////////// SUBWOOFER FREQ /////////////////////////////////////////////////////////////////////
if(menu0==6){
if (newPosition != oldPosition){oldPosition = newPosition;sab_f=sab_f+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;sab_f_func();audio();}
lcd.setCursor(0,0);lcd.print("SUBWOOFER");lcd.setCursor(0,1);lcd.print("CENTER FREQUENCY");
lcd.setCursor(10,0);
switch(sab_f){
case 0: lcd.print("FLAT ");break;
case 1: lcd.print("80 Hz");break;
case 2: lcd.print("120 Hz");break;
case 3: lcd.print("160 Hz");break;}
}
////////////// RF GAIN ///////////////////////////////////////////////////////////////////
if(menu0==7){
if (newPosition != oldPosition){oldPosition = newPosition;rf=rf+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;rf_func();audio();}
a[0]= rf/10;a[1]=rf%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("RF_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
}
////////////// LF GAIN ///////////////////////////////////////////////////////////////////
if(menu0==8){
if (newPosition != oldPosition){oldPosition = newPosition;lf=lf+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;lf_func();audio();}
a[0]= lf/10;a[1]=lf%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("LF_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
}
////////////// RT GAIN ///////////////////////////////////////////////////////////////////
if(menu0==9){
if (newPosition != oldPosition){oldPosition = newPosition;rt=rt+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;rt_func();audio();}
a[0]= rt/10;a[1]=rt%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("RT_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
}
////////////// LT GAIN ///////////////////////////////////////////////////////////////////
if(menu0==10){
if (newPosition != oldPosition){oldPosition = newPosition;lt=lt+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;lt_func();audio();}
a[0]= lt/10;a[1]=lt%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("LT_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
}
////////////// SAB GAIN ///////////////////////////////////////////////////////////////////
if(menu0==11){
if (newPosition != oldPosition){oldPosition = newPosition;sab=sab+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;sab_func();audio();}
a[0]= sab/10;a[1]=sab%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("SAB_OUT");lcd.setCursor(0,1);lcd.print("GAIN");
}
//// EEPROM ///////////////////////////////////////
if(millis()-times>5000 && w==1 && mute==1 && power==0){
EEPROM.update(0,vol_reg);EEPROM.update(1,treb_reg+100);EEPROM.update(2,middle_reg+100);EEPROM.update(3,bass_reg+100);EEPROM.update(4,in);
EEPROM.update(5,lon_f);EEPROM.update(6,lon);
EEPROM.update(7,rf);EEPROM.update(8,lf);EEPROM.update(9,rt);EEPROM.update(10,lt);EEPROM.update(11,sab);
menu=0;menu0=100;w=0;w2=1;w3=0;tic=0;cl();
}
}// END LOOP
void rf_func(){if(rf>15){rf=15;}if(rf<0){rf=0;}}
void lf_func(){if(lf>15){lf=15;}if(lf<0){lf=0;}}
void rt_func(){if(rt>15){rt=15;}if(rt<0){rt=0;}}
void lt_func(){if(lt>15){lt=15;}if(lt<0){lt=0;}}
void sab_func(){if(sab>15){sab=15;}if(sab<0){sab=0;}}
void sab_f_func(){if(sab_f>3){sab_f=3;}if(sab_f<0){sab_f=0;}}
void bas_c_func(){if(bas_c>3){bas_c=3;}if(bas_c<0){bas_c=0;}}
void mid_c_func(){if(mid_c>3){mid_c=3;}if(mid_c<0){mid_c=0;}}
void treb_c_func(){if(treb_c>3){treb_c=3;}if(treb_c<0){treb_c=0;}}
void lon_func(){if(lon>15){lon=15;}if(lon<0){lon=0;}}
void lon_f_func(){if(lon_f>3){lon_f=3;}if(lon_f<0){lon_f=0;}}
void in_func(){if(in>3){in=3;}if(in<1){in=1;}}
void bass_func(){if(bass_reg>15){bass_reg=15;}if(bass_reg<-15){bass_reg=-15;}}
void mid_func(){if(middle_reg>15){middle_reg=15;}if(middle_reg<-15){middle_reg=-15;}}
void vol_func(){if(vol_reg>79){vol_reg=79;}if(vol_reg<0){vol_reg=0;}}
void treb_func(){if(treb_reg>15){treb_reg=15;}if(treb_reg<-15){treb_reg=-15;}}
void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);}
void audio(){
tda.setInput(in,gain0,0); //вх1=1, вх2=2, вх3=3
tda.setInput2(0,0,0); // не используется
tda.setAtt_loudness(lon,lon_f,0,0);
tda.setSoft(mute,0,0,0,0);//mute off (не менять)
tda.setVolume(vol_reg-79,0); // общая громкость от 0 до 79 макс
tda.setAtt_LF(64+lf,0); // гром. лк фронт
tda.setAtt_RF(64+rf,0); // гром. пк фронт
tda.setAtt_LT(64+lt,0); // гром. лк тыл
tda.setAtt_RT(64+rt,0); // гром. пк тыл
tda.setAtt_SUB(64+sab,0); // гром. савбуфер
tda.setAtt_Mix(79,0); // не использует
tda.setFilter_Treble(treb_reg,treb_c,0);
tda.setFilter_Middle(middle_reg,0,0);
tda.setFilter_Bass(bass_reg,0,0);
tda.setSub_M_B(sab_f,mid_c,bas_c,0,0);
tda.setMix_Gain_Eff(1,0,0,0,0); // не используется
tda.setSpektor(0,0,1,0,1,0,0);
}
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);}
спасибо автору за труды, чуть ли единственный в этой области.
данный скетч один, который запустился без зависания наглухо ардуинки)))). Не проверял полноценно на полностью собранной системе, как отрабатывает процессор и как в общем звучит, гонял меню все четко на первый взгляд и хотелось бы попросить о возможности добавить 2 физические кнопки: STANDBY и MUTE, так же более заинтересовал второй вариант отображения, со шкалой которая. За что отвечают 8 байтов в начале скетча? эту строчку: if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении, как я понял уже можно удалить и обновить скетч, так как первое включение в принципе произошло(при выключении ардуинки данные сбрасываются изза этого ведь, если ее вновь включаешь?)