26

Re: TDA7313 + DS3231 + IR + LCD2004

строку
  if(digitalRead(10)==LOW&&menu0==0){menu++;delay(200);time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0

замените на

  if(digitalRead(10)==LOW&&menu0==0){menu++;delay(200);time0=millis();save=1;in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0

27

Re: TDA7313 + DS3231 + IR + LCD2004

внес поправку save=1 в эту строку,

if(digitalRead(10)==LOW&&menu0==1){menu1++;delay(200);time0=millis();save=1;in_x=0;w=1;if(menu1>6){menu1=0;}}// меню 1

была такая же беда...
пока все работает нормально

28 (2022-06-03 08:10:39 отредактировано sanj76a)

Re: TDA7313 + DS3231 + IR + LCD2004

можно ли этот скетч залить в Atmega 8  или просто в Atmega328

29

Re: TDA7313 + DS3231 + IR + LCD2004

Памяти не хватит в atmega8

30 (2022-06-03 08:18:17 отредактировано sanj76a)

Re: TDA7313 + DS3231 + IR + LCD2004

а как в Atmega328P-PU

31

Re: TDA7313 + DS3231 + IR + LCD2004

Atmega328 подойдет, проблем не будет.

32 (2022-06-07 13:36:53 отредактировано sanj76a)

Re: TDA7313 + DS3231 + IR + LCD2004

http://forum.rcl-radio.ru/uploads/images/2022/06/31b5cecc4e35f5da05b4deee78ef4b6e.jpg
Есть такой модуль

33

Re: TDA7313 + DS3231 + IR + LCD2004

http://forum.rcl-radio.ru/uploads/images/2022/06/4c1606115b6cfc54bf90cc56a3827e40.jpg 
Измените пожалуйста в скетче,
чтоб при включении канала 1, была надпись блютуз модуль и на одном из выводов появлялось 5в для питания модуля, при переходе на другой канал 5в отключалось

34

Re: TDA7313 + DS3231 + IR + LCD2004

Опубликуйте скетч со всеми Вашими изменениями.

35

Re: TDA7313 + DS3231 + IR + LCD2004

почему-то не могу вставить текст скетча.
Из Arduino 1.8.19 копирую текст, при попытке пишет:

-вложение тега  ...  в самого себя невозможно

36

Re: TDA7313 + DS3231 + IR + LCD2004

[code ]скетч[/code ]

37 (2022-06-09 00:37:24 отредактировано sanj76a)

Re: TDA7313 + DS3231 + IR + LCD2004

[code ]скетч[/code ]

что это значит? Раньше такого гемороя не было

38 (2022-06-09 00:54:27 отредактировано sanj76a)

Re: TDA7313 + DS3231 + IR + LCD2004

скетч тот же что и был (последний) с вашими изменениями, только я добавил: save=1 в меню 1

if(digitalRead(10)==LOW&&menu0==1){menu1++;delay(200);time0=millis();save=1;in_x=0;w=1;if(menu1>6){menu1=0;}}// меню 1

39

Re: TDA7313 + DS3231 + IR + LCD2004

выход А0 - управление блютуз
В железе не проверял

#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B850AF // Кнопка IN
#define IR_6 0x33B844BB // Кнопка SET
#define IR_7 0x33B8946B // Кнопка MUTE
#define IR_8 0x33B800FF // Кнопка STANDBY (POWER)

#include <Wire.h> 
#include <TDA7313.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/TDA7313-1.zip
#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
#include <DS3231.h>
   DS3231 clock;RTCDateTime DateTime;
   TDA7313 tda;
   LiquidCrystal_I2C lcd(0x27,20,4);  // Устанавливаем дисплей
   IRrecv irrecv(12); // указываем вывод модуля IR приемника
   Encoder myEnc(9, 8);// DT, CLK
   decode_results ir; 
      int menu,menu0,menu1,vol,bass,treb,in,balans,balans_d,vol_d,bass_d,treb_d,temp0,par,hour,minut,secon,z_old,gain0,loud;
      int gain1,gain2,gain3,brig0,brig1;
      byte w2[4],z,z0,z1,n,q,gr1,gr2,www,i,w,mute,power,in_x,save,i1,power_on=1;
      unsigned long time0,oldPosition  = -999,newPosition,times_in;
      int att_lr,att_rr,att_lf,att_rf;
      byte mesto2[7]={0,10,0,10,6,0,10};
      byte mesto3[7]={0,0,1,1,2,3,3};

void setup() {
  irrecv.enableIRIn();lcd.init();lcd.backlight();clock.begin();Serial.begin(9600);
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА IN
  pinMode(4,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(5,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(7,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ STANDBY
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(A0,OUTPUT); // ВЫХОД УПРАВЛЕНИЯ BL
  analogWrite(6, 200);// больше 200 не делать
  lcd.setCursor(3,1);lcd.print("Sound Processor");lcd.setCursor(7,2);lcd.print("TDA7313"); delay(3000);lcd.clear();
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  vol = EEPROM.read(0);treb = EEPROM.read(1)-7;bass = EEPROM.read(2)-7;in = EEPROM.read(3);
  gain1 = EEPROM.read(6);gain2 = EEPROM.read(7);
  att_lr = EEPROM.read(20);att_rr = EEPROM.read(21);att_lf = EEPROM.read(22);att_rf = EEPROM.read(23);
  gain3 = EEPROM.read(8);loud = EEPROM.read(10);brig0 = EEPROM.read(11);brig1 = EEPROM.read(12);
  switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
  w2_arr();audio();cl();
  analogWrite(6, 25*brig0);
}

void loop() {
  if(in==0){digitalWrite(A0,HIGH);}else{digitalWrite(A0,LOW);}
  DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;

/////////////////////////////// УПРАВЛЕНИЕ //////////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time0=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

  if(mute==0&&power==0){ 
  if(ir.value==IR_2&&menu0==0){menu++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}//меню 1
  if(ir.value==IR_1&&menu0==0){menu--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu<0){menu=2;}}//меню 1
 
  if(ir.value==IR_2&&menu0==1){menu1++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}//меню 2
  if(ir.value==IR_1&&menu0==1){menu1--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1<0){menu1=6;}}//меню 2
    
  if(digitalRead(10)==LOW&&menu0==0){menu++;delay(200);time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0
  if(digitalRead(10)==LOW&&menu0==1){menu1++;delay(200);time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}// меню 1
  
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==0){menu0=1;cl();in_x=0;save=1;time0=millis();w=1;lcd.setCursor(6,1);lcd.print("SETTING"); delay(2000);lcd.clear();}
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==1){menu0=0;menu=0;cl();in_x=0;w2_arr();time0=millis();w=1;lcd.setCursor(8,1);lcd.print("MENU"); delay(2000);lcd.clear();}
  
  if(ir.value==IR_5||digitalRead(3)==LOW){in++;cl();time0=millis();times_in=millis();in_x=1;w=1;www=1;menu0=100;menu=100;if(in>2){in=0;}}// IN
  }
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==0&&power==0){mute=1;in_x=0;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      menu0=100;cl();w=1;w2_arr();lcd.setCursor(8,1);lcd.print("MUTE");delay(300);}// mute on
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==1&&power==0){mute=0;cl();time0=millis();w=1;w2_arr();menu0=0;menu=0;myEnc.write(0);audio();}// mute off

  if(((ir.value==IR_8||digitalRead(5)==LOW)&&power==0)||power_on==1){power=1;in_x=0;power_on=0;save=1;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      cl();lcd.setCursor(5,1);lcd.print("POWER  OFF");menu0=100;delay(3000);analogWrite(6, brig1*25);}// power off
  if((ir.value==IR_8||digitalRead(5)==LOW)&&power==1){power=0;analogWrite(6, brig0*25);lcd.clear();lcd.setCursor(5,1);lcd.print("POWER   ON ");w=1;w2_arr();menu0=0;myEnc.write(0);audio();delay(3000);cl();}// power on

if(power==0){digitalWrite(7,HIGH);
   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 a4[8] = {0b10000,0b11000,0b11100,0b11110,0b11100,0b11000,0b10000,0b00000}; //>
   byte a5[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(3,a4);lcd.createChar(4,a5);
  }
  if(power==1){digitalWrite(7,LOW);
      byte v1[8] = {7,7,7,7,7,7,7,7};
      byte v2[8] = {7,7,0, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 28, 28, 0, 0, 0, 0, 28, 28};
      byte v6[8] = {28,28,28,28,28,28,28,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 0,7,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
   byte a[6];
   byte i0,d1,d2,d3,d4,d5,d6,e1,e2,e3;
  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);
  
     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(i=0;i<6;i++){
      switch(i){
        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;
        case 4: e1=14,e2=15,e3=16;break;
        case 5: e1=17,e2=18,e3=19;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);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  if(digitalRead(10)==LOW&&digitalRead(2)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100);}    // SET
  if(digitalRead(10)==LOW&&digitalRead(3)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }// IN
  if(digitalRead(10)==LOW&&digitalRead(4)==LOW){secon=0; clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }                      // MUTE
  } 

 /////////////////////////////// MENU0 = VOLUME TERBLE BASS BALANCE ///////////////////////////////////////////////////////////////////////
  if(menu0==0){ 
    switch(menu){
      case 0: temp0 = vol;q=0;break;
      case 1: temp0 = bass;q=1;break;
      case 2: temp0 = treb;q=2;break;}
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка <<<<<<   
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;w2[q]=1;www=1;} 
 
     switch(menu){
      case 0: vol = temp0;vol_func();break;
      case 1: bass = temp0;bass_func();break;
      case 2: treb = temp0;treb_func();break;}
 
   au();
   for(i=0;i<3;i++){if(menu==i){lcd.setCursor(0,i);lcd.write((uint8_t)3);}else{lcd.setCursor(0,i);lcd.print(" ");}}
   lcd.setCursor(1,0);lcd.print("VOLUME ");if(vol>=0){lcd.print(" ");}lcd.print(vol);lcd.print(" ");vol_d=map(vol,0,63,1,24);
   lcd.setCursor(1,1);lcd.print("BASS   ");if(bass>=0){lcd.print(" ");}lcd.print(bass);lcd.print(" ");bass_d=map(bass,-7,7,1,24);
   lcd.setCursor(1,2);lcd.print("TREBLE ");if(treb>=0){lcd.print(" ");}lcd.print(treb);lcd.print(" ");treb_d=map(treb,-7,7,1,24);
   lcd.setCursor(1,3);lcd.print("INPUT  ");if(in==0){lcd.print("BL");}else{lcd.print(in+1);}lcd.print("  ");
   lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
   lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);

   for(n=0;n<3;n++){if(w2[n]==1){
   switch(n){
    case 0: par = vol_d;break;
    case 1: par = bass_d;break;
    case 2: par = treb_d;break;} 
   
   for(z=0,z0=0,z1=0;z<=par;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+12,n);lcd.write((uint8_t)0);lcd.setCursor(z0+1+12,n);Serial.println(z0);z_old=7-par/3;while(z_old>0){z_old=z_old-1;lcd.write((uint8_t)4);}}}
   if(z1==3){lcd.setCursor(z0+12,n);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+12,n);lcd.write((uint8_t)2);}w2[n]=0;}
   }}// menu0 = 0
///////////////////////////////////////////////////////////////////////////////////////////////

 if(menu0==1){
     switch(menu1){
      case 0: temp0 = att_lr;break;
      case 1: temp0 = att_rr;break;
      case 2: temp0 = att_lf;break;
      case 3: temp0 = att_rf;break;
      case 4: temp0 = loud;break;
      case 5: temp0 = brig0;break;
      case 6: temp0 = brig1;break;
      }
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;www=1;}// кнопка <<<<<<     
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;www=1;} 
 
     switch(menu1){
      case 0: att_lr = temp0;att_lr_func();break;
      case 1: att_rr = temp0;att_rr_func();break;
      case 2: att_lf = temp0;att_lf_func();break;
      case 3: att_rf = temp0;att_rf_func();break;      
      case 4: loud  = temp0;loud_func();break;
      case 5: brig0  = temp0;brig0_func();break;
      case 6: brig1  = temp0;brig1_func();break;
      }
 
  au();analogWrite(6, brig0*25);
  for(i=0;i<7;i++){if(menu1==i){lcd.setCursor(mesto2[i],mesto3[i]);lcd.write((uint8_t)3);}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("ATT_LR ");lcd.print(att_lr);lcd.print(" ");lcd.setCursor(11,0);lcd.print("ATT_RR ");lcd.print(att_rr);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("ATT_LF ");lcd.print(att_lf);lcd.print(" ");lcd.setCursor(11,1);lcd.print("ATT_RF ");lcd.print(att_rf);lcd.print(" ");
  lcd.setCursor(7,2);lcd.print("LOUD ");if(loud==0){lcd.print("OFF");}else{lcd.print("ON ");}
  lcd.setCursor(1,3);lcd.print("BRIG_1 ");lcd.print(brig0);lcd.print(" ");lcd.setCursor(11,3);lcd.print("BRIG_2 ");lcd.print(brig1);
  
 } // menu0 = 1


////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu0=100;
   switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
 
     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <<<<<<  
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time0=millis();times_in=millis();www=1;w=1;gain_func();} 
 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     }
 
  au();
  lcd.setCursor(5,1);if(in==0){lcd.print("Gain BL   ");}else{lcd.print("Gain IN ");lcd.print(in+1);lcd.print(" ");}lcd.setCursor(6,2);lcd.print(float(gain0*3.75));lcd.print(" ");lcd.print("dB ");
   }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

if(millis()-time0>10000&&w==1&&mute==0&&power==0){if(menu0==1){cl();}w=0;menu0=0;menu=0;w2_arr();}
if(millis()-times_in>3000&&w==1&&in_x==1&&mute==0&&power==0){time0=millis();w=0;in_x=0;menu0=0;menu=0;w2_arr();cl();}

if(save==1){save=0;
     EEPROM.update(0,vol);EEPROM.update(1,treb+7);EEPROM.update(2,bass+7);EEPROM.update(3,in);
     EEPROM.update(6,gain1);EEPROM.update(7,gain2);EEPROM.update(8,gain3);
     EEPROM.update(20,att_lr);EEPROM.update(21,att_rr);EEPROM.update(22,att_lf);EEPROM.update(23,att_rf);
     EEPROM.update(10,loud);EEPROM.update(11,brig0);EEPROM.update(12,brig1);}
            
}// loop

void brig1_func(){if(brig1>8){brig1=8;}if(brig1<0){brig1=0;}}
void brig0_func(){if(brig0>8){brig0=8;}if(brig0<0){brig0=0;}}
void w2_arr(){w2[0]=1;w2[1]=1;w2[2]=1;w2[3]=1;}
void au(){if(www==1){audio();www=0;}}

void in_func(){if(in>2){in=2;}if(in<0){in=0;}}
void loud_func(){if(loud<0){loud=0;}if(loud>1){loud=1;}}
void gain_func(){if(gain0<0){gain0=0;}if(gain0>3){gain0=3;}}
void att_lr_func(){if(att_lr<0){att_lr=0;}if(att_lr>31){att_lr=31;}}
void att_rr_func(){if(att_rr<0){att_rr=0;}if(att_rr>31){att_rr=31;}}
void att_lf_func(){if(att_lf<0){att_lf=0;}if(att_lf>31){att_lf=31;}}
void att_rf_func(){if(att_rf<0){att_rf=0;}if(att_rf>31){att_rf=31;}}
void vol_func(){if(vol<0){vol=0;}if(vol>63){vol=63;}}
void treb_func(){if(treb<-7){treb=-7;}if(treb>7){treb=7;}}
void bass_func(){if(bass<-7){bass=-7;}if(bass>7){bass=7;}}

void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);}  
void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(att_lr);   // аттенюатор LR 0...31
  tda.setAttRR(att_rr);   // аттенюатор RR 0...31
  tda.setAttLF(att_lf);   // аттенюатор LF 0...31
  tda.setAttRF(att_rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain0); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(bass);    // тембр НЧ -7...+7
  tda.setTreble(treb);  // тембр ВЧ -7...+7
}

void to_Timer(){newPosition = myEnc.read()/4;}  

40 (2022-06-10 18:42:32 отредактировано sanj76a)

Re: TDA7313 + DS3231 + IR + LCD2004

В режиме GAIN 1, при Power off питание не снимается с А0, при Выкл. Вкл. общего питания на А0 остаётся 5в.
При GAIN 2,3 питание с модуля снимается.
http://forum.rcl-radio.ru/uploads/images/2022/06/944936e043e7a8b34fba41cf0e02d822.jpg

41

Re: TDA7313 + DS3231 + IR + LCD2004

В режиме GAIN 1, при Power off питание не снимается с А0, при Выкл. Вкл. общего питания на А0 остаётся 5в.
При GAIN 2,3 питание с модуля снимается.

Поправил:

#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B850AF // Кнопка IN
#define IR_6 0x33B844BB // Кнопка SET
#define IR_7 0x33B8946B // Кнопка MUTE
#define IR_8 0x33B800FF // Кнопка STANDBY (POWER)

#include <Wire.h> 
#include <TDA7313.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/TDA7313-1.zip
#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
#include <DS3231.h>             // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=1754&download=1
   DS3231 clock;RTCDateTime DateTime;
   TDA7313 tda;
   LiquidCrystal_I2C lcd(0x27,20,4);  // Устанавливаем дисплей
   IRrecv irrecv(12); // указываем вывод модуля IR приемника
   Encoder myEnc(9, 8);// DT, CLK
   decode_results ir; 
      int menu,menu0,menu1,vol,bass,treb,in,balans,balans_d,vol_d,bass_d,treb_d,temp0,par,hour,minut,secon,z_old,gain0,loud;
      int gain1,gain2,gain3,brig0,brig1;
      byte w2[4],z,z0,z1,n,q,gr1,gr2,www,i,w,mute,power,in_x,save,i1,power_on=1;
      unsigned long time0,oldPosition  = -999,newPosition,times_in;
      int att_lr,att_rr,att_lf,att_rf;
      byte mesto2[7]={0,10,0,10,6,0,10};
      byte mesto3[7]={0,0,1,1,2,3,3};

void setup() {
  irrecv.enableIRIn();lcd.init();lcd.backlight();clock.begin();Serial.begin(9600);
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА IN
  pinMode(4,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(5,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(7,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ STANDBY
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(A0,OUTPUT); // ВЫХОД УПРАВЛЕНИЯ BL
  analogWrite(6, 200);// больше 200 не делать
  lcd.setCursor(3,1);lcd.print("Sound Processor");lcd.setCursor(7,2);lcd.print("TDA7313"); delay(3000);lcd.clear();
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  vol = EEPROM.read(0);treb = EEPROM.read(1)-7;bass = EEPROM.read(2)-7;in = EEPROM.read(3);
  gain1 = EEPROM.read(6);gain2 = EEPROM.read(7);
  att_lr = EEPROM.read(20);att_rr = EEPROM.read(21);att_lf = EEPROM.read(22);att_rf = EEPROM.read(23);
  gain3 = EEPROM.read(8);loud = EEPROM.read(10);brig0 = EEPROM.read(11);brig1 = EEPROM.read(12);
  switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
  w2_arr();audio();cl();
  analogWrite(6, 25*brig0);
}

void loop() {
  if(in==0&&power==0){digitalWrite(A0,HIGH);}else{digitalWrite(A0,LOW);}
  DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;

/////////////////////////////// УПРАВЛЕНИЕ //////////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time0=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

  if(mute==0&&power==0){ 
  if(ir.value==IR_2&&menu0==0){menu++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}//меню 1
  if(ir.value==IR_1&&menu0==0){menu--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu<0){menu=2;}}//меню 1
 
  if(ir.value==IR_2&&menu0==1){menu1++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}//меню 2
  if(ir.value==IR_1&&menu0==1){menu1--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1<0){menu1=6;}}//меню 2
    
  if(digitalRead(10)==LOW&&menu0==0){menu++;delay(200);time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0
  if(digitalRead(10)==LOW&&menu0==1){menu1++;delay(200);time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}// меню 1
  
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==0){menu0=1;cl();in_x=0;save=1;time0=millis();w=1;lcd.setCursor(6,1);lcd.print("SETTING"); delay(2000);lcd.clear();}
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==1){menu0=0;menu=0;cl();in_x=0;w2_arr();time0=millis();w=1;lcd.setCursor(8,1);lcd.print("MENU"); delay(2000);lcd.clear();}
  
  if(ir.value==IR_5||digitalRead(3)==LOW){in++;cl();time0=millis();times_in=millis();in_x=1;w=1;www=1;menu0=100;menu=100;if(in>2){in=0;}}// IN
  }
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==0&&power==0){mute=1;in_x=0;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      menu0=100;cl();w=1;w2_arr();lcd.setCursor(8,1);lcd.print("MUTE");delay(300);}// mute on
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==1&&power==0){mute=0;cl();time0=millis();w=1;w2_arr();menu0=0;menu=0;myEnc.write(0);audio();}// mute off

  if(((ir.value==IR_8||digitalRead(5)==LOW)&&power==0)||power_on==1){power=1;in_x=0;power_on=0;save=1;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      cl();lcd.setCursor(5,1);lcd.print("POWER  OFF");menu0=100;delay(3000);analogWrite(6, brig1*25);}// power off
  if((ir.value==IR_8||digitalRead(5)==LOW)&&power==1){power=0;analogWrite(6, brig0*25);lcd.clear();lcd.setCursor(5,1);lcd.print("POWER   ON ");w=1;w2_arr();menu0=0;myEnc.write(0);audio();delay(3000);cl();}// power on

if(power==0){digitalWrite(7,HIGH);
   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 a4[8] = {0b10000,0b11000,0b11100,0b11110,0b11100,0b11000,0b10000,0b00000}; //>
   byte a5[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(3,a4);lcd.createChar(4,a5);
  }
  if(power==1){digitalWrite(7,LOW);
      byte v1[8] = {7,7,7,7,7,7,7,7};
      byte v2[8] = {7,7,0, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 28, 28, 0, 0, 0, 0, 28, 28};
      byte v6[8] = {28,28,28,28,28,28,28,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 0,7,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
   byte a[6];
   byte i0,d1,d2,d3,d4,d5,d6,e1,e2,e3;
  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);
  
     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(i=0;i<6;i++){
      switch(i){
        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;
        case 4: e1=14,e2=15,e3=16;break;
        case 5: e1=17,e2=18,e3=19;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);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  if(digitalRead(10)==LOW&&digitalRead(2)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100);}    // SET
  if(digitalRead(10)==LOW&&digitalRead(3)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }// IN
  if(digitalRead(10)==LOW&&digitalRead(4)==LOW){secon=0; clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }                      // MUTE
  } 

 /////////////////////////////// MENU0 = VOLUME TERBLE BASS BALANCE ///////////////////////////////////////////////////////////////////////
  if(menu0==0){ 
    switch(menu){
      case 0: temp0 = vol;q=0;break;
      case 1: temp0 = bass;q=1;break;
      case 2: temp0 = treb;q=2;break;}
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка <<<<<<   
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;w2[q]=1;www=1;} 
 
     switch(menu){
      case 0: vol = temp0;vol_func();break;
      case 1: bass = temp0;bass_func();break;
      case 2: treb = temp0;treb_func();break;}
 
   au();
   for(i=0;i<3;i++){if(menu==i){lcd.setCursor(0,i);lcd.write((uint8_t)3);}else{lcd.setCursor(0,i);lcd.print(" ");}}
   lcd.setCursor(1,0);lcd.print("VOLUME ");if(vol>=0){lcd.print(" ");}lcd.print(vol);lcd.print(" ");vol_d=map(vol,0,63,1,24);
   lcd.setCursor(1,1);lcd.print("BASS   ");if(bass>=0){lcd.print(" ");}lcd.print(bass);lcd.print(" ");bass_d=map(bass,-7,7,1,24);
   lcd.setCursor(1,2);lcd.print("TREBLE ");if(treb>=0){lcd.print(" ");}lcd.print(treb);lcd.print(" ");treb_d=map(treb,-7,7,1,24);
   lcd.setCursor(1,3);lcd.print("INPUT  ");if(in==0){lcd.print("BL");}else{lcd.print(in+1);}lcd.print("  ");
   lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
   lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);

   for(n=0;n<3;n++){if(w2[n]==1){
   switch(n){
    case 0: par = vol_d;break;
    case 1: par = bass_d;break;
    case 2: par = treb_d;break;} 
   
   for(z=0,z0=0,z1=0;z<=par;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+12,n);lcd.write((uint8_t)0);lcd.setCursor(z0+1+12,n);Serial.println(z0);z_old=7-par/3;while(z_old>0){z_old=z_old-1;lcd.write((uint8_t)4);}}}
   if(z1==3){lcd.setCursor(z0+12,n);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+12,n);lcd.write((uint8_t)2);}w2[n]=0;}
   }}// menu0 = 0
///////////////////////////////////////////////////////////////////////////////////////////////

 if(menu0==1){
     switch(menu1){
      case 0: temp0 = att_lr;break;
      case 1: temp0 = att_rr;break;
      case 2: temp0 = att_lf;break;
      case 3: temp0 = att_rf;break;
      case 4: temp0 = loud;break;
      case 5: temp0 = brig0;break;
      case 6: temp0 = brig1;break;
      }
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;www=1;}// кнопка <<<<<<     
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;www=1;} 
 
     switch(menu1){
      case 0: att_lr = temp0;att_lr_func();break;
      case 1: att_rr = temp0;att_rr_func();break;
      case 2: att_lf = temp0;att_lf_func();break;
      case 3: att_rf = temp0;att_rf_func();break;      
      case 4: loud  = temp0;loud_func();break;
      case 5: brig0  = temp0;brig0_func();break;
      case 6: brig1  = temp0;brig1_func();break;
      }
 
  au();analogWrite(6, brig0*25);
  for(i=0;i<7;i++){if(menu1==i){lcd.setCursor(mesto2[i],mesto3[i]);lcd.write((uint8_t)3);}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("ATT_LR ");lcd.print(att_lr);lcd.print(" ");lcd.setCursor(11,0);lcd.print("ATT_RR ");lcd.print(att_rr);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("ATT_LF ");lcd.print(att_lf);lcd.print(" ");lcd.setCursor(11,1);lcd.print("ATT_RF ");lcd.print(att_rf);lcd.print(" ");
  lcd.setCursor(7,2);lcd.print("LOUD ");if(loud==0){lcd.print("OFF");}else{lcd.print("ON ");}
  lcd.setCursor(1,3);lcd.print("BRIG_1 ");lcd.print(brig0);lcd.print(" ");lcd.setCursor(11,3);lcd.print("BRIG_2 ");lcd.print(brig1);
  
 } // menu0 = 1


////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu0=100;
   switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
 
     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <<<<<<  
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time0=millis();times_in=millis();www=1;w=1;gain_func();} 
 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     }
 
  au();
  lcd.setCursor(5,1);if(in==0){lcd.print("Gain BL   ");}else{lcd.print("Gain IN ");lcd.print(in+1);lcd.print(" ");}lcd.setCursor(6,2);lcd.print(float(gain0*3.75));lcd.print(" ");lcd.print("dB ");
   }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

if(millis()-time0>10000&&w==1&&mute==0&&power==0){if(menu0==1){cl();}w=0;menu0=0;menu=0;w2_arr();}
if(millis()-times_in>3000&&w==1&&in_x==1&&mute==0&&power==0){time0=millis();w=0;in_x=0;menu0=0;menu=0;w2_arr();cl();}

if(save==1){save=0;
     EEPROM.update(0,vol);EEPROM.update(1,treb+7);EEPROM.update(2,bass+7);EEPROM.update(3,in);
     EEPROM.update(6,gain1);EEPROM.update(7,gain2);EEPROM.update(8,gain3);
     EEPROM.update(20,att_lr);EEPROM.update(21,att_rr);EEPROM.update(22,att_lf);EEPROM.update(23,att_rf);
     EEPROM.update(10,loud);EEPROM.update(11,brig0);EEPROM.update(12,brig1);}
            
}// loop

void brig1_func(){if(brig1>8){brig1=8;}if(brig1<0){brig1=0;}}
void brig0_func(){if(brig0>8){brig0=8;}if(brig0<0){brig0=0;}}
void w2_arr(){w2[0]=1;w2[1]=1;w2[2]=1;w2[3]=1;}
void au(){if(www==1){audio();www=0;}}

void in_func(){if(in>2){in=2;}if(in<0){in=0;}}
void loud_func(){if(loud<0){loud=0;}if(loud>1){loud=1;}}
void gain_func(){if(gain0<0){gain0=0;}if(gain0>3){gain0=3;}}
void att_lr_func(){if(att_lr<0){att_lr=0;}if(att_lr>31){att_lr=31;}}
void att_rr_func(){if(att_rr<0){att_rr=0;}if(att_rr>31){att_rr=31;}}
void att_lf_func(){if(att_lf<0){att_lf=0;}if(att_lf>31){att_lf=31;}}
void att_rf_func(){if(att_rf<0){att_rf=0;}if(att_rf>31){att_rf=31;}}
void vol_func(){if(vol<0){vol=0;}if(vol>63){vol=63;}}
void treb_func(){if(treb<-7){treb=-7;}if(treb>7){treb=7;}}
void bass_func(){if(bass<-7){bass=-7;}if(bass>7){bass=7;}}

void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);}  
void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(att_lr);   // аттенюатор LR 0...31
  tda.setAttRR(att_rr);   // аттенюатор RR 0...31
  tda.setAttLF(att_lf);   // аттенюатор LF 0...31
  tda.setAttRF(att_rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain0); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(bass);    // тембр НЧ -7...+7
  tda.setTreble(treb);  // тембр ВЧ -7...+7
}

void to_Timer(){newPosition = myEnc.read()/4;}  

42

Re: TDA7313 + DS3231 + IR + LCD2004

Загрузите I2C сканер, посмотрите адреса уст-в- http://forum.rcl-radio.ru/viewtopic.php?id=64

43

Re: TDA7313 + DS3231 + IR + LCD2004

Замените библиотеку DS3231 на новую - Данный контент доступен только зарегистрированным пользователям.

44

Re: TDA7313 + DS3231 + IR + LCD2004

подергал контакты....заработало

45

Re: TDA7313 + DS3231 + IR + LCD2004

#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B850AF // Кнопка IN
#define IR_6 0x33B844BB // Кнопка SET
#define IR_7 0x33B8946B // Кнопка MUTE
#define IR_8 0x33B800FF // Кнопка STANDBY (POWER)

#include <Wire.h> 
#include <TDA7313.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/TDA7313-1.zip
#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
#include <DS3231.h>             // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=1754&download=1
   DS3231 clock;RTCDateTime DateTime;
   TDA7313 tda;
   LiquidCrystal_I2C lcd(0x27,20,4);  // Устанавливаем дисплей
   IRrecv irrecv(12); // указываем вывод модуля IR приемника
   Encoder myEnc(9, 8);// DT, CLK
   decode_results ir; 
      int menu,menu0,menu1,vol,bass,treb,in,balans,balans_d,vol_d,bass_d,treb_d,temp0,par,hour,minut,secon,z_old,gain0,loud;
      int gain1,gain2,gain3,brig0,brig1;
      byte w2[4],z,z0,z1,n,q,gr1,gr2,www,i,w,mute,power,in_x,save,i1,power_on=1;
      unsigned long time0,oldPosition  = -999,newPosition,times_in;
      int att_lr,att_rr,att_lf,att_rf;
      byte mesto2[7]={0,10,0,10,6,0,10};
      byte mesto3[7]={0,0,1,1,2,3,3};

void setup() {
  irrecv.enableIRIn();lcd.init();lcd.backlight();clock.begin();Serial.begin(9600);
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА IN
  pinMode(4,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(5,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(7,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ STANDBY
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(A0,OUTPUT); // ВЫХОД УПРАВЛЕНИЯ BL
  analogWrite(6, 200);// больше 200 не делать
  lcd.setCursor(3,1);lcd.print("Sound Processor");lcd.setCursor(7,2);lcd.print("TDA7313"); delay(3000);lcd.clear();
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  vol = EEPROM.read(0);treb = EEPROM.read(1)-7;bass = EEPROM.read(2)-7;in = EEPROM.read(3);
  gain1 = EEPROM.read(6);gain2 = EEPROM.read(7);
  att_lr = EEPROM.read(20);att_rr = EEPROM.read(21);att_lf = EEPROM.read(22);att_rf = EEPROM.read(23);
  gain3 = EEPROM.read(8);loud = EEPROM.read(10);brig0 = EEPROM.read(11);brig1 = EEPROM.read(12);
  switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
  w2_arr();audio();cl();
  analogWrite(6, 25*brig0);
}

void loop() {
  if(in==0&&power==0){digitalWrite(A0,HIGH);}else{digitalWrite(A0,LOW);}
  DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;

/////////////////////////////// УПРАВЛЕНИЕ //////////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time0=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

  if(mute==0&&power==0){ 
  if(ir.value==IR_2&&menu0==0){menu++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}//меню 1
  if(ir.value==IR_1&&menu0==0){menu--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu<0){menu=2;}}//меню 1
 
  if(ir.value==IR_2&&menu0==1){menu1++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}//меню 2
  if(ir.value==IR_1&&menu0==1){menu1--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1<0){menu1=6;}}//меню 2
    
  if(digitalRead(10)==LOW&&menu0==0){menu++;delay(200);time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0
  if(digitalRead(10)==LOW&&menu0==1){menu1++;delay(200);time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}// меню 1
  
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==0){menu0=1;cl();in_x=0;save=1;time0=millis();w=1;lcd.setCursor(6,1);lcd.print("SETTING"); delay(2000);lcd.clear();}
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==1){menu0=0;menu=0;cl();in_x=0;w2_arr();time0=millis();w=1;lcd.setCursor(8,1);lcd.print("MENU"); delay(2000);lcd.clear();}
  
  if(ir.value==IR_5||digitalRead(3)==LOW){if(in_x==1){in++;}cl();time0=millis();times_in=millis();in_x=1;w=1;www=1;menu0=100;menu=100;if(in>2){in=0;}}// IN
  }
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==0&&power==0){mute=1;in_x=0;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      menu0=100;cl();w=1;w2_arr();lcd.setCursor(8,1);lcd.print("MUTE");delay(300);}// mute on
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==1&&power==0){mute=0;cl();time0=millis();w=1;w2_arr();menu0=0;menu=0;myEnc.write(0);audio();}// mute off

  if(((ir.value==IR_8||digitalRead(5)==LOW)&&power==0)||power_on==1){power=1;in_x=0;power_on=0;save=1;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      cl();lcd.setCursor(5,1);lcd.print("POWER  OFF");menu0=100;delay(3000);analogWrite(6, brig1*25);}// power off
  if((ir.value==IR_8||digitalRead(5)==LOW)&&power==1){power=0;analogWrite(6, brig0*25);lcd.clear();lcd.setCursor(5,1);lcd.print("POWER   ON ");w=1;w2_arr();menu0=0;myEnc.write(0);audio();delay(3000);cl();}// power on

if(power==0){digitalWrite(7,HIGH);
   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 a4[8] = {0b10000,0b11000,0b11100,0b11110,0b11100,0b11000,0b10000,0b00000}; //>
   byte a5[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(3,a4);lcd.createChar(4,a5);
  }
  if(power==1){digitalWrite(7,LOW);
      byte v1[8] = {7,7,7,7,7,7,7,7};
      byte v2[8] = {7,7,0, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 28, 28, 0, 0, 0, 0, 28, 28};
      byte v6[8] = {28,28,28,28,28,28,28,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 0,7,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
   byte a[6];
   byte i0,d1,d2,d3,d4,d5,d6,e1,e2,e3;
  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);
  
     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(i=0;i<6;i++){
      switch(i){
        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;
        case 4: e1=14,e2=15,e3=16;break;
        case 5: e1=17,e2=18,e3=19;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);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  if(digitalRead(10)==LOW&&digitalRead(2)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100);}    // SET
  if(digitalRead(10)==LOW&&digitalRead(3)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }// IN
  if(digitalRead(10)==LOW&&digitalRead(4)==LOW){secon=0; clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }                      // MUTE
  } 

 /////////////////////////////// MENU0 = VOLUME TERBLE BASS BALANCE ///////////////////////////////////////////////////////////////////////
  if(menu0==0){ 
    switch(menu){
      case 0: temp0 = vol;q=0;break;
      case 1: temp0 = bass;q=1;break;
      case 2: temp0 = treb;q=2;break;}
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка <<<<<<   
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;w2[q]=1;www=1;} 
 
     switch(menu){
      case 0: vol = temp0;vol_func();break;
      case 1: bass = temp0;bass_func();break;
      case 2: treb = temp0;treb_func();break;}
 
   au();
   for(i=0;i<3;i++){if(menu==i){lcd.setCursor(0,i);lcd.write((uint8_t)3);}else{lcd.setCursor(0,i);lcd.print(" ");}}
   lcd.setCursor(1,0);lcd.print("VOLUME ");if(vol>=0){lcd.print(" ");}lcd.print(vol);lcd.print(" ");vol_d=map(vol,0,63,1,24);
   lcd.setCursor(1,1);lcd.print("BASS   ");if(bass>=0){lcd.print(" ");}lcd.print(bass);lcd.print(" ");bass_d=map(bass,-7,7,1,24);
   lcd.setCursor(1,2);lcd.print("TREBLE ");if(treb>=0){lcd.print(" ");}lcd.print(treb);lcd.print(" ");treb_d=map(treb,-7,7,1,24);
   lcd.setCursor(1,3);lcd.print("INPUT  ");if(in==0){lcd.print("BL");}else{lcd.print(in+1);}lcd.print("  ");
   lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
   lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);

   for(n=0;n<3;n++){if(w2[n]==1){
   switch(n){
    case 0: par = vol_d;break;
    case 1: par = bass_d;break;
    case 2: par = treb_d;break;} 
   
   for(z=0,z0=0,z1=0;z<=par;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+12,n);lcd.write((uint8_t)0);lcd.setCursor(z0+1+12,n);Serial.println(z0);z_old=7-par/3;while(z_old>0){z_old=z_old-1;lcd.write((uint8_t)4);}}}
   if(z1==3){lcd.setCursor(z0+12,n);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+12,n);lcd.write((uint8_t)2);}w2[n]=0;}
   }}// menu0 = 0
///////////////////////////////////////////////////////////////////////////////////////////////

 if(menu0==1){
     switch(menu1){
      case 0: temp0 = att_lr;break;
      case 1: temp0 = att_rr;break;
      case 2: temp0 = att_lf;break;
      case 3: temp0 = att_rf;break;
      case 4: temp0 = loud;break;
      case 5: temp0 = brig0;break;
      case 6: temp0 = brig1;break;
      }
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;www=1;}// кнопка <<<<<<     
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;www=1;} 
 
     switch(menu1){
      case 0: att_lr = temp0;att_lr_func();break;
      case 1: att_rr = temp0;att_rr_func();break;
      case 2: att_lf = temp0;att_lf_func();break;
      case 3: att_rf = temp0;att_rf_func();break;      
      case 4: loud  = temp0;loud_func();break;
      case 5: brig0  = temp0;brig0_func();break;
      case 6: brig1  = temp0;brig1_func();break;
      }
 
  au();analogWrite(6, brig0*25);
  for(i=0;i<7;i++){if(menu1==i){lcd.setCursor(mesto2[i],mesto3[i]);lcd.write((uint8_t)3);}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("ATT_LR ");lcd.print(att_lr);lcd.print(" ");lcd.setCursor(11,0);lcd.print("ATT_RR ");lcd.print(att_rr);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("ATT_LF ");lcd.print(att_lf);lcd.print(" ");lcd.setCursor(11,1);lcd.print("ATT_RF ");lcd.print(att_rf);lcd.print(" ");
  lcd.setCursor(7,2);lcd.print("LOUD ");if(loud==0){lcd.print("OFF");}else{lcd.print("ON ");}
  lcd.setCursor(1,3);lcd.print("BRIG_1 ");lcd.print(brig0);lcd.print(" ");lcd.setCursor(11,3);lcd.print("BRIG_2 ");lcd.print(brig1);
  
 } // menu0 = 1


////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu0=100;
   switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
 
     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <<<<<<  
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time0=millis();times_in=millis();www=1;w=1;gain_func();} 
 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     }
 
  au();
  lcd.setCursor(5,1);if(in==0){lcd.print("Gain BL   ");}else{lcd.print("Gain IN ");lcd.print(in+1);lcd.print(" ");}lcd.setCursor(6,2);lcd.print(float(gain0*3.75));lcd.print(" ");lcd.print("dB ");
   }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

if(millis()-time0>10000&&w==1&&mute==0&&power==0){if(menu0==1){cl();}w=0;menu0=0;menu=0;w2_arr();}
if(millis()-times_in>3000&&w==1&&in_x==1&&mute==0&&power==0){time0=millis();w=0;in_x=0;menu0=0;menu=0;w2_arr();cl();}

if(save==1){save=0;
     EEPROM.update(0,vol);EEPROM.update(1,treb+7);EEPROM.update(2,bass+7);EEPROM.update(3,in);
     EEPROM.update(6,gain1);EEPROM.update(7,gain2);EEPROM.update(8,gain3);
     EEPROM.update(20,att_lr);EEPROM.update(21,att_rr);EEPROM.update(22,att_lf);EEPROM.update(23,att_rf);
     EEPROM.update(10,loud);EEPROM.update(11,brig0);EEPROM.update(12,brig1);}
            
}// loop

void brig1_func(){if(brig1>8){brig1=8;}if(brig1<0){brig1=0;}}
void brig0_func(){if(brig0>8){brig0=8;}if(brig0<0){brig0=0;}}
void w2_arr(){w2[0]=1;w2[1]=1;w2[2]=1;w2[3]=1;}
void au(){if(www==1){audio();www=0;}}

void in_func(){if(in>2){in=2;}if(in<0){in=0;}}
void loud_func(){if(loud<0){loud=0;}if(loud>1){loud=1;}}
void gain_func(){if(gain0<0){gain0=0;}if(gain0>3){gain0=3;}}
void att_lr_func(){if(att_lr<0){att_lr=0;}if(att_lr>31){att_lr=31;}}
void att_rr_func(){if(att_rr<0){att_rr=0;}if(att_rr>31){att_rr=31;}}
void att_lf_func(){if(att_lf<0){att_lf=0;}if(att_lf>31){att_lf=31;}}
void att_rf_func(){if(att_rf<0){att_rf=0;}if(att_rf>31){att_rf=31;}}
void vol_func(){if(vol<0){vol=0;}if(vol>63){vol=63;}}
void treb_func(){if(treb<-7){treb=-7;}if(treb>7){treb=7;}}
void bass_func(){if(bass<-7){bass=-7;}if(bass>7){bass=7;}}

void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);}  
void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(att_lr);   // аттенюатор LR 0...31
  tda.setAttRR(att_rr);   // аттенюатор RR 0...31
  tda.setAttLF(att_lf);   // аттенюатор LF 0...31
  tda.setAttRF(att_rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain0); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(bass);    // тембр НЧ -7...+7
  tda.setTreble(treb);  // тембр ВЧ -7...+7
}

void to_Timer(){newPosition = myEnc.read()/4;}  

46

Re: TDA7313 + DS3231 + IR + LCD2004

1. [code ]скетч[/code ] я так и не понял, не могу вставить скетч, растолкуйте.

2. В последнем скетче вы не внесли поправку save=1

     if(digitalRead(10)==LOW&&menu0==0){menu++;delay(200);time0=millis();save=1;in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0
  if(digitalRead(10)==LOW&&menu0==1){menu1++;delay(200);time0=millis();save=1;in_x=0;w=1;if(menu1>6){menu1=0;}}// меню 1

47

Re: TDA7313 + DS3231 + IR + LCD2004

#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B850AF // Кнопка IN
#define IR_6 0x33B844BB // Кнопка SET
#define IR_7 0x33B8946B // Кнопка MUTE
#define IR_8 0x33B800FF // Кнопка STANDBY (POWER)

#include <Wire.h> 
#include <TDA7313.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/TDA7313-1.zip
#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
#include <DS3231.h>             // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=1754&download=1
   DS3231 clock;RTCDateTime DateTime;
   TDA7313 tda;
   LiquidCrystal_I2C lcd(0x27,20,4);  // Устанавливаем дисплей
   IRrecv irrecv(12); // указываем вывод модуля IR приемника
   Encoder myEnc(9, 8);// DT, CLK
   decode_results ir; 
      int menu,menu0,menu1,vol,bass,treb,in,balans,balans_d,vol_d,bass_d,treb_d,temp0,par,hour,minut,secon,z_old,gain0,loud;
      int gain1,gain2,gain3,brig0,brig1;
      byte w2[4],z,z0,z1,n,q,gr1,gr2,www,i,w,mute,power,in_x,save,i1,power_on=1;
      unsigned long time0,oldPosition  = -999,newPosition,times_in;
      int att_lr,att_rr,att_lf,att_rf;
      byte mesto2[7]={0,10,0,10,6,0,10};
      byte mesto3[7]={0,0,1,1,2,3,3};

void setup() {
  irrecv.enableIRIn();lcd.init();lcd.backlight();clock.begin();Serial.begin(9600);
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА IN
  pinMode(4,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(5,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(7,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ STANDBY
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(A0,OUTPUT); // ВЫХОД УПРАВЛЕНИЯ BL
  analogWrite(6, 200);// больше 200 не делать
  lcd.setCursor(3,1);lcd.print("Sound Processor");lcd.setCursor(7,2);lcd.print("TDA7313"); delay(3000);lcd.clear();
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  vol = EEPROM.read(0);treb = EEPROM.read(1)-7;bass = EEPROM.read(2)-7;in = EEPROM.read(3);
  gain1 = EEPROM.read(6);gain2 = EEPROM.read(7);
  att_lr = EEPROM.read(20);att_rr = EEPROM.read(21);att_lf = EEPROM.read(22);att_rf = EEPROM.read(23);
  gain3 = EEPROM.read(8);loud = EEPROM.read(10);brig0 = EEPROM.read(11);brig1 = EEPROM.read(12);
  switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
  w2_arr();audio();cl();
  analogWrite(6, 25*brig0);
}

void loop() {
  if(in==0&&power==0){digitalWrite(A0,HIGH);}else{digitalWrite(A0,LOW);}
  DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;

/////////////////////////////// УПРАВЛЕНИЕ //////////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time0=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

  if(mute==0&&power==0){ 
  if(ir.value==IR_2&&menu0==0){menu++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}//меню 1
  if(ir.value==IR_1&&menu0==0){menu--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu<0){menu=2;}}//меню 1
 
  if(ir.value==IR_2&&menu0==1){menu1++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}//меню 2
  if(ir.value==IR_1&&menu0==1){menu1--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1<0){menu1=6;}}//меню 2
    
  if(digitalRead(10)==LOW&&menu0==0){menu++;save=1;delay(200);time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0
  if(digitalRead(10)==LOW&&menu0==1){menu1++;save=1;delay(200);time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}// меню 1
  
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==0){menu0=1;cl();in_x=0;save=1;time0=millis();w=1;lcd.setCursor(6,1);lcd.print("SETTING"); delay(2000);lcd.clear();}
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==1){menu0=0;menu=0;cl();in_x=0;w2_arr();time0=millis();w=1;lcd.setCursor(8,1);lcd.print("MENU"); delay(2000);lcd.clear();}
  
  if(ir.value==IR_5||digitalRead(3)==LOW){if(in_x==1){in++;}cl();time0=millis();times_in=millis();in_x=1;w=1;www=1;menu0=100;menu=100;if(in>2){in=0;}}// IN
  }
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==0&&power==0){mute=1;in_x=0;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      menu0=100;cl();w=1;w2_arr();lcd.setCursor(8,1);lcd.print("MUTE");delay(300);}// mute on
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==1&&power==0){mute=0;cl();time0=millis();w=1;w2_arr();menu0=0;menu=0;myEnc.write(0);audio();}// mute off

  if(((ir.value==IR_8||digitalRead(5)==LOW)&&power==0)||power_on==1){power=1;in_x=0;power_on=0;save=1;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      cl();lcd.setCursor(5,1);lcd.print("POWER  OFF");menu0=100;delay(3000);analogWrite(6, brig1*25);}// power off
  if((ir.value==IR_8||digitalRead(5)==LOW)&&power==1){power=0;analogWrite(6, brig0*25);lcd.clear();lcd.setCursor(5,1);lcd.print("POWER   ON ");w=1;w2_arr();menu0=0;myEnc.write(0);audio();delay(3000);cl();}// power on

if(power==0){digitalWrite(7,HIGH);
   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 a4[8] = {0b10000,0b11000,0b11100,0b11110,0b11100,0b11000,0b10000,0b00000}; //>
   byte a5[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(3,a4);lcd.createChar(4,a5);
  }
  if(power==1){digitalWrite(7,LOW);
      byte v1[8] = {7,7,7,7,7,7,7,7};
      byte v2[8] = {7,7,0, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 28, 28, 0, 0, 0, 0, 28, 28};
      byte v6[8] = {28,28,28,28,28,28,28,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 0,7,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
   byte a[6];
   byte i0,d1,d2,d3,d4,d5,d6,e1,e2,e3;
  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);
  
     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(i=0;i<6;i++){
      switch(i){
        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;
        case 4: e1=14,e2=15,e3=16;break;
        case 5: e1=17,e2=18,e3=19;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);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  if(digitalRead(10)==LOW&&digitalRead(2)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100);}    // SET
  if(digitalRead(10)==LOW&&digitalRead(3)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }// IN
  if(digitalRead(10)==LOW&&digitalRead(4)==LOW){secon=0; clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }                      // MUTE
  } 

 /////////////////////////////// MENU0 = VOLUME TERBLE BASS BALANCE ///////////////////////////////////////////////////////////////////////
  if(menu0==0){ 
    switch(menu){
      case 0: temp0 = vol;q=0;break;
      case 1: temp0 = bass;q=1;break;
      case 2: temp0 = treb;q=2;break;}
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка <<<<<<   
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;w2[q]=1;www=1;} 
 
     switch(menu){
      case 0: vol = temp0;vol_func();break;
      case 1: bass = temp0;bass_func();break;
      case 2: treb = temp0;treb_func();break;}
 
   au();
   for(i=0;i<3;i++){if(menu==i){lcd.setCursor(0,i);lcd.write((uint8_t)3);}else{lcd.setCursor(0,i);lcd.print(" ");}}
   lcd.setCursor(1,0);lcd.print("VOLUME ");if(vol>=0){lcd.print(" ");}lcd.print(vol);lcd.print(" ");vol_d=map(vol,0,63,1,24);
   lcd.setCursor(1,1);lcd.print("BASS   ");if(bass>=0){lcd.print(" ");}lcd.print(bass);lcd.print(" ");bass_d=map(bass,-7,7,1,24);
   lcd.setCursor(1,2);lcd.print("TREBLE ");if(treb>=0){lcd.print(" ");}lcd.print(treb);lcd.print(" ");treb_d=map(treb,-7,7,1,24);
   lcd.setCursor(1,3);lcd.print("INPUT  ");if(in==0){lcd.print("BL");}else{lcd.print(in+1);}lcd.print("  ");
   lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
   lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);

   for(n=0;n<3;n++){if(w2[n]==1){
   switch(n){
    case 0: par = vol_d;break;
    case 1: par = bass_d;break;
    case 2: par = treb_d;break;} 
   
   for(z=0,z0=0,z1=0;z<=par;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+12,n);lcd.write((uint8_t)0);lcd.setCursor(z0+1+12,n);Serial.println(z0);z_old=7-par/3;while(z_old>0){z_old=z_old-1;lcd.write((uint8_t)4);}}}
   if(z1==3){lcd.setCursor(z0+12,n);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+12,n);lcd.write((uint8_t)2);}w2[n]=0;}
   }}// menu0 = 0
///////////////////////////////////////////////////////////////////////////////////////////////

 if(menu0==1){
     switch(menu1){
      case 0: temp0 = att_lr;break;
      case 1: temp0 = att_rr;break;
      case 2: temp0 = att_lf;break;
      case 3: temp0 = att_rf;break;
      case 4: temp0 = loud;break;
      case 5: temp0 = brig0;break;
      case 6: temp0 = brig1;break;
      }
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;www=1;}// кнопка <<<<<<     
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;www=1;} 
 
     switch(menu1){
      case 0: att_lr = temp0;att_lr_func();break;
      case 1: att_rr = temp0;att_rr_func();break;
      case 2: att_lf = temp0;att_lf_func();break;
      case 3: att_rf = temp0;att_rf_func();break;      
      case 4: loud  = temp0;loud_func();break;
      case 5: brig0  = temp0;brig0_func();break;
      case 6: brig1  = temp0;brig1_func();break;
      }
 
  au();analogWrite(6, brig0*25);
  for(i=0;i<7;i++){if(menu1==i){lcd.setCursor(mesto2[i],mesto3[i]);lcd.write((uint8_t)3);}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("ATT_LR ");lcd.print(att_lr);lcd.print(" ");lcd.setCursor(11,0);lcd.print("ATT_RR ");lcd.print(att_rr);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("ATT_LF ");lcd.print(att_lf);lcd.print(" ");lcd.setCursor(11,1);lcd.print("ATT_RF ");lcd.print(att_rf);lcd.print(" ");
  lcd.setCursor(7,2);lcd.print("LOUD ");if(loud==0){lcd.print("OFF");}else{lcd.print("ON ");}
  lcd.setCursor(1,3);lcd.print("BRIG_1 ");lcd.print(brig0);lcd.print(" ");lcd.setCursor(11,3);lcd.print("BRIG_2 ");lcd.print(brig1);
  
 } // menu0 = 1


////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu0=100;
   switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
 
     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <<<<<<  
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time0=millis();times_in=millis();www=1;w=1;gain_func();} 
 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     }
 
  au();
  lcd.setCursor(5,1);if(in==0){lcd.print("Gain BL   ");}else{lcd.print("Gain IN ");lcd.print(in+1);lcd.print(" ");}lcd.setCursor(6,2);lcd.print(float(gain0*3.75));lcd.print(" ");lcd.print("dB ");
   }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

if(millis()-time0>10000&&w==1&&mute==0&&power==0){if(menu0==1){cl();}w=0;menu0=0;menu=0;w2_arr();}
if(millis()-times_in>3000&&w==1&&in_x==1&&mute==0&&power==0){time0=millis();w=0;in_x=0;menu0=0;menu=0;w2_arr();cl();}

if(save==1){save=0;
     EEPROM.update(0,vol);EEPROM.update(1,treb+7);EEPROM.update(2,bass+7);EEPROM.update(3,in);
     EEPROM.update(6,gain1);EEPROM.update(7,gain2);EEPROM.update(8,gain3);
     EEPROM.update(20,att_lr);EEPROM.update(21,att_rr);EEPROM.update(22,att_lf);EEPROM.update(23,att_rf);
     EEPROM.update(10,loud);EEPROM.update(11,brig0);EEPROM.update(12,brig1);}
            
}// loop

void brig1_func(){if(brig1>8){brig1=8;}if(brig1<0){brig1=0;}}
void brig0_func(){if(brig0>8){brig0=8;}if(brig0<0){brig0=0;}}
void w2_arr(){w2[0]=1;w2[1]=1;w2[2]=1;w2[3]=1;}
void au(){if(www==1){audio();www=0;}}

void in_func(){if(in>2){in=2;}if(in<0){in=0;}}
void loud_func(){if(loud<0){loud=0;}if(loud>1){loud=1;}}
void gain_func(){if(gain0<0){gain0=0;}if(gain0>3){gain0=3;}}
void att_lr_func(){if(att_lr<0){att_lr=0;}if(att_lr>31){att_lr=31;}}
void att_rr_func(){if(att_rr<0){att_rr=0;}if(att_rr>31){att_rr=31;}}
void att_lf_func(){if(att_lf<0){att_lf=0;}if(att_lf>31){att_lf=31;}}
void att_rf_func(){if(att_rf<0){att_rf=0;}if(att_rf>31){att_rf=31;}}
void vol_func(){if(vol<0){vol=0;}if(vol>63){vol=63;}}
void treb_func(){if(treb<-7){treb=-7;}if(treb>7){treb=7;}}
void bass_func(){if(bass<-7){bass=-7;}if(bass>7){bass=7;}}

void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);}  
void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(att_lr);   // аттенюатор LR 0...31
  tda.setAttRR(att_rr);   // аттенюатор RR 0...31
  tda.setAttLF(att_lf);   // аттенюатор LF 0...31
  tda.setAttRF(att_rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain0); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(bass);    // тембр НЧ -7...+7
  tda.setTreble(treb);  // тембр ВЧ -7...+7
}

void to_Timer(){newPosition = myEnc.read()/4;}  

48

Re: TDA7313 + DS3231 + IR + LCD2004

команды с пульта отрабатывают хорошо

49 (2022-06-14 21:57:56 отредактировано sanj76a)

Re: TDA7313 + DS3231 + IR + LCD2004

Что касается управления с пульта. Было бы удобней, если убрать команду IN, а выбор канала назначить за кнопками пульта 1,2,3, соответственно. В процессе работы нажимаем нужный канал, на ЛСД сразу индицируется выбранный
канал и через время возвращается в исходное положение.

50

Re: TDA7313 + DS3231 + IR + LCD2004

Я добавил кнопки пульта для 3-х входов, в железе не проверял:

#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B850AF // Кнопка IN
#define IR_6 0x33B844BB // Кнопка SET
#define IR_7 0x33B8946B // Кнопка MUTE
#define IR_8 0x33B800FF // Кнопка STANDBY (POWER)
#define IN1  0x00000001 // Конпка IN1
#define IN2  0x00000002 // Конпка IN2
#define IN3  0x00000003 // Конпка IN3

#include <Wire.h> 
#include <TDA7313.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/TDA7313-1.zip
#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
#include <DS3231.h>             // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=1754&download=1
   DS3231 clock;RTCDateTime DateTime;
   TDA7313 tda;
   LiquidCrystal_I2C lcd(0x27,20,4);  // Устанавливаем дисплей
   IRrecv irrecv(12); // указываем вывод модуля IR приемника
   Encoder myEnc(9, 8);// DT, CLK
   decode_results ir; 
      int menu,menu0,menu1,vol,bass,treb,in,balans,balans_d,vol_d,bass_d,treb_d,temp0,par,hour,minut,secon,z_old,gain0,loud;
      int gain1,gain2,gain3,brig0,brig1;
      byte w2[4],z,z0,z1,n,q,gr1,gr2,www,i,w,mute,power,in_x,save,i1,power_on=1;
      unsigned long time0,oldPosition  = -999,newPosition,times_in;
      int att_lr,att_rr,att_lf,att_rf;
      byte mesto2[7]={0,10,0,10,6,0,10};
      byte mesto3[7]={0,0,1,1,2,3,3};

void setup() {
  irrecv.enableIRIn();lcd.init();lcd.backlight();clock.begin();Serial.begin(9600);
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  pinMode(2,INPUT_PULLUP);   // КНОПКА SET
  pinMode(3,INPUT_PULLUP);   // КНОПКА IN
  pinMode(4,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(5,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(7,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ STANDBY
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  pinMode(A0,OUTPUT); // ВЫХОД УПРАВЛЕНИЯ BL
  analogWrite(6, 200);// больше 200 не делать
  lcd.setCursor(3,1);lcd.print("Sound Processor");lcd.setCursor(7,2);lcd.print("TDA7313"); delay(3000);lcd.clear();
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  vol = EEPROM.read(0);treb = EEPROM.read(1)-7;bass = EEPROM.read(2)-7;in = EEPROM.read(3);
  gain1 = EEPROM.read(6);gain2 = EEPROM.read(7);
  att_lr = EEPROM.read(20);att_rr = EEPROM.read(21);att_lf = EEPROM.read(22);att_rf = EEPROM.read(23);
  gain3 = EEPROM.read(8);loud = EEPROM.read(10);brig0 = EEPROM.read(11);brig1 = EEPROM.read(12);
  switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
  w2_arr();audio();cl();
  analogWrite(6, 25*brig0);
}

void loop() {
  if(in==0&&power==0){digitalWrite(A0,HIGH);}else{digitalWrite(A0,LOW);}
  DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;

/////////////////////////////// УПРАВЛЕНИЕ //////////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();time0=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  

  if(mute==0&&power==0){ 
  if(ir.value==IR_2&&menu0==0){menu++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}//меню 1
  if(ir.value==IR_1&&menu0==0){menu--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;w2_arr();if(menu<0){menu=2;}}//меню 1
 
  if(ir.value==IR_2&&menu0==1){menu1++;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}//меню 2
  if(ir.value==IR_1&&menu0==1){menu1--;gr1=0;gr2=0;cl1();time0=millis();in_x=0;w=1;if(menu1<0){menu1=6;}}//меню 2

    
  if(digitalRead(10)==LOW&&menu0==0){menu++;save=1;delay(200);time0=millis();in_x=0;w=1;w2_arr();if(menu>2){menu=0;}}// меню 0
  if(digitalRead(10)==LOW&&menu0==1){menu1++;save=1;delay(200);time0=millis();in_x=0;w=1;if(menu1>6){menu1=0;}}// меню 1
  
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==0){menu0=1;cl();in_x=0;save=1;time0=millis();w=1;lcd.setCursor(6,1);lcd.print("SETTING"); delay(2000);lcd.clear();}
  if((ir.value==IR_6||digitalRead(2)==LOW)&&menu0==1){menu0=0;menu=0;cl();in_x=0;w2_arr();time0=millis();w=1;lcd.setCursor(8,1);lcd.print("MENU"); delay(2000);lcd.clear();}
  
  if(ir.value==IR_5||digitalRead(3)==LOW){if(in_x==1){in++;}cl();time0=millis();times_in=millis();in_x=1;w=1;www=1;menu0=100;menu=100;if(in>2){in=0;}}// IN

  if(ir.value==IN1){in=0;cl();time0=millis();times_in=millis();in_x=1;w=1;www=1;menu0=100;menu=100;}// IN1
  if(ir.value==IN2){in=1;cl();time0=millis();times_in=millis();in_x=1;w=1;www=1;menu0=100;menu=100;}// IN1
  if(ir.value==IN3){in=2;cl();time0=millis();times_in=millis();in_x=1;w=1;www=1;menu0=100;menu=100;}// IN1
  
  }
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==0&&power==0){mute=1;in_x=0;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      menu0=100;cl();w=1;w2_arr();lcd.setCursor(8,1);lcd.print("MUTE");delay(300);}// mute on
  if((ir.value==IR_7||digitalRead(4)==LOW)&&mute==1&&power==0){mute=0;cl();time0=millis();w=1;w2_arr();menu0=0;menu=0;myEnc.write(0);audio();}// mute off

  if(((ir.value==IR_8||digitalRead(5)==LOW)&&power==0)||power_on==1){power=1;in_x=0;power_on=0;save=1;tda.setAttLR(31);tda.setAttRR(31);tda.setAttLF(31);tda.setAttRF(31);
      cl();lcd.setCursor(5,1);lcd.print("POWER  OFF");menu0=100;delay(3000);analogWrite(6, brig1*25);}// power off
  if((ir.value==IR_8||digitalRead(5)==LOW)&&power==1){power=0;analogWrite(6, brig0*25);lcd.clear();lcd.setCursor(5,1);lcd.print("POWER   ON ");w=1;w2_arr();menu0=0;myEnc.write(0);audio();delay(3000);cl();}// power on

if(power==0){digitalWrite(7,HIGH);
   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 a4[8] = {0b10000,0b11000,0b11100,0b11110,0b11100,0b11000,0b10000,0b00000}; //>
   byte a5[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};
   lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);lcd.createChar(3,a4);lcd.createChar(4,a5);
  }
  if(power==1){digitalWrite(7,LOW);
      byte v1[8] = {7,7,7,7,7,7,7,7};
      byte v2[8] = {7,7,0, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,0,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 28, 28, 0, 0, 0, 0, 28, 28};
      byte v6[8] = {28,28,28,28,28,28,28,28};
      byte v7[8] = { 0, 0, 0, 0, 0, 0,7,7};
      byte v8[8] = { 31, 31,0,0,0,0,0, 0};
   byte a[6];
   byte i0,d1,d2,d3,d4,d5,d6,e1,e2,e3;
  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);
  
     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(i=0;i<6;i++){
      switch(i){
        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;
        case 4: e1=14,e2=15,e3=16;break;
        case 5: e1=17,e2=18,e3=19;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);
  }
  lcd.setCursor(6,0);lcd.print(".");lcd.setCursor(13,0);lcd.print(".");lcd.setCursor(6,1);lcd.print(".");lcd.setCursor(13,1);lcd.print(".");
  lcd.setCursor(5,3);lcd.print("POWER  OFF");
  if(digitalRead(10)==LOW&&digitalRead(2)==LOW){hour++;if(hour>23){hour=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100);}    // SET
  if(digitalRead(10)==LOW&&digitalRead(3)==LOW){minut++;if(minut>59){minut=0;} clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }// IN
  if(digitalRead(10)==LOW&&digitalRead(4)==LOW){secon=0; clock.setDateTime(2020, 9, 15, hour, minut, secon);delay(100); }                      // MUTE
  } 

 /////////////////////////////// MENU0 = VOLUME TERBLE BASS BALANCE ///////////////////////////////////////////////////////////////////////
  if(menu0==0){ 
    switch(menu){
      case 0: temp0 = vol;q=0;break;
      case 1: temp0 = bass;q=1;break;
      case 2: temp0 = treb;q=2;break;}
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;w2[q]=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;w2[q]=1;www=1;}// кнопка <<<<<<   
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;w2[q]=1;www=1;} 
 
     switch(menu){
      case 0: vol = temp0;vol_func();break;
      case 1: bass = temp0;bass_func();break;
      case 2: treb = temp0;treb_func();break;}
 
   au();
   for(i=0;i<3;i++){if(menu==i){lcd.setCursor(0,i);lcd.write((uint8_t)3);}else{lcd.setCursor(0,i);lcd.print(" ");}}
   lcd.setCursor(1,0);lcd.print("VOLUME ");if(vol>=0){lcd.print(" ");}lcd.print(vol);lcd.print(" ");vol_d=map(vol,0,63,1,24);
   lcd.setCursor(1,1);lcd.print("BASS   ");if(bass>=0){lcd.print(" ");}lcd.print(bass);lcd.print(" ");bass_d=map(bass,-7,7,1,24);
   lcd.setCursor(1,2);lcd.print("TREBLE ");if(treb>=0){lcd.print(" ");}lcd.print(treb);lcd.print(" ");treb_d=map(treb,-7,7,1,24);
   lcd.setCursor(1,3);lcd.print("INPUT  ");if(in==0){lcd.print("BL");}else{lcd.print(in+1);}lcd.print("  ");
   lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
   lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);

   for(n=0;n<3;n++){if(w2[n]==1){
   switch(n){
    case 0: par = vol_d;break;
    case 1: par = bass_d;break;
    case 2: par = treb_d;break;} 
   
   for(z=0,z0=0,z1=0;z<=par;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+12,n);lcd.write((uint8_t)0);lcd.setCursor(z0+1+12,n);Serial.println(z0);z_old=7-par/3;while(z_old>0){z_old=z_old-1;lcd.write((uint8_t)4);}}}
   if(z1==3){lcd.setCursor(z0+12,n);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+12,n);lcd.write((uint8_t)2);}w2[n]=0;}
   }}// menu0 = 0
///////////////////////////////////////////////////////////////////////////////////////////////

 if(menu0==1){
     switch(menu1){
      case 0: temp0 = att_lr;break;
      case 1: temp0 = att_rr;break;
      case 2: temp0 = att_lf;break;
      case 3: temp0 = att_rf;break;
      case 4: temp0 = loud;break;
      case 5: temp0 = brig0;break;
      case 6: temp0 = brig1;break;
      }
 
     if(ir.value==IR_3){temp0++;gr1=1;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){temp0++;gr2=0;cl1();time0=millis();w=1;www=1;}// кнопка >>>>>>
     if(ir.value==IR_4){temp0--;gr1=0;gr2=1;cl1();time0=millis();;w=1;www=1;}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){temp0--;gr1=0;cl1();time0=millis();w=1;www=1;}// кнопка <<<<<<     
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     temp0=temp0+newPosition;myEnc.write(0);newPosition=0;time0=millis();w=1;www=1;} 
 
     switch(menu1){
      case 0: att_lr = temp0;att_lr_func();break;
      case 1: att_rr = temp0;att_rr_func();break;
      case 2: att_lf = temp0;att_lf_func();break;
      case 3: att_rf = temp0;att_rf_func();break;      
      case 4: loud  = temp0;loud_func();break;
      case 5: brig0  = temp0;brig0_func();break;
      case 6: brig1  = temp0;brig1_func();break;
      }
 
  au();analogWrite(6, brig0*25);
  for(i=0;i<7;i++){if(menu1==i){lcd.setCursor(mesto2[i],mesto3[i]);lcd.write((uint8_t)3);}else{lcd.setCursor(mesto2[i],mesto3[i]);lcd.print(" ");}}
  
  lcd.setCursor(1,0);lcd.print("ATT_LR ");lcd.print(att_lr);lcd.print(" ");lcd.setCursor(11,0);lcd.print("ATT_RR ");lcd.print(att_rr);lcd.print(" ");
  lcd.setCursor(1,1);lcd.print("ATT_LF ");lcd.print(att_lf);lcd.print(" ");lcd.setCursor(11,1);lcd.print("ATT_RF ");lcd.print(att_rf);lcd.print(" ");
  lcd.setCursor(7,2);lcd.print("LOUD ");if(loud==0){lcd.print("OFF");}else{lcd.print("ON ");}
  lcd.setCursor(1,3);lcd.print("BRIG_1 ");lcd.print(brig0);lcd.print(" ");lcd.setCursor(11,3);lcd.print("BRIG_2 ");lcd.print(brig1);
  
 } // menu0 = 1


////////////////////////// GAIN IN /////////////////////////////////////////////////////////////////////////////////////
if(in_x==1){ menu0=100;
   switch(in){
     case 0: gain0 = gain1;break;
     case 1: gain0 = gain2;break;
     case 2: gain0 = gain3;break;
     }
 
     if(ir.value==IR_3){gain0++;gr1=1;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка > 
     if(ir.value==0xFFFFFFFF and gr1==1){gain0++;gr2=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка >>>>>>
     if(ir.value==IR_4){gain0--;gr1=0;gr2=1;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <
     if(ir.value==0xFFFFFFFF and gr2==1){gain0--;gr1=0;cl1();time0=millis();times_in=millis();www=1;w=1;gain_func();}// кнопка <<<<<<  
 
    if (newPosition != oldPosition) {oldPosition = newPosition;
    gain0=gain0+newPosition;myEnc.write(0);newPosition=0;time0=millis();times_in=millis();www=1;w=1;gain_func();} 
 
   switch(in){
     case 0: gain1 = gain0;break;
     case 1: gain2 = gain0;break;
     case 2: gain3 = gain0;break;
     }
 
  au();
  lcd.setCursor(5,1);if(in==0){lcd.print("Gain BL   ");}else{lcd.print("Gain IN ");lcd.print(in+1);lcd.print(" ");}lcd.setCursor(6,2);lcd.print(float(gain0*3.75));lcd.print(" ");lcd.print("dB ");
   }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

if(millis()-time0>10000&&w==1&&mute==0&&power==0){if(menu0==1){cl();}w=0;menu0=0;menu=0;w2_arr();}
if(millis()-times_in>3000&&w==1&&in_x==1&&mute==0&&power==0){time0=millis();w=0;in_x=0;menu0=0;menu=0;w2_arr();cl();}

if(save==1){save=0;
     EEPROM.update(0,vol);EEPROM.update(1,treb+7);EEPROM.update(2,bass+7);EEPROM.update(3,in);
     EEPROM.update(6,gain1);EEPROM.update(7,gain2);EEPROM.update(8,gain3);
     EEPROM.update(20,att_lr);EEPROM.update(21,att_rr);EEPROM.update(22,att_lf);EEPROM.update(23,att_rf);
     EEPROM.update(10,loud);EEPROM.update(11,brig0);EEPROM.update(12,brig1);}
            
}// loop

void brig1_func(){if(brig1>8){brig1=8;}if(brig1<0){brig1=0;}}
void brig0_func(){if(brig0>8){brig0=8;}if(brig0<0){brig0=0;}}
void w2_arr(){w2[0]=1;w2[1]=1;w2[2]=1;w2[3]=1;}
void au(){if(www==1){audio();www=0;}}

void in_func(){if(in>2){in=2;}if(in<0){in=0;}}
void loud_func(){if(loud<0){loud=0;}if(loud>1){loud=1;}}
void gain_func(){if(gain0<0){gain0=0;}if(gain0>3){gain0=3;}}
void att_lr_func(){if(att_lr<0){att_lr=0;}if(att_lr>31){att_lr=31;}}
void att_rr_func(){if(att_rr<0){att_rr=0;}if(att_rr>31){att_rr=31;}}
void att_lf_func(){if(att_lf<0){att_lf=0;}if(att_lf>31){att_lf=31;}}
void att_rf_func(){if(att_rf<0){att_rf=0;}if(att_rf>31){att_rf=31;}}
void vol_func(){if(vol<0){vol=0;}if(vol>63){vol=63;}}
void treb_func(){if(treb<-7){treb=-7;}if(treb>7){treb=7;}}
void bass_func(){if(bass<-7){bass=-7;}if(bass>7){bass=7;}}

void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);}  
void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(att_lr);   // аттенюатор LR 0...31
  tda.setAttRR(att_rr);   // аттенюатор RR 0...31
  tda.setAttLF(att_lf);   // аттенюатор LF 0...31
  tda.setAttRF(att_rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain0); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(bass);    // тембр НЧ -7...+7
  tda.setTreble(treb);  // тембр ВЧ -7...+7
}

void to_Timer(){newPosition = myEnc.read()/4;}