#include <IRremote.h>
#include <Wire.h>
#include <TDA8425.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>//#include <EEPROMex.h>
TDA8425 tda;
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir;
LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
byte menu,z,z0,z1,g1,g2,b1,b2,n1,n2,v1,v2,in,mute,w,w1,w2=1;
int vol,vol_d,balans,bass,bass_d,treb,treb_d;
unsigned long time,time1;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // запускаем модуль IR
lcd.begin(16, 2);
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
vol = EEPROM.read(0);// vol eeprom
bass = EEPROM.read(1);// bass eeprom
treb = EEPROM.read(2);// treb eeprom
in = EEPROM.read(3);// in eeprom
balans = EEPROM.read(4)-4;// balans eeprom
lcd.setCursor(4,0);lcd.print("TDA8425");delay(500);lcd.clear();
}
void loop() {
if ( irrecv.decode( &ir )) {delay(200);Serial.print("0x");Serial.println( ir.value,HEX);time1=millis();time=millis();w=1;w1=1;irrecv.resume();}// IR приемник
if(ir.value==0x2FDD02F){menu++;cl();if(menu>4){menu=0;}}// меню кнопка вверх 0xFF18E7
if(ir.value==0x2FD32CD){menu--;cl();if(menu==255){menu=4;}}// меню кнопка вниз 0xFF4AB5
if(ir.value==0xFFA25D){menu=0;cl();g1=0;g2=0;}// меню кнопка 1(ГРОМКОСТЬ) 0xFFA25D
if(ir.value==0xFF629D){menu=1;cl();b1=0;b2=0;}// меню кнопка 2(БАЛАНС) 0xFF629D
if(ir.value==0xFFE21D){menu=2;cl();n1=0;n2=0;}// меню кнопка 3(НЧ) 0xFFE21D
if(ir.value==0xFF22DD){menu=3;cl();v1=0;v2=0;}// меню кнопка 4(ВЧ) 0xFF22DD
if(ir.value==0xFF02FD){menu=4;cl();}// меню кнопка 5(ВЫБОР ВХОДА) 0xFF02FD
///////////////////////// громкость /////////////////////////////
if(menu==0){ // 0xFFFFFFFF - долгое нажатие любой кнопки
if(ir.value==0x2FD906F){vol++;g1=1;g2=0;cl();}// кнопка > 0xFF5AA5
if(ir.value==0xFFFFFFFF and g1==1){vol++;g2=0;cl();}// кнопка >>>>>>
if(ir.value==0x2FDF20D){vol--;g1=0;g2=1;cl();}// кнопка < 0xFF10EF
if(ir.value==0xFFFFFFFF and g2==1){vol--;g1=0;cl();}// кнопка <<<<<<
if(vol>63){vol=63;}if(vol<=16){vol=16;}
lcd.setCursor(0,0);lcd.print("Volume ");
vol_d=vol*2-120;
if(vol_d>=0){lcd.print("+");}else{lcd.print("-");}
if(vol_d>-10){{lcd.print(" ");}}
lcd.print(abs(vol_d));lcd.print(" dB ");
// ползунок громкости начинает работать с -56 дБ
if(w2==1){audio();
for(z=0,z0=0,z1=0;z<=vol-15;z++,z1++){if(z1>2){z1=0;z0++;}
if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
///////////////////////// баланс /////////////////////////////
if(menu==1){// 0xFFFFFFFF - долгое нажатие любой кнопки
if(ir.value==0x2FD906F){balans++;b1=1;b2=0;cl();}// кнопка > 0xFF5AA5
if(ir.value==0xFFFFFFFF and b1==1){balans++;b2=0;cl();}// кнопка >>>>>>
if(ir.value==0x2FDF20D){balans--;b1=0;b2=1;cl();}// кнопка < 0xFF10EF
if(ir.value==0xFFFFFFFF and b2==1){balans--;b1=0;cl();}// кнопка <<<<<<
if(balans>4){balans=4;}if(balans<-4){balans=-4;}
lcd.setCursor(0,0);
if(balans*2>=0){lcd.print("-");}else{lcd.print("+");}
lcd.print(abs(balans*2));lcd.print(" dB ");
lcd.print(" <> ");
if(balans*2>=0){lcd.print("+");}else{lcd.print("-");}
lcd.print(abs(balans*2));lcd.print(" dB ");
lcd.setCursor(0,1);lcd.print("R");
lcd.setCursor(15,1);lcd.print("L");
if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}
audio();
}
///////////////////////// тембр нч /////////////////////////////
if(menu==2){// 0xFFFFFFFF - долгое нажатие любой кнопки
if(ir.value==0x2FD906F){bass++;n1=1;n2=0;cl();}// кнопка > 0xFF5AA5
if(ir.value==0xFFFFFFFF and n1==1){bass++;n2=0;cl();}// кнопка >>>>>>
if(ir.value==0x2FDF20D){bass--;n1=0;n2=1;cl();}// кнопка < 0xFF10EF
if(ir.value==0xFFFFFFFF and n2==1){bass--;n1=0;cl();}// кнопка <<<<<<
if(bass>11){bass=11;}if(bass<2||bass==255){bass=2;}
lcd.setCursor(0,0);lcd.print("Bass ");
bass_d=bass*3-18;
if(bass_d>=0){lcd.print("+");}else{lcd.print("-");}
if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}}
lcd.print(abs(bass_d));lcd.print(" dB ");
if(bass>1){for(z=3;z<=bass+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
audio();
}
///////////////////////// тембр вч /////////////////////////////
if(menu==3){// 0xFFFFFFFF - долгое нажатие любой кнопки
if(ir.value==0x2FD906F){treb++;v1=1;v2=0;cl();}// кнопка > 0xFF5AA5
if(ir.value==0xFFFFFFFF and v1==1){treb++;v2=0;cl();}// кнопка >>>>>>
if(ir.value==0x2FDF20D){treb--;v1=0;v2=1;cl();}// кнопка < 0xFF10EF
if(ir.value==0xFFFFFFFF and v2==1){treb--;v1=0;cl();}// кнопка <<<<<<
if(treb>10){treb=10;}if(treb<2||treb==255){treb=2;}
lcd.setCursor(0,0);lcd.print("Treble ");
treb_d=treb*3-18;
if(treb_d>=0){lcd.print("+");}else{lcd.print("-");}
if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}}
lcd.print(abs(treb_d));lcd.print(" dB ");
if(treb>1){for(z=3;z<=treb+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
audio();
}
///////////////////////// input /////////////////////////////
if(menu==4){
if(ir.value==0xFF5AA5){in++;cl();}// кнопка > 0xFF5AA5
if(ir.value==0xFF10EF){in--;cl();}// кнопка < 0xFF10EF
if(in>1&&in<255){in=0;}if(in>2){in=1;}
lcd.setCursor(0,0);lcd.print("Source selector");
lcd.setCursor(0,1);lcd.print("Input: ");lcd.print(in);
audio();
}
////////////////// mute //////////////////////////////////
if(ir.value==0xFFB04F){mute++;delay(500);cl();}// кнопка # 0xFFB04F
if(mute>1){mute=0;cl();menu=0;}
if(mute==1){menu=-1;audio();lcd.setCursor(6,0);lcd.print("MUTE");}
/////////////////// -20 dB ///////////////////////////////
if(ir.value==0xFF6897){vol=vol-10;delay(500);audio();menu=0;cl();}//кнопка # 0xFF6897
if(millis()-time>10000 and w==1 and mute==0){// возврат в меню громкости через 10 сек не активности
menu=0;cl();w=0;}
if(millis()-time1>60000 and w1==1){ // eeprom запись при не активности 60 сек
EEPROM.update(0,vol);
EEPROM.update(4,balans+4);
EEPROM.update(1,bass);
EEPROM.update(2,treb);
EEPROM.update(3,in);
w1=0;}
}//loop
void cl(){ir.value=0;delay(100);lcd.clear();w2=1;}
void audio(){
tda.setVolumeL(vol+balans);
tda.setVolumeR(vol-balans);
tda.setBass(bass);
tda.setTreble(treb);
tda.setMute(mute);
tda.setSource(in);
}