276

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

Не должно ни как повлиять

277

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

Спасибо

278 (2025-03-29 09:51:16 отредактировано opertech)

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

Здравствуйте. Можно ли обойти превышение размеров прошивки (104% от памяти контроллера) при использовании 328P-LQFP32(MiniEVB) если использовать стандартную прошивку из среды через сн340(загрузчик)?

279

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

Надо по возможности все повторяющиеся фрагменты кода перенести в функцию для уменьшения размера скетча

280

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

Спасибо

281

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

Здравствуйте собрал Ваш проект скетч из поста 260 не отключается звук в режиме MUTE на экране режим отображается

282

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

Замените

if(power==0){
  if((digitalRead(MUTE_BUTTON)==LOW || ir.value==IR_MUTE)&& mute==0){mute=1;gr1=0;gr2=0;cl();
    myOLED.setFont(SmallFont);myOLED.print(F("MUTE"), CENTER, 10);myOLED.update();cl();menu=100;}
  if((digitalRead(MUTE_BUTTON)==LOW  || ir.value==IR_MUTE)&& mute==1){mute=0;gr1=0;gr2=0;times=millis();w=1;w2=1;cl();menu=0;} 
}

на

if(power==0){
  if((digitalRead(MUTE_BUTTON)==LOW || ir.value==IR_MUTE)&& mute==0){mute=1;gr1=0;gr2=0;cl();
    myOLED.setFont(SmallFont);myOLED.print(F("MUTE"), CENTER, 10);myOLED.update();cl();menu=100;audio();}
  if((digitalRead(MUTE_BUTTON)==LOW  || ir.value==IR_MUTE)&& mute==1){mute=0;gr1=0;gr2=0;times=millis();w=1;w2=1;cl();menu=0;audio();} 
}

283

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

Спасибо за быстрый ответ еще хотелось добавить 2 пина на  IN2  и IN3
#define IN2_OUT 6
#define IN3_OUT 7
чтобы при включении соответствующего входа  на них был высокий уровень.нужны для коммутации индикатора уровня

284

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

swith(in_reg){
  case 1: digitalWrite(IN2_OUT,HIGH); digitalWrite(IN3_OUT,LOW);break;
  case 2: digitalWrite(IN2_OUT,LOW); digitalWrite(IN3_OUT,HIGH);break;
}

285

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

спасибо а то я уже начал пытать китайский ии вот что получилось
#define ENC_BUTTON 10
#define IN_BUTTON 2
#define SET_BUTTON 3
#define POWER_BUTTON 4
#define STANDBY_OUT 13
#define MUTE_BUTTON 5
#define IN2_OUT 6
#define IN3_OUT 7

#define IR_POWER 0x106FBA45  // КРАСНАЯ
#define IR_MUTE 0x106F02FD   // 3
#define IR_UP 0x106F42BD     // 1
#define IR_DW 0x106F827D     // 2
#define IR_MENU 0x106F8A75   // СИНЯЯ
#define IR_INPUT 0x106F9A65  // ЗЕЛЕНАЯ
#define IR_SET 0x106FE01F    // ЖЕЛТАЯ

// Константы для улучшения читаемости
#define DEBOUNCE_DELAY 50
#define DISPLAY_TIMEOUT 5000
#define ENCODER_DIVIDER 4
#define EEPROM_CLEAR_FLAG 100
#define EEPROM_CLEAR_VALUE 0

// Ограничения значений
#define VOLUME_MIN -79
#define VOLUME_MAX 15
#define EQ_MIN -20
#define EQ_MAX 20
#define GAIN_MIN 0
#define GAIN_MAX 20
#define CHANNEL_GAIN_MIN -79
#define CHANNEL_GAIN_MAX 15

#include <Wire.h>
#include <OLED_I2C.h>
#include <Encoder.h>
#include <EEPROM.h>
#include <MsTimer2.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <BD37534FV.h>

BD37534FV tda;
OLED myOLED(SDA, SCL, 8);
extern uint8_t SmallFont[], BigNumbers[];
IRrecv irrecv(12);
Encoder myEnc(9, 8);
decode_results ir;

// Переменные состояния
long times, oldPosition = -999, newPosition;
int menu, vol_reg, in_reg, treb_reg, bass_reg, mid_reg, gain0, gain1, gain2, gain3;
bool w2, w, www, gr1, gr2, power = 1, mute;
int f_treb, q_treb, f_mid, q_mid, f_bass, q_bass, set = 0, f_sub, f_lon, gain_lon;
int gain_lf, gain_rf, gain_lr, gain_rr, gain_sub;

// Прототипы функций
void to_Timer();
void handlePower();
void handleMenuNavigation();
void handleVolume();
void handleToneControls();
void handleInputGain();
void handleSettingsMenu();
void saveToEEPROM();
void updateDisplay();
void audio();
void cl();

void en_low();
void ir_low();
void ir_low1();
void ir_low2();
void ir_low3();
void enc_err();

// Функции ограничения значений
void gain_lf_func() { gain_lf = constrain(gain_lf, CHANNEL_GAIN_MIN, CHANNEL_GAIN_MAX); }
void gain_rf_func() { gain_rf = constrain(gain_rf, CHANNEL_GAIN_MIN, CHANNEL_GAIN_MAX); }
void gain_lr_func() { gain_lr = constrain(gain_lr, CHANNEL_GAIN_MIN, CHANNEL_GAIN_MAX); }
void gain_rr_func() { gain_rr = constrain(gain_rr, CHANNEL_GAIN_MIN, CHANNEL_GAIN_MAX); }
void gain_sub_func() { gain_sub = constrain(gain_sub, CHANNEL_GAIN_MIN, CHANNEL_GAIN_MAX); }
void gain_lon_func() { gain_lon = constrain(gain_lon, GAIN_MIN, GAIN_MAX); }
void f_lon_func() { f_lon = constrain(f_lon, 0, 3); }
void f_sub_func() { f_sub = constrain(f_sub, 0, 4); }
void f_treb_func() { f_treb = constrain(f_treb, 0, 3); }
void f_mid_func() { f_mid = constrain(f_mid, 0, 3); }
void f_bass_func() { f_bass = constrain(f_bass, 0, 3); }
void q_mid_func() { q_mid = constrain(q_mid, 0, 3); }
void q_bass_func() { q_bass = constrain(q_bass, 0, 3); }
void q_treb_func() { q_treb = constrain(q_treb, 0, 1); }
void bass_func() { bass_reg = constrain(bass_reg, EQ_MIN, EQ_MAX); }
void mid_func() { mid_reg = constrain(mid_reg, EQ_MIN, EQ_MAX); }
void treb_func() { treb_reg = constrain(treb_reg, EQ_MIN, EQ_MAX); }
void gain_func() { gain0 = constrain(gain0, GAIN_MIN, GAIN_MAX); }
void vol_func() { vol_reg = constrain(vol_reg, VOLUME_MIN, VOLUME_MAX); }

void setup() {
  Wire.begin();
  Wire.setClock(400000L);
  irrecv.enableIRIn();
  myOLED.begin();
  myOLED.setBrightness(100);
 
  // Настройка пинов
  pinMode(ENC_BUTTON, INPUT);
  pinMode(IN_BUTTON, INPUT_PULLUP);
  pinMode(SET_BUTTON, INPUT_PULLUP);
  pinMode(MUTE_BUTTON, INPUT_PULLUP);
  pinMode(POWER_BUTTON, INPUT_PULLUP);
  pinMode(STANDBY_OUT, OUTPUT);
  pinMode(IN2_OUT, OUTPUT);
  pinMode(IN3_OUT, OUTPUT);

  // Таймер для энкодера
  MsTimer2::set(3, to_Timer);
  MsTimer2::start();

  // Инициализация EEPROM
  if (EEPROM.read(EEPROM_CLEAR_FLAG) != EEPROM_CLEAR_VALUE) {
    for (int i = 0; i < EEPROM_CLEAR_FLAG; i++) {
      EEPROM.update(i, EEPROM_CLEAR_VALUE);
    }
  }

  // Загрузка настроек из EEPROM
  vol_reg = EEPROM.read(0) - 79;
  in_reg = EEPROM.read(1);
  gain1 = EEPROM.read(2);
  gain2 = EEPROM.read(3);
  gain3 = EEPROM.read(4);
  treb_reg = EEPROM.read(5) - 20;
  f_treb = EEPROM.read(6);
  q_treb = EEPROM.read(7);
  mid_reg = EEPROM.read(8) - 20;
  f_mid = EEPROM.read(9);
  q_mid = EEPROM.read(10);
  bass_reg = EEPROM.read(11) - 20;
  f_bass = EEPROM.read(12);
  q_bass = EEPROM.read(13);
  f_sub = EEPROM.read(14);
  f_lon = EEPROM.read(15);
  gain_lon = EEPROM.read(16);
  gain_lf = EEPROM.read(17) - 79;
  gain_rf = EEPROM.read(18) - 79;
  gain_lr = EEPROM.read(19) - 79;
  gain_rr = EEPROM.read(20) - 79;
  gain_sub = EEPROM.read(21) - 79;

  // Применение ограничений
  vol_func();
  treb_func();
  mid_func();
  bass_func();
  gain_func();

  // Установка начального gain0
  switch (in_reg) {
    case 0: gain0 = gain1; break;
    case 1: gain0 = gain2; break;
    case 2: gain0 = gain3; break;
  }
 

  // Стартовый экран
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("Sound Processors"), CENTER, 10);
  myOLED.print(F("BD37534FV"), CENTER, 30);
  myOLED.update();
  delay(2000);
}

void to_Timer() {
  newPosition = myEnc.read() / ENCODER_DIVIDER;
}
void updateInputOutputs() {
  switch (in_reg) {
    case 0:
      // Вход 1 - оба выхода LOW
      digitalWrite(IN2_OUT, LOW);
      digitalWrite(IN3_OUT, LOW);
      break;
    case 1:
      // Вход 2 - IN2_OUT HIGH, IN3_OUT LOW
      digitalWrite(IN2_OUT, HIGH);
      digitalWrite(IN3_OUT, LOW);
      break;
    case 2:
      // Вход 3 - IN2_OUT LOW, IN3_OUT HIGH
      digitalWrite(IN2_OUT, LOW);
      digitalWrite(IN3_OUT, HIGH);
      break;
  }
}
void loop() {
  // Обработка ИК-сигналов
  if (irrecv.decode(&ir)) {
    irrecv.resume();
    times = millis();
    w = true;
    w2 = true;
  }

  if (ir.value == 0) {
    gr1 = false;
    gr2 = false;
  }

  // Основные обработчики
  handlePower();
  handleMenuNavigation();
 
  if (power == 0 && mute == 0) {
    handleVolume();
    handleToneControls();
    handleInputGain();
    handleSettingsMenu();
  }

  // Управление standby
  digitalWrite(STANDBY_OUT, (power == 0) ? HIGH : LOW);

  // Автосохранение в EEPROM
  if (millis() - times > DISPLAY_TIMEOUT && w2 && power == 0 && mute == 0) {
    saveToEEPROM();
    set = 0;
    menu = 0;
    w2 = false;
    w = true;
    cl();
  }
}

void handlePower() {
  if ((digitalRead(POWER_BUTTON) == LOW || ir.value == IR_POWER) && power == 0) {
    power = true;
    mute = true;
    gr1 = false;
    gr2 = false;
    cl();
    myOLED.setFont(SmallFont);
    myOLED.print(F("POWER OFF"), CENTER, 10);
    myOLED.update();
    delay(1500);
    cl();
    menu = 100;
    myOLED.setBrightness(0);
    audio();
  }
 
  if ((digitalRead(POWER_BUTTON) == LOW || ir.value == IR_POWER) && power == 1) {
    power = false;
    mute = false;
    myOLED.setBrightness(100);
    gr1 = false;
    gr2 = false;
    times = millis();
    w = true;
    w2 = true;
    myOLED.setFont(SmallFont);
    myOLED.print(F("POWER ON"), CENTER, 10);
    myOLED.update();
    delay(1500);
    cl();
    menu = 0;
    audio();
  }

  // Обработка MUTE
  if (power == 0) {
    if ((digitalRead(MUTE_BUTTON) == LOW || ir.value == IR_MUTE) && mute == 0) {
      mute = true;
      gr1 = false;
      gr2 = false;
      cl();
      myOLED.setFont(SmallFont);
      myOLED.print(F("MUTE"), CENTER, 10);
      myOLED.update();
      cl();
      menu = 100;
      audio();
    }
    if ((digitalRead(MUTE_BUTTON) == LOW || ir.value == IR_MUTE) && mute == 1) {
      mute = false;
      gr1 = false;
      gr2 = false;
      times = millis();
      w = true;
      w2 = true;
      cl();
      menu = 0;
      audio();
    }
  }
}

void handleMenuNavigation() {
  if (power == 0 && mute == 0) {
    if (digitalRead(SET_BUTTON) == LOW || ir.value == IR_SET) {
      set = 1;
      gr1 = false;
      gr2 = false;
      cl();
      delay(DEBOUNCE_DELAY);
      times = millis();
      w = true;
      w2 = true;
      myOLED.setFont(SmallFont);
      myOLED.print(F("SETTING MENU"), CENTER, 10);
      myOLED.update();
      delay(1500);
      cl();
      menu = 10;
    }
   
    if ((digitalRead(ENC_BUTTON) == LOW || ir.value == IR_MENU) && set == 0) {
      menu++;
      gr1 = false;
      gr2 = false;
      cl();
      delay(DEBOUNCE_DELAY);
      times = millis();
      w = true;
      w2 = true;
      if (menu > 3) menu = 0;
    }
   
    if ((digitalRead(ENC_BUTTON) == LOW || ir.value == IR_MENU) && set == 1) {
      menu++;
      gr1 = false;
      gr2 = false;
      cl();
      delay(DEBOUNCE_DELAY);
      times = millis();
      w = true;
      w2 = true;
      if (menu > 23) menu = 10;
    }
   
    if (digitalRead(IN_BUTTON) == LOW || ir.value == IR_INPUT) {
      in_reg++;
      menu = 5;
      cl();
      times = millis();
      w = true;
      w2 = true;
      www = true;
      if (in_reg > 2) in_reg = 0;
      // Обновление gain0 при смене входа
      switch (in_reg) {
        case 0: gain0 = gain1; break;
        case 1: gain0 = gain2; break;
        case 2: gain0 = gain3; break;
      }
      audio();
    }
  }
}

void handleVolume() {
  if (menu != 0) return;

  // Обработка энкодера
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    enc_err();
    vol_reg += newPosition;
    myEnc.write(0);
    newPosition = 0;
    times = millis();
    w = true;
    w2 = true;
    vol_func();
    audio();
  }

  // Обработка ИК-пульта
  if (ir.value == IR_UP) {
    vol_reg++;
    ir_low();
    vol_func();
    audio();
  }
  if (ir.value == 0xFFFFFFFF && gr1) {
    vol_reg++;
    ir_low2();
    vol_func();
    audio();
  }
  if (ir.value == IR_DW) {
    vol_reg--;
    ir_low1();
    vol_func();
    audio();
  }
  if (ir.value == 0xFFFFFFFF && gr2) {
    vol_reg--;
    ir_low3();
    vol_func();
    audio();
  }

  // Обновление дисплея
  if (w) {
    w = false;
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print(F("VOLUME"), LEFT, 0);
    myOLED.setFont(BigNumbers);
    myOLED.printNumI(vol_reg + 79, 75, 0);
    myOLED.setFont(SmallFont);
    myOLED.print(F("IN"), LEFT, 10);
    myOLED.printNumI(in_reg + 1, 30, 10);
    myOLED.print(F("GAIN"), LEFT, 20);
    myOLED.printNumI(gain0, 30, 20);
    myOLED.drawLine(0, 30, 128, 30);
    myOLED.setFont(SmallFont);
    myOLED.print(F("TREBLE"), LEFT, 35);
    myOLED.printNumI(treb_reg, 75, 35);
    myOLED.print(F("MIDDLE"), LEFT, 45);
    myOLED.printNumI(mid_reg, 75, 45);
    myOLED.print(F("BASS"), LEFT, 55);
    myOLED.printNumI(bass_reg, 75, 55);
    myOLED.update();
  }
}

void handleToneControls() {
  // TREBLE (меню 1)
  if (menu == 1) {
    if (newPosition != oldPosition) {
      oldPosition = newPosition;
      enc_err();
      treb_reg += newPosition;
      myEnc.write(0);
      newPosition = 0;
      times = millis();
      w = true;
      w2 = true;
      treb_func();
      audio();
    }

    // Обработка ИК... (аналогично handleVolume)
    // ... остальной код для treble, mid, bass
  }
 
  // MIDDLE (меню 2) и BASS (меню 3) - аналогичная структура
}

void handleInputGain() {
  if (menu != 5) return;

  // Обновление gain0 в зависимости от входа
  switch (in_reg) {
    case 0: gain0 = gain1; break;
    case 1: gain0 = gain2; break;
    case 2: gain0 = gain3; break;
  }

  // Обработка ИК-пульта
  if (ir.value == IR_UP) {
    gain0++;
    ir_low();
    gain_func();
    audio();
  }
  if (ir.value == 0xFFFFFFFF && gr1) {
    gain0++;
    ir_low2();
    gain_func();
    audio();
  }
  if (ir.value == IR_DW) {
    gain0--;
    ir_low1();
    gain_func();
    audio();
  }
  if (ir.value == 0xFFFFFFFF && gr2) {
    gain0--;
    ir_low3();
    gain_func();
    audio();
  }

  // Обработка энкодера
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    enc_err();
    gain0 += newPosition;
    myEnc.write(0);
    newPosition = 0;
    times = millis();
    www = true;
    w = true;
    w2 = true;
    gain_func();
  }

  // Сохранение gain для текущего входа
  switch (in_reg) {
    case 0: gain1 = gain0; break;
    case 1: gain2 = gain0; break;
    case 2: gain3 = gain0; break;
  }

  if (www) {
    audio();
    www = false;
  }

  // Обновление дисплея
  if (w) {
    w = false;
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print(F("INPUT"), LEFT, 0);
    myOLED.setFont(BigNumbers);
    myOLED.printNumI(in_reg + 1, 65, 0);
    myOLED.drawLine(0, 30, 128, 30);
    myOLED.setFont(SmallFont);
    myOLED.print(F("GAIN"), LEFT, 35);
    myOLED.setFont(BigNumbers);
    myOLED.printNumI(gain0, 65, 35);
    myOLED.update();
  }
}

void handleSettingsMenu() {
  // Обработка подменю настроек (10-23)
  // Структура аналогична предыдущим обработчикам
  // ... (код для меню 10-23)
}

void saveToEEPROM() {
  EEPROM.update(0, vol_reg + 79);
  EEPROM.update(1, in_reg);
  EEPROM.update(2, gain1);
  EEPROM.update(3, gain2);
  EEPROM.update(4, gain3);
  EEPROM.update(5, treb_reg + 20);
  EEPROM.update(6, f_treb);
  EEPROM.update(7, q_treb);
  EEPROM.update(8, mid_reg + 20);
  EEPROM.update(9, f_mid);
  EEPROM.update(10, q_mid);
  EEPROM.update(11, bass_reg + 20);
  EEPROM.update(12, f_bass);
  EEPROM.update(13, q_bass);
  EEPROM.update(14, f_sub);
  EEPROM.update(15, f_lon);
  EEPROM.update(16, gain_lon);
  EEPROM.update(17, gain_lf + 79);
  EEPROM.update(18, gain_rf + 79);
  EEPROM.update(19, gain_lr + 79);
  EEPROM.update(20, gain_rr + 79);
  EEPROM.update(21, gain_sub + 79);
}

// Вспомогательные функции
void en_low() {
  myEnc.write(0);
  newPosition = 0;
  times = millis();
  myOLED.clrScr();
  w = true;
  w2 = true;
}

void ir_low3() {
  gr1 = false;
  cl();
  times = millis();
  w = true;
  w2 = true;
}

void ir_low2() {
  gr2 = false;
  cl();
  times = millis();
  w = true;
  w2 = true;
}

void ir_low1() {
  gr1 = false;
  gr2 = true;
  cl();
  times = millis();
  w = true;
  w2 = true;
}

void ir_low() {
  gr1 = true;
  ir_low2();
}

void enc_err() {
  newPosition = constrain(newPosition, -1, 1);
}

void cl() {
  myOLED.clrScr();
  ir.value = 0;
  delay(300);
}

void audio() {
  tda.setSetup_1(1, 2, 0);
  tda.setSetup_2(f_sub, 0, 0, 0);
  tda.setLoudness_f(f_lon);
  tda.setIn(in_reg);
  tda.setIn_gain(gain0, mute);
  tda.setVol(vol_reg);
  tda.setFront_1(gain_lf);
  tda.setFront_2(gain_rf);
  tda.setRear_1(gain_lr);
  tda.setRear_2(gain_rr);
  tda.setSub(gain_sub);
  tda.mix();
  tda.setBass_setup(q_bass, f_bass);
  tda.setMiddle_setup(q_mid, f_mid);
  tda.setTreble_setup(q_treb, f_treb);
  tda.setBass_gain(bass_reg);
  tda.setMiddle_gain(mid_reg);
  tda.setTreble_gain(treb_reg);
  tda.setLoudness_gain(gain_lon);
}
Скетч использует 19852 байт (61%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 1599 байт (78%) динамической памяти, оставляя 449 байт для локальных переменных. Максимум: 2048 байт.

286

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

буду тестировать

287

Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer

пытка апельсинами продолжалась 7 часов в итоге ии раскололся
#define STANDBY_OUT 13
#define IN2_OUT 6
#define IN3_OUT 7

#define IR_POWER 0x106FBA45  //КРАСНАЯ
#define IR_MUTE 0x106F02FD   // 3
#define IR_UP 0x106F42BD     //1
#define IR_DW 0x106F827D     //2
#define IR_MENU 0x106F8A75   //СИНЯЯ
#define IR_INPUT 0x106F9A65  //ЗЕЛЕНАЯ
#define IR_SET 0x106FE01F    //ЖЕЛТАЯ

#include <Wire.h>
#include <OLED_I2C.h>  // http://rcl-radio.ru/wp-content/uploads/ … ED_I2C.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
#include <BD37534FV.h>

BD37534FV tda;
OLED myOLED(SDA, SCL, 8);
extern uint8_t SmallFont[], BigNumbers[];
IRrecv irrecv(12);    // указываем вывод модуля IR приемника
decode_results ir;

long times;
int menu, vol_reg, in_reg, treb_reg, bass_reg, mid_reg, gain0, gain1, gain2, gain3;
bool w2, w, www, gr1, gr2, power = 1, mute;
int f_treb, q_treb, f_mid, q_mid, f_bass, q_bass, set = 0, f_sub, f_lon, gain_lon;
int gain_lf, gain_rf, gain_lr, gain_rr, gain_sub;

void setup() {
  Wire.begin();
  Wire.setClock(400000L);
  irrecv.enableIRIn();
  myOLED.begin();
  myOLED.setBrightness(100);
 
  pinMode(STANDBY_OUT, OUTPUT);
  pinMode(IN2_OUT, OUTPUT);
  pinMode(IN3_OUT, OUTPUT);
 
  // ИНИЦИАЛИЗАЦИЯ ВЫХОДОВ
  digitalWrite(IN2_OUT, LOW);
  digitalWrite(IN3_OUT, LOW);

  MsTimer2::set(3, to_Timer);
  MsTimer2::start();
 
  if (EEPROM.read(100) != 0) {
    for (int i = 0; i < 101; i++) {
      EEPROM.update(i, 0);  // очистка памяти при первом включении
    }
  }
 
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("Sound Processors"), CENTER, 10);
  myOLED.print(F("BD37534FV"), CENTER, 30);
  myOLED.update();
  delay(2000);
 
  // ЗАГРУЗКА ДАННЫХ ИЗ EEPROM
  vol_reg = EEPROM.read(0) - 79;
  in_reg = EEPROM.read(1);
  gain1 = EEPROM.read(2);
  gain2 = EEPROM.read(3);
  gain3 = EEPROM.read(4);
  treb_reg = EEPROM.read(5) - 20;
  f_treb = EEPROM.read(6);
  q_treb = EEPROM.read(7);
  mid_reg = EEPROM.read(8) - 20;
  f_mid = EEPROM.read(9);
  q_mid = EEPROM.read(10);
  bass_reg = EEPROM.read(11) - 20;
  f_bass = EEPROM.read(12);
  q_bass = EEPROM.read(13);
  f_sub = EEPROM.read(14);
  f_lon = EEPROM.read(15);
  gain_lon = EEPROM.read(16);
  gain_lf = EEPROM.read(17) - 79;
  gain_rf = EEPROM.read(18) - 79;
  gain_lr = EEPROM.read(19) - 79;
  gain_rr = EEPROM.read(20) - 79;
  gain_sub = EEPROM.read(21) - 79;

  switch (in_reg) {
    case 0: gain0 = gain1; break;
    case 1: gain0 = gain2; break;
    case 2: gain0 = gain3; break;
  }
 
  // ОБНОВЛЕНИЕ ВЫХОДОВ ПРИ ЗАГРУЗКЕ
  updateInputOutputs();
}

// ФУНКЦИЯ ОБНОВЛЕНИЯ ВЫХОДОВ ДЛЯ ПЕРЕКЛЮЧЕНИЯ ВХОДОВ
void updateInputOutputs() {
  switch (in_reg) {
    case 0:
      // Вход 1 - оба выхода LOW
      digitalWrite(IN2_OUT, LOW);
      digitalWrite(IN3_OUT, LOW);
      break;
    case 1:
      // Вход 2 - IN2_OUT HIGH, IN3_OUT LOW
      digitalWrite(IN2_OUT, HIGH);
      digitalWrite(IN3_OUT, LOW);
      break;
    case 2:
      // Вход 3 - IN2_OUT LOW, IN3_OUT HIGH
      digitalWrite(IN2_OUT, LOW);
      digitalWrite(IN3_OUT, HIGH);
      break;
  }
}

void to_Timer() {
  // Таймер оставлен для совместимости
}

// ФУНКЦИЯ ОЧИСТКИ ЭКРАНА
void cl() {
  myOLED.clrScr();
  ir.value = 0;
  delay(300);
}

// ФУНКЦИЯ AUDIO ДЛЯ НАСТРОЙКИ BD37534FV
void audio() {
  tda.setSetup_1(1, 2, 0);  // default (1,2,0)
  tda.setSetup_2(f_sub, 0, 0, 0);
  tda.setLoudness_f(f_lon);     // 250Hz 400Hz 800Hz Prohibition = int 0...3
  tda.setIn(in_reg);            // 0...2
  tda.setIn_gain(gain0, mute);  // in_gain -- 0...20 = 0...20 dB, mute -- 0 default
  tda.setVol(vol_reg);          // -79...+15 dB = int -79...15
  tda.setFront_1(gain_lf);      // -79...+15 dB = int -79...15
  tda.setFront_2(gain_rf);      // -79...+15 dB = int -79...15
  tda.setRear_1(gain_lr);       // -79...+15 dB = int -79...15
  tda.setRear_2(gain_rr);       // -79...+15 dB = int -79...15
  tda.setSub(gain_sub);         // -79...+15 dB = int -79...15
  tda.mix();
  tda.setBass_setup(q_bass, f_bass);    // 0.5 1.0 1.5 2.0 --- int 0...3, 60Hz 80Hz 100Hz 120Hz --- int 0...3
  tda.setMiddle_setup(q_mid, f_mid);    // 0.75 1.0 1.25 1.5 --- int 0...3, 500Hz 1kHz 1.5kHz 2.5kHz --- int 0...3
  tda.setTreble_setup(q_treb, f_treb);  // 0.75 1.25  --- int 0...1, 7.5kHz 10kHz 12.5kHz 15kHz --- int 0...3
  tda.setBass_gain(bass_reg);           // --20 ... +20 dB = int -20 ... 20
  tda.setMiddle_gain(mid_reg);          // --20 ... +20 dB = int -20 ... 20
  tda.setTreble_gain(treb_reg);         // --20 ... +20 dB = int -20 ... 20
  tda.setLoudness_gain(gain_lon);       // 0 ... 20 dB = int 0 ... 20
}

void loop() {
  /// IR ////////////////////////////////////////
  if (irrecv.decode(&ir)) {
    irrecv.resume();
    times = millis();
    w = 1;
    w2 = 1;
  }
  if (ir.value == 0) {
    gr1 = 0;  // запрет нажатий не активных кнопок пульта
    gr2 = 0;
  }

  //////// POWER //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if (ir.value == IR_POWER && power == 0) {
    power = 1;
    mute = 1;
    gr1 = 0;
    gr2 = 0;
    cl();
    myOLED.setFont(SmallFont);
    myOLED.print(F("POWER OFF"), CENTER, 10);
    myOLED.update();
    delay(1500);
    cl();
    menu = 100;
    myOLED.setBrightness(0);
  }
  if (ir.value == IR_POWER && power == 1) {
    power = 0;
    mute = 0;
    myOLED.setBrightness(100);
    gr1 = 0;
    gr2 = 0;
    times = millis();
    w = 1;
    w2 = 1;
    myOLED.setFont(SmallFont);
    myOLED.print(F("POWER ON"), CENTER, 10);
    myOLED.update();
    delay(1500);
    cl();
    menu = 0;
  }

  if (power == 0 && mute == 0) {
    // SET BUTTON - ВХОД В SETTING MENU
    if (ir.value == IR_SET) {
      set = 1;
      gr1 = 0;
      gr2 = 0;
      cl();
      delay(200);
      times = millis();
      w = 1;
      w2 = 1;
      myOLED.setFont(SmallFont);
      myOLED.print(F("SETTING MENU"), CENTER, 10);
      myOLED.update();
      delay(1500);
      cl();
      menu = 10;  // Начинаем с первого пункта настроек
    }
   
    // MENU BUTTON - ПЕРЕКЛЮЧЕНИЕ МЕЖДУ ОСНОВНЫМИ МЕНЮ И НАСТРОЙКАМИ
    if (ir.value == IR_MENU && set == 0) {
      menu++;
      gr1 = 0;
      gr2 = 0;
      cl();
      delay(200);
      times = millis();
      w = 1;
      w2 = 1;
      if (menu > 3) {
        menu = 0;
      }
    }
    if (ir.value == IR_MENU && set == 1) {
      menu++;
      gr1 = 0;
      gr2 = 0;
      cl();
      delay(200);
      times = millis();
      w = 1;
      w2 = 1;
      if (menu > 23) {
        menu = 10;  // Циклическое переключение в настройках
      }
    }
   
    // INPUT BUTTON - ПЕРЕКЛЮЧЕНИЕ ВХОДОВ
    if (ir.value == IR_INPUT) {
      in_reg++;
      if (in_reg > 2) {
        in_reg = 0;
      }
      menu = 5;
      cl();
      times = millis();
      w = 1;
      w2 = 1;
      www = 1;
     
      // ОБНОВЛЯЕМ ВЫХОДЫ ПРИ СМЕНЕ ВХОДА
      updateInputOutputs();
     
      // Обновляем gain0 для текущего входа
      switch (in_reg) {
        case 0: gain0 = gain1; break;
        case 1: gain0 = gain2; break;
        case 2: gain0 = gain3; break;
      }
      audio();
    }
  }
 
  // MUTE BUTTON
  if (power == 0) {
    if (ir.value == IR_MUTE && mute == 0) {
      mute = 1; gr1 = 0; gr2 = 0; cl();
      myOLED.setFont(SmallFont); myOLED.print(F("MUTE"), CENTER, 10); myOLED.update(); cl(); menu = 100; audio();
    }
    if (ir.value == IR_MUTE && mute == 1) {
      mute = 0;
      gr1 = 0;
      gr2 = 0;
      times = millis();
      w = 1;
      w2 = 1;
      cl();
      menu = 0;
      audio();
    }
  }
 
  // STANDBY CONTROL
  if (power == 0) {
    digitalWrite(STANDBY_OUT, HIGH);
  } else {
    digitalWrite(STANDBY_OUT, LOW);
  }

  ////////////// VOLUME MENU ///////////////////////////////////////////////////////////////////
  if (menu == 0) {
    if (ir.value == IR_UP) {
      vol_reg++;  // кнопка >
      ir_low();
      vol_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      vol_reg++;  // кнопка >>>>>>
      ir_low2();
      vol_func();
      audio();
    }
    if (ir.value == IR_DW) {
      vol_reg--;  // кнопка <
      ir_low1();
      vol_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      vol_reg--;  // кнопка <<<<<<
      ir_low3();
      vol_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("VOLUME"), LEFT, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(vol_reg + 79, 75, 0);
      myOLED.setFont(SmallFont);
      myOLED.print(F("IN"), LEFT, 10);
      myOLED.printNumI(in_reg + 1, 30, 10);
      myOLED.print(F("GAIN"), LEFT, 20);
      myOLED.printNumI(gain0, 30, 20);
      myOLED.drawLine(0, 30, 128, 30);
      myOLED.setFont(SmallFont);
      myOLED.print(F("TREBLE"), LEFT, 35);
      myOLED.printNumI(treb_reg, 75, 35);
      myOLED.setFont(SmallFont);
      myOLED.print(F("MIDDLE"), LEFT, 45);
      myOLED.printNumI(mid_reg, 75, 45);
      myOLED.setFont(SmallFont);
      myOLED.print(F("BASS"), LEFT, 55);
      myOLED.printNumI(bass_reg, 75, 55);
      myOLED.update();
    }
  }

  ////////////// TREBLE MENU ///////////////////////////////////////////////////////////////////
  if (menu == 1) {
    if (ir.value == IR_UP) {
      treb_reg++;  // кнопка >
      ir_low();
      treb_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      treb_reg++;  // кнопка >>>>>>
      ir_low2();
      treb_func();
      audio();
    }
    if (ir.value == IR_DW) {
      treb_reg--;  // кнопка <
      ir_low1();
      treb_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      treb_reg--;  // кнопка <<<<<<
      ir_low3();
      treb_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("TREBLE"), LEFT, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(treb_reg, 75, 0);
      myOLED.setFont(SmallFont);
      switch (f_treb) {
        case 0: myOLED.print(F("F 7.5 kHz"), LEFT, 10); break;
        case 1: myOLED.print(F("F 10  kHz"), LEFT, 10); break;
        case 2: myOLED.print(F("F 12.5kHz"), LEFT, 10); break;
        case 3: myOLED.print(F("F 15  kHz"), LEFT, 10); break;
      }
      myOLED.setFont(SmallFont);
      switch (q_treb) {
        case 0: myOLED.print(F("Q 0.75"), LEFT, 20); break;
        case 1: myOLED.print(F("Q 1.25"), LEFT, 20); break;
      }
      myOLED.drawLine(0, 30, 128, 30);
      myOLED.setFont(SmallFont);
      myOLED.print(F("MIDDLE"), LEFT, 35);
      myOLED.printNumI(mid_reg, 75, 35);
      myOLED.print(F("BASS"), LEFT, 45);
      myOLED.printNumI(bass_reg, 75, 45);
      myOLED.print(F("VOLUME"), LEFT, 55);
      myOLED.printNumI(vol_reg + 79, 75, 55);
      myOLED.update();
    }
  }

  ////////////// MIDDLE MENU ///////////////////////////////////////////////////////////////////
  if (menu == 2) {
    if (ir.value == IR_UP) {
      mid_reg++;  // кнопка >
      ir_low();
      mid_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      mid_reg++;  // кнопка >>>>>>
      ir_low2();
      mid_func();
      audio();
    }
    if (ir.value == IR_DW) {
      mid_reg--;  // кнопка <
      ir_low1();
      mid_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      mid_reg--;  // кнопка <<<<<<
      ir_low3();
      mid_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("MIDDLE"), LEFT, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(mid_reg, 75, 0);
      myOLED.setFont(SmallFont);
      switch (f_mid) {
        case 0: myOLED.print(F("F 500 Hz"), LEFT, 10); break;
        case 1: myOLED.print(F("F 1  kHz"), LEFT, 10); break;
        case 2: myOLED.print(F("F 1.5kHz"), LEFT, 10); break;
        case 3: myOLED.print(F("F 2.5kHz"), LEFT, 10); break;
      }
      myOLED.setFont(SmallFont);
      switch (q_mid) {
        case 0: myOLED.print(F("Q 0.75"), LEFT, 20); break;
        case 1: myOLED.print(F("Q 1.00"), LEFT, 20); break;
        case 2: myOLED.print(F("Q 1.25"), LEFT, 20); break;
        case 3: myOLED.print(F("Q 1.50"), LEFT, 20); break;
      }
      myOLED.drawLine(0, 30, 128, 30);
      myOLED.setFont(SmallFont);
      myOLED.print(F("BASS"), LEFT, 35);
      myOLED.printNumI(bass_reg, 75, 35);
      myOLED.print(F("VOLUME"), LEFT, 45);
      myOLED.printNumI(vol_reg + 79, 75, 45);
      myOLED.print(F("TERBLE"), LEFT, 55);
      myOLED.printNumI(treb_reg, 75, 55);
      myOLED.update();
    }
  }

  ////////////// BASS MENU ///////////////////////////////////////////////////////////////////
  if (menu == 3) {
    if (ir.value == IR_UP) {
      bass_reg++;  // кнопка >
      ir_low();
      bass_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      bass_reg++;  // кнопка >>>>>>
      ir_low2();
      bass_func();
      audio();
    }
    if (ir.value == IR_DW) {
      bass_reg--;  // кнопка <
      ir_low1();
      bass_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      bass_reg--;  // кнопка <<<<<<
      ir_low3();
      bass_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("BASS"), LEFT, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(bass_reg, 75, 0);
      myOLED.setFont(SmallFont);
      switch (f_bass) {
        case 0: myOLED.print(F("F 60 Hz"), LEFT, 10); break;
        case 1: myOLED.print(F("F 80 Hz"), LEFT, 10); break;
        case 2: myOLED.print(F("F 100kHz"), LEFT, 10); break;
        case 3: myOLED.print(F("F 120kHz"), LEFT, 10); break;
      }
      switch (q_bass) {
        case 0: myOLED.print(F("Q 0.50"), LEFT, 20); break;
        case 1: myOLED.print(F("Q 1.00"), LEFT, 20); break;
        case 2: myOLED.print(F("Q 1.50"), LEFT, 20); break;
        case 3: myOLED.print(F("Q 2.00"), LEFT, 20); break;
      }
      myOLED.drawLine(0, 30, 128, 30);
      myOLED.setFont(SmallFont);
      myOLED.print(F("VOLUME"), LEFT, 35);
      myOLED.printNumI(vol_reg + 79, 75, 35);
      myOLED.print(F("TREBLE"), LEFT, 45);
      myOLED.printNumI(treb_reg, 75, 45);
      myOLED.print(F("MIDDLE"), LEFT, 55);
      myOLED.printNumI(mid_reg, 75, 55);
      myOLED.update();
    }
  }

  ////////////// INPUT GAIN MENU ///////////////////////////////////////////////////////////////////
  if (menu == 5) {
    switch (in_reg) {
      case 0: gain0 = gain1; break;
      case 1: gain0 = gain2; break;
      case 2: gain0 = gain3; break;
    }

    if (ir.value == IR_UP) {
      gain0++;  // кнопка >
      ir_low();
      gain_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      gain0++;  // кнопка >>>>>>
      ir_low2();
      gain_func();
      audio();
    }
    if (ir.value == IR_DW) {
      gain0--;  // кнопка <
      ir_low1();
      gain_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      gain0--;  // кнопка <<<<<<
      ir_low3();
      gain_func();
      audio();
    }

    switch (in_reg) {
      case 0: gain1 = gain0; break;
      case 1: gain2 = gain0; break;
      case 2: gain3 = gain0; break;
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("INPUT"), LEFT, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(in_reg + 1, 65, 0);
      myOLED.drawLine(0, 30, 128, 30);
      myOLED.setFont(SmallFont);
      myOLED.print(F("GAIN"), LEFT, 35);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(gain0, 65, 35);
      myOLED.update();
    }
  }

  ////////////// SETTING MENU ITEMS ///////////////////////////////////////////////////////////////////

  ////////////// SET F_TREB ///////////////////////////////////////////////////////////////////
  if (menu == 10) {
    if (ir.value == IR_UP) {
      f_treb++;  // кнопка >
      ir_low();
      f_treb_func();
      audio();
    }
    if (ir.value == IR_DW) {
      f_treb--;  // кнопка <
      ir_low1();
      f_treb_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("Frequency TREBLE"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      switch (f_treb) {
        case 0: myOLED.print(F("7.50"), CENTER, 20); break;
        case 1: myOLED.print(F("10.0"), CENTER, 20); break;
        case 2: myOLED.print(F("12.5"), CENTER, 20); break;
        case 3: myOLED.print(F("15.0"), CENTER, 20); break;
      }
      myOLED.setFont(SmallFont);
      myOLED.print(F("kHz"), CENTER, 50);
      myOLED.update();
    }
  }

  ////////////// SET F_MID ///////////////////////////////////////////////////////////////////
  if (menu == 11) {
    if (ir.value == IR_UP) {
      f_mid++;  // кнопка >
      ir_low();
      f_mid_func();
      audio();
    }
    if (ir.value == IR_DW) {
      f_mid--;  // кнопка <
      ir_low1();
      f_mid_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("Frequency MIDDLE"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      switch (f_mid) {
        case 0: myOLED.print(F("0.5"), CENTER, 20); break;
        case 1: myOLED.print(F("1.0"), CENTER, 20); break;
        case 2: myOLED.print(F("1.5"), CENTER, 20); break;
        case 3: myOLED.print(F("2.5"), CENTER, 20); break;
      }
      myOLED.setFont(SmallFont);
      myOLED.print(F("kHz"), CENTER, 50);
      myOLED.update();
    }
  }

  ////////////// SET F_BASS ///////////////////////////////////////////////////////////////////
  if (menu == 12) {
    if (ir.value == IR_UP) {
      f_bass++;  // кнопка >
      ir_low();
      f_bass_func();
      audio();
    }
    if (ir.value == IR_DW) {
      f_bass--;  // кнопка <
      ir_low1();
      f_bass_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("Frequency BASS"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      switch (f_bass) {
        case 0: myOLED.print(F("60"), CENTER, 20); break;
        case 1: myOLED.print(F("80"), CENTER, 20); break;
        case 2: myOLED.print(F("100"), CENTER, 20); break;
        case 3: myOLED.print(F("120"), CENTER, 20); break;
      }
      myOLED.setFont(SmallFont);
      myOLED.print(F("Hz"), CENTER, 50);
      myOLED.update();
    }
  }

  ////////////// SET F_SUB ///////////////////////////////////////////////////////////////////
  if (menu == 13) {
    if (ir.value == IR_UP) {
      f_sub++;  // кнопка >
      ir_low();
      f_sub_func();
      audio();
    }
    if (ir.value == IR_DW) {
      f_sub--;  // кнопка <
      ir_low1();
      f_sub_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("Frequency SUBWOOFER"), CENTER, 0);
      switch (f_sub) {
        case 0:
          myOLED.setFont(SmallFont);
          myOLED.print(F("OFF"), CENTER, 20);
          break;
        case 1:
          myOLED.setFont(BigNumbers);
          myOLED.print(F("55"), CENTER, 20);
          break;
        case 2:
          myOLED.setFont(BigNumbers);
          myOLED.print(F("85"), CENTER, 20);
          break;
        case 3:
          myOLED.setFont(BigNumbers);
          myOLED.print(F("120"), CENTER, 20);
          break;
        case 4:
          myOLED.setFont(BigNumbers);
          myOLED.print(F("160"), CENTER, 20);
          break;
      }
      if (f_sub > 0) {
        myOLED.setFont(SmallFont);
        myOLED.print(F("Hz"), CENTER, 50);
      }
      myOLED.update();
    }
  }

  ////////////// SET F_LOUDNESS ///////////////////////////////////////////////////////////////////
  if (menu == 14) {
    if (ir.value == IR_UP) {
      f_lon++;  // кнопка >
      ir_low();
      f_lon_func();
      audio();
    }
    if (ir.value == IR_DW) {
      f_lon--;  // кнопка <
      ir_low1();
      f_lon_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("Frequency LOUDNESS"), CENTER, 0);
      switch (f_lon) {
        case 0:
          myOLED.setFont(BigNumbers);
          myOLED.print(F("250"), CENTER, 20);
          break;
        case 1:
          myOLED.setFont(BigNumbers);
          myOLED.print(F("400"), CENTER, 20);
          break;
        case 2:
          myOLED.setFont(BigNumbers);
          myOLED.print(F("800"), CENTER, 20);
          break;
        case 3:
          myOLED.setFont(SmallFont);
          myOLED.print(F("Prohibition"), CENTER, 20);
          break;
      }
      if (f_lon < 3) {
        myOLED.setFont(SmallFont);
        myOLED.print(F("Hz"), CENTER, 50);
      }
      myOLED.update();
    }
  }

  ////////////// SET Q_TREB ///////////////////////////////////////////////////////////////////
  if (menu == 15) {
    if (ir.value == IR_UP) {
      q_treb++;  // кнопка >
      ir_low();
      q_treb_func();
      audio();
    }
    if (ir.value == IR_DW) {
      q_treb--;  // кнопка <
      ir_low1();
      q_treb_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("Q TREBLE"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      switch (q_treb) {
        case 0: myOLED.print(F("0.75"), CENTER, 20); break;
        case 1: myOLED.print(F("1.25"), CENTER, 20); break;
      }
      myOLED.update();
    }
  }

  ////////////// SET Q_MIDDLE ///////////////////////////////////////////////////////////////////
  if (menu == 16) {
    if (ir.value == IR_UP) {
      q_mid++;  // кнопка >
      ir_low();
      q_mid_func();
      audio();
    }
    if (ir.value == IR_DW) {
      q_mid--;  // кнопка <
      ir_low1();
      q_mid_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("Q MIDDLE"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      switch (q_mid) {
        case 0: myOLED.print(F("0.75"), CENTER, 20); break;
        case 1: myOLED.print(F("1.00"), CENTER, 20); break;
        case 2: myOLED.print(F("1.25"), CENTER, 20); break;
        case 3: myOLED.print(F("1.50"), CENTER, 20); break;
      }
      myOLED.update();
    }
  }

  ////////////// SET Q_BASS ///////////////////////////////////////////////////////////////////
  if (menu == 17) {
    if (ir.value == IR_UP) {
      q_bass++;  // кнопка >
      ir_low();
      q_bass_func();
      audio();
    }
    if (ir.value == IR_DW) {
      q_bass--;  // кнопка <
      ir_low1();
      q_bass_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("Q BASS"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      switch (q_bass) {
        case 0: myOLED.print(F("0.50"), CENTER, 20); break;
        case 1: myOLED.print(F("1.00"), CENTER, 20); break;
        case 2: myOLED.print(F("1.50"), CENTER, 20); break;
        case 3: myOLED.print(F("2.00"), CENTER, 20); break;
      }
      myOLED.update();
    }
  }

  ////////////// SET GAIN LOUDNESS ///////////////////////////////////////////////////////////////////
  if (menu == 18) {
    if (ir.value == IR_UP) {
      gain_lon++;  // кнопка >
      ir_low();
      gain_lon_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      gain_lon++;  // кнопка >>>>>>
      ir_low2();
      gain_lon_func();
      audio();
    }
    if (ir.value == IR_DW) {
      gain_lon--;  // кнопка <
      ir_low1();
      gain_lon_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      gain_lon--;  // кнопка <<<<<<
      ir_low3();
      gain_lon_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("GAIN LOUDNESS"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(gain_lon, CENTER, 20);
      myOLED.setFont(SmallFont);
      myOLED.print(F("dB"), CENTER, 50);
      myOLED.update();
    }
  }

  ////////////// SET GAIN LEFT FRONT ///////////////////////////////////////////////////////////////////
  if (menu == 19) {
    if (ir.value == IR_UP) {
      gain_lf++;  // кнопка >
      ir_low();
      gain_lf_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      gain_lf++;  // кнопка >>>>>>
      ir_low2();
      gain_lf_func();
      audio();
    }
    if (ir.value == IR_DW) {
      gain_lf--;  // кнопка <
      ir_low1();
      gain_lf_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      gain_lf--;  // кнопка <<<<<<
      ir_low3();
      gain_lf_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("GAIN LEFT FRONT"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(gain_lf, CENTER, 20);
      myOLED.setFont(SmallFont);
      myOLED.print(F("dB"), CENTER, 50);
      myOLED.update();
    }
  }

  ////////////// SET GAIN RIGHT FRONT ///////////////////////////////////////////////////////////////////
  if (menu == 20) {
    if (ir.value == IR_UP) {
      gain_rf++;  // кнопка >
      ir_low();
      gain_rf_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      gain_rf++;  // кнопка >>>>>>
      ir_low2();
      gain_rf_func();
      audio();
    }
    if (ir.value == IR_DW) {
      gain_rf--;  // кнопка <
      ir_low1();
      gain_rf_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      gain_rf--;  // кнопка <<<<<<
      ir_low3();
      gain_rf_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("GAIN RIGHT FRONT"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(gain_rf, CENTER, 20);
      myOLED.setFont(SmallFont);
      myOLED.print(F("dB"), CENTER, 50);
      myOLED.update();
    }
  }

  ////////////// SET GAIN LEFT REAR ///////////////////////////////////////////////////////////////////
  if (menu == 21) {
    if (ir.value == IR_UP) {
      gain_lr++;  // кнопка >
      ir_low();
      gain_lr_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      gain_lr++;  // кнопка >>>>>>
      ir_low2();
      gain_lr_func();
      audio();
    }
    if (ir.value == IR_DW) {
      gain_lr--;  // кнопка <
      ir_low1();
      gain_lr_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      gain_lr--;  // кнопка <<<<<<
      ir_low3();
      gain_lr_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("GAIN LEFT REAR"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(gain_lr, CENTER, 20);
      myOLED.setFont(SmallFont);
      myOLED.print(F("dB"), CENTER, 50);
      myOLED.update();
    }
  }

  ////////////// SET GAIN RIGHT REAR ///////////////////////////////////////////////////////////////////
  if (menu == 22) {
    if (ir.value == IR_UP) {
      gain_rr++;  // кнопка >
      ir_low();
      gain_rr_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      gain_rr++;  // кнопка >>>>>>
      ir_low2();
      gain_rr_func();
      audio();
    }
    if (ir.value == IR_DW) {
      gain_rr--;  // кнопка <
      ir_low1();
      gain_rr_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      gain_rr--;  // кнопка <<<<<<
      ir_low3();
      gain_rr_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("GAIN RIGHT REAR"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(gain_rr, CENTER, 20);
      myOLED.setFont(SmallFont);
      myOLED.print(F("dB"), CENTER, 50);
      myOLED.update();
    }
  }

  ////////////// SET GAIN SUBWOOFER ///////////////////////////////////////////////////////////////////
  if (menu == 23) {
    if (ir.value == IR_UP) {
      gain_sub++;  // кнопка >
      ir_low();
      gain_sub_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr1 == 1) {
      gain_sub++;  // кнопка >>>>>>
      ir_low2();
      gain_sub_func();
      audio();
    }
    if (ir.value == IR_DW) {
      gain_sub--;  // кнопка <
      ir_low1();
      gain_sub_func();
      audio();
    }
    if (ir.value == 0xFFFFFFFF and gr2 == 1) {
      gain_sub--;  // кнопка <<<<<<
      ir_low3();
      gain_sub_func();
      audio();
    }

    if (w == 1) {
      w = 0;
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print(F("GAIN SUBWOOFER"), CENTER, 0);
      myOLED.setFont(BigNumbers);
      myOLED.printNumI(gain_sub, CENTER, 20);
      myOLED.setFont(SmallFont);
      myOLED.print(F("dB"), CENTER, 50);
      myOLED.update();
    }
  }

  ////////////////// EEPROM //////////////////////////////////////////////////////////////
  if (millis() - times > 5000 && w2 == 1 && power == 0 && mute == 0) {
    EEPROM.update(0, vol_reg + 79);
    EEPROM.update(1, in_reg);
    EEPROM.update(2, gain1);
    EEPROM.update(3, gain2);
    EEPROM.update(4, gain3);
    EEPROM.update(5, treb_reg + 20);
    EEPROM.update(6, f_treb);
    EEPROM.update(7, q_treb);
    EEPROM.update(8, mid_reg + 20);
    EEPROM.update(9, f_mid);
    EEPROM.update(10, q_mid);
    EEPROM.update(11, bass_reg + 20);
    EEPROM.update(12, f_bass);
    EEPROM.update(13, q_bass);
    EEPROM.update(14, f_sub);
    EEPROM.update(15, f_lon);
    EEPROM.update(16, gain_lon);
    EEPROM.update(17, gain_lf + 79);
    EEPROM.update(18, gain_rf + 79);
    EEPROM.update(19, gain_lr + 79);
    EEPROM.update(20, gain_rr + 79);
    EEPROM.update(21, gain_sub + 79);
    cl();
    set = 0;
    menu = 0;
    w2 = 0;
    w = 1;
  }
}  // loop end

// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
void ir_low3() {
  gr1 = 0;
  cl();
  times = millis();
  w = 1;
  w2 = 1;
}

void ir_low2() {
  gr2 = 0;
  cl();
  times = millis();
  w = 1;
  w2 = 1;
}

void ir_low1() {
  gr1 = 0;
  gr2 = 1;
  cl();
  times = millis();
  w = 1;
  w2 = 1;
}

void ir_low() {
  gr1 = 1;
  ir_low2();
}

void gain_lf_func() {
  if (gain_lf < -79) {
    gain_lf = -79;
  }
  if (gain_lf > 15) {
    gain_lf = 15;
  }
}

void gain_rf_func() {
  if (gain_rf < -79) {
    gain_rf = -79;
  }
  if (gain_rf > 15) {
    gain_rf = 15;
  }
}

void gain_lr_func() {
  if (gain_lr < -79) {
    gain_lr = -79;
  }
  if (gain_lr > 15) {
    gain_lr = 15;
  }
}

void gain_rr_func() {
  if (gain_rr < -79) {
    gain_rr = -79;
  }
  if (gain_rr > 15) {
    gain_rr = 15;
  }
}

void gain_sub_func() {
  if (gain_sub < -79) {
    gain_sub = -79;
  }
  if (gain_sub > 15) {
    gain_sub = 15;
  }
}

void gain_lon_func() {
  if (gain_lon < 0) {
    gain_lon = 0;
  }
  if (gain_lon > 20) {
    gain_lon = 20;
  }
}

void f_lon_func() {
  if (f_lon < 0) {
    f_lon = 0;
  }
  if (f_lon > 3) {
    f_lon = 3;
  }
}

void f_sub_func() {
  if (f_sub < 0) {
    f_sub = 0;
  }
  if (f_sub > 4) {
    f_sub = 4;
  }
}

void f_treb_func() {
  if (f_treb < 0) {
    f_treb = 0;
  }
  if (f_treb > 3) {
    f_treb = 3;
  }
}

void f_mid_func() {
  if (f_mid < 0) {
    f_mid = 0;
  }
  if (f_mid > 3) {
    f_mid = 3;
  }
}

void f_bass_func() {
  if (f_bass < 0) {
    f_bass = 0;
  }
  if (f_bass > 3) {
    f_bass = 3;
  }
}

void q_mid_func() {
  if (q_mid < 0) {
    q_mid = 0;
  }
  if (q_mid > 3) {
    q_mid = 3;
  }
}

void q_bass_func() {
  if (q_bass < 0) {
    q_bass = 0;
  }
  if (q_bass > 3) {
    q_bass = 3;
  }
}

void q_treb_func() {
  if (q_treb < 0) {
    q_treb = 0;
  }
  if (q_treb > 1) {
    q_treb = 1;
  }
}

void bass_func() {
  if (bass_reg < -20) {
    bass_reg = -20;
  }
  if (bass_reg > 20) {
    bass_reg = 20;
  }
}

void mid_func() {
  if (mid_reg < -20) {
    mid_reg = -20;
  }
  if (mid_reg > 20) {
    mid_reg = 20;
  }
}

void treb_func() {
  if (treb_reg < -20) {
    treb_reg = -20;
  }
  if (treb_reg > 20) {
    treb_reg = 20;
  }
}

void gain_func() {
  if (gain0 < 0) {
    gain0 = 0;
  }
  if (gain0 > 20) {
    gain0 = 20;
  }
}

void vol_func() {
  if (vol_reg < -79) {
    vol_reg = -79;
  }
  if (vol_reg > 15) {
    vol_reg = 15;
  }
}
убран энкодер и кнопки .протестировано