76

Re: M62446

У меня все работает
http://forum.rcl-radio.ru/uploads/images/2026/01/8f1d2ada8426897a936373acbbfe9706.png

Re: M62446

в скетче поменял подключение дисплея с i2c на обычное,и появляется no matching function for call to 'LiquidCrystal::init()'

78

Re: M62446

Не все функции относящиеся к LCD1602_I2C удалены или заменены

Re: M62446

что еще необходимо сделать?

80

Re: M62446

Опубликуйте измененный код

Re: M62446

// M62446
#define LATCH        2
#define DATA         3
#define CLOCK        4
// ENCODER
#define ENC_DT       9
#define ENC_CLK      8
#define ENC_SW       10
// BUTTON
#define ATT          A0
#define MUTE         A1
#define STANDBY      A2
// выход упр. STANDBY
#define ST_OUT       13
// коды кнопок ИК пульта
#define MENU      0x2FDB24D // button encoder
#define UP        0x2FDD02F // >>>
#define DW        0x2FD32CD // <<<
#define POWER_IR  0x2FD00FF // POWER
#define MUTE_IR   0x2FDB04F // MUTE
#define ATT_IR    0x2FDF00F // ATT
// ИК датчик
#define IR           12

#include <Wire.h>
#include <LiquidCrystal.h>  // http://forum.rcl-radio.ru/misc.php?acti … download=1
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip   
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip       
#include <boarddefs.h>          // входит в состав библиотеки IRremote
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/ … remote.zip

LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7;  // Устанавливаем дисплей
IRrecv irrecv(IR); // указываем вывод модуля IR приемника
Encoder myEnc(ENC_DT, ENC_CLK);
decode_results ir;

byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};     
byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};

long times,oldPosition  = -999,newPosition;
int vol,bass,treb,att_l,att_r,att_c,att_sw,att_sl,att_sr,mute,power;
int menu,treb_print,bass_print,menu0=100;
bool gr1,gr2;
byte a[6],d1,d2,d3,d4,d5,d6,e1,e2,e3,w,w2,x;

void setup() {
  irrecv.enableIRIn();lcd.init();lcd.backlight();Serial.begin(9600);
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  pinMode(ENC_SW,INPUT);
  pinMode(LATCH, OUTPUT);digitalWrite(LATCH, LOW);
  pinMode(DATA, OUTPUT);digitalWrite(DATA, LOW);
  pinMode(CLOCK, OUTPUT);digitalWrite(CLOCK, LOW);
  pinMode(ATT,INPUT_PULLUP);   // КНОПКА ATT
  pinMode(MUTE,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(STANDBY,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(ST_OUT,OUTPUT);
  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);
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
  lcd.setCursor(0,0);lcd.print("Sound  Processor");lcd.setCursor(5,1);lcd.print("M62446"); delay(2000);lcd.clear();
 
  vol = EEPROM.read(0);bass = EEPROM.read(1)-7;treb = EEPROM.read(2)-7;
  att_l = EEPROM.read(3);att_r = EEPROM.read(4);att_c = EEPROM.read(5);att_sw = EEPROM.read(6);att_sl = EEPROM.read(7);att_sr = EEPROM.read(8);
  audio();

}

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

  if(power==0){
  if(digitalRead(ENC_SW)==LOW||ir.value==MENU){menu++;menu0=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>2){menu=0;}}

  if(digitalRead(ATT)==LOW||ir.value==ATT_IR){menu0++;menu=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu0>5){menu0=0;}}

  if((ir.value==MUTE_IR||digitalRead(MUTE)==LOW)&&mute==0){mute=1;menu=100;menu0=100;cl();lcd.setCursor(6,0);lcd.print("MUTE");audio_mute();delay(300);}// mute on
  if((ir.value==MUTE_IR||digitalRead(MUTE)==LOW)&&mute==1){mute=0;cl();times=millis();menu=0;myEnc.write(0);audio();}// mute off   
}
// power
  if((ir.value==POWER_IR||digitalRead(STANDBY)==LOW)&&power==0){power=1;cl();audio_mute();lcd.setCursor(3,0);lcd.print("POWER  OFF");menu=100;menu0=100;delay(3000);lcd.noBacklight();digitalWrite(ST_OUT,HIGH);}// power off
  if((ir.value==POWER_IR||digitalRead(STANDBY)==LOW)&&power==1){power=0;lcd.backlight();cl();lcd.setCursor(3,0);lcd.print("POWER   ON ");myEnc.write(0);digitalWrite(ST_OUT,LOW);delay(3000);audio();menu=0;cl();}// power on 
   
////////////// VOLUME ///////////////////////////////////////////////////////////////////
if(menu==0){
   if(ir.value==DW){vol++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
   if(ir.value==UP){vol--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   vol=vol-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();}
   a[0]= (50-vol)/10;a[1]=(50-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   if(mute==0){lcd.setCursor(0,0);lcd.print("VOLUME");}else{lcd.setCursor(0,0);lcd.print("MUTE");}
   lcd.setCursor(0,1);lcd.print("CONTROL");
  }

////////////// TREBLE ///////////////////////////////////////////////////////////////////
if(menu==1){
   if(ir.value==UP){treb++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >
   if(ir.value==DW){treb--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();}
   if(treb<0){treb_print = abs(treb)*2;lcd.setCursor(7,0);lcd.write((uint8_t)3);}else{treb_print = treb*2;lcd.setCursor(7,0);lcd.print(" ");}
   a[0]= treb_print/10;a[1]=treb_print%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=8,e2=9,e3=10;break;case 1: e1=11,e2=12,e3=13;break;}digit();}
   lcd.setCursor(0,0);lcd.print("TREBLE");lcd.setCursor(0,1);lcd.print("CONTROL");lcd.setCursor(14,0);lcd.print("dB");
   }   

////////////// BASS ///////////////////////////////////////////////////////////////////
if(menu==2){
   if(ir.value==UP){bass++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >
   if(ir.value==DW){bass--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   bass=bass+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();}
   if(bass<0){bass_print = abs(bass)*2;lcd.setCursor(7,0);lcd.write((uint8_t)3);}else{bass_print = bass*2;lcd.setCursor(7,0);lcd.print(" ");}
   a[0]= bass_print/10;a[1]=bass_print%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=8,e2=9,e3=10;break;case 1: e1=11,e2=12,e3=13;break;}digit();}
   lcd.setCursor(0,0);lcd.print("BASS");lcd.setCursor(0,1);lcd.print("CONTROL");lcd.setCursor(14,0);lcd.print("dB");
   }     


  ////////////// ATT_L ///////////////////////////////////////////////////////////////////
if(menu0==0){menu=100;
   if(ir.value==UP){att_l++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_l++;gr2=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_l--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_l--;gr1=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_l=att_l+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_l_func();audio();}
   a[0]= (att_l)/10;a[1]=(att_l)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("LEFT");
   }   

  ////////////// ATT_R ///////////////////////////////////////////////////////////////////
if(menu0==1){menu=100;
   if(ir.value==UP){att_r++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_r++;gr2=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_r--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_r--;gr1=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_r=att_r+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_r_func();audio();}
   a[0]= (att_r)/10;a[1]=(att_r)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("RIGHT");
   }     

  ////////////// ATT_C ///////////////////////////////////////////////////////////////////
if(menu0==2){menu=100;
   if(ir.value==UP){att_c++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_c++;gr2=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_c--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_c--;gr1=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_c=att_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_c_func();audio();}
   a[0]= (att_c)/10;a[1]=(att_c)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("CENTER");
   } 

  ////////////// ATT_SW ///////////////////////////////////////////////////////////////////
if(menu0==3){menu=100;
   if(ir.value==UP){att_sw++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_sw++;gr2=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sw--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sw--;gr1=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sw=att_sw+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sw_func();audio();}
   a[0]= (att_sw)/10;a[1]=(att_sw)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUBWOOFER");
   } 

  ////////////// ATT_SL ///////////////////////////////////////////////////////////////////
if(menu0==4){menu=100;
   if(ir.value==UP){att_sl++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_sl++;gr2=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sl--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sl--;gr1=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sl=att_sl+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sl_func();audio();}
   a[0]= (att_sl)/10;a[1]=(att_sl)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUR. LEFT");
   } 

  ////////////// ATT_SR ///////////////////////////////////////////////////////////////////
if(menu0==5){menu=100;
   if(ir.value==UP){att_sr++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_sr++;gr2=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sr--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sr--;gr1=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sr=att_sr+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sr_func();audio();}
   a[0]= (att_sr)/10;a[1]=(att_sr)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUR. RIGHT");
   }                     


if(millis()-times>10000&&w==1&&mute==0&&power==0){
   menu=0;menu0=100;w=0;cl();
   EEPROM.update(0,vol);EEPROM.update(1,bass+7);EEPROM.update(2,treb+7);
   EEPROM.update(3,att_l);EEPROM.update(4,att_r);EEPROM.update(5,att_c);
   EEPROM.update(6,att_sw);EEPROM.update(7,att_sl);EEPROM.update(8,att_sr);
   }
}

void vol_func(){if(vol>50){vol=50;}if(vol<0){vol=0;}}
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 att_l_func(){if(att_l>19){att_l=19;}if(att_l<0){att_l=0;}}
void att_r_func(){if(att_r>19){att_r=19;}if(att_r<0){att_r=0;}}
void att_c_func(){if(att_c>19){att_c=19;}if(att_c<0){att_c=0;}}
void att_sw_func(){if(att_sw>19){att_sw=19;}if(att_sw<0){att_sw=0;}}
void att_sr_func(){if(att_sr>19){att_sr=19;}if(att_sr<0){att_sr=0;}}
void att_sl_func(){if(att_sl>19){att_sl=19;}if(att_sl<0){att_sl=0;}}

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

void to_Timer(){newPosition = myEnc.read()/4;}
void audio(){
  byte_1(treb,0b0000,bass,0);// treb -7...7, port 0b0000, bass -7...7, bypass = 0
  byte_2(vol+att_l,vol+att_r);// 0...95 = 0...-95 dB mute = 111
  byte_3(vol+att_c,vol+att_sw);// 0...95 = 0...-95 dB mute = 111
  byte_4(vol+att_sl,vol+att_sr);// 0...95 = 0...-95 dB mute = 111
  }

void audio_mute(){
  byte_2(111,111);
  byte_3(111,111);
  byte_4(111,111);
  } 

void byte_1(int treb, byte port, int bass, bool by_pass){
  // treb int -7...+7 === -14...+14 dB
  // bass int -7...+7 === -14...+14 dB
  // byte port 0b0000....0b1111
  // by_pass  === 0 TONE | 1 BYPASS
  switch(treb){
    case -7: treb = 0b1111;break;
    case -6: treb = 0b1101;break;
    case -5: treb = 0b1110;break;
    case -4: treb = 0b1100;break;
    case -3: treb = 0b1011;break;
    case -2: treb = 0b1010;break;
    case -1: treb = 0b1001;break;
    case  0: treb = 0b0000;break;
    case  1: treb = 0b0001;break;
    case  2: treb = 0b0010;break;
    case  3: treb = 0b0011;break;
    case  4: treb = 0b0100;break;
    case  5: treb = 0b0110;break;
    case  6: treb = 0b0101;break;
    case  7: treb = 0b0111;break;
    }
  switch(bass){
    case -7: bass = 0b1111;break;
    case -6: bass = 0b1101;break;
    case -5: bass = 0b1110;break;
    case -4: bass = 0b1100;break;
    case -3: bass = 0b1011;break;
    case -2: bass = 0b1010;break;
    case -1: bass = 0b1001;break;
    case  0: bass = 0b0000;break;
    case  1: bass = 0b0001;break;
    case  2: bass = 0b0010;break;
    case  3: bass = 0b0011;break;
    case  4: bass = 0b0100;break;
    case  5: bass = 0b0110;break;
    case  6: bass = 0b0101;break;
    case  7: bass = 0b0111;break;
    } 
  unsigned int data_byte = (treb<<12)|(port<<8)|(bass<<4)|(by_pass<<2)|0b00;
  writeByte(data_byte); 
  }

void byte_2(int vol_l, int vol_r){
  // int vol 0...95 === 0...-95 dB mute=111
  if(vol_l>79){vol_l=vol_l+16;}
  if(vol_r>79){vol_r=vol_r+16;}
  unsigned int data_byte = (vol_l<<9)|(vol_r<<2)|0b01;
  writeByte(data_byte);
  } 
void byte_3(int vol_c, int vol_sw){
  // int vol 0...95 === 0...-95 dB mute=112
  if(vol_c>79){vol_c=vol_c+16;}
  if(vol_sw>79){vol_sw=vol_sw+16;}
  unsigned int data_byte = (vol_c<<9)|(vol_sw<<2)|0b10;
  writeByte(data_byte);
  } 
void byte_4(int vol_sl, int vol_sr){
  // int vol 0...95 === 0...-95 dB mute=112
  if(vol_sl>79){vol_sl=vol_sl+16;}
  if(vol_sr>79){vol_sr=vol_sr+16;}
  unsigned int data_byte = (vol_sl<<9)|(vol_sr<<2)|0b11;
  writeByte(data_byte);
  }   

void writeByte(uint16_t data){
    digitalWrite(LATCH, HIGH); delayMicroseconds(1);
    digitalWrite(LATCH, LOW); delayMicroseconds(3);
    for (int i = 15; i >= 0; i--) {
        digitalWrite(DATA, (data >> i) & 1); delayMicroseconds(3);
        digitalWrite(CLOCK, HIGH); delayMicroseconds(3);
        digitalWrite(CLOCK, LOW); delayMicroseconds(3);
    }
    digitalWrite(LATCH, HIGH); delayMicroseconds(1);
    digitalWrite(LATCH, LOW); delayMicroseconds(3);
}

82

Re: M62446

Компиляция проходит, но у Вас пересекаются выводы lcd и M62446

// M62446
#define LATCH        2
#define DATA         3
#define CLOCK        4
// ENCODER
#define ENC_DT       9
#define ENC_CLK      8
#define ENC_SW       10
// BUTTON
#define ATT          A0
#define MUTE         A1
#define STANDBY      A2
// выход упр. STANDBY
#define ST_OUT       13
// коды кнопок ИК пульта
#define MENU      0x2FDB24D // button encoder
#define UP        0x2FDD02F // >>>
#define DW        0x2FD32CD // <<<
#define POWER_IR  0x2FD00FF // POWER
#define MUTE_IR   0x2FDB04F // MUTE
#define ATT_IR    0x2FDF00F // ATT
// ИК датчик
#define IR           12

#include <Wire.h>
#include <LiquidCrystal.h>  // http://forum.rcl-radio.ru/misc.php?acti … download=1
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip   
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip       
#include <boarddefs.h>          // входит в состав библиотеки IRremote
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/ … remote.zip

LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7;  // Устанавливаем дисплей
IRrecv irrecv(IR); // указываем вывод модуля IR приемника
Encoder myEnc(ENC_DT, ENC_CLK);
decode_results ir;

byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};     
byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};

long times,oldPosition  = -999,newPosition;
int vol,bass,treb,att_l,att_r,att_c,att_sw,att_sl,att_sr,mute,power;
int menu,treb_print,bass_print,menu0=100;
bool gr1,gr2;
byte a[6],d1,d2,d3,d4,d5,d6,e1,e2,e3,w,w2,x;

void setup() {
  irrecv.enableIRIn();lcd.begin(16, 2); Serial.begin(9600);
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  pinMode(ENC_SW,INPUT);
  pinMode(LATCH, OUTPUT);digitalWrite(LATCH, LOW);
  pinMode(DATA, OUTPUT);digitalWrite(DATA, LOW);
  pinMode(CLOCK, OUTPUT);digitalWrite(CLOCK, LOW);
  pinMode(ATT,INPUT_PULLUP);   // КНОПКА ATT
  pinMode(MUTE,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(STANDBY,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(ST_OUT,OUTPUT);
  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);
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
  lcd.setCursor(0,0);lcd.print("Sound  Processor");lcd.setCursor(5,1);lcd.print("M62446"); delay(2000);lcd.clear();
 
  vol = EEPROM.read(0);bass = EEPROM.read(1)-7;treb = EEPROM.read(2)-7;
  att_l = EEPROM.read(3);att_r = EEPROM.read(4);att_c = EEPROM.read(5);att_sw = EEPROM.read(6);att_sl = EEPROM.read(7);att_sr = EEPROM.read(8);
  audio();

}

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

  if(power==0){
  if(digitalRead(ENC_SW)==LOW||ir.value==MENU){menu++;menu0=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>2){menu=0;}}

  if(digitalRead(ATT)==LOW||ir.value==ATT_IR){menu0++;menu=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu0>5){menu0=0;}}

  if((ir.value==MUTE_IR||digitalRead(MUTE)==LOW)&&mute==0){mute=1;menu=100;menu0=100;cl();lcd.setCursor(6,0);lcd.print("MUTE");audio_mute();delay(300);}// mute on
  if((ir.value==MUTE_IR||digitalRead(MUTE)==LOW)&&mute==1){mute=0;cl();times=millis();menu=0;myEnc.write(0);audio();}// mute off   
}
// power
  if((ir.value==POWER_IR||digitalRead(STANDBY)==LOW)&&power==0){power=1;cl();audio_mute();lcd.setCursor(3,0);lcd.print("POWER  OFF");menu=100;menu0=100;delay(3000);digitalWrite(ST_OUT,HIGH);}// power off
  if((ir.value==POWER_IR||digitalRead(STANDBY)==LOW)&&power==1){power=0;cl();lcd.setCursor(3,0);lcd.print("POWER   ON ");myEnc.write(0);digitalWrite(ST_OUT,LOW);delay(3000);audio();menu=0;cl();}// power on 
   
////////////// VOLUME ///////////////////////////////////////////////////////////////////
if(menu==0){
   if(ir.value==DW){vol++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
   if(ir.value==UP){vol--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   vol=vol-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();}
   a[0]= (50-vol)/10;a[1]=(50-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   if(mute==0){lcd.setCursor(0,0);lcd.print("VOLUME");}else{lcd.setCursor(0,0);lcd.print("MUTE");}
   lcd.setCursor(0,1);lcd.print("CONTROL");
  }

////////////// TREBLE ///////////////////////////////////////////////////////////////////
if(menu==1){
   if(ir.value==UP){treb++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >
   if(ir.value==DW){treb--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();}
   if(treb<0){treb_print = abs(treb)*2;lcd.setCursor(7,0);lcd.write((uint8_t)3);}else{treb_print = treb*2;lcd.setCursor(7,0);lcd.print(" ");}
   a[0]= treb_print/10;a[1]=treb_print%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=8,e2=9,e3=10;break;case 1: e1=11,e2=12,e3=13;break;}digit();}
   lcd.setCursor(0,0);lcd.print("TREBLE");lcd.setCursor(0,1);lcd.print("CONTROL");lcd.setCursor(14,0);lcd.print("dB");
   }   

////////////// BASS ///////////////////////////////////////////////////////////////////
if(menu==2){
   if(ir.value==UP){bass++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >
   if(ir.value==DW){bass--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   bass=bass+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();}
   if(bass<0){bass_print = abs(bass)*2;lcd.setCursor(7,0);lcd.write((uint8_t)3);}else{bass_print = bass*2;lcd.setCursor(7,0);lcd.print(" ");}
   a[0]= bass_print/10;a[1]=bass_print%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=8,e2=9,e3=10;break;case 1: e1=11,e2=12,e3=13;break;}digit();}
   lcd.setCursor(0,0);lcd.print("BASS");lcd.setCursor(0,1);lcd.print("CONTROL");lcd.setCursor(14,0);lcd.print("dB");
   }     


  ////////////// ATT_L ///////////////////////////////////////////////////////////////////
if(menu0==0){menu=100;
   if(ir.value==UP){att_l++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_l++;gr2=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_l--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_l--;gr1=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_l=att_l+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_l_func();audio();}
   a[0]= (att_l)/10;a[1]=(att_l)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("LEFT");
   }   

  ////////////// ATT_R ///////////////////////////////////////////////////////////////////
if(menu0==1){menu=100;
   if(ir.value==UP){att_r++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_r++;gr2=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_r--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_r--;gr1=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_r=att_r+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_r_func();audio();}
   a[0]= (att_r)/10;a[1]=(att_r)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("RIGHT");
   }     

  ////////////// ATT_C ///////////////////////////////////////////////////////////////////
if(menu0==2){menu=100;
   if(ir.value==UP){att_c++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_c++;gr2=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_c--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_c--;gr1=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_c=att_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_c_func();audio();}
   a[0]= (att_c)/10;a[1]=(att_c)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("CENTER");
   } 

  ////////////// ATT_SW ///////////////////////////////////////////////////////////////////
if(menu0==3){menu=100;
   if(ir.value==UP){att_sw++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_sw++;gr2=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sw--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sw--;gr1=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sw=att_sw+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sw_func();audio();}
   a[0]= (att_sw)/10;a[1]=(att_sw)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUBWOOFER");
   } 

  ////////////// ATT_SL ///////////////////////////////////////////////////////////////////
if(menu0==4){menu=100;
   if(ir.value==UP){att_sl++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_sl++;gr2=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sl--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sl--;gr1=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sl=att_sl+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sl_func();audio();}
   a[0]= (att_sl)/10;a[1]=(att_sl)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUR. LEFT");
   } 

  ////////////// ATT_SR ///////////////////////////////////////////////////////////////////
if(menu0==5){menu=100;
   if(ir.value==UP){att_sr++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_sr++;gr2=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sr--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sr--;gr1=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sr=att_sr+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sr_func();audio();}
   a[0]= (att_sr)/10;a[1]=(att_sr)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUR. RIGHT");
   }                     


if(millis()-times>10000&&w==1&&mute==0&&power==0){
   menu=0;menu0=100;w=0;cl();
   EEPROM.update(0,vol);EEPROM.update(1,bass+7);EEPROM.update(2,treb+7);
   EEPROM.update(3,att_l);EEPROM.update(4,att_r);EEPROM.update(5,att_c);
   EEPROM.update(6,att_sw);EEPROM.update(7,att_sl);EEPROM.update(8,att_sr);
   }
}

void vol_func(){if(vol>50){vol=50;}if(vol<0){vol=0;}}
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 att_l_func(){if(att_l>19){att_l=19;}if(att_l<0){att_l=0;}}
void att_r_func(){if(att_r>19){att_r=19;}if(att_r<0){att_r=0;}}
void att_c_func(){if(att_c>19){att_c=19;}if(att_c<0){att_c=0;}}
void att_sw_func(){if(att_sw>19){att_sw=19;}if(att_sw<0){att_sw=0;}}
void att_sr_func(){if(att_sr>19){att_sr=19;}if(att_sr<0){att_sr=0;}}
void att_sl_func(){if(att_sl>19){att_sl=19;}if(att_sl<0){att_sl=0;}}

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

void to_Timer(){newPosition = myEnc.read()/4;}
void audio(){
  byte_1(treb,0b0000,bass,0);// treb -7...7, port 0b0000, bass -7...7, bypass = 0
  byte_2(vol+att_l,vol+att_r);// 0...95 = 0...-95 dB mute = 111
  byte_3(vol+att_c,vol+att_sw);// 0...95 = 0...-95 dB mute = 111
  byte_4(vol+att_sl,vol+att_sr);// 0...95 = 0...-95 dB mute = 111
  }

void audio_mute(){
  byte_2(111,111);
  byte_3(111,111);
  byte_4(111,111);
  } 

void byte_1(int treb, byte port, int bass, bool by_pass){
  // treb int -7...+7 === -14...+14 dB
  // bass int -7...+7 === -14...+14 dB
  // byte port 0b0000....0b1111
  // by_pass  === 0 TONE | 1 BYPASS
  switch(treb){
    case -7: treb = 0b1111;break;
    case -6: treb = 0b1101;break;
    case -5: treb = 0b1110;break;
    case -4: treb = 0b1100;break;
    case -3: treb = 0b1011;break;
    case -2: treb = 0b1010;break;
    case -1: treb = 0b1001;break;
    case  0: treb = 0b0000;break;
    case  1: treb = 0b0001;break;
    case  2: treb = 0b0010;break;
    case  3: treb = 0b0011;break;
    case  4: treb = 0b0100;break;
    case  5: treb = 0b0110;break;
    case  6: treb = 0b0101;break;
    case  7: treb = 0b0111;break;
    }
  switch(bass){
    case -7: bass = 0b1111;break;
    case -6: bass = 0b1101;break;
    case -5: bass = 0b1110;break;
    case -4: bass = 0b1100;break;
    case -3: bass = 0b1011;break;
    case -2: bass = 0b1010;break;
    case -1: bass = 0b1001;break;
    case  0: bass = 0b0000;break;
    case  1: bass = 0b0001;break;
    case  2: bass = 0b0010;break;
    case  3: bass = 0b0011;break;
    case  4: bass = 0b0100;break;
    case  5: bass = 0b0110;break;
    case  6: bass = 0b0101;break;
    case  7: bass = 0b0111;break;
    } 
  unsigned int data_byte = (treb<<12)|(port<<8)|(bass<<4)|(by_pass<<2)|0b00;
  writeByte(data_byte); 
  }

void byte_2(int vol_l, int vol_r){
  // int vol 0...95 === 0...-95 dB mute=111
  if(vol_l>79){vol_l=vol_l+16;}
  if(vol_r>79){vol_r=vol_r+16;}
  unsigned int data_byte = (vol_l<<9)|(vol_r<<2)|0b01;
  writeByte(data_byte);
  } 
void byte_3(int vol_c, int vol_sw){
  // int vol 0...95 === 0...-95 dB mute=112
  if(vol_c>79){vol_c=vol_c+16;}
  if(vol_sw>79){vol_sw=vol_sw+16;}
  unsigned int data_byte = (vol_c<<9)|(vol_sw<<2)|0b10;
  writeByte(data_byte);
  } 
void byte_4(int vol_sl, int vol_sr){
  // int vol 0...95 === 0...-95 dB mute=112
  if(vol_sl>79){vol_sl=vol_sl+16;}
  if(vol_sr>79){vol_sr=vol_sr+16;}
  unsigned int data_byte = (vol_sl<<9)|(vol_sr<<2)|0b11;
  writeByte(data_byte);
  }   

void writeByte(uint16_t data){
    digitalWrite(LATCH, HIGH); delayMicroseconds(1);
    digitalWrite(LATCH, LOW); delayMicroseconds(3);
    for (int i = 15; i >= 0; i--) {
        digitalWrite(DATA, (data >> i) & 1); delayMicroseconds(3);
        digitalWrite(CLOCK, HIGH); delayMicroseconds(3);
        digitalWrite(CLOCK, LOW); delayMicroseconds(3);
    }
    digitalWrite(LATCH, HIGH); delayMicroseconds(1);
    digitalWrite(LATCH, LOW); delayMicroseconds(3);
}

83 (2026-01-23 18:35:30 отредактировано Игорёк 87)

Re: M62446

Огромное спасибо! всё заработало. осталось два вопроса: можно ли дописать регулировку нч/вч с пульта отдельными кнопками? и сделать переключение входов с пульта и с кнопки (кусок схемы на CD4053 я присылал чуть ранее на форум), может задействовать какой-то пин ардуинки?

Re: M62446

http://forum.rcl-radio.ru/uploads/images/2026/01/b5262b94b149baf162d698515d6f7529.jpg

85

Re: M62446

Тестируйте, перед загрузкой добавьте коды кнопок пульта

переключение входов с пульта и с кнопки (кусок схемы на CD4053 я присылал чуть ранее на форум

- мне нужен алгоритм работы управляющих сигналов

// M62446
#define LATCH        2
#define DATA         3
#define CLOCK        4
// ENCODER
#define ENC_DT       9
#define ENC_CLK      8
#define ENC_SW       10
// BUTTON
#define ATT          A0
#define MUTE         A1
#define STANDBY      A2
// выход упр. STANDBY
#define ST_OUT       13
// коды кнопок ИК пульта
#define MENU      0x2FDB24D // button encoder
#define UP        0x2FDD02F // >>>
#define DW        0x2FD32CD // <<<
#define POWER_IR  0x2FD00FF // POWER
#define MUTE_IR   0x2FDB04F // MUTE
#define ATT_IR    0x2FDF00F // ATT

#define BASS_UP_IR    0x2FDF00F // bassUP
#define BASS_DW_IR    0x2FDF00F // bassDW

#define TREB_UP_IR    0x2FDF00F // trebUP
#define TREB_DW_IR    0x2FDF00F // trebDW

// ИК датчик
#define IR           12

#include <Wire.h>
#include <LiquidCrystal.h>  // http://forum.rcl-radio.ru/misc.php?acti … download=1
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/ … ncoder.zip   
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/ … Timer2.zip       
#include <boarddefs.h>          // входит в состав библиотеки IRremote
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/ … remote.zip

LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7;  // Устанавливаем дисплей
IRrecv irrecv(IR); // указываем вывод модуля IR приемника
Encoder myEnc(ENC_DT, ENC_CLK);
decode_results ir;

byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};     
byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};

long times,oldPosition  = -999,newPosition;
int vol,bass,treb,att_l,att_r,att_c,att_sw,att_sl,att_sr,mute,power;
int menu,treb_print,bass_print,menu0=100;
bool gr1,gr2;
byte a[6],d1,d2,d3,d4,d5,d6,e1,e2,e3,w,w2,x;

void setup() {
  irrecv.enableIRIn();lcd.begin(16, 2); Serial.begin(9600);
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  pinMode(ENC_SW,INPUT);
  pinMode(LATCH, OUTPUT);digitalWrite(LATCH, LOW);
  pinMode(DATA, OUTPUT);digitalWrite(DATA, LOW);
  pinMode(CLOCK, OUTPUT);digitalWrite(CLOCK, LOW);
  pinMode(ATT,INPUT_PULLUP);   // КНОПКА ATT
  pinMode(MUTE,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(STANDBY,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(ST_OUT,OUTPUT);
  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);
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
  lcd.setCursor(0,0);lcd.print("Sound  Processor");lcd.setCursor(5,1);lcd.print("M62446"); delay(2000);lcd.clear();
 
  vol = EEPROM.read(0);bass = EEPROM.read(1)-7;treb = EEPROM.read(2)-7;
  att_l = EEPROM.read(3);att_r = EEPROM.read(4);att_c = EEPROM.read(5);att_sw = EEPROM.read(6);att_sl = EEPROM.read(7);att_sr = EEPROM.read(8);
  audio();

}

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

  if(power==0){
  if(digitalRead(ENC_SW)==LOW||ir.value==MENU){menu++;menu0=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>2){menu=0;}}

  if(digitalRead(ATT)==LOW||ir.value==ATT_IR){menu0++;menu=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu0>5){menu0=0;}}

  if((ir.value==MUTE_IR||digitalRead(MUTE)==LOW)&&mute==0){mute=1;menu=100;menu0=100;cl();lcd.setCursor(6,0);lcd.print("MUTE");audio_mute();delay(300);}// mute on
  if((ir.value==MUTE_IR||digitalRead(MUTE)==LOW)&&mute==1){mute=0;cl();times=millis();menu=0;myEnc.write(0);audio();}// mute off  

  if(ir.value==BASS_UP_IR){menu=2;bass++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;bass_func();audio();}// bassUP
  if(ir.value==BASS_DW_IR){menu=2;bass--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;bass_func();audio();}// bassDW

  if(ir.value==TREB_UP_IR){menu=1;treb++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;treb_func();audio();}// trebUP
  if(ir.value==TREB_DW_IR){menu=1;treb--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;treb_func();audio();}// trebDW
   
}
// power
  if((ir.value==POWER_IR||digitalRead(STANDBY)==LOW)&&power==0){power=1;cl();audio_mute();lcd.setCursor(3,0);lcd.print("POWER  OFF");menu=100;menu0=100;delay(3000);digitalWrite(ST_OUT,HIGH);}// power off
  if((ir.value==POWER_IR||digitalRead(STANDBY)==LOW)&&power==1){power=0;cl();lcd.setCursor(3,0);lcd.print("POWER   ON ");myEnc.write(0);digitalWrite(ST_OUT,LOW);delay(3000);audio();menu=0;cl();}// power on 
   
////////////// VOLUME ///////////////////////////////////////////////////////////////////
if(menu==0){
   if(ir.value==DW){vol++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
   if(ir.value==UP){vol--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   vol=vol-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();}
   a[0]= (50-vol)/10;a[1]=(50-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   if(mute==0){lcd.setCursor(0,0);lcd.print("VOLUME");}else{lcd.setCursor(0,0);lcd.print("MUTE");}
   lcd.setCursor(0,1);lcd.print("CONTROL");
  }

////////////// TREBLE ///////////////////////////////////////////////////////////////////
if(menu==1){
   if(ir.value==UP){treb++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка >
   if(ir.value==DW){treb--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();}
   if(treb<0){treb_print = abs(treb)*2;lcd.setCursor(7,0);lcd.write((uint8_t)3);}else{treb_print = treb*2;lcd.setCursor(7,0);lcd.print(" ");}
   a[0]= treb_print/10;a[1]=treb_print%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=8,e2=9,e3=10;break;case 1: e1=11,e2=12,e3=13;break;}digit();}
   lcd.setCursor(0,0);lcd.print("TREBLE");lcd.setCursor(0,1);lcd.print("CONTROL");lcd.setCursor(14,0);lcd.print("dB");
   }   

////////////// BASS ///////////////////////////////////////////////////////////////////
if(menu==2){
   if(ir.value==UP){bass++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка >
   if(ir.value==DW){bass--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   bass=bass+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();}
   if(bass<0){bass_print = abs(bass)*2;lcd.setCursor(7,0);lcd.write((uint8_t)3);}else{bass_print = bass*2;lcd.setCursor(7,0);lcd.print(" ");}
   a[0]= bass_print/10;a[1]=bass_print%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=8,e2=9,e3=10;break;case 1: e1=11,e2=12,e3=13;break;}digit();}
   lcd.setCursor(0,0);lcd.print("BASS");lcd.setCursor(0,1);lcd.print("CONTROL");lcd.setCursor(14,0);lcd.print("dB");
   }     


  ////////////// ATT_L ///////////////////////////////////////////////////////////////////
if(menu0==0){menu=100;
   if(ir.value==UP){att_l++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_l++;gr2=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_l--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_l--;gr1=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_l=att_l+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_l_func();audio();}
   a[0]= (att_l)/10;a[1]=(att_l)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("LEFT");
   }   

  ////////////// ATT_R ///////////////////////////////////////////////////////////////////
if(menu0==1){menu=100;
   if(ir.value==UP){att_r++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_r++;gr2=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_r--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_r--;gr1=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_r=att_r+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_r_func();audio();}
   a[0]= (att_r)/10;a[1]=(att_r)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("RIGHT");
   }     

  ////////////// ATT_C ///////////////////////////////////////////////////////////////////
if(menu0==2){menu=100;
   if(ir.value==UP){att_c++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_c++;gr2=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_c--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_c--;gr1=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_c=att_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_c_func();audio();}
   a[0]= (att_c)/10;a[1]=(att_c)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("CENTER");
   } 

  ////////////// ATT_SW ///////////////////////////////////////////////////////////////////
if(menu0==3){menu=100;
   if(ir.value==UP){att_sw++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_sw++;gr2=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sw--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sw--;gr1=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sw=att_sw+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sw_func();audio();}
   a[0]= (att_sw)/10;a[1]=(att_sw)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUBWOOFER");
   } 

  ////////////// ATT_SL ///////////////////////////////////////////////////////////////////
if(menu0==4){menu=100;
   if(ir.value==UP){att_sl++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_sl++;gr2=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sl--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sl--;gr1=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sl=att_sl+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sl_func();audio();}
   a[0]= (att_sl)/10;a[1]=(att_sl)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUR. LEFT");
   } 

  ////////////// ATT_SR ///////////////////////////////////////////////////////////////////
if(menu0==5){menu=100;
   if(ir.value==UP){att_sr++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка >
   if(ir.value==0xFFFFFFFF and gr1==1){att_sr++;gr2=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sr--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sr--;gr1=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка <<<<<<

   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sr=att_sr+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sr_func();audio();}
   a[0]= (att_sr)/10;a[1]=(att_sr)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUR. RIGHT");
   }                     


if(millis()-times>10000&&w==1&&mute==0&&power==0){
   menu=0;menu0=100;w=0;cl();
   EEPROM.update(0,vol);EEPROM.update(1,bass+7);EEPROM.update(2,treb+7);
   EEPROM.update(3,att_l);EEPROM.update(4,att_r);EEPROM.update(5,att_c);
   EEPROM.update(6,att_sw);EEPROM.update(7,att_sl);EEPROM.update(8,att_sr);
   }
}

void vol_func(){if(vol>50){vol=50;}if(vol<0){vol=0;}}
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 att_l_func(){if(att_l>19){att_l=19;}if(att_l<0){att_l=0;}}
void att_r_func(){if(att_r>19){att_r=19;}if(att_r<0){att_r=0;}}
void att_c_func(){if(att_c>19){att_c=19;}if(att_c<0){att_c=0;}}
void att_sw_func(){if(att_sw>19){att_sw=19;}if(att_sw<0){att_sw=0;}}
void att_sr_func(){if(att_sr>19){att_sr=19;}if(att_sr<0){att_sr=0;}}
void att_sl_func(){if(att_sl>19){att_sl=19;}if(att_sl<0){att_sl=0;}}

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

void to_Timer(){newPosition = myEnc.read()/4;}
void audio(){
  byte_1(treb,0b0000,bass,0);// treb -7...7, port 0b0000, bass -7...7, bypass = 0
  byte_2(vol+att_l,vol+att_r);// 0...95 = 0...-95 dB mute = 111
  byte_3(vol+att_c,vol+att_sw);// 0...95 = 0...-95 dB mute = 111
  byte_4(vol+att_sl,vol+att_sr);// 0...95 = 0...-95 dB mute = 111
  }

void audio_mute(){
  byte_2(111,111);
  byte_3(111,111);
  byte_4(111,111);
  } 

void byte_1(int treb, byte port, int bass, bool by_pass){
  // treb int -7...+7 === -14...+14 dB
  // bass int -7...+7 === -14...+14 dB
  // byte port 0b0000....0b1111
  // by_pass  === 0 TONE | 1 BYPASS
  switch(treb){
    case -7: treb = 0b1111;break;
    case -6: treb = 0b1101;break;
    case -5: treb = 0b1110;break;
    case -4: treb = 0b1100;break;
    case -3: treb = 0b1011;break;
    case -2: treb = 0b1010;break;
    case -1: treb = 0b1001;break;
    case  0: treb = 0b0000;break;
    case  1: treb = 0b0001;break;
    case  2: treb = 0b0010;break;
    case  3: treb = 0b0011;break;
    case  4: treb = 0b0100;break;
    case  5: treb = 0b0110;break;
    case  6: treb = 0b0101;break;
    case  7: treb = 0b0111;break;
    }
  switch(bass){
    case -7: bass = 0b1111;break;
    case -6: bass = 0b1101;break;
    case -5: bass = 0b1110;break;
    case -4: bass = 0b1100;break;
    case -3: bass = 0b1011;break;
    case -2: bass = 0b1010;break;
    case -1: bass = 0b1001;break;
    case  0: bass = 0b0000;break;
    case  1: bass = 0b0001;break;
    case  2: bass = 0b0010;break;
    case  3: bass = 0b0011;break;
    case  4: bass = 0b0100;break;
    case  5: bass = 0b0110;break;
    case  6: bass = 0b0101;break;
    case  7: bass = 0b0111;break;
    } 
  unsigned int data_byte = (treb<<12)|(port<<8)|(bass<<4)|(by_pass<<2)|0b00;
  writeByte(data_byte); 
  }

void byte_2(int vol_l, int vol_r){
  // int vol 0...95 === 0...-95 dB mute=111
  if(vol_l>79){vol_l=vol_l+16;}
  if(vol_r>79){vol_r=vol_r+16;}
  unsigned int data_byte = (vol_l<<9)|(vol_r<<2)|0b01;
  writeByte(data_byte);
  } 
void byte_3(int vol_c, int vol_sw){
  // int vol 0...95 === 0...-95 dB mute=112
  if(vol_c>79){vol_c=vol_c+16;}
  if(vol_sw>79){vol_sw=vol_sw+16;}
  unsigned int data_byte = (vol_c<<9)|(vol_sw<<2)|0b10;
  writeByte(data_byte);
  } 
void byte_4(int vol_sl, int vol_sr){
  // int vol 0...95 === 0...-95 dB mute=112
  if(vol_sl>79){vol_sl=vol_sl+16;}
  if(vol_sr>79){vol_sr=vol_sr+16;}
  unsigned int data_byte = (vol_sl<<9)|(vol_sr<<2)|0b11;
  writeByte(data_byte);
  }   

void writeByte(uint16_t data){
    digitalWrite(LATCH, HIGH); delayMicroseconds(1);
    digitalWrite(LATCH, LOW); delayMicroseconds(3);
    for (int i = 15; i >= 0; i--) {
        digitalWrite(DATA, (data >> i) & 1); delayMicroseconds(3);
        digitalWrite(CLOCK, HIGH); delayMicroseconds(3);
        digitalWrite(CLOCK, LOW); delayMicroseconds(3);
    }
    digitalWrite(LATCH, HIGH); delayMicroseconds(1);
    digitalWrite(LATCH, LOW); delayMicroseconds(3);
}

86

Re: M62446

Определитесь с пинами, у Вас есть общие пины для двух уст-в

Re: M62446

у меня акустика XORO HS511,могу прислать схему,для общего понимания

Re: M62446

http://forum.rcl-radio.ru/uploads/images/2026/01/ccb0dfdcfed2399fce6ba0d75ff41ed0.jpg

89

Re: M62446

Мне нужно что подавать (отмечено красным), чтобы переключать режимы входов

http://forum.rcl-radio.ru/uploads/images/2026/01/ad295a5e86826968644efeae88533e6c.png

Re: M62446

Микросхема имеет 6 каналов коммутации (аналоговых ключей), объединённых в три группы по два ключа в каждом. Сигналы A, B и C задают номера включёнённых каналов, а INH даёт общее разрешение работы (активный уровень — низкий). Три канала (по одному из каждой группы) включаются одновременно

Re: M62446

http://forum.rcl-radio.ru/uploads/images/2026/01/dd6a8a4db93279c41b1daf87dd482720.jpg

Re: M62446

АС-3,это АВС

Re: M62446

разобрался. 6-на массу, а на выводы ABC-если 2.0 вход-LOW, ЕСЛИ 5.1, -HIGH

94

Re: M62446

ок. Завтра постараюсь сделать.
Нужно выделить пины под коммутатор входов 2 шт, напишите их, управление IR

95 (2026-01-24 08:24:26 отредактировано Игорёк 87)

Re: M62446

Спасибо. Переключение входов на пульте,кнопка in, и кнопка отдельная на лицевой панели,может А3 задействовать?

Re: M62446

НАШЁЛ дисплей i2c, можно всё сделать под него?

97

Re: M62446

// M62446
#define LATCH        2
#define DATA         3
#define CLOCK        4
// ENCODER
#define ENC_DT       9
#define ENC_CLK      8
#define ENC_SW       10
// BUTTON
#define ATT          A0
#define MUTE         A1
#define STANDBY      A2
#define IN           A3
// выход упр. STANDBY
#define ST_OUT       13
// коды кнопок ИК пульта
#define MENU         0x2FDB24D // button encoder
#define UP           0x2FDD02F // >>>
#define DW           0x2FD32CD // <<<
#define POWER_IR     0x2FD00FF // POWER
#define MUTE_IR      0x2FDB04F // MUTE
#define ATT_IR       0x2FDF00F // ATT
#define IN_IR        0x2FD807F // INPUT
#define BASS_UP_IR   0x2FD629D // bassUP
#define BASS_DW_IR   0x2FDA25D // bassDW
#define TREB_UP_IR   0x2FD22DD // trebUP
#define TREB_DW_IR   0x2FDE01F // trebDW
// ИК датчик
#define IR           12
// управление входами
#define OUT_PIN1     5
#define OUT_PIN2     6

#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

 LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
 IRrecv irrecv(IR); // указываем вывод модуля IR приемника
 Encoder myEnc(ENC_DT, ENC_CLK);
 decode_results ir; 

 byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
 byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};      
 byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
 byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
 byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
 byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
 byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
 byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000}; 

 long times,oldPosition  = -999,newPosition;
 int vol,bass,treb,att_l,att_r,att_c,att_sw,att_sl,att_sr,mute,power;
 int menu,treb_print,bass_print,menu0=100,in;
 bool gr1,gr2;
 byte a[6],d1,d2,d3,d4,d5,d6,e1,e2,e3,w,w2,x;

void setup() {
  irrecv.enableIRIn();lcd.init();lcd.backlight();Serial.begin(9600);
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  pinMode(ENC_SW,INPUT); 
  pinMode(LATCH, OUTPUT);digitalWrite(LATCH, LOW);
  pinMode(DATA, OUTPUT);digitalWrite(DATA, LOW);
  pinMode(CLOCK, OUTPUT);digitalWrite(CLOCK, LOW);
  pinMode(ATT,INPUT_PULLUP);   // КНОПКА ATT
  pinMode(MUTE,INPUT_PULLUP);   // КНОПКА MUTE
  pinMode(STANDBY,INPUT_PULLUP);   // КНОПКА STANDBY
  pinMode(IN,INPUT_PULLUP);   // КНОПКА INPUT
  pinMode(ST_OUT,OUTPUT); 
  pinMode(OUT_PIN1,OUTPUT); 
  pinMode(OUT_PIN2,OUTPUT); 
  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);
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  lcd.setCursor(0,0);lcd.print("Sound  Processor");lcd.setCursor(5,1);lcd.print("M62446"); delay(2000);lcd.clear();
  
  vol = EEPROM.read(0);bass = EEPROM.read(1)-7;treb = EEPROM.read(2)-7;
  att_l = EEPROM.read(3);att_r = EEPROM.read(4);att_c = EEPROM.read(5);att_sw = EEPROM.read(6);att_sl = EEPROM.read(7);att_sr = EEPROM.read(8);
  in = EEPROM.read(9);
  audio();

}

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

  if(power==0){ 
  if(digitalRead(ENC_SW)==LOW||ir.value==MENU){menu++;menu0=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu>2){menu=0;}}

  if(digitalRead(ATT)==LOW||ir.value==ATT_IR){menu0++;menu=100;gr1=0;gr2=0;cl();times=millis();w=1;w2=1;if(menu0>5){menu0=0;}}

  if((ir.value==MUTE_IR||digitalRead(MUTE)==LOW)&&mute==0){mute=1;menu=100;menu0=100;cl();lcd.setCursor(6,0);lcd.print("MUTE");audio_mute();delay(300);}// mute on
  if((ir.value==MUTE_IR||digitalRead(MUTE)==LOW)&&mute==1){mute=0;cl();times=millis();menu=0;myEnc.write(0);audio();}// mute off 

  if(ir.value==BASS_UP_IR && menu!=2){menu=2;bass++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();audio();}// bassUP
  if(ir.value==BASS_DW_IR && menu!=2){menu=2;bass--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();audio();}// bassDW

  if(ir.value==TREB_UP_IR && menu!=1){menu=1;treb++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();audio();}// trebUP
  if(ir.value==TREB_DW_IR && menu!=1){menu=1;treb--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();audio();}// trebDW   
 
  if(digitalRead(IN)==LOW||ir.value==IN_IR){in++;menu=100;cl();times=millis();w=1;w2=1;if(in>1){in=0;}
  if(in==0){lcd.setCursor(3,0);lcd.print("INPUT 2CH");digitalWrite(OUT_PIN1,LOW);digitalWrite(OUT_PIN2,LOW);delay(1000);menu=0;cl();}
  if(in==1){lcd.setCursor(3,0);lcd.print("INPUT 6CH");digitalWrite(OUT_PIN1,LOW);digitalWrite(OUT_PIN2,HIGH);delay(1000);menu=0;cl();}
  }
 
 }
 // power 
  if((ir.value==POWER_IR||digitalRead(STANDBY)==LOW)&&power==0){power=1;cl();audio_mute();lcd.setCursor(3,0);lcd.print("POWER  OFF");menu=100;menu0=100;delay(3000);lcd.noBacklight();digitalWrite(ST_OUT,HIGH);}// power off
  if((ir.value==POWER_IR||digitalRead(STANDBY)==LOW)&&power==1){power=0;lcd.backlight();cl();lcd.setCursor(3,0);lcd.print("POWER   ON ");myEnc.write(0);digitalWrite(ST_OUT,LOW);delay(3000);audio();menu=0;cl();}// power on  
    
 ////////////// VOLUME ///////////////////////////////////////////////////////////////////
 if(menu==0){
   if(ir.value==DW){vol++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка >>>>>>
   if(ir.value==UP){vol--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();times=millis();w=1;w2=1;vol_func();audio();}// кнопка <<<<<<
 
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   vol=vol-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();audio();}
   a[0]= (50-vol)/10;a[1]=(50-vol)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   if(mute==0){lcd.setCursor(0,0);lcd.print("VOLUME");}else{lcd.setCursor(0,0);lcd.print("MUTE");}
   lcd.setCursor(0,1);lcd.print("CONTROL");
  }

////////////// TREBLE ///////////////////////////////////////////////////////////////////
 if(menu==1){
   if(ir.value==UP||ir.value==TREB_UP_IR){treb++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка > 
   if(ir.value==DW||ir.value==TREB_DW_IR){treb--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;treb_func();audio();}// кнопка <
 
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();audio();}
   if(treb<0){treb_print = abs(treb)*2;lcd.setCursor(7,0);lcd.write((uint8_t)3);}else{treb_print = treb*2;lcd.setCursor(7,0);lcd.print(" ");}
   a[0]= treb_print/10;a[1]=treb_print%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=8,e2=9,e3=10;break;case 1: e1=11,e2=12,e3=13;break;}digit();}
   lcd.setCursor(0,0);lcd.print("TREBLE");lcd.setCursor(0,1);lcd.print("CONTROL");lcd.setCursor(14,0);lcd.print("dB");
   }   

 ////////////// BASS ///////////////////////////////////////////////////////////////////
 if(menu==2){
   if(ir.value==UP||ir.value==BASS_UP_IR){bass++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка > 
   if(ir.value==DW||ir.value==BASS_DW_IR){bass--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;bass_func();audio();}// кнопка <
 
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   bass=bass+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();audio();}
   if(bass<0){bass_print = abs(bass)*2;lcd.setCursor(7,0);lcd.write((uint8_t)3);}else{bass_print = bass*2;lcd.setCursor(7,0);lcd.print(" ");}
   a[0]= bass_print/10;a[1]=bass_print%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=8,e2=9,e3=10;break;case 1: e1=11,e2=12,e3=13;break;}digit();}
   lcd.setCursor(0,0);lcd.print("BASS");lcd.setCursor(0,1);lcd.print("CONTROL");lcd.setCursor(14,0);lcd.print("dB");
   }     


  ////////////// ATT_L ///////////////////////////////////////////////////////////////////
 if(menu0==0){menu=100;
   if(ir.value==UP){att_l++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){att_l++;gr2=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_l--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_l--;gr1=0;cl1();times=millis();w=1;w2=1;att_l_func();audio();}// кнопка <<<<<<
 
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_l=att_l+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_l_func();audio();}
   a[0]= (att_l)/10;a[1]=(att_l)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("LEFT");
   }   

  ////////////// ATT_R ///////////////////////////////////////////////////////////////////
 if(menu0==1){menu=100;
   if(ir.value==UP){att_r++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){att_r++;gr2=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_r--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_r--;gr1=0;cl1();times=millis();w=1;w2=1;att_r_func();audio();}// кнопка <<<<<<
 
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_r=att_r+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_r_func();audio();}
   a[0]= (att_r)/10;a[1]=(att_r)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("RIGHT");
   }     

  ////////////// ATT_C ///////////////////////////////////////////////////////////////////
 if(menu0==2){menu=100;
   if(ir.value==UP){att_c++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){att_c++;gr2=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_c--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_c--;gr1=0;cl1();times=millis();w=1;w2=1;att_c_func();audio();}// кнопка <<<<<<
 
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_c=att_c+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_c_func();audio();}
   a[0]= (att_c)/10;a[1]=(att_c)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("CENTER");
   }  

  ////////////// ATT_SW ///////////////////////////////////////////////////////////////////
 if(menu0==3){menu=100;
   if(ir.value==UP){att_sw++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){att_sw++;gr2=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sw--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sw--;gr1=0;cl1();times=millis();w=1;w2=1;att_sw_func();audio();}// кнопка <<<<<<
 
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sw=att_sw+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sw_func();audio();}
   a[0]= (att_sw)/10;a[1]=(att_sw)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUBWOOFER");
   }  

  ////////////// ATT_SL ///////////////////////////////////////////////////////////////////
 if(menu0==4){menu=100;
   if(ir.value==UP){att_sl++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){att_sl++;gr2=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sl--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sl--;gr1=0;cl1();times=millis();w=1;w2=1;att_sl_func();audio();}// кнопка <<<<<<
 
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sl=att_sl+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sl_func();audio();}
   a[0]= (att_sl)/10;a[1]=(att_sl)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUR. LEFT");
   }  

  ////////////// ATT_SR ///////////////////////////////////////////////////////////////////
 if(menu0==5){menu=100;
   if(ir.value==UP){att_sr++;gr1=1;gr2=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){att_sr++;gr2=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка >>>>>>
   if(ir.value==DW){att_sr--;gr1=0;gr2=1;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){att_sr--;gr1=0;cl1();times=millis();w=1;w2=1;att_sr_func();audio();}// кнопка <<<<<<
 
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
   att_sr=att_sr+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;att_sr_func();audio();}
   a[0]= (att_sr)/10;a[1]=(att_sr)%10;
   for(x=0;x<2;x++){switch(x){case 0: e1=10,e2=11,e3=12;break;case 1: e1=13,e2=14,e3=15;break;}digit();}
   lcd.setCursor(0,0);lcd.print("ATTENUATOR");lcd.setCursor(0,1);lcd.print("SUR. RIGHT");
   }                      


 if(millis()-times>10000&&w==1&&mute==0&&power==0){
   menu=0;menu0=100;w=0;cl();
   EEPROM.update(0,vol);EEPROM.update(1,bass+7);EEPROM.update(2,treb+7);
   EEPROM.update(3,att_l);EEPROM.update(4,att_r);EEPROM.update(5,att_c);
   EEPROM.update(6,att_sw);EEPROM.update(7,att_sl);EEPROM.update(8,att_sr);
   EEPROM.update(9,in);
   }
}

void vol_func(){if(vol>50){vol=50;}if(vol<0){vol=0;}}
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 att_l_func(){if(att_l>19){att_l=19;}if(att_l<0){att_l=0;}}
void att_r_func(){if(att_r>19){att_r=19;}if(att_r<0){att_r=0;}}
void att_c_func(){if(att_c>19){att_c=19;}if(att_c<0){att_c=0;}}
void att_sw_func(){if(att_sw>19){att_sw=19;}if(att_sw<0){att_sw=0;}}
void att_sr_func(){if(att_sr>19){att_sr=19;}if(att_sr<0){att_sr=0;}}
void att_sl_func(){if(att_sl>19){att_sl=19;}if(att_sl<0){att_sl=0;}}

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

void to_Timer(){newPosition = myEnc.read()/4;}
void audio(){
  byte_1(treb,0b0000,bass,0);// treb -7...7, port 0b0000, bass -7...7, bypass = 0
  byte_2(vol+att_l,vol+att_r);// 0...95 = 0...-95 dB mute = 111
  byte_3(vol+att_c,vol+att_sw);// 0...95 = 0...-95 dB mute = 111
  byte_4(vol+att_sl,vol+att_sr);// 0...95 = 0...-95 dB mute = 111
  }

void audio_mute(){
  byte_2(111,111);
  byte_3(111,111);
  byte_4(111,111);
  }  

void byte_1(int treb, byte port, int bass, bool by_pass){
  // treb int -7...+7 === -14...+14 dB
  // bass int -7...+7 === -14...+14 dB
  // byte port 0b0000....0b1111
  // by_pass  === 0 TONE | 1 BYPASS 
  switch(treb){
    case -7: treb = 0b1111;break;
    case -6: treb = 0b1101;break;
    case -5: treb = 0b1110;break;
    case -4: treb = 0b1100;break;
    case -3: treb = 0b1011;break;
    case -2: treb = 0b1010;break;
    case -1: treb = 0b1001;break;
    case  0: treb = 0b0000;break;
    case  1: treb = 0b0001;break;
    case  2: treb = 0b0010;break;
    case  3: treb = 0b0011;break;
    case  4: treb = 0b0100;break;
    case  5: treb = 0b0110;break;
    case  6: treb = 0b0101;break;
    case  7: treb = 0b0111;break;
    }
  switch(bass){
    case -7: bass = 0b1111;break;
    case -6: bass = 0b1101;break;
    case -5: bass = 0b1110;break;
    case -4: bass = 0b1100;break;
    case -3: bass = 0b1011;break;
    case -2: bass = 0b1010;break;
    case -1: bass = 0b1001;break;
    case  0: bass = 0b0000;break;
    case  1: bass = 0b0001;break;
    case  2: bass = 0b0010;break;
    case  3: bass = 0b0011;break;
    case  4: bass = 0b0100;break;
    case  5: bass = 0b0110;break;
    case  6: bass = 0b0101;break;
    case  7: bass = 0b0111;break;
    }  
  unsigned int data_byte = (treb<<12)|(port<<8)|(bass<<4)|(by_pass<<2)|0b00;
  writeByte(data_byte);  
  }

void byte_2(int vol_l, int vol_r){
  // int vol 0...95 === 0...-95 dB mute=111
  if(vol_l>79){vol_l=vol_l+16;}
  if(vol_r>79){vol_r=vol_r+16;}
  unsigned int data_byte = (vol_l<<9)|(vol_r<<2)|0b01;
  writeByte(data_byte); 
  }  
void byte_3(int vol_c, int vol_sw){
  // int vol 0...95 === 0...-95 dB mute=112
  if(vol_c>79){vol_c=vol_c+16;}
  if(vol_sw>79){vol_sw=vol_sw+16;}
  unsigned int data_byte = (vol_c<<9)|(vol_sw<<2)|0b10;
  writeByte(data_byte); 
  }  
void byte_4(int vol_sl, int vol_sr){
  // int vol 0...95 === 0...-95 dB mute=112
  if(vol_sl>79){vol_sl=vol_sl+16;}
  if(vol_sr>79){vol_sr=vol_sr+16;}
  unsigned int data_byte = (vol_sl<<9)|(vol_sr<<2)|0b11;
  writeByte(data_byte); 
  }    

void writeByte(uint16_t data){
    digitalWrite(LATCH, HIGH); delayMicroseconds(1);
    digitalWrite(LATCH, LOW); delayMicroseconds(3);
    for (int i = 15; i >= 0; i--) {
        digitalWrite(DATA, (data >> i) & 1); delayMicroseconds(3);
        digitalWrite(CLOCK, HIGH); delayMicroseconds(3);
        digitalWrite(CLOCK, LOW); delayMicroseconds(3);
    }
    digitalWrite(LATCH, HIGH); delayMicroseconds(1);
    digitalWrite(LATCH, LOW); delayMicroseconds(3);
}

Re: M62446

Александр,спасибо! буду тестировать. Вопрос-управление входами -5 и 6,это что и как ? просто на обоих микросхемах АВС соеденены между собой в пучек,т.е нужен один пин управления на всё. проследил по печатке

99

Re: M62446

я сделал через два пина, один всегда LOW, другой меняет состояние, на всякий случай
Но можете использовать только 6

100

Re: M62446

низкий уровень для 2,0 и высокий для 5,1