<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[forum.rcl-radio.ru &mdash; BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
		<link>http://forum.rcl-radio.ru/viewtopic.php?id=50</link>
		<atom:link href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=50&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «BD37534FV - Sound Processor with Built-in 3-band Equalizer».]]></description>
		<lastBuildDate>Sun, 22 Feb 2026 10:24:04 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12521#p12521</link>
			<description><![CDATA[<p>Собственно, похоже проблема была все-таки с шиной. Ардуинка и аудиопроцессор расположены на разных платах. На каждую плату приходит 12В от блока питания. На плате контроллера собран стабилизатор на 5В, на плате аудиопроцессора - на 9В. По итогу протянул отдельный провод +5В с платы контроллера параллельно проводам шины и добавил два подтягивающих резистора 3,6к подпаяв прямо к контактам переходной площадки, на которой распаяна микросхема аудиопроцессора. Пока что полет нормальный <img src="http://forum.rcl-radio.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /> буду тестировать дальше.<br />Спасибо за совет!</p>]]></description>
			<author><![CDATA[null@example.com (k-serg)]]></author>
			<pubDate>Sun, 22 Feb 2026 10:24:04 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12521#p12521</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12459#p12459</link>
			<description><![CDATA[<p>Возможно помехи по питанию, увеличьте емкости фильтра питания, расположите конденсатор 0,1 мкФ как можно ближе к выводу питания микросхемы.</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Wed, 18 Feb 2026 07:48:26 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12459#p12459</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12457#p12457</link>
			<description><![CDATA[<p>Попробовал добавить по резистору 3,6к - были под рукой, как можно ближе к BD37534FV - то же самое, рандомно виснет, без микросхемы - все работает.</p>]]></description>
			<author><![CDATA[null@example.com (k-serg)]]></author>
			<pubDate>Tue, 17 Feb 2026 18:48:18 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12457#p12457</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12454#p12454</link>
			<description><![CDATA[<p>Похоже виснет шина I2C, попробуйте установить на BD37534FV подтягивающие резисторы на шину I2C</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Tue, 17 Feb 2026 11:31:18 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12454#p12454</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12445#p12445</link>
			<description><![CDATA[<p>Добрый день! Столкнулся со следующей проблемой - при подключенной микросхеме выполнение программы зависает случайным образом - иногда сразу после стартовой заставки, иногда при перемещении по меню и изменении значений. Как только отключаю микросхему от шины - все отлично работает. Перепробовал все три имеющиеся в наличии микросхемы - ситуация одинаковая. Что это может быть?</p>]]></description>
			<author><![CDATA[null@example.com (k-serg)]]></author>
			<pubDate>Mon, 16 Feb 2026 18:47:27 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12445#p12445</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11961#p11961</link>
			<description><![CDATA[<p>рабочий протестированный код<br />#define STANDBY_OUT 13<br />#define IN2_OUT 6<br />#define IN3_OUT 7</p><p>#define IR_POWER 0x106FBA45<br />#define IR_MUTE 0x106FE21D<br />#define IR_UP 0x20DF40BF<br />#define IR_DW 0x20DFC03F<br />#define IR_MENU 0x106F8A75<br />#define IR_INPUT 0x106F9A65<br />#define IR_SET 0x106FE01F</p><p>#include &lt;Wire.h&gt;<br />#include &lt;OLED_I2C.h&gt;<br />#include &lt;EEPROM.h&gt;<br />#include &lt;IRremote.h&gt;<br />#include &lt;BD37534FV.h&gt;<br />#include &lt;avr/wdt.h&gt;</p><p>BD37534FV tda;<br />OLED myOLED(SDA, SCL, 8);<br />extern uint8_t SmallFont[], BigNumbers[];<br />IRrecv irrecv(12);<br />decode_results ir;</p><p>// Константы меню<br />const int MENU_MAIN_COUNT = 6;<br />const int MENU_SETTINGS_START = 10;<br />const int MENU_SETTINGS_END = 23;<br />const int MENU_SETTINGS_COUNT = 14;</p><p>// Константы EEPROM<br />const int EEPROM_VOLUME = 0;<br />const int EEPROM_INPUT = 1;<br />const int EEPROM_GAIN1 = 2;<br />const int EEPROM_GAIN2 = 3;<br />const int EEPROM_GAIN3 = 4;<br />const uint8_t EEPROM_INIT_FLAG = 0xAA;<br />const int EEPROM_INIT_ADDR = 100;</p><p>// Константы времени<br />const unsigned long VOLUME_STEP_DELAY = 150;<br />const unsigned long IR_DEBOUNCE = 200;<br />const unsigned long EEPROM_SAVE_DELAY = 5000;<br />const unsigned long REPEAT_DELAY = 500;<br />const unsigned long REPEAT_INTERVAL = 100;<br />const unsigned long POWER_DEBOUNCE = 1000;</p><p>// Основные переменные<br />int menu = 0;<br />int vol_reg = 0, in_reg = 0, treb_reg = 0, bass_reg = 0, mid_reg = 0;<br />int gain0 = 0, gain1 = 0, gain2 = 0, gain3 = 0;<br />bool power = false, mute = false, set = false; // Начинаем с выключенного состояния</p><p>// Настройки эквалайзера<br />int f_treb = 1, q_treb = 0, f_mid = 1, q_mid = 1, f_bass = 1, q_bass = 1;<br />int f_sub = 2, f_lon = 1, gain_lon = 10;</p><p>// Усилители каналов<br />int gain_lf = 0, gain_rf = 0, gain_lr = 0, gain_rr = 0, gain_sub = 0;</p><p>// Флаги состояния<br />unsigned long lastIrTime = 0;<br />unsigned long eepromSaveTime = 0;<br />bool eepromDirty = false;<br />uint32_t lastCommand = 0;<br />unsigned long lastRepeatTime = 0;<br />bool repeatEnabled = false;<br />unsigned long lastPowerCommandTime = 0;</p><p>// Строки в PROGMEM<br />const char str_power_off[] PROGMEM = &quot;POWER OFF&quot;;<br />const char str_mute[] PROGMEM = &quot;MUTE&quot;;<br />const char str_volume[] PROGMEM = &quot;VOLUME&quot;;<br />const char str_treble[] PROGMEM = &quot;TREBLE&quot;;<br />const char str_middle[] PROGMEM = &quot;MIDDLE&quot;;<br />const char str_bass[] PROGMEM = &quot;BASS&quot;;<br />const char str_input[] PROGMEM = &quot;INPUT&quot;;<br />const char str_gain[] PROGMEM = &quot;GAIN&quot;;<br />const char str_in[] PROGMEM = &quot;IN&quot;;<br />const char str_settings_saved[] PROGMEM = &quot;SETTINGS SAVED&quot;;<br />const char str_bd37534fv[] PROGMEM = &quot;BD37534FV&quot;;</p><p>// Класс для безопасной работы со временем<br />class SafeTimer {<br />private:<br />&nbsp; &nbsp; unsigned long lastTime = 0;<br />&nbsp; &nbsp; <br />public:<br />&nbsp; &nbsp; bool isTimePassed(unsigned long interval) {<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned long currentTime = millis();<br />&nbsp; &nbsp; &nbsp; &nbsp; if (currentTime - lastTime &gt;= interval) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastTime = currentTime;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; return false;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; void reset() {<br />&nbsp; &nbsp; &nbsp; &nbsp; lastTime = millis();<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; bool isTimePassedFrom(unsigned long startTime, unsigned long interval) {<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned long currentTime = millis();<br />&nbsp; &nbsp; &nbsp; &nbsp; return (currentTime - startTime) &gt;= interval;<br />&nbsp; &nbsp; }<br />};</p><p>// Функция для обновления текущего усиления<br />void updateCurrentGain() {<br />&nbsp; &nbsp; switch (in_reg) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: gain0 = gain1; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: gain0 = gain2; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: gain0 = gain3; break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; gain0 = constrain(gain0, 0, 20);<br />}</p><p>// Класс для управления EEPROM<br />class EEPROMManager {<br />private:<br />&nbsp; &nbsp; bool dirty = false;<br />&nbsp; &nbsp; unsigned long saveTime = 0;<br />&nbsp; &nbsp; <br />public:<br />&nbsp; &nbsp; void loadSettings() {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Проверка инициализации EEPROM<br />&nbsp; &nbsp; &nbsp; &nbsp; if (EEPROM.read(EEPROM_INIT_ADDR) != EEPROM_INIT_FLAG) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Первая инициализация<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_VOLUME, 79);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_INPUT, 0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_GAIN1, 0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_GAIN2, 0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_GAIN3, 0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_INIT_ADDR, EEPROM_INIT_FLAG);<br />&nbsp; &nbsp; &nbsp; &nbsp; }</p><p>&nbsp; &nbsp; &nbsp; &nbsp; // Безопасная загрузка<br />&nbsp; &nbsp; &nbsp; &nbsp; uint8_t stored_vol = EEPROM.read(EEPROM_VOLUME);<br />&nbsp; &nbsp; &nbsp; &nbsp; vol_reg = constrain(stored_vol - 79, -79, 15);<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; uint8_t stored_input = EEPROM.read(EEPROM_INPUT);<br />&nbsp; &nbsp; &nbsp; &nbsp; in_reg = constrain(stored_input, 0, 2);<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; gain1 = constrain(EEPROM.read(EEPROM_GAIN1), 0, 20);<br />&nbsp; &nbsp; &nbsp; &nbsp; gain2 = constrain(EEPROM.read(EEPROM_GAIN2), 0, 20);<br />&nbsp; &nbsp; &nbsp; &nbsp; gain3 = constrain(EEPROM.read(EEPROM_GAIN3), 0, 20);<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; updateCurrentGain();<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; void saveSettings() {<br />&nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_VOLUME, vol_reg + 79);<br />&nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_INPUT, in_reg);<br />&nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_GAIN1, gain1);<br />&nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_GAIN2, gain2);<br />&nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_GAIN3, gain3);<br />&nbsp; &nbsp; &nbsp; &nbsp; EEPROM.update(EEPROM_INIT_ADDR, EEPROM_INIT_FLAG);<br />&nbsp; &nbsp; &nbsp; &nbsp; dirty = false;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; void markDirty() {<br />&nbsp; &nbsp; &nbsp; &nbsp; dirty = true;<br />&nbsp; &nbsp; &nbsp; &nbsp; saveTime = millis();<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; bool shouldSave() {<br />&nbsp; &nbsp; &nbsp; &nbsp; return dirty &amp;&amp; (millis() - saveTime &gt;= EEPROM_SAVE_DELAY);<br />&nbsp; &nbsp; }<br />};</p><p>// Класс для управления питанием<br />class PowerManager {<br />private:<br />&nbsp; &nbsp; uint8_t standbyPin;<br />&nbsp; &nbsp; unsigned long lastPowerChange = 0;<br />&nbsp; &nbsp; <br />public:<br />&nbsp; &nbsp; PowerManager(uint8_t pin) : standbyPin(pin) {}<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; void initialize() {<br />&nbsp; &nbsp; &nbsp; &nbsp; pinMode(standbyPin, OUTPUT);<br />&nbsp; &nbsp; &nbsp; &nbsp; digitalWrite(standbyPin, LOW); // Начинаем с выключенного состояния<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; bool canChangePower() {<br />&nbsp; &nbsp; &nbsp; &nbsp; return (millis() - lastPowerChange) &gt;= POWER_DEBOUNCE;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; void turnOn() {<br />&nbsp; &nbsp; &nbsp; &nbsp; if (!canChangePower()) return;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; digitalWrite(standbyPin, HIGH);<br />&nbsp; &nbsp; &nbsp; &nbsp; lastPowerChange = millis();<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Плавное включение дисплея<br />&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i &lt;= 100; i += 20) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myOLED.setBrightness(i);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; delay(30);<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; void turnOff() {<br />&nbsp; &nbsp; &nbsp; &nbsp; if (!canChangePower()) return;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Плавное выключение дисплея<br />&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 100; i &gt;= 0; i -= 20) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myOLED.setBrightness(i);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; delay(30);<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; digitalWrite(standbyPin, LOW);<br />&nbsp; &nbsp; &nbsp; &nbsp; lastPowerChange = millis();<br />&nbsp; &nbsp; }<br />};</p><p>// Класс для управления аудио<br />class AudioManager {<br />private:<br />&nbsp; &nbsp; BD37534FV* processor;<br />&nbsp; &nbsp; <br />public:<br />&nbsp; &nbsp; AudioManager(BD37534FV* audioProcessor) : processor(audioProcessor) {}<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; void applyEqualizerSettings() {<br />&nbsp; &nbsp; &nbsp; &nbsp; if (!power) return;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Здесь должны быть вызовы функций настройки эквалайзера<br />&nbsp; &nbsp; &nbsp; &nbsp; // Временная заглушка - реализовать когда будут готовы функции в библиотеке<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; void updateAudio() {<br />&nbsp; &nbsp; &nbsp; &nbsp; if (!power) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Полное отключение<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setIn_gain(0, 1);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; if (mute) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Режим MUTE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setIn_gain(gain0, 1);<br />&nbsp; &nbsp; &nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Нормальный режим<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setIn(in_reg);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setIn_gain(gain0, 0);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setVol(vol_reg);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setFront_1(gain_lf);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setFront_2(gain_rf);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setRear_1(gain_lr);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setRear_2(gain_rr);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setSub(gain_sub);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;mix();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setBass_gain(bass_reg);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setMiddle_gain(mid_reg);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; processor-&gt;setTreble_gain(treb_reg);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; applyEqualizerSettings();<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; void updateInputOutputs() {<br />&nbsp; &nbsp; &nbsp; &nbsp; switch (in_reg) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 0:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; digitalWrite(IN2_OUT, LOW);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; digitalWrite(IN3_OUT, LOW);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 1:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; digitalWrite(IN2_OUT, HIGH);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; digitalWrite(IN3_OUT, LOW);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 2:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; digitalWrite(IN2_OUT, LOW);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; digitalWrite(IN3_OUT, HIGH);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />};</p><p>// Глобальные экземпляры классов<br />PowerManager powerManager(STANDBY_OUT);<br />EEPROMManager eepromManager;<br />AudioManager audioManager(&amp;tda);</p><p>// Прототипы функций<br />void displayMainMenu();<br />void displayVolumeMenu();<br />void displayTrebleMenu();<br />void displayMiddleMenu();<br />void displayBassMenu();<br />void displayInputGainMenu();<br />void displaySettingsMenu();<br />void displaySettingFreqTreble();<br />void displaySettingFreqMiddle();<br />void displaySettingFreqBass();<br />void displaySettingFreqSub();<br />void displaySettingFreqLoudness();<br />void displaySettingQTreble();<br />void displaySettingQMiddle();<br />void displaySettingQBass();<br />void displaySettingGainLoudness();<br />void displaySettingGainLF();<br />void displaySettingGainRF();<br />void displaySettingGainLR();<br />void displaySettingGainRR();<br />void displaySettingGainSub();<br />void handlePowerCommand();<br />void handleMuteCommand();<br />void handleSetCommand();<br />void handleMenuCommand();<br />void handleInputCommand();<br />void handleUpDownButtons(uint32_t cmd);<br />bool adjustValue(int direction);<br />bool changeVolume(int direction);<br />bool changeTone(int &amp;value, int direction, int min_val, int max_val);<br />void saveCurrentGain();<br />void constrainValues();<br />void displayMenu();<br />void displayPowerOff();<br />void displayMute();</p><p>void constrainValues() {<br />&nbsp; &nbsp; vol_reg = constrain(vol_reg, -79, 15);<br />&nbsp; &nbsp; treb_reg = constrain(treb_reg, -20, 20);<br />&nbsp; &nbsp; mid_reg = constrain(mid_reg, -20, 20);<br />&nbsp; &nbsp; bass_reg = constrain(bass_reg, -20, 20);<br />&nbsp; &nbsp; gain0 = constrain(gain0, 0, 20);<br />&nbsp; &nbsp; gain1 = constrain(gain1, 0, 20);<br />&nbsp; &nbsp; gain2 = constrain(gain2, 0, 20);<br />&nbsp; &nbsp; gain3 = constrain(gain3, 0, 20);<br />}</p><p>void setup() {<br />&nbsp; &nbsp; wdt_disable(); // Отключить watchdog на время инициализации<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; Wire.begin();<br />&nbsp; &nbsp; Wire.setClock(400000L);<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Инициализация пинов<br />&nbsp; &nbsp; pinMode(IN2_OUT, OUTPUT);<br />&nbsp; &nbsp; pinMode(IN3_OUT, OUTPUT);<br />&nbsp; &nbsp; pinMode(12, INPUT_PULLUP); // Защита от помех на IR входе<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; powerManager.initialize();<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Инициализация IR<br />&nbsp; &nbsp; irrecv.enableIRIn();<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Инициализация дисплея<br />&nbsp; &nbsp; myOLED.begin();<br />&nbsp; &nbsp; myOLED.setBrightness(0); // Начинаем с выключенного дисплея<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Загрузка настроек<br />&nbsp; &nbsp; eepromManager.loadSettings();<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Быстрая заставка<br />&nbsp; &nbsp; myOLED.clrScr();<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; char buffer[20];<br />&nbsp; &nbsp; strcpy_P(buffer, str_bd37534fv);<br />&nbsp; &nbsp; myOLED.print(buffer, CENTER, 20);<br />&nbsp; &nbsp; myOLED.update();<br />&nbsp; &nbsp; delay(500);<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Остаемся в выключенном состоянии<br />&nbsp; &nbsp; displayMenu();<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; wdt_enable(WDTO_2S); // Включить watchdog (2 секунды)<br />}</p><p>bool handleIR() {<br />&nbsp; &nbsp; if (irrecv.decode(&amp;ir)) {<br />&nbsp; &nbsp; &nbsp; &nbsp; unsigned long now = millis();<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Защита от дребезга<br />&nbsp; &nbsp; &nbsp; &nbsp; if (now - lastIrTime &lt; IR_DEBOUNCE) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; irrecv.resume();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; lastIrTime = now;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; uint32_t value = ir.value;<br />&nbsp; &nbsp; &nbsp; &nbsp; irrecv.resume();<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Фильтрация невалидных команд<br />&nbsp; &nbsp; &nbsp; &nbsp; if (value == 0) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Обработка повторяющихся команд<br />&nbsp; &nbsp; &nbsp; &nbsp; if (value == 0xFFFFFFFF) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (repeatEnabled &amp;&amp; (now - lastRepeatTime &gt;= REPEAT_INTERVAL)) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastRepeatTime = now;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value = lastCommand;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Новая команда<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastCommand = value;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; repeatEnabled = true;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastRepeatTime = now + REPEAT_DELAY;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Обработка команд<br />&nbsp; &nbsp; &nbsp; &nbsp; if (value == IR_POWER) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handlePowerCommand();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; if (!power) return true; // Остальные команды игнорируем при выключенном питании<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; if (value == IR_MUTE) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handleMuteCommand();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; if (value == IR_SET) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handleSetCommand();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Если в режиме mute, блокируем остальные команды кроме навигации<br />&nbsp; &nbsp; &nbsp; &nbsp; if (mute) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (value == IR_MENU) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handleMenuCommand();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Обработка остальных команд при включенном питании и снятом mute<br />&nbsp; &nbsp; &nbsp; &nbsp; switch (value) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case IR_MENU:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handleMenuCommand();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case IR_INPUT:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handleInputCommand();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case IR_UP:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case IR_DW:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handleUpDownButtons(value);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; return true;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return false;<br />}</p><p>void handlePowerCommand() {<br />&nbsp; &nbsp; power = !power;<br />&nbsp; &nbsp; if (power) {<br />&nbsp; &nbsp; &nbsp; &nbsp; powerManager.turnOn();<br />&nbsp; &nbsp; &nbsp; &nbsp; mute = false; // Снимаем mute при включении<br />&nbsp; &nbsp; &nbsp; &nbsp; menu = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; set = false;<br />&nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; powerManager.turnOff();<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; audioManager.updateAudio();<br />&nbsp; &nbsp; displayMenu();<br />}</p><p>void handleMuteCommand() {<br />&nbsp; &nbsp; if (!power) return;<br />&nbsp; &nbsp; mute = !mute;<br />&nbsp; &nbsp; audioManager.updateAudio();<br />&nbsp; &nbsp; displayMenu();<br />}</p><p>void handleSetCommand() {<br />&nbsp; &nbsp; if (!power) return;<br />&nbsp; &nbsp; set = !set;<br />&nbsp; &nbsp; if (set) {<br />&nbsp; &nbsp; &nbsp; &nbsp; menu = MENU_SETTINGS_START;<br />&nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; menu = 0;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; displayMenu();<br />}</p><p>void handleMenuCommand() {<br />&nbsp; &nbsp; if (!set) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Основные меню<br />&nbsp; &nbsp; &nbsp; &nbsp; menu = (menu + 1) % MENU_MAIN_COUNT;<br />&nbsp; &nbsp; &nbsp; &nbsp; if (menu == 4) menu = 5; // Пропускаем 4<br />&nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Меню настроек<br />&nbsp; &nbsp; &nbsp; &nbsp; menu++;<br />&nbsp; &nbsp; &nbsp; &nbsp; if (menu &gt; MENU_SETTINGS_END) menu = MENU_SETTINGS_START;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; displayMenu();<br />}</p><p>void handleInputCommand() {<br />&nbsp; &nbsp; in_reg = (in_reg + 1) % 3;<br />&nbsp; &nbsp; menu = 5;<br />&nbsp; &nbsp; audioManager.updateInputOutputs();<br />&nbsp; &nbsp; updateCurrentGain();<br />&nbsp; &nbsp; audioManager.updateAudio();<br />&nbsp; &nbsp; eepromManager.markDirty();<br />&nbsp; &nbsp; displayMenu();<br />}</p><p>void handleUpDownButtons(uint32_t cmd) {<br />&nbsp; &nbsp; bool changed = false;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if (cmd == IR_UP) {<br />&nbsp; &nbsp; &nbsp; &nbsp; changed = adjustValue(1);<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; else if (cmd == IR_DW) {<br />&nbsp; &nbsp; &nbsp; &nbsp; changed = adjustValue(-1);<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if (menu == 5 &amp;&amp; changed) {<br />&nbsp; &nbsp; &nbsp; &nbsp; saveCurrentGain();<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if (changed) {<br />&nbsp; &nbsp; &nbsp; &nbsp; audioManager.updateAudio();<br />&nbsp; &nbsp; &nbsp; &nbsp; eepromManager.markDirty();<br />&nbsp; &nbsp; &nbsp; &nbsp; displayMenu();<br />&nbsp; &nbsp; }<br />}</p><p>bool adjustValue(int direction) {<br />&nbsp; &nbsp; switch (menu) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: return changeVolume(direction);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: return changeTone(treb_reg, direction, -20, 20);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: return changeTone(mid_reg, direction, -20, 20);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: return changeTone(bass_reg, direction, -20, 20);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 5: return changeTone(gain0, direction, 0, 20);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 10: return changeTone(f_treb, direction, 0, 3);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 11: return changeTone(f_mid, direction, 0, 3);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 12: return changeTone(f_bass, direction, 0, 3);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 13: return changeTone(f_sub, direction, 0, 4);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 14: return changeTone(f_lon, direction, 0, 3);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 15: return changeTone(q_treb, direction, 0, 1);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 16: return changeTone(q_mid, direction, 0, 3);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 17: return changeTone(q_bass, direction, 0, 3);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 18: return changeTone(gain_lon, direction, 0, 20);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 19: return changeTone(gain_lf, direction, -79, 15);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 20: return changeTone(gain_rf, direction, -79, 15);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 21: return changeTone(gain_lr, direction, -79, 15);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 22: return changeTone(gain_rr, direction, -79, 15);<br />&nbsp; &nbsp; &nbsp; &nbsp; case 23: return changeTone(gain_sub, direction, -79, 15);<br />&nbsp; &nbsp; &nbsp; &nbsp; default: return false;<br />&nbsp; &nbsp; }<br />}</p><p>bool changeVolume(int direction) {<br />&nbsp; &nbsp; int new_vol = vol_reg + direction;<br />&nbsp; &nbsp; if (new_vol &gt;= -79 &amp;&amp; new_vol &lt;= 15) {<br />&nbsp; &nbsp; &nbsp; &nbsp; vol_reg = new_vol;<br />&nbsp; &nbsp; &nbsp; &nbsp; return true;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return false;<br />}</p><p>bool changeTone(int &amp;value, int direction, int min_val, int max_val) {<br />&nbsp; &nbsp; int new_val = value + direction;<br />&nbsp; &nbsp; if (new_val &gt;= min_val &amp;&amp; new_val &lt;= max_val) {<br />&nbsp; &nbsp; &nbsp; &nbsp; value = new_val;<br />&nbsp; &nbsp; &nbsp; &nbsp; return true;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return false;<br />}</p><p>void saveCurrentGain() {<br />&nbsp; &nbsp; switch (in_reg) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: gain1 = gain0; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: gain2 = gain0; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: gain3 = gain0; break;<br />&nbsp; &nbsp; }<br />}</p><p>void displayMenu() {<br />&nbsp; &nbsp; myOLED.clrScr();<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if (!power) {<br />&nbsp; &nbsp; &nbsp; &nbsp; displayPowerOff();<br />&nbsp; &nbsp; &nbsp; &nbsp; myOLED.update();<br />&nbsp; &nbsp; &nbsp; &nbsp; return;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if (mute) {<br />&nbsp; &nbsp; &nbsp; &nbsp; displayMute();<br />&nbsp; &nbsp; &nbsp; &nbsp; myOLED.update();<br />&nbsp; &nbsp; &nbsp; &nbsp; return;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if (!set) {<br />&nbsp; &nbsp; &nbsp; &nbsp; displayMainMenu();<br />&nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; displaySettingsMenu();<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; myOLED.update();<br />}</p><p>void displayPowerOff() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; char buffer[20];<br />&nbsp; &nbsp; strcpy_P(buffer, str_power_off);<br />&nbsp; &nbsp; myOLED.print(buffer, CENTER, 30);<br />}</p><p>void displayMute() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; char buffer[20];<br />&nbsp; &nbsp; strcpy_P(buffer, str_mute);<br />&nbsp; &nbsp; myOLED.print(buffer, CENTER, 17);<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;VOL:&quot;), 25, 45);<br />&nbsp; &nbsp; myOLED.printNumI(vol_reg + 79, 30, 45);<br />&nbsp; &nbsp; myOLED.print(F(&quot;IN:&quot;), 80, 45);<br />&nbsp; &nbsp; myOLED.printNumI(in_reg + 1, 90, 45);<br />}</p><p>void displayMainMenu() {<br />&nbsp; &nbsp; switch (menu) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: displayVolumeMenu(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: displayTrebleMenu(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: displayMiddleMenu(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: displayBassMenu(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 5: displayInputGainMenu(); break;<br />&nbsp; &nbsp; }<br />}</p><p>void displayVolumeMenu() {<br />&nbsp; &nbsp; char buffer[20];<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_volume);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(vol_reg + 79, 75, 0);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_in);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 10);<br />&nbsp; &nbsp; myOLED.printNumI(in_reg + 1, 30, 10);<br />&nbsp; &nbsp; strcpy_P(buffer, str_gain);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 20);<br />&nbsp; &nbsp; myOLED.printNumI(gain0, 30, 20);<br />&nbsp; &nbsp; myOLED.drawLine(0, 30, 128, 30);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_treble);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 35);<br />&nbsp; &nbsp; myOLED.printNumI(treb_reg, 75, 35);<br />&nbsp; &nbsp; strcpy_P(buffer, str_middle);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 45);<br />&nbsp; &nbsp; myOLED.printNumI(mid_reg, 75, 45);<br />&nbsp; &nbsp; strcpy_P(buffer, str_bass);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 55);<br />&nbsp; &nbsp; myOLED.printNumI(bass_reg, 75, 55);<br />}</p><p>void displayTrebleMenu() {<br />&nbsp; &nbsp; char buffer[20];<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_treble);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(treb_reg, 75, 0);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; switch (f_treb) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;F 7.5 kHz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;F 10&nbsp; kHz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;F 12.5kHz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;F 15&nbsp; kHz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; switch (q_treb) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;Q 0.75&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;Q 1.25&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; myOLED.drawLine(0, 30, 128, 30);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_middle);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 35);<br />&nbsp; &nbsp; myOLED.printNumI(mid_reg, 75, 35);<br />&nbsp; &nbsp; strcpy_P(buffer, str_bass);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 45);<br />&nbsp; &nbsp; myOLED.printNumI(bass_reg, 75, 45);<br />&nbsp; &nbsp; strcpy_P(buffer, str_volume);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 55);<br />&nbsp; &nbsp; myOLED.printNumI(vol_reg + 79, 75, 55);<br />}</p><p>void displayMiddleMenu() {<br />&nbsp; &nbsp; char buffer[20];<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_middle);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(mid_reg, 75, 0);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; switch (f_mid) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;F 500 Hz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;F 1&nbsp; kHz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;F 1.5kHz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;F 2.5kHz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; switch (q_mid) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;Q 0.75&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;Q 1.00&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;Q 1.25&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;Q 1.50&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; myOLED.drawLine(0, 30, 128, 30);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_bass);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 35);<br />&nbsp; &nbsp; myOLED.printNumI(bass_reg, 75, 35);<br />&nbsp; &nbsp; strcpy_P(buffer, str_volume);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 45);<br />&nbsp; &nbsp; myOLED.printNumI(vol_reg + 79, 75, 45);<br />&nbsp; &nbsp; strcpy_P(buffer, str_treble);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 55);<br />&nbsp; &nbsp; myOLED.printNumI(treb_reg, 75, 55);<br />}</p><p>void displayBassMenu() {<br />&nbsp; &nbsp; char buffer[20];<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_bass);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(bass_reg, 75, 0);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; switch (f_bass) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;F 60 Hz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;F 80 Hz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;F 100 Hz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;F 120 Hz&quot;), LEFT, 10); break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; switch (q_bass) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;Q 0.50&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;Q 1.00&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;Q 1.50&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;Q 2.00&quot;), LEFT, 20); break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; myOLED.drawLine(0, 30, 128, 30);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_volume);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 35);<br />&nbsp; &nbsp; myOLED.printNumI(vol_reg + 79, 75, 35);<br />&nbsp; &nbsp; strcpy_P(buffer, str_treble);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 45);<br />&nbsp; &nbsp; myOLED.printNumI(treb_reg, 75, 45);<br />&nbsp; &nbsp; strcpy_P(buffer, str_middle);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 55);<br />&nbsp; &nbsp; myOLED.printNumI(mid_reg, 75, 55);<br />}</p><p>void displayInputGainMenu() {<br />&nbsp; &nbsp; char buffer[20];<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_input);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(in_reg + 1, 65, 0);<br />&nbsp; &nbsp; myOLED.drawLine(0, 30, 128, 30);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; strcpy_P(buffer, str_gain);<br />&nbsp; &nbsp; myOLED.print(buffer, LEFT, 35);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(gain0, 65, 35);<br />}</p><p>void displaySettingsMenu() {<br />&nbsp; &nbsp; switch (menu) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 10: displaySettingFreqTreble(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 11: displaySettingFreqMiddle(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 12: displaySettingFreqBass(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 13: displaySettingFreqSub(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 14: displaySettingFreqLoudness(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 15: displaySettingQTreble(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 16: displaySettingQMiddle(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 17: displaySettingQBass(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 18: displaySettingGainLoudness(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 19: displaySettingGainLF(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 20: displaySettingGainRF(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 21: displaySettingGainLR(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 22: displaySettingGainRR(); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 23: displaySettingGainSub(); break;<br />&nbsp; &nbsp; }<br />}</p><p>void displaySettingFreqTreble() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;Frequency TREBLE&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; switch (f_treb) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;7.50&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;10.0&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;12.5&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;15.0&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;kHz&quot;), CENTER, 50);<br />}</p><p>void displaySettingFreqMiddle() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;Frequency MIDDLE&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; switch (f_mid) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;0.5&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;1.0&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;1.5&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;2.5&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;kHz&quot;), CENTER, 50);<br />}</p><p>void displaySettingFreqBass() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;Frequency BASS&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; switch (f_bass) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;60&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;80&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;100&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;120&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;Hz&quot;), CENTER, 50);<br />}</p><p>void displaySettingFreqSub() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;Frequency SUBWOOFER&quot;), CENTER, 0);<br />&nbsp; &nbsp; switch (f_sub) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;OFF&quot;), CENTER, 25); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;55 Hz&quot;), CENTER, 25); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;85 Hz&quot;), CENTER, 25); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;120 Hz&quot;), CENTER, 25); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 4: myOLED.print(F(&quot;160 Hz&quot;), CENTER, 25); break;<br />&nbsp; &nbsp; }<br />}</p><p>void displaySettingFreqLoudness() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;Frequency LOUDNESS&quot;), CENTER, 0);<br />&nbsp; &nbsp; switch (f_lon) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;250 Hz&quot;), CENTER, 25); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;400 Hz&quot;), CENTER, 25); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;800 Hz&quot;), CENTER, 25); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;PROHIBIT&quot;), CENTER, 25); break;<br />&nbsp; &nbsp; }<br />}</p><p>void displaySettingQTreble() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;Q TREBLE&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; switch (q_treb) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;0.75&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;1.25&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; }<br />}</p><p>void displaySettingQMiddle() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;Q MIDDLE&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; switch (q_mid) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;0.75&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;1.00&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;1.25&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;1.50&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; }<br />}</p><p>void displaySettingQBass() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;Q BASS&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; switch (q_bass) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case 0: myOLED.print(F(&quot;0.50&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 1: myOLED.print(F(&quot;1.00&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 2: myOLED.print(F(&quot;1.50&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case 3: myOLED.print(F(&quot;2.00&quot;), CENTER, 20); break;<br />&nbsp; &nbsp; }<br />}</p><p>void displaySettingGainLoudness() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;GAIN LOUDNESS&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(gain_lon, CENTER, 20);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;dB&quot;), CENTER, 50);<br />}</p><p>void displaySettingGainLF() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;GAIN LEFT FRONT&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(gain_lf, CENTER, 20);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;dB&quot;), CENTER, 50);<br />}</p><p>void displaySettingGainRF() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;GAIN RIGHT FRONT&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(gain_rf, CENTER, 20);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;dB&quot;), CENTER, 50);<br />}</p><p>void displaySettingGainLR() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;GAIN LEFT REAR&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(gain_lr, CENTER, 20);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;dB&quot;), CENTER, 50);<br />}</p><p>void displaySettingGainRR() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;GAIN RIGHT REAR&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(gain_rr, CENTER, 20);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;dB&quot;), CENTER, 50);<br />}</p><p>void displaySettingGainSub() {<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;GAIN SUBWOOFER&quot;), CENTER, 0);<br />&nbsp; &nbsp; myOLED.setFont(BigNumbers);<br />&nbsp; &nbsp; myOLED.printNumI(gain_sub, CENTER, 20);<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; myOLED.print(F(&quot;dB&quot;), CENTER, 50);<br />}</p><p>void loop() {<br />&nbsp; &nbsp; wdt_reset(); // Сброс watchdog таймера<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Обработка ИК-команд<br />&nbsp; &nbsp; handleIR();<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Автосохранение в EEPROM<br />&nbsp; &nbsp; if (eepromManager.shouldSave()) {<br />&nbsp; &nbsp; &nbsp; &nbsp; eepromManager.saveSettings();<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // Краткое сообщение о сохранении<br />&nbsp; &nbsp; &nbsp; &nbsp; myOLED.clrScr();<br />&nbsp; &nbsp; &nbsp; &nbsp; myOLED.setFont(SmallFont);<br />&nbsp; &nbsp; &nbsp; &nbsp; char buffer[20];<br />&nbsp; &nbsp; &nbsp; &nbsp; strcpy_P(buffer, str_settings_saved);<br />&nbsp; &nbsp; &nbsp; &nbsp; myOLED.print(buffer, CENTER, 30);<br />&nbsp; &nbsp; &nbsp; &nbsp; myOLED.update();<br />&nbsp; &nbsp; &nbsp; &nbsp; delay(300);<br />&nbsp; &nbsp; &nbsp; &nbsp; displayMenu();<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; delay(10);<br />}<br />Скетч использует 20786 байт (64%) памяти устройства. Всего доступно 32256 байт.<br />Глобальные переменные используют 1573 байт (76%) динамической памяти, оставляя 475 байт для локальных переменных. Максимум: 2048 байт.</p>]]></description>
			<author><![CDATA[null@example.com (hokvin)]]></author>
			<pubDate>Sun, 26 Oct 2025 09:41:43 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11961#p11961</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11929#p11929</link>
			<description><![CDATA[<p>буду тестировать</p>]]></description>
			<author><![CDATA[null@example.com (hokvin)]]></author>
			<pubDate>Sun, 12 Oct 2025 03:49:07 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11929#p11929</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11925#p11925</link>
			<description><![CDATA[<p>swith(in_reg){<br />&nbsp; case 1: digitalWrite(IN2_OUT,HIGH); digitalWrite(IN3_OUT,LOW);break;<br />&nbsp; case 2: digitalWrite(IN2_OUT,LOW); digitalWrite(IN3_OUT,HIGH);break;<br />}</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Sat, 11 Oct 2025 04:37:58 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11925#p11925</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11924#p11924</link>
			<description><![CDATA[<p>Спасибо за быстрый ответ еще хотелось добавить 2 пина на&nbsp; IN2&nbsp; и IN3 <br />#define IN2_OUT 6<br />#define IN3_OUT 7<br />чтобы при включении соответствующего входа&nbsp; на них был высокий уровень.нужны для коммутации индикатора уровня</p>]]></description>
			<author><![CDATA[null@example.com (hokvin)]]></author>
			<pubDate>Sat, 11 Oct 2025 04:01:23 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11924#p11924</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11923#p11923</link>
			<description><![CDATA[<p>Замените</p><p>if(power==0){<br />&nbsp; if((digitalRead(MUTE_BUTTON)==LOW || ir.value==IR_MUTE)&amp;&amp; mute==0){mute=1;gr1=0;gr2=0;cl();<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);myOLED.print(F(&quot;MUTE&quot;), CENTER, 10);myOLED.update();cl();menu=100;}<br />&nbsp; if((digitalRead(MUTE_BUTTON)==LOW&nbsp; || ir.value==IR_MUTE)&amp;&amp; mute==1){mute=0;gr1=0;gr2=0;times=millis();w=1;w2=1;cl();menu=0;}&nbsp; <br />}</p><p>на</p><p>if(power==0){<br />&nbsp; if((digitalRead(MUTE_BUTTON)==LOW || ir.value==IR_MUTE)&amp;&amp; mute==0){mute=1;gr1=0;gr2=0;cl();<br />&nbsp; &nbsp; myOLED.setFont(SmallFont);myOLED.print(F(&quot;MUTE&quot;), CENTER, 10);myOLED.update();cl();menu=100;audio();}<br />&nbsp; if((digitalRead(MUTE_BUTTON)==LOW&nbsp; || ir.value==IR_MUTE)&amp;&amp; mute==1){mute=0;gr1=0;gr2=0;times=millis();w=1;w2=1;cl();menu=0;audio();}&nbsp; <br />}</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Sat, 11 Oct 2025 03:04:55 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11923#p11923</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11922#p11922</link>
			<description><![CDATA[<p>Здравствуйте собрал Ваш проект скетч из поста 260 не отключается звук в режиме MUTE на экране режим отображается</p>]]></description>
			<author><![CDATA[null@example.com (hokvin)]]></author>
			<pubDate>Sat, 11 Oct 2025 02:56:49 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11922#p11922</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11583#p11583</link>
			<description><![CDATA[<p>Спасибо</p>]]></description>
			<author><![CDATA[null@example.com (opertech)]]></author>
			<pubDate>Sat, 29 Mar 2025 11:16:27 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11583#p11583</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11582#p11582</link>
			<description><![CDATA[<p>Надо по возможности все повторяющиеся фрагменты кода перенести в функцию для уменьшения размера скетча</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Sat, 29 Mar 2025 10:39:04 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11582#p11582</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11579#p11579</link>
			<description><![CDATA[<p>Здравствуйте. Можно ли обойти превышение размеров прошивки (104% от памяти контроллера) при использовании 328P-LQFP32(MiniEVB) если использовать стандартную прошивку из среды через сн340(загрузчик)?</p>]]></description>
			<author><![CDATA[null@example.com (opertech)]]></author>
			<pubDate>Sat, 29 Mar 2025 09:45:59 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11579#p11579</guid>
		</item>
		<item>
			<title><![CDATA[Re: BD37534FV - Sound Processor with Built-in 3-band Equalizer]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11492#p11492</link>
			<description><![CDATA[<p>Спасибо</p>]]></description>
			<author><![CDATA[null@example.com (opertech)]]></author>
			<pubDate>Sun, 23 Mar 2025 18:31:36 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11492#p11492</guid>
		</item>
	</channel>
</rss>
