<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;type=atom" />
	<updated>2026-02-07T12:52:52Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/index.php</id>
		<entry>
			<title type="html"><![CDATA[PT2323]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=728&amp;action=new" />
			<summary type="html"><![CDATA[<p>Здравствуйте! нужна Ваша помощь в написании скетча. Нужно управление процессором&nbsp; PT2322,как в Темброблок 5.1 на PT2323 и PT2322 (Arduino),но без 2323, коммутатор входов на 3 канала (aux1/aux2/6ch)будет на мс 4053,которые переключаются с определённого сигнала с вывода ардуинки. Энкодер и ик пульт присутствуют. Короче,как в статье,только вырезать всё,что касается 2323,сделать меню на 3 входа с соответствующими надписями и управлением. Дисплей i2c, режим st-by.</p>]]></summary>
			<author>
				<name><![CDATA[Игорёк 87]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=4030</uri>
			</author>
			<updated>2026-02-07T12:52:52Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=728&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[BD37534FV+LCD2004+энкодер+ИК пульт]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=727&amp;action=new" />
			<summary type="html"><![CDATA[<p>Здравствуйте, собрал этот проект, всё работает, не проверял только пульт. Хотелось бы добавить к нему модуль BT201 с управлением по uart. Чтобы при включении одного из трёх входов, пока не важно какого но к которому будет подключен модуль, появлялось четвёртое меню в котором первая строка это громкость, вторая- указывает на то, что включено, блютуз, USB или SD карта, третья и четвёртая это номер и название трека. Также нужно добавить кнопки воспроизведение-стоп, трек+, трек- и выбор блютуз, USB или SD карта.<br />Нужна помощь в написании скетча, сам не разберусь. И возможно ли это Вообще?<br />Всё железо на руках. Не знаю как прикрепить скетч который использую.</p><p><span class="attention-yellow"></span></p>]]></summary>
			<author>
				<name><![CDATA[lisiyivan]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3887</uri>
			</author>
			<updated>2026-01-23T19:17:12Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=727&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Анализатор спектра с пиковыми индикаторами на OLED1.3 (Arduino Nano)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=726&amp;action=new" />
			<summary type="html"><![CDATA[<p>Требуется тестирование </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/39c130535431edf3113d822a2087fa31.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/39c130535431edf3113d822a2087fa31.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/e41a3a89d5fc21bcbbe09fffeaf88d9a.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/e41a3a89d5fc21bcbbe09fffeaf88d9a.png" /></span> </p><br /><div class="codebox"><pre><code>#define AUTO_GAIN 1       // автонастройка по громкости (экспериментальная функция)
#define VOL_THR 25        // порог тишины (ниже него отображения на матрице не будет)
#define LOW_PASS 20       // нижний порог чувствительности шумов (нет скачков при отсутствии звука)
#define DEF_GAIN 80       // максимальный порог по умолчанию (при GAIN_CONTROL игнорируется)
#define FHT_N 256         // ширина спектра х2
#define LOG_OUT 1
#define PIK_DELAY 400    // время зависания пика

// вручную забитый массив тонов, сначала плавно, потом круче
byte posOffset[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};//1500 Hz
//byte posOffset[16] = {1, 2, 3, 4, 6, 8, 10, 13, 16, 20, 25, 30, 35, 40, 45, 50};//4000 Hz

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &amp;= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

#include &lt;Wire.h&gt;
#include &lt;U8glib.h&gt;  // http://rcl-radio.ru/wp-content/uploads/2023/04/U8glib.zip
#include &lt;FHT.h&gt;     // http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=297&amp;download=1

U8GLIB_SH1106_128X64 myOLED(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
 
  byte gain = DEF_GAIN;   
  unsigned long gainTimer,times, times0;
  byte maxValue, maxValue_f;
  float k = 0.1;
  byte ur[16],urr[16];
  unsigned long peakTimings[16]; 


  
void setup() {
  delay(100); 
  sbi(ADCSRA, ADPS2);
  cbi(ADCSRA, ADPS1);
  sbi(ADCSRA, ADPS0);
  Serial.begin(9600);
  Wire.begin();Wire.setClock(800000L);
  myOLED.begin();
 // myOLED.setRot180();
  myOLED.setFont(u8g_font_profont11r);
  analogReference(INTERNAL); // Устанавливаем внутреннее опорное напряжение 1.1 В
  pinMode(A0,INPUT); // INPUT AUDIO
}
 

void loop() {
  analyzeAudio(); 

  myOLED.firstPage();  
  do {
    for (int pos = 0; pos &lt; 128; pos += 8) {
      // Определяем уровень сигнала на конкретной частоте
      int posLevel = map(fht_log_out[posOffset[pos / 8]], LOW_PASS, gain, 0, 60);
      posLevel = constrain(posLevel, 0, 60);

      // Обновляем текущий уровень сигнала
      urr[pos] = posLevel;

      // Индекс текущей полосы (для массива пиков)
      int index = pos / 8;

      // Обрабатываем пики
      if (urr[pos] &lt; ur[index]) {
        // Если пик установлен давно, начинается его плавное уменьшение
        if (millis() - peakTimings[index] &gt; PIK_DELAY) {
          ur[index] -= 1; // Плавное уменьшение пиков
        }
      } else {
        // Установка нового пикового значения и фиксация времени
        ur[index] = posLevel;
        peakTimings[index] = millis(); // Запомним время фиксации текущего пика
      }

      // Ждем для стабильности
      delayMicroseconds(200);

      // Рисуем текущий уровень сигнала
      for (int v_pos = 0; v_pos &lt; urr[pos] + 4; v_pos += 4) {
        myOLED.drawBox(pos, 61 - v_pos, 6, 2);
      }

      // Если пик существовал раньше, рисуем пиковый индикатор
      if (ur[index] &gt; urr[pos]) {
        myOLED.drawBox(pos, 61 - ur[index], 6, 2); // Пиковый индикатор
      }
    }
  } while(myOLED.nextPage());

  // Автонастройка усиления
  if (AUTO_GAIN) {
    maxValue_f = maxValue * k + maxValue_f * (1 - k);
    if (millis() - gainTimer &gt; 1500) {
      if (maxValue_f &gt; VOL_THR) gain = maxValue_f;
      else gain = 100;
      gainTimer = millis();
    }
  }
}
 
void analyzeAudio() {
  for (int i = 0 ; i &lt; FHT_N ; i++) {
    int sample = analogRead(A0);
    fht_input[i] = sample; // put real data into bins
  }
  fht_window();  // window the data for better frequency response
  fht_reorder(); // reorder the data before doing the fht
  fht_run();     // process the data in the fht
  fht_mag_log(); // take the output of the fht
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2026-01-07T08:44:12Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=726&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AX2358]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=725&amp;action=new" />
			<summary type="html"><![CDATA[<p><a href="http://rcl-radio.ru/wp-content/uploads/2026/01/AX2358_ETC.pdf">http://rcl-radio.ru/wp-content/uploads/ … 58_ETC.pdf</a></p><br /><p>ax2358.ino</p><div class="codebox"><pre><code>#include &lt;Wire.h&gt; 
#include &lt;AX2358.h&gt; 

AX2358 ax;

void setup() {
  audio();
  delay(1000);
}

void loop() {
  // put your main code here, to run repeatedly:

}

void audio(){
        ax.setInput(1);// int 1,2,3,4 = input 1,2,3,4 | int 5 = input 6CH
        ax.setFunc_stereo(0); // 3d int 1...0 = on ... off 
        ax.setFunc_att(0);    // Stereo‑to‑CT/SUB Mixer with −6dB Attenuation | int 1...0 = on ... off 
        ax.setVol_master(65); //  int 0...79 
        ax.setMute(0);// mute 0 - off / 1 - on     
  }</code></pre></div><p><span class="attention-yellow"></span></p>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2026-01-05T16:31:23Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=725&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[M62429 + OLED 128x32]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=724&amp;action=new" />
			<summary type="html"><![CDATA[<div class="codebox"><pre><code>// энкодер
#define ENC_DT       9
#define ENC_CLK      8
#define ENC_SW       10

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

// кнопки управления
#define POWER_BUTTON    3
#define MUTE_BUTTON     4

// выход управления standby
#define STANDBY_OUT     13

// M62429 
#define CLK        11
#define DATA       12

// коды кнопок ИК пульта
#define MENU      0x2FDB24D // button encoder
#define UP        0x2FDD02F // &gt;&gt;&gt;
#define DW        0x2FD32CD // &lt;&lt;&lt;
#define POWER_IR  0x2FD00FF // POWER
#define MUTE_IR   0x2FDB04F // MUTE

#include &lt;Wire.h&gt; 
#include &lt;U8glib.h&gt;             // https://github.com/olikraus/u8glib/
#include &lt;Encoder.h&gt;            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
#include &lt;EEPROM.h&gt;
#include &lt;MsTimer2.h&gt;           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip       
#include &lt;boarddefs.h&gt;          // входит в состав библиотеки IRremote
#include &lt;IRremote.h&gt;           // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include &lt;M62429.h&gt;             // http://rcl-radio.ru/wp-content/uploads/2026/01/M62429.zip

 U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI 
 IRrecv irrecv(IR);
 Encoder myEnc(ENC_DT, ENC_CLK);
 decode_results ir; 
 

 extern uint8_t SmallFont[],BigNumbers[];
 long times,oldPosition  = -999,newPosition;
 int vol,balans,bass,treb,in,menu;
 bool mute=0,gr1,gr2,w,w1,power=0;

 void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  pinMode(POWER_BUTTON,INPUT_PULLUP);
  pinMode(MUTE_BUTTON,INPUT_PULLUP);
  pinMode(STANDBY_OUT,OUTPUT); 

 u8g.firstPage(); do {
  u8g.setFont(u8g_font_profont29r);u8g.drawStr(5,25,&quot;M62429&quot;); 
  }while( u8g.nextPage() );

  delay(3000);
  digitalWrite(STANDBY_OUT,LOW);
  vol = EEPROM.read(0);balans = EEPROM.read(3)-8;
  audio(); 
 }

 void loop(){
  // IR ////////////////////////////////////////
  if ( irrecv.decode( &amp;ir )) {Serial.print(&quot;0x&quot;);Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  
  
 if(power==0){ 
 if(digitalRead(ENC_SW)==LOW || ir.value==MENU){menu++;cl();delay(200);times=millis();w1=1;w=1;if(menu&gt;1){menu=0;}} // меню


 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&amp;&amp; mute==0){mute=1;cl();times=millis();w1=1;w=1;mute_conf();
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(25,25,&quot;MUTE&quot;);}while( u8g.nextPage() );delay(300);menu=100;} // mute on 

 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&amp;&amp; mute==1){mute=0;cl();times=millis();w1=1;w=1;audio();
 delay(300);menu=0;} // mute off 
 }

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&amp;&amp; power==0){power=1;cl();times=millis();w1=1;w=1;mute_conf();digitalWrite(STANDBY_OUT,HIGH);
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(10,25,&quot;STANDBY&quot;);}while( u8g.nextPage() );delay(2000);menu=100;
 u8g.firstPage(); do {}while( u8g.nextPage() );} // power on 

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&amp;&amp; power==1){power=0;cl();times=millis();w1=1;w=1;audio();digitalWrite(STANDBY_OUT,LOW);delay(300);menu=0;} // power off 
 
  
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition&gt;1){newPosition=1;}if(newPosition&lt;-1){newPosition=-1;}
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();}
 
   if(ir.value==UP){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &gt; 
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
   if(ir.value==DW){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &lt;
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
 
  if(w==1){w=0;
 // Serial.println(63-vol+balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,&quot;VOLUME&quot;);
  u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(95, 24);u8g.print(vol-8);
  for(int v_pos=0; v_pos&lt;(75-8)*1.3;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos&lt;(vol-8)*1.3;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos&lt;(75-8)*1.3;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BALL /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==1){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition&gt;1){newPosition=1;}if(newPosition&lt;-1){newPosition=-1;}
   balans=balans+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;ball_func();audio();}

   if(ir.value==UP){balans++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка &gt; 
   if(ir.value==DW){balans--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка &lt;
 
  if(w==1){w=0;
 // Serial.println(83-vol+balans);
 // Serial.println(83-vol-balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,&quot;BALANCE&quot;);
  u8g.setFont(u8g_font_profont29r); 
  if(balans&gt;=0){u8g.setPrintPos(112, 24);u8g.print(balans);u8g.drawStr(95,24,&quot;+&quot;);}
  else{u8g.setPrintPos(95, 24);u8g.print(balans);}

  for(int v_pos=0; v_pos&lt;(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  const int SCREEN_WIDTH = 84; 
  u8g.drawBox(43,18, 1, 9);// 0 dB
  if(balans &gt;= 0){for(int v_pos=0; v_pos&lt;(balans*4);v_pos+=4){u8g.drawBox(v_pos+48,18, 2, 9);}} 
  else{for(int v_pos=SCREEN_WIDTH-48; v_pos&gt;(SCREEN_WIDTH-(abs(balans)*4)-48); v_pos-=4){u8g.drawBox(v_pos,18, 2, 9);}}
  for(int v_pos=0; v_pos&lt;(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
  
   } while( u8g.nextPage() );
  }}
  

////////////// EEPROM /////////////////////////////////////////////////////////////////////  
  if(millis()-times&gt;5000 &amp;&amp; w1==1 &amp;&amp; power==0 &amp;&amp; mute==0){
     EEPROM.update(0,vol);EEPROM.update(3,balans+8);
     menu=0;w1=0;w=1;myEnc.write(0);}
  }

 
void to_Timer(){newPosition = myEnc.read()/4;} 
void audio(){
setVolume (CLK,DATA,0,0,83-vol+balans); 
setVolume (CLK,DATA,0,1,83-vol-balans);
/* pin CLK
   pin DATA
   0 - по одному каналу, 1 - оба вместе
   0 ПК 1 ЛК
   83 ... 0 громкость 83 = -83 дБ */  
}

void mute_conf(){
setVolume (CLK,DATA,0,0,84); 
setVolume (CLK,DATA,0,1,84);
  }


void vol_func(){if(vol&gt;75){vol=75;}if(vol&lt;=8){vol=8;}} // int 0 ... int 79 
void ball_func(){if(balans&gt;8){balans=8;}if(balans&lt;=-8){balans=-8;}}
void cl(){ir.value=0;delay(200);} </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2026-01-05T11:35:42Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=724&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[PT2257 + OLED 128x32]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=723&amp;action=new" />
			<summary type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/233aaa5371e0f4f322498c18039693e8.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/233aaa5371e0f4f322498c18039693e8.png" /></span> </p><br /><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/c9200d50cc2d87a6afa7bca554b03f96.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/c9200d50cc2d87a6afa7bca554b03f96.png" /></span> </p><br /><div class="codebox"><pre><code>// энкодер
#define ENC_DT       9
#define ENC_CLK      8
#define ENC_SW       10

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

// кнопки управления
#define POWER_BUTTON    3
#define MUTE_BUTTON     4

// выход управления standby
#define STANDBY_OUT     13

// коды кнопок ИК пульта
#define MENU      0x2FDB24D // button encoder
#define UP        0x2FDD02F // &gt;&gt;&gt;
#define DW        0x2FD32CD // &lt;&lt;&lt;
#define POWER_IR  0x2FD00FF // POWER
#define MUTE_IR   0x2FDB04F // MUTE

#include &lt;Wire.h&gt; 
#include &lt;U8glib.h&gt;             // https://github.com/olikraus/u8glib/
#include &lt;Encoder.h&gt;            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
#include &lt;EEPROM.h&gt;
#include &lt;MsTimer2.h&gt;           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip       
#include &lt;boarddefs.h&gt;          // входит в состав библиотеки IRremote
#include &lt;IRremote.h&gt;           // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include &lt;PT2257.h&gt;             // http://rcl-radio.ru/wp-content/uploads/2019/01/PT2257.zip

 U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI 
 IRrecv irrecv(IR);
 Encoder myEnc(ENC_DT, ENC_CLK);
 decode_results ir; 
 PT2257 rt;

 extern uint8_t SmallFont[],BigNumbers[];
 long times,oldPosition  = -999,newPosition;
 int vol,balans,bass,treb,in,menu;
 bool mute=0,gr1,gr2,w,w1,power=0;

 void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  pinMode(POWER_BUTTON,INPUT_PULLUP);
  pinMode(MUTE_BUTTON,INPUT_PULLUP);
  pinMode(STANDBY_OUT,OUTPUT); 

 u8g.firstPage(); do {
  u8g.setFont(u8g_font_profont29r);u8g.drawStr(5,25,&quot;PT2257&quot;); 
  }while( u8g.nextPage() );

  delay(300);
  digitalWrite(STANDBY_OUT,LOW);
  vol = EEPROM.read(0);balans = EEPROM.read(3)-8;
  audio(); 
 }

 void loop(){
  // IR ////////////////////////////////////////
  if ( irrecv.decode( &amp;ir )) {Serial.print(&quot;0x&quot;);Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  
  
 if(power==0){ 
 if(digitalRead(ENC_SW)==LOW || ir.value==MENU){menu++;cl();delay(200);times=millis();w1=1;w=1;if(menu&gt;1){menu=0;}} // меню


 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&amp;&amp; mute==0){mute=1;cl();times=millis();w1=1;w=1;audio();
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(25,25,&quot;MUTE&quot;);}while( u8g.nextPage() );delay(300);menu=100;} // mute on 

 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&amp;&amp; mute==1){mute=0;cl();times=millis();w1=1;w=1;audio();
 delay(300);menu=0;} // mute off 
 }

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&amp;&amp; power==0){power=1;cl();times=millis();w1=1;w=1;mute=1;audio();digitalWrite(STANDBY_OUT,HIGH);
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(10,25,&quot;STANDBY&quot;);}while( u8g.nextPage() );delay(2000);menu=100;
 u8g.firstPage(); do {}while( u8g.nextPage() );} // power on 

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&amp;&amp; power==1){power=0;cl();times=millis();w1=1;w=1;mute=0;audio();digitalWrite(STANDBY_OUT,LOW);delay(300);menu=0;} // power off 
 
  
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition&gt;1){newPosition=1;}if(newPosition&lt;-1){newPosition=-1;}
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();}
 
   if(ir.value==UP){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &gt; 
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
   if(ir.value==DW){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &lt;
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
 
  if(w==1){w=0;
 // Serial.println(63-vol+balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,&quot;VOLUME&quot;);
  u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(95, 24);u8g.print(vol-8);
  for(int v_pos=0; v_pos&lt;(71-8)*1.3;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos&lt;(vol-8)*1.3;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos&lt;(71-8)*1.3;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BALL /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==1){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition&gt;1){newPosition=1;}if(newPosition&lt;-1){newPosition=-1;}
   balans=balans+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;ball_func();audio();}

   if(ir.value==UP){balans++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка &gt; 
   if(ir.value==DW){balans--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка &lt;
 
  if(w==1){w=0;
//  Serial.println(vol+balans);
//  Serial.println(vol-balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,&quot;BALANCE&quot;);
  u8g.setFont(u8g_font_profont29r); 
  if(balans&gt;=0){u8g.setPrintPos(112, 24);u8g.print(balans);u8g.drawStr(95,24,&quot;+&quot;);}
  else{u8g.setPrintPos(95, 24);u8g.print(balans);}

  for(int v_pos=0; v_pos&lt;(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  const int SCREEN_WIDTH = 84; 
  u8g.drawBox(43,18, 1, 9);// 0 dB
  if(balans &gt;= 0){for(int v_pos=0; v_pos&lt;(balans*4);v_pos+=4){u8g.drawBox(v_pos+48,18, 2, 9);}} 
  else{for(int v_pos=SCREEN_WIDTH-48; v_pos&gt;(SCREEN_WIDTH-(abs(balans)*4)-48); v_pos-=4){u8g.drawBox(v_pos,18, 2, 9);}}
  for(int v_pos=0; v_pos&lt;(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
  
   } while( u8g.nextPage() );
  }}
  

////////////// EEPROM /////////////////////////////////////////////////////////////////////  
  if(millis()-times&gt;5000 &amp;&amp; w1==1 &amp;&amp; power==0 &amp;&amp; mute==0){
     EEPROM.update(0,vol);EEPROM.update(3,balans+8);
     menu=0;w1=0;w=1;myEnc.write(0);}
  }

 
void to_Timer(){newPosition = myEnc.read()/4;} 
void audio(){
  rt.setLeft(vol-8+balans); // int 0...79 
  rt.setRight(vol-8-balans);// int 0...79
  rt.setMute(mute);  // int 0...1
}

void vol_func(){if(vol&gt;71){vol=71;}if(vol&lt;=8){vol=8;}} // int 0 ... int 79 
void ball_func(){if(balans&gt;8){balans=8;}if(balans&lt;=-8){balans=-8;}}
void cl(){ir.value=0;delay(200);} </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2026-01-04T10:48:27Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=723&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[TDA8425 + OLED 128x32]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=722&amp;action=new" />
			<summary type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/c07c38d98b7a963a9d69cac0dbf02185.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/c07c38d98b7a963a9d69cac0dbf02185.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/757dc857d69bfd965d9bed974888f543.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/757dc857d69bfd965d9bed974888f543.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/6ccf049697bc477775a1682a1fa4a8d6.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/6ccf049697bc477775a1682a1fa4a8d6.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/03068df51245af85557b796dca902ae7.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/03068df51245af85557b796dca902ae7.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/c437dbd9d40eeed7bc82d5cccd62b1de.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/c437dbd9d40eeed7bc82d5cccd62b1de.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/03a01820a12435ebe527034ba2f5bba8.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/03a01820a12435ebe527034ba2f5bba8.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/05baa7de0dbc8d9959bc680a09cd0e0c.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/05baa7de0dbc8d9959bc680a09cd0e0c.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/5ef886e5e5edba7e4f293b912e0bfca1.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/5ef886e5e5edba7e4f293b912e0bfca1.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/00c9efff332ec89a1e12b724bea5340d.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/00c9efff332ec89a1e12b724bea5340d.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2026/01/7d1dc5c895bf287654b6afdcea1a13ea.png" alt="http://forum.rcl-radio.ru/uploads/images/2026/01/7d1dc5c895bf287654b6afdcea1a13ea.png" /></span> </p><br /><div class="codebox"><pre><code>// энкодер
#define ENC_DT       9
#define ENC_CLK      8
#define ENC_SW       10

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

// кнопки управления
#define IN_BUTTON       2
#define POWER_BUTTON    3
#define MUTE_BUTTON     4

// выход управления standby
#define STANDBY_OUT     13

// коды кнопок ИК пульта
#define MENU      0x2FDB24D // button encoder
#define UP        0x2FDD02F // &gt;&gt;&gt;
#define DW        0x2FD32CD // &lt;&lt;&lt;
#define INPUT_IR  0x2FD6A95 // IN
#define POWER_IR  0x2FD00FF // POWER
#define MUTE_IR   0x2FDB04F // MUTE

#include &lt;Wire.h&gt; 
#include &lt;U8glib.h&gt;             // https://github.com/olikraus/u8glib/
#include &lt;Encoder.h&gt;            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
#include &lt;EEPROM.h&gt;
#include &lt;MsTimer2.h&gt;           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip       
#include &lt;boarddefs.h&gt;          // входит в состав библиотеки IRremote
#include &lt;IRremote.h&gt;           // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include &lt;TDA8425.h&gt;            // http://rcl-radio.ru/wp-content/uploads/2018/11/TDA8425.zip

 U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI 
 IRrecv irrecv(IR);
 Encoder myEnc(ENC_DT, ENC_CLK);
 decode_results ir; 
 TDA8425 tda;

 extern uint8_t SmallFont[],BigNumbers[];
 long times,oldPosition  = -999,newPosition;
 int vol,balans,bass,treb,in,menu;
 bool mute=0,gr1,gr2,w,w1,power=0;

 void setup(){
  Wire.begin();
  irrecv.enableIRIn();
  Serial.begin(9600);
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  pinMode(IN_BUTTON,INPUT_PULLUP);
  pinMode(POWER_BUTTON,INPUT_PULLUP);
  pinMode(MUTE_BUTTON,INPUT_PULLUP);
  pinMode(STANDBY_OUT,OUTPUT); 

 u8g.firstPage(); do {
  u8g.setFont(u8g_font_profont29r);u8g.drawStr(5,25,&quot;TDA8425&quot;); 
  }while( u8g.nextPage() );

  delay(300);
  digitalWrite(STANDBY_OUT,LOW);
  vol = EEPROM.read(0);bass = EEPROM.read(1);treb = EEPROM.read(2);balans = EEPROM.read(3)-4;in = EEPROM.read(4);
  audio(); 
 }

 void loop(){
  // IR ////////////////////////////////////////
  if ( irrecv.decode( &amp;ir )) {Serial.print(&quot;0x&quot;);Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  
  
 if(power==0){ 
 if(digitalRead(ENC_SW)==LOW || ir.value==MENU){menu++;cl();delay(200);times=millis();w1=1;w=1;if(menu&gt;3){menu=0;}} // меню

 if((digitalRead(IN_BUTTON)==LOW || ir.value==INPUT_IR) &amp;&amp; mute==0){in++;cl();times=millis();w1=1;w=1;if(in&gt;1){in=0;}audio();
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(0,25,&quot;INPUT&quot;);u8g.setPrintPos(95, 25);u8g.print(in+1);}while( u8g.nextPage() );delay(1000);} // input 

 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&amp;&amp; mute==0){mute=1;cl();times=millis();w1=1;w=1;audio();
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(25,25,&quot;MUTE&quot;);}while( u8g.nextPage() );delay(300);menu=100;} // mute on 

 if((digitalRead(MUTE_BUTTON)==LOW || ir.value==MUTE_IR)&amp;&amp; mute==1){mute=0;cl();times=millis();w1=1;w=1;audio();
 delay(300);menu=0;} // mute off 
 }

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&amp;&amp; power==0){power=1;cl();times=millis();w1=1;w=1;mute=1;audio();digitalWrite(STANDBY_OUT,HIGH);
 u8g.firstPage(); do {u8g.setFont(u8g_font_profont29r);u8g.drawStr(10,25,&quot;STANDBY&quot;);}while( u8g.nextPage() );delay(2000);menu=100;
 u8g.firstPage(); do {}while( u8g.nextPage() );} // power on 

 if((digitalRead(POWER_BUTTON)==LOW || ir.value==POWER_IR)&amp;&amp; power==1){power=0;cl();times=millis();w1=1;w=1;mute=0;audio();digitalWrite(STANDBY_OUT,LOW);delay(300);menu=0;} // power off 
 
  
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition&gt;1){newPosition=1;}if(newPosition&lt;-1){newPosition=-1;}
   vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;vol_func();audio();}
 
   if(ir.value==UP){vol++;gr1=1;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &gt; 
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &gt;&gt;&gt;&gt;&gt;&gt;
   if(ir.value==DW){vol--;gr1=0;gr2=1;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &lt;
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl();times=millis();w=1;w1=1;vol_func();audio();}// кнопка &lt;&lt;&lt;&lt;&lt;&lt;
 
  if(w==1){w=0;
 // Serial.println(63-vol+balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,&quot;VOLUME&quot;);
  u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(95, 24);u8g.print(vol-4);
  for(int v_pos=0; v_pos&lt;(59-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos&lt;(vol-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos&lt;(59-3)*1.5;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BASS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==1){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition&gt;1){newPosition=1;}if(newPosition&lt;-1){newPosition=-1;}
   bass=bass+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;bass_func();audio();}

   if(ir.value==UP){bass++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;bass_func();audio();}// кнопка &gt; 
   if(ir.value==DW){bass--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;bass_func();audio();}// кнопка &lt;
 
  if(w==1){w=0;

  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,&quot;BASS&quot;);
  u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(95, 24);u8g.print(bass-6);
  for(int v_pos=0; v_pos&lt;(11-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos&lt;(bass-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos&lt;(11-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// TREB /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==2){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition&gt;1){newPosition=1;}if(newPosition&lt;-1){newPosition=-1;}
   treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;treb_func();audio();}

   if(ir.value==UP){treb++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;treb_func();audio();}// кнопка &gt; 
   if(ir.value==DW){treb--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;treb_func();audio();}// кнопка &lt;
 
  if(w==1){w=0;

  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,&quot;TREBLE&quot;);
  u8g.setFont(u8g_font_profont29r); u8g.setPrintPos(95, 24);u8g.print(treb-6);
  for(int v_pos=0; v_pos&lt;(10-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  for(int v_pos=0; v_pos&lt;(treb-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,18, 2, 9);}
  for(int v_pos=0; v_pos&lt;(10-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
   } while( u8g.nextPage() );
  }}

///////// BALL /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if(menu==3){
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition&gt;1){newPosition=1;}if(newPosition&lt;-1){newPosition=-1;}
   balans=balans+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w1=1;ball_func();audio();}

   if(ir.value==UP){balans++;gr1=1;gr2=0;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка &gt; 
   if(ir.value==DW){balans--;gr1=0;gr2=1;ir.value=0;times=millis();w=1;w1=1;ball_func();audio();}// кнопка &lt;
 
  if(w==1){w=0;
 // Serial.println(63-vol+balans);
 // Serial.println(63-vol-balans);
  u8g.firstPage();  
   do {
  u8g.setFont(u8g_font_profont12r);u8g.drawStr(0,8,&quot;BALANCE&quot;);
  u8g.setFont(u8g_font_profont29r); 
  if(balans&gt;=0){u8g.setPrintPos(112, 24);u8g.print(balans);u8g.drawStr(95,24,&quot;+&quot;);}
  else{u8g.setPrintPos(95, 24);u8g.print(balans);}

  for(int v_pos=0; v_pos&lt;(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,16, 2, 1);}
  const int SCREEN_WIDTH = 84; 
  u8g.drawBox(43,18, 1, 9);// 0 dB
  if(balans &gt;= 0){for(int v_pos=0; v_pos&lt;(balans*8);v_pos+=4){u8g.drawBox(v_pos+48,18, 2, 9);}} 
  else{for(int v_pos=SCREEN_WIDTH-48; v_pos&gt;(SCREEN_WIDTH-(abs(balans)*8)-48); v_pos-=4){u8g.drawBox(v_pos,18, 2, 9);}}
  for(int v_pos=0; v_pos&lt;(12-1)*8;v_pos+=4){u8g.drawBox(v_pos+0,28, 2, 1);}
  
   } while( u8g.nextPage() );
  }}
  

////////////// EEPROM /////////////////////////////////////////////////////////////////////  
  if(millis()-times&gt;5000 &amp;&amp; w1==1 &amp;&amp; power==0 &amp;&amp; mute==0){
     EEPROM.update(0,vol);EEPROM.update(1,bass);EEPROM.update(2,treb);EEPROM.update(3,balans+4);EEPROM.update(4,in);
     menu=0;w1=0;w=1;myEnc.write(0);}
  }


  
void to_Timer(){newPosition = myEnc.read()/4;} 
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
 } 

void vol_func(){if(vol&gt;59){vol=59;}if(vol&lt;=4){vol=4;}} // int 0 = min ... int 63 = max + ballans 4 dB 
void bass_func(){if(bass&gt;11){bass=11;}if(bass&lt;2){bass=2;}} // int 6 = 0 dB | int 2 = -12 dB | int 11 = 15 dB
void treb_func(){if(treb&gt;10){treb=10;}if(treb&lt;2){treb=2;}} // int 6 = 0 dB | int 2 = -12 dB | int 10 = 12 dB
void ball_func(){if(balans&gt;4){balans=4;}if(balans&lt;=-4){balans=-4;}}
void cl(){ir.value=0;delay(200);} </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2026-01-04T06:40:52Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=722&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Терморегулятор на сдвиговых регистрах 74НС595]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=721&amp;action=new" />
			<summary type="html"><![CDATA[<p>На сайте <a href="http://rcl-radio.ru/?p=53543">http://rcl-radio.ru/?p=53543</a>&nbsp; &nbsp; прочитал ,там 74НС595,&nbsp; &nbsp;но&nbsp; у меня&nbsp; есть индикатор TM1637, вохиожна ли переделка. Есть&nbsp; на сайте схема&nbsp; на TM1637, но с энкодером, а мне нужна на кнопках. Пробывал фркенштеить программу, но ума и опыта&nbsp; не хватает. Если уважаемый&nbsp; автор&nbsp; &nbsp;liman28 сможет&nbsp; поправить&nbsp; прогу , то буду признателен.</p>]]></summary>
			<author>
				<name><![CDATA[Сергей из Сибири]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1632</uri>
			</author>
			<updated>2026-01-01T13:54:24Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=721&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[прошивка linux-ESP-01]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=720&amp;action=new" />
			<summary type="html"><![CDATA[<p>оказалось что все возможно<br />Не работает по двум причинам: изначально<br />где её брать саму прошивку, и команды, и ещё нет необходимых пакетов</p><p>Значит все по порядку, установить пакет<br /><span style="color: red"><strong>esptool</strong></span><br />Достаточно трудно , но вполне решаем.<br />Почему трудно, идет переделка пакета, меняются команда, но когда все установлено терминал сам подскажет что и где поменять))<br />сейчас не смогу точно отписать как сам это сделал, однако очень скоро вернусь и допишу как <br />по случаю система моя не стабильна и может сломаться тогда и вернусь. ))</p><p>проверка платы в режиме прошивки<br /><strong>esptool --port /dev/ttyUSB0 flash-id</strong></p><br /><p>Вывод этой команды в терминале два примера</p><p>okk@okk1:~$ esptool --port /dev/ttyUSB0 flash-id<br />esptool v5.1.0<br />Serial port /dev/ttyUSB0:</p><p><strong>A fatal error occurred: Could not open /dev/ttyUSB0, the port is busy or doesn&#039;t exist.<br />([Errno 16] could not open port /dev/ttyUSB0: [Errno 16] Device or resource busy: &#039;/dev/ttyUSB0&#039;)</strong><br />второй<br /><strong>okk@okk1:~$ esptool --port /dev/ttyUSB0 flash-id<br />esptool v5.1.0<br />Connected to ESP8266 on /dev/ttyUSB0:<br />Chip type:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ESP8266EX<br />Features:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Wi-Fi, 160MHz<br />Crystal frequency:&nbsp; 26MHz<br />MAC:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cc:50:e3:78:1f:70</strong></p><p><strong>Stub flasher running.</strong></p><p><strong>Flash Memory Information:<br />=========================<br />Manufacturer: 85<br />Device: 2014<br />Detected flash size: 1MB</strong></p><p><strong>Hard resetting via RTS pin...<br />okk@okk1:~$ </strong></p><p>Первый ошибка : плата не подключена по питанию<br />Вторая:<br />плата видна и её все настройки видны, Плата готова к прошивке.</p><p>Вторая часть где брать. ? ещё тот вопрос??<br />Оказалось на GitHub все есть но найти трудно, почему так.<br />Разные релизы разложены по веткам.<br />это последний релиз этой платы, <br /><a href="https://github.com/espressif/esp-at/releases/tag/v2.2.2.0_esp8266">https://github.com/espressif/esp-at/rel … .0_esp8266</a><br />а это основной<br /><a href="https://github.com/espressif/esp-at">https://github.com/espressif/esp-at</a><br />как выбрать релиз<br />место есть выбрать не мастер а ветка релиза, попробуйте по нажимать на ветки и будет понятно как и где искать))<br />для начала думаю достаточно</p><p>ещё ссылка в ней все платы, выбрать свою из главного её не видно, поэтому такие трудности<br /><a href="https://github.com/espressif/esp-at/releases/">https://github.com/espressif/esp-at/releases/</a></p><p>Вот то место где лежат все прошивки без GitHub напрямую<br /><a href="https://docs.espressif.com/projects/esp-at/en/release-v2.3.0.0_esp8266/AT_Binary_Lists/ESP8266_AT_binaries.html">https://docs.espressif.com/projects/esp … aries.html</a><br />Кто не читает иглиш переводчик гугла справится</p>]]></summary>
			<author>
				<name><![CDATA[Okruru]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3955</uri>
			</author>
			<updated>2025-12-18T17:58:07Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=720&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Arduino Микроконтроллеры (Измерить C)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=719&amp;action=new" />
			<summary type="html"><![CDATA[<p>переделал ваш код, как смог, это первая проба. Не все разобрал, но должен, далее справлюсь. <br /><a href="http://rcl-radio.ru/?p=43106">Arduino Микроконтроллеры</a><br />на LCD под включение на четыре ноги</p><div class="codebox"><pre><code> // взято отсюда ..h==://rcl-radio.ru/?p=43106

#include &lt;LiquidCrystal_I2C.h&gt;
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.init();           // инициализация
 // lcd.backlight();      // включить подсветку
}
unsigned long time0, time1, time2;
float c, null0;
byte kn, mk, i;

void loop() {
  lcd.setCursor(15, 0);
  lcd.print(&quot;*&quot;);
  if (mk == 0) {
    pinMode(13, OUTPUT);
    pinMode(3, INPUT);
    digitalWrite(13, HIGH);
  }

  if (mk == 1) {
    pinMode(3, OUTPUT);
    pinMode(13, INPUT);
    digitalWrite(3, HIGH);
  }

  time0 = micros();
  while (analogRead(A0) &lt; 644) {
    time2 = micros() - time0;
    if (time2 &gt;= 1000000 &amp;&amp; mk == 0) {
      mk = 1;
      time0 = 100000000;
      break;
    }
  }

  time1 = micros() - time0;

  while (analogRead(A0) &gt; 0) {
    pinMode(3, OUTPUT);
    pinMode(13, OUTPUT);
    digitalWrite(3, LOW);
    digitalWrite(13, LOW);
  }

  if (mk == 1 &amp;&amp; time1 &lt; 1000) {
    mk = 0;
  }

  lcd.setCursor(1, 0);
  c = time1;
  c = c / 1000 - null0;
  c = abs(c);

  if (time1 &gt;= 10000000) {
    lcd.setCursor(1, 0);
    lcd.print(&quot; TEST uF   &quot;);
  } else {                  // Вывод на LCD
    lcd.print(c);

    if (mk == 0) {
      lcd.print(&quot; nF       &quot;);
    }
    if (mk == 1) {
      lcd.print(&quot; uF       &quot;);
    }
  }
  if (i == 0) {              // калибровка нуля
    i++;
    null0 = c + 0.02;
  }
  delay(100);
} </code></pre></div><p>изменен и работает. Код выше с ошбками.<br /><a href="https://github.com/OKRUgit/MOI_chemi/blob/Okrugit/Condensator/">GitHub </a></p>]]></summary>
			<author>
				<name><![CDATA[Okruru]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3955</uri>
			</author>
			<updated>2025-11-16T18:53:02Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=719&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Дистанция для лодки ПВХ]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=718&amp;action=new" />
			<summary type="html"><![CDATA[<p>Возможно вы удивитесь подобному.<br />Всем доброго.<br />Идея такова, <br />Сам придумал отлиный привод для лодки ПВХ , возможно есть некие неточности, с поднятием мотора при стоянке, думаю и это можно подправить, при подходе к берегу привод одцеплать от мотора.<br />Это второй вопрос, главное пока управление.<br />&nbsp; &nbsp;Задача в несколько пунктов.<br />1) Подобные устройства стоят достаточно дорого, больше подходят лодкам больших размеров, однако на малых осуществимы. Достаточно к тросу управления прикрутить Ардуино, скажем через реде включения подачи напуги на мотор(движение в одну и обратную сторону) и управлять поворотом мотора. Питание или раздельно или общее, от батареи, скажем 12 в.<br />2) Так же при помощи серво-приводов управлять режимом работы самого мотора, увеличения и уменьшения подачи топлива.<br />3) Режим включения передачь( в моем случае их два) нейтоаль и ход в перед.<br />4) Дистанция: для начала вполне и проводная, для теста. Дальше прикурутить к Ардуине wifi модуль и при помощи связи через браузер(написать старничку для управления:(она небольшая и вполне возможная) и предевать по определенному АйПи адресу.</p><p>Что насегодня, <br />пока разробатываю нечто похожее на тахометр, для управления опережением зажигания(считываение оборотов с мотрора) и смещение опрежения зажигания.</p><p>С тахометром вопросов больше чем ответов. Например:<br /></p><div class="codebox"><pre><code>]#include &lt;DueTimer.h&gt;

const int RPM_PIN=3;
volatile int rpm                = 0;    // Тахометр
volatile int rpm_tik            = 0;    // Импуслы тахометра

void rpm_count(){
  rpm_tik++;
}

void SensorData(){
  rpm = rpm_tik;
  rpm_tik = 0;
}

void setup(){
   Serial.begin(9600);
   pinMode(RPM_PIN,INPUT);
   attachInterrupt(RPM_PIN,  rpm_count,  RISING);
   Timer3.attachInterrupt(SensorData);
   Timer3.start(1000000);
}

void loop(){
    Serial.println(rpm/2*60);
    delay(500);
}
на малых оборотах двигателя все соответствует истине. 
Но при увеличении оборотов показания начинают завышаться.
 Так при оборотах 5000-5500 (примерное значение, ибо прибор аналоговый) - 
 получаю значение 6600 и выше. В чем может быть проблема?

Заменил вызов прерывания на:

attachInterrupt(digitalPinToInterrupt(RPM_PIN), rpm_count,  RISING);
вместо

attachInterrupt(RPM_PIN, rpm_count,  RISING);
Все заработало правильно.</code></pre></div><p>Этот код взят для примера подобных, может быть и рабочим. Пока сам не во всем разобрался. Думаю время поможет, и вы тоже подскажите..если захотите.</p><p>Все свои пробы выкладяваю на <a href="https://github.com/OKRUgit/MOI_chemi">https://github.com/OKRUgit/MOI_chemi</a> там есть несколько примеров, И вполне можно их дополнять или исправлять он-лайн, <br />Если непонятно здесь так-же ничто меня не ограничит. Только правила форума, как на это посмотрит администрация форума, удобный вариан за админом..</p><p>Любой приму..</p>]]></summary>
			<author>
				<name><![CDATA[Okruru]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3955</uri>
			</author>
			<updated>2025-11-16T07:41:27Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=718&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Предложение! для форума.]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=716&amp;action=new" />
			<summary type="html"><![CDATA[<p>На всех форумах, почти на всех.<br />Доброго времени суток.<br />И вот: на которых бывал и не только, сидел прочно и долго. Нет главного раздела Эррор или error:</p><p>Предложение:<span class="bbu"> Сделать один раздел, который так и называетс</span>я<br /> (скажем <strong>Ошибки</strong> или <strong><em>Частые ошибки</em></strong>.)<br />Этих ошибок будет не привеликое множество, а именно типичные.</p><p>Конечно есть раздел <strong><em> Проблемы с загрузками скетча</em></strong>, только пусть и есть нечто подобное в нем. Даже так: в этом есть очень полезные, но не относящиеся к этму разделу вообще, не о них речь, о полезных, поди найди его где он, для самого, видел и пропустил.</p><p>Когда отрываешь список соответствия, не совсем ожидаемый. Некий список, тоько о чем каждый, надо просмотреть все, только в этом случае приходит понимание или ещё раз, или ни разу.<br />Вот и случится порядок. Есть раздел скажем, <strong>Мои скетчи</strong>, или <strong>Законченные проекты</strong></p><p>Собственно вот такое предложение. Спасибо, за такой форум и сайт!!!<br />ПС: у самого то в ПК такой непорядок, черт ногу сломит. .... </p><p>Есть, на сегодня отличная тема Git, она набирает обороты постоянно приходят ссылки а как им пользоваться, знают не многие, сам почти недавно постиг этот git, что хочеться сказать, отличная штука оказалась и очень удобная.<br />Представте: можно собрать воедино все скетчи и по случаю сразу их поправить и скачать с предпросмотром зипом и отправить назад для проверки.<br />Однако это целая тема. <br />Пс2: выдал . ... .</p>]]></summary>
			<author>
				<name><![CDATA[Okruru]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3955</uri>
			</author>
			<updated>2025-11-15T04:46:43Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=716&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[FM и ЧМ]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=715&amp;action=new" />
			<summary type="html"><![CDATA[<p>Я хотел тут предложить разработки, своей деятельности. С 1965 года. Но увидив что автор не понимает что такое FM&nbsp; и ЧМ. Думаю мне здесь не интересно. Адью. Всего вАМ ...</p>]]></summary>
			<author>
				<name><![CDATA[aqtar]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2400</uri>
			</author>
			<updated>2025-11-05T18:08:46Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=715&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[звуковой кодек и ардуино]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=711&amp;action=new" />
			<summary type="html"><![CDATA[<p>есть звуковой кодек alc 888&nbsp; 7 +1 канал , можно ли его использовать с ардуино</p>]]></summary>
			<author>
				<name><![CDATA[rewre]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3862</uri>
			</author>
			<updated>2025-09-05T09:38:39Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=711&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[tc9260]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=710&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=134035">http://rcl-radio.ru/?p=134035</a></p><div class="codebox"><pre><code>#define STB   2
#define DATA  3
#define CK   4

void setup() {
  Serial.begin(9600);
  pinMode(STB, OUTPUT);digitalWrite(STB, LOW);
  pinMode(DATA, OUTPUT);digitalWrite(DATA, LOW);
  pinMode(CK, OUTPUT);digitalWrite(CK, LOW);
  delay(100);
}

void loop() {
  byte_tc9260(1,0, 1, 0);
  byte_tc9260(0,1, 39, 0);
  delay(1000);Serial.println();
  }
  
  void byte_tc9260(bool lh, bool rh, int vol, bool ld){
    int vol_1 = ((vol&amp;0b100000)&gt;&gt;5)&lt;&lt;0|((vol&amp;0b010000)&gt;&gt;4)&lt;&lt;1|((vol&amp;0b001000)&gt;&gt;3)&lt;&lt;2|((vol&amp;0b000100)&gt;&gt;2)&lt;&lt;3|((vol&amp;0b000010)&gt;&gt;1)&lt;&lt;4|(vol&amp;0b000001)&lt;&lt;5;
    Serial.println(vol_1,BIN);
    unsigned long data_byte = (lh&lt;&lt;12)|(rh&lt;&lt;11)|(vol_1&lt;&lt;5)|(ld&lt;&lt;4)|0b1011;
    // vol 0...40
    // lh rh 0...1
    // ld 0...1
    writeByte(data_byte);  
    }


void writeByte(uint16_t data){
    digitalWrite(STB, LOW); delayMicroseconds(3);
    for (int i = 12; i &gt;= 0; i--) {
        digitalWrite(DATA, (data &gt;&gt; i) &amp; 1); delayMicroseconds(3);
        Serial.print((data &gt;&gt; i) &amp; 1);
        digitalWrite(CK, HIGH); delayMicroseconds(3);
        digitalWrite(CK, LOW); delayMicroseconds(3);
    }
    digitalWrite(STB, HIGH); delayMicroseconds(3);
    digitalWrite(STB, LOW); 
    Serial.println();
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-09-02T15:57:45Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=710&amp;action=new</id>
		</entry>
</feed>
