<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; Тестирование скетчей]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;fid=8&amp;type=atom" />
	<updated>2026-01-07T08:44:12Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/index.php</id>
		<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[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>
		<entry>
			<title type="html"><![CDATA[ESP32 генератор, регулировка частоты]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=705&amp;action=new" />
			<summary type="html"><![CDATA[<p>Пытаюсь менять частоту грнератора используя кнопк, но делаю чо то не так . Может кто то знает что делаю неправельно.<br /></p><div class="codebox"><pre><code>//https://www.i-programmer.info/programming/148-hardware/17804-programming-the-esp32-in-c-pwm-first-example.html?start=4#google_vignette
#include &lt;driver/ledc.h&gt;
int k;
//const int btn_inc = 16;
//const int btn_dec = 17;
const int maxFreq = 18000;
const int minFreq = 5000;
//unsigned long tim_btn_inc, tim_btn_dec;
//+++++++++++++++++++++++++++++++
// variables will change:
int freq = maxFreq;
int interval = 1; // variables will change:

void setup() {
  Serial.begin(115200);
  pinMode(32, INPUT_PULLUP);    //k++
  pinMode(33, INPUT_PULLUP);   //k--
  /*
    ledc_timer_config_t timerConfig = {
      .speed_mode = LEDC_LOW_SPEED_MODE,
      .duty_resolution = LEDC_TIMER_10_BIT,
      .timer_num = LEDC_TIMER_0,
      .freq_hz = 10000,              //+++++++++++++++++++++++++++++
      .clk_cfg = LEDC_AUTO_CLK
    };
    ledc_timer_config(&amp;timerConfig);
  */

  ledc_channel_config_t channelConfig1 = {
    .gpio_num = 12,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel = LEDC_CHANNEL_0,
    .timer_sel = LEDC_TIMER_0,
    .duty = 512,
    .hpoint = 0
  };
  ledc_channel_config(&amp;channelConfig1);


  ledc_channel_config_t channelConfig2 = {
    .gpio_num = 27,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel = LEDC_CHANNEL_1,
    .timer_sel = LEDC_TIMER_0,
    .duty = 512,
    .hpoint = 256
  };
  ledc_channel_config(&amp;channelConfig2);
}


void loop()
{
}

//++++++++++++
void frequencyChange()  //void somefunc()
// your variable here
{
  if (digitalRead(32) == LOW) {
    k++;
    if (k &gt; 18000) k = 18000;
   // Serial.println(k); //for debugging purposes
  }
  if (digitalRead(33) == LOW) {
    k--;
    if (k &lt; 5000) k = 5000;
   // Serial.println(k); //for debugging purposes
  }

  ledc_timer_config_t timerConfig = {
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .duty_resolution = LEDC_TIMER_10_BIT,
    .timer_num = LEDC_TIMER_0,
    .freq_hz = k,              //+++++++++++++++++++++++++++++
    .clk_cfg = LEDC_AUTO_CLK
  };
  ledc_timer_config(&amp;timerConfig);

  //+++++++++++++++++++++++++++++++
  Serial.print(&quot;  k3 =  &quot;);
  Serial.println(k);
  delay( 2 );
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[galina]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1049</uri>
			</author>
			<updated>2025-05-17T18:49:27Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=705&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ESP32-C3 TDA7719 TFT9341]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=704&amp;action=new" />
			<summary type="html"><![CDATA[<p>I tested the compilation and it worked. I uploaded it to the board, but there is no screenshot. I don&#039;t know where the problem is.</p><br /><div class="codebox"><pre><code>#include &lt;TFT_eSPI.h&gt; // Hardware-specific library
#include &lt;SPI.h&gt;
#include &lt;TDA7719.h&gt;
#include &lt;Encoder.h&gt;
#include &lt;EEPROM.h&gt;
//#include &lt;MsTimer2.h&gt;

//#define TFT_MOSI  PIN_D7  // 
//#define TFT_SCLK  PIN_D5  // 
//#define TFT_CS    PIN_D6  // Chip select control
//#define TFT_DC    PIN_D4  // Data Command control pin
//#define TFT_RST   PIN_D3

TDA7719 tda;
TFT_eSPI tft = TFT_eSPI();       // Invoke custom library
Encoder myEnc(10, 9);//CLK, DT encoder connection

int k=1,i,q=1,y=1,w1=1,w2=1,w3=1,w4=1,w5=1,w6=1,w7=1,w8=1,w9=1,w10=1,w11=1,w12=1,w13=1,w14=1,w15=1,w16=1,w17=1,w18=1,w19=1,w20=1,w21=1;
int v0=1,v1=1,v2=1,v3=1,v4=1,v5=1,v6=1,v7=1,v8=1,v9=1,v10=1,v11=1,v12=1,v13=1,v14=1,v15=1,v16=1,v17=1,v18=1,v19=1,v20=1;
int w=1,ccc,xxx=1,menu=0,menu_old,vol,in,in0,loun,loun_f,vol_att,treb,treb_f,mid,mid_q,bass,bass_q,sub_f,phase,mid_f,bass_f,att_lf,att_rf,att_lr,att_rr,att_l,att_r,vol0,vol1,vol2,vol3,vol4,vol5;
unsigned long newPosition,oldPosition  = -999,newPosition1,oldPosition1  = -999;

//byte power;
//long time0,times1;

// Rotary Encoder Inputs
 #define encoderCLK 10   //S3
 #define encoderDT 9   //S2
 #define encoderSW 16    //D0

void setup(void) {
   Serial.begin(9600);
  
   pinMode (encoderCLK,INPUT);
   pinMode (encoderDT,INPUT);
   pinMode (encoderSW, INPUT);

   vol = EEPROM.read(0)-79;treb = EEPROM.read(1)-15;treb_f = EEPROM.read(2);mid = EEPROM.read(3)-15;mid_f = EEPROM.read(4);bass = EEPROM.read(5)-15;bass_f = EEPROM.read(6);
   loun = EEPROM.read(7)-15;loun_f = EEPROM.read(8);att_lf=EEPROM.read(9)-30;att_rf=EEPROM.read(10)-30;att_lr=EEPROM.read(11)-30;att_rr=EEPROM.read(12)-30;
   att_l=EEPROM.read(13)-30;att_r=EEPROM.read(14)-30;sub_f=EEPROM.read(15);phase=EEPROM.read(16);bass_q=EEPROM.read(17);mid_q=EEPROM.read(18);
   in0=EEPROM.read(19);vol0=EEPROM.read(20)-15;vol1=EEPROM.read(21)-15;vol2=EEPROM.read(22)-15;vol3=EEPROM.read(23)-15;vol4=EEPROM.read(24)-15;inn();vol5=EEPROM.read(25)-15;inn();
   delay(300);audio();// we transfer all settings from memory to tda

  tft.begin();
  //tft.init();
  tft.setRotation(1);
  for(int i=0; i&lt;2; i++){                                                
    tft.drawLine(0+i,0+i,319-i*2,239-i*2,TFT_OLIVE);}      //draw the outer border (0+i,0+i,319-i*2,239-i*2)
    //tft.drawRFrame(10,10,299,219,8,TFT_OLIVE);             //draw an inner border with rounded corners

  tft.fillScreen(TFT_BLACK);
  tft.setTextSize(3);
  tft.setTextColor(TFT_YELLOW);
  tft.setCursor(35, 80);
  tft.print(&quot;AUDIO PROCEESOR&quot;);
  tft.setTextColor(TFT_GREEN);
  tft.setCursor(60, 120);
  tft.print(&quot;TONE CONTROL&quot;);
  tft.setCursor(120, 160);
  tft.print(&quot;HI-END&quot;);

}
void to_Timer(){newPosition = myEnc.read()/4;} // interrupt function
void loop() {
     if(digitalRead(encoderSW)==LOW){xxx++;myEnc.write(0);millis();delay(200);screen();k=1;if(xxx&gt;1){xxx=0;}}// encoder button activation analogRead
   tft.setTextSize(1);
   set_menu();
  /////////////////////////////////////////// processing encoder commands  
    if(menu==0&amp;&amp;xxx==1){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      vol=vol+newPosition;myEnc.write(0);newPosition=0;w=1;w1=1;if(vol&gt;0){vol=0;}if(vol&lt;-79){vol=-79;}audio();}}
    if(menu==1&amp;&amp;xxx==1){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      treb=treb+newPosition;myEnc.write(0);newPosition=0;w=1;w2=1;if(treb&gt;15){treb=15;}if(treb&lt;-15){treb=-15;}audio();}}
    if(menu==2&amp;&amp;xxx==1){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      mid=mid+newPosition;myEnc.write(0);newPosition=0;w=1;w3=1;if(mid&gt;15){mid=15;}if(mid&lt;-15){mid=-15;}audio();}}
    if(menu==3&amp;&amp;xxx==1){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      bass=bass+newPosition;myEnc.write(0);newPosition=0;w=1;w4=1;if(bass&gt;15){bass=15;}if(bass&lt;-15){bass=-15;}audio();}}
    if(menu==4&amp;&amp;xxx==1){
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      in0=in0+newPosition;myEnc.write(0);newPosition=0;w=1;w5=1;w6=1;if(in0&gt;5){in0=0;}if(in0&lt;0){in0=5;}
         inn();set_vol_att();audio();}}
         inn();set_vol_att();
    if(menu==5&amp;&amp;xxx==1){inn();
         set_vol_att();
      if (newPosition != oldPosition) {
      oldPosition = newPosition;
      vol_att=vol_att+newPosition;myEnc.write(0);newPosition=0;w=1;w6=1;w5=1;if(vol_att&lt;-15){vol_att=-15;}if(vol_att&gt;15){vol_att=15;}audio();}inn();  
      switch(in){case 0: vol0 = vol_att;break;case 1: vol1 = vol_att;break;case 2: vol2 = vol_att;break;case 4: vol5=vol_att;break;case 5: vol3 = vol_att;break;case 6: vol4 = vol_att;break;}}
    if(menu==6&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       att_lf=att_lf+newPosition;myEnc.write(0);newPosition=0;w=1;w7=1;if(att_lf&gt;0){att_lf=0;}if(att_lf&lt;-30){att_lf=-30;}audio();}}  
   if(menu==7&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       att_rf=att_rf+newPosition;myEnc.write(0);newPosition=0;w=1;w8=1;if(att_rf&gt;0){att_rf=0;}if(att_rf&lt;-30){att_rf=-30;}audio();}} 
   if(menu==8&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       att_lr=att_lr+newPosition;myEnc.write(0);newPosition=0;w=1;w9=1;if(att_lr&gt;0){att_lr=0;}if(att_lr&lt;-30){att_lr=-30;}audio();}}
   if(menu==9&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       att_rr=att_rr+newPosition;myEnc.write(0);newPosition=0;w=1;w10=1;if(att_rr&gt;0){att_rr=0;}if(att_rr&lt;-30){att_rr=-30;}audio();}}
   if(menu==10&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       att_l=att_l+newPosition;myEnc.write(0);newPosition=0;w=1;w11=1;if(att_l&gt;0){att_l=0;}if(att_l&lt;-30){att_l=-30;}audio();}}
   if(menu==11&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       att_r=att_r+newPosition;myEnc.write(0);newPosition=0;w=1;w12=1;if(att_r&gt;0){att_r=0;}if(att_r&lt;-30){att_r=-30;}audio();}}
   if(menu==12&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       loun_f=loun_f+newPosition;myEnc.write(0);newPosition=0;w=1;w13=1;if(loun_f&gt;3){loun_f=0;}if(loun_f&lt;0){loun_f=3;}audio();}} 
   if(menu==13&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       loun=loun+newPosition;myEnc.write(0);newPosition=0;w=1;w14=1;if(loun&gt;0){loun=0;}if(loun&lt;-15){loun=-15;}audio();}}
   if(menu==14&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       treb_f=treb_f+newPosition;myEnc.write(0);newPosition=0;w=1;w15=1;if(treb_f&gt;3){treb_f=0;}if(treb_f&lt;0){treb_f=3;}audio();}}
   if(menu==15&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       mid_f=mid_f+newPosition;myEnc.write(0);newPosition=0;w=1;w16=1;if(mid_f&gt;3){mid_f=0;}if(mid_f&lt;0){mid_f=3;}audio();}}
   if(menu==16&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       bass_f=bass_f+newPosition;myEnc.write(0);newPosition=0;w=1;w17=1;if(bass_f&gt;3){bass_f=0;}if(bass_f&lt;0){bass_f=3;}audio();}}
   if(menu==17&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       sub_f=sub_f+newPosition;myEnc.write(0);newPosition=0;w=1;w18=1;if(sub_f&gt;3){sub_f=0;}if(sub_f&lt;0){sub_f=3;}audio();}}
   if(menu==18&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       mid_q=mid_q+newPosition;myEnc.write(0);newPosition=0;w=1;w19=1;if(mid_q&gt;3){mid_q=0;}if(mid_q&lt;0){mid_q=3;}audio();}}
   if(menu==19&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       bass_q=bass_q+newPosition;myEnc.write(0);newPosition=0;w=1;w20=1;if(bass_q&gt;3){bass_q=0;}if(bass_q&lt;0){bass_q=3;}audio();}}
   if(menu==20&amp;&amp;xxx==1){
       if (newPosition != oldPosition) {
       oldPosition = newPosition;
       phase=phase+newPosition;myEnc.write(0);newPosition=0;w=1;w21=1;if(phase&gt;1){phase=0;}if(phase&lt;0){phase=1;}audio();}}

   set_menu();
    ///// Output of tda adjustment names
          if(v0==1){   if(menu==0) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(TFT_WHITE); // 0xf5,0xe0,0x12
                       else tft.setTextColor(TFT_BLUE);tft.setCursor(5,13);tft.print(&quot;VOLUME&quot;);tft.setCursor(290,13);tft.print(&quot;dB&quot;);  v0=0;}
          if(v1==1){   if(menu==1) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(TFT_WHITE);
                       else tft.setTextColor(TFT_YELLOW);tft.setCursor(5,30);tft.print(&quot;TREBLE&quot;);tft.setCursor(290,30);tft.print(&quot;dB&quot;); v1=0;}
          if(v2==1){   if(menu==2) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(TFT_WHITE);
                       else tft.setTextColor(TFT_GREEN);tft.setCursor(5,45);tft.print(&quot;MIDDLE&quot;);tft.setCursor(290,45);tft.print(&quot;dB&quot;);v2=0;}
          if(v3==1){   if(menu==3) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(TFT_WHITE);
                       else tft.setTextColor(TFT_RED);tft.setCursor(5,60);tft.print(&quot;BASS  &quot;);tft.setCursor(290,60);tft.print(&quot;dB&quot;);v3=0;}
          if(v4==1){   if(menu==4) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(255,255,255);
                       else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,75);tft.print(&quot;IN &quot;);v4=0;}
          if(v5==1){   if(menu==5) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(TFT_WHITE);
                       else tft.setTextColor(TFT_OLIVE);tft.setCursor(160,75);tft.print(&quot;ATT&quot;);tft.setCursor(290,75);tft.print(&quot;dB&quot;);v5=0;}
          if(v6==1){   if(menu==6) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(TFT_WHITE);
                       else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,90);tft.print(&quot;ATT LF&quot;);v6=0;}
          if(v7==1){   if(menu==7) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(255,255,255);
                       else tft.setTextColor(TFT_OLIVE);tft.setCursor(160,90);tft.print(&quot;ATT RF&quot;);v7=0;}
          if(v8==1){   if(menu==8) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(TFT_WHITE);
                       else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,105);tft.print(&quot;ATT LR&quot;);v8=0;}
          if(v9==1){   if(menu==9) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                       else tft.setTextColor(TFT_WHITE);
                       else tft.setTextColor(TFT_OLIVE);tft.setCursor(160,105);tft.print(&quot;ATT RR&quot;);v9=0;}
          if(v10==1){ if(menu==10) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,120);tft.print(&quot;ATT SL&quot;);v10=0;}
          if(v11==1){ if(menu==11) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(TFT_OLIVE);tft.setCursor(160,120);tft.print(&quot;ATT SR&quot;);v11=0;}
          if(v12==1){ if(menu==12) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,135);tft.print(&quot;LN&quot;);v12=0;}
          if(v13==1){ if(menu==13) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(TFT_OLIVE);tft.setCursor(180,135);tft.print(&quot;ATT&quot;);v13=0;}
          if(v14==1){ if(menu==14) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,150);tft.print(&quot;Treb CF&quot;);v14=0;}
          if(v15==1){ if(menu==15) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(128, 128, 0);tft.setCursor(5,165);tft.print(&quot;Midd CF&quot;);v15=0;}
          if(v16==1){ if(menu==16) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else{tft.setTextColor(TFT_OLIVE);}tft.setCursor(5,180);tft.print(&quot;Bass CF&quot;);v16=0;}
          if(v17==1){ if(menu==17) if(xxx==1)tft.setTextColor(0,165,255);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,195);tft.print(&quot;Subw CF&quot;);v17=0;}
          if(v18==1){ if(menu==18) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,210);tft.print(&quot;Midd QF&quot;);v18=0;}
          if(v19==1){ if(menu==19) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,225);tft.print(&quot;Bass QF&quot;);v19=0;}
          if(v20==1){ if(menu==20) if(xxx==1)tft.setTextColor(TFT_ORANGE);
                      else tft.setTextColor(TFT_WHITE);
                      else tft.setTextColor(TFT_OLIVE);tft.setCursor(5,240);tft.print(&quot;Phase Sub&quot;);v20=0;}
     set_menu();
///////////////////output of numerical values of parameters
  if(w1==1){tft.setTextColor(TFT_BLUE);tft.drawRect(100,1,100,12,TFT_BLUE); // x,y,w h // drawLine X1,Y1,X2,Y2
   //ucg.setColor(0,0,0);ucg.drawBox(100,1,80,12);
   tft.setTextColor(TFT_WHITE);tft.setCursor(230,15);tft.print(vol);w1=0;}
  if(w2==1){tft.setTextColor(TFT_YELLOW);tft.drawRect(100,16,100,12,TFT_YELLOW);   //ucg.setColor(150+treb*5,150+treb*4,0);ucg.drawLine(110,27,56+treb*4+109,17);
   //ucg.setColor(0,0,0);ucg.drawBox(67+treb*2+110,16,80+treb*2+110,12);
   tft.setTextColor(TFT_WHITE);tft.setCursor(230,30);tft.print(treb);tft.print(&quot; &quot;);w2=0;}
  if(w3==1){tft.setTextColor(TFT_GREEN);tft.drawRect(100,31,100,12,TFT_GREEN); ///ucg.setColor(0,150+mid*5,0);ucg.drawLine(110,42,56+mid*4+109,32);
   //ucg.setColor(0,0,0);ucg.drawLine(57+mid*4+109,42,80+mid*4+109,32);
   tft.setTextColor(TFT_WHITE);tft.setCursor(230,45);tft.print(mid);tft.print(&quot; &quot;);w3=0;}
  if(w4==1){tft.setTextColor(TFT_RED);tft.drawRect(100,46,100,12,TFT_RED); //ucg.setColor(150+bass*5,0,0);ucg.drawLine(110,57,56+bass*4+109,47);
   //ucg.setColor(0,0,0);ucg.drawLine(57+bass*5+109,57,80+bass*4+109,47);
   tft.setTextColor(TFT_WHITE);tft.setCursor(230,60);tft.print(bass);tft.print(&quot; &quot;);w4=0;}
  if(w5==1){tft.setTextColor(TFT_WHITE);  //myGLCD.printNumI(in0,60, 75,1);}
     switch(in0){
      case 0: tft.setCursor(50,75);tft.print(&quot;BT_IN&quot;);break;
      case 1: tft.setCursor(50,75);tft.print(&quot;CD_IN&quot;);break;
      case 2: tft.setCursor(50,75);tft.print(&quot;TV_IN&quot;);break;
      case 3: tft.setCursor(50,75);tft.print(&quot;PHONO&quot;);break;
      case 4: tft.setCursor(50,75);tft.print(&quot;AUX1 &quot;);break;
      case 5: tft.setCursor(50,75);tft.print(&quot;AUX2 &quot;);break;
     }
  }  
  if(w5==1||w6==1){tft.setTextColor(TFT_WHITE);tft.setCursor(225,75);tft.print(vol_att);tft.print(&quot; &quot;);w6=0;w5=0;}
  if(w7==1){tft.setTextColor(TFT_WHITE);tft.setCursor(100,90);tft.print(att_lf);tft.print(&quot; &quot;);w7=0;}
  if(w8==1){tft.setTextColor(TFT_WHITE);tft.setCursor(265,90);tft.print(att_rf);tft.print(&quot; &quot;);w8=0;}
  if(w9==1){tft.setTextColor(TFT_WHITE);tft.setCursor(100,105);tft.print(att_lr);tft.print(&quot; &quot;);w9=0;}
  if(w10==1){tft.setTextColor(TFT_WHITE);tft.setCursor(265,105);tft.print(att_rr);tft.print(&quot; &quot;);w10=0;}
  if(w11==1){tft.setTextColor(TFT_WHITE);tft.setCursor(100,120);tft.print(att_l);tft.print(&quot; &quot;);w11=0;}
  if(w12==1){tft.setTextColor(TFT_WHITE);tft.setCursor(265,120);tft.print(att_r);tft.print(&quot; &quot;);w12=0;}
  if(w13==1){tft.setTextColor(TFT_WHITE);
   switch(loun_f){case 0: tft.setCursor(50,135);tft.print(&quot; FLAT  &quot;);break;
                  case 1: tft.setCursor(50,135);tft.print(&quot;400 Hz &quot;);break;
                  case 2: tft.setCursor(50,135);tft.print(&quot;800 Hz &quot;);break;
                  case 3: tft.setCursor(50,135);tft.print(&quot;2.4 kHz&quot;);break;};w13=0;}
  if(w14==1){tft.setTextColor(TFT_WHITE);tft.setCursor(265,135);tft.print(loun);tft.print(&quot; &quot;);w14=0;}
  if(w15==1){tft.setTextColor(TFT_WHITE);
    switch(treb_f){case 0: tft.setCursor(210,150);tft.print(&quot;10.0 kHz&quot;);break;
                   case 1: tft.setCursor(210,150);tft.print(&quot;12.5 kHz&quot;);break;
                   case 2: tft.setCursor(210,150);tft.print(&quot;15.0 kHz&quot;);break;
                   case 3: tft.setCursor(210,150);tft.print(&quot;17.5 kHz&quot;);break;}w15=0;}
  if(w16==1){tft.setTextColor(TFT_WHITE);
    switch(mid_f){case 0: tft.setCursor(220,165);tft.print(&quot;0.5 kHz&quot;);break;
                  case 1: tft.setCursor(220,165);tft.print(&quot;1.0 kHz&quot;);break;
                  case 2: tft.setCursor(220,165);tft.print(&quot;1.5 kHz&quot;);break;
                  case 3: tft.setCursor(220,165);tft.print(&quot;2.5 kHz&quot;);break;}w16=0;}
  if(w17==1){tft.setTextColor(TFT_WHITE);
    switch(bass_f){case 0: tft.setCursor(220,180);tft.print(&quot; 60 Hz&quot;);break;
                   case 1: tft.setCursor(220,180);tft.print(&quot; 80 Hz&quot;);break;
                   case 2: tft.setCursor(220,180);tft.print(&quot;100 Hz&quot;);break;
                   case 3: tft.setCursor(220,180);tft.print(&quot;200 Hz&quot;);break;}w17=0;}
  if(w18==1){tft.setTextColor(TFT_WHITE);
    switch(sub_f){case 0: tft.setCursor(220,195);tft.print(&quot; FLAT  &quot;);break;
                  case 1: tft.setCursor(220,195);tft.print(&quot; 80 Hz &quot;);break;
                  case 2: tft.setCursor(220,195);tft.print(&quot;120 Hz&quot;);break;
                  case 3: tft.setCursor(220,195);tft.print(&quot;160 Hz&quot;);break;}w18=0;}
  if(w19==1){tft.setTextColor(TFT_WHITE);
    switch(mid_q){case 0: tft.setCursor(240,210);tft.print(&quot;0.5 &quot;);break;
                  case 1: tft.setCursor(240,210);tft.print(&quot;0.75&quot;);break;
                  case 2: tft.setCursor(240,210);tft.print(&quot;1.0 &quot;);break;
                  case 3: tft.setCursor(240,210);tft.print(&quot;1.25&quot;);break;}w19=0;}
  if(w20==1){tft.setTextColor(255,255,255);
    switch(bass_q){case 0: tft.setCursor(240,225);tft.print(&quot;1.0 &quot;);break;
                   case 1: tft.setCursor(240,225);tft.print(&quot;1.25&quot;);break;
                   case 2: tft.setCursor(240,225);tft.print(&quot;1.5 &quot;);break;
                   case 3: tft.setCursor(240,225);tft.print(&quot;2.0 &quot;);break;}w20=0;}
  if(w21==1){tft.setTextColor(TFT_WHITE);
    switch(phase){case 0: tft.setCursor(240,240);tft.print(&quot;180&quot;);break;
                 case 1: tft.setCursor(240,240);tft.print(&quot;  0&quot;);break;}w21=0;}

     ///////////////////// EEPROM /////////////////////////////////////////////
 if(millis()&gt;10000&amp;&amp;w==1){ inn();
     EEPROM.write(0,vol+79);EEPROM.write(1,treb+15);EEPROM.write(2,treb_f);EEPROM.write(3,mid+15);EEPROM.write(4,mid_f);EEPROM.write(5,bass+15);EEPROM.write(6,bass_f);
     EEPROM.write(7,loun+15);EEPROM.write(8,loun_f);EEPROM.write(9,att_lf+30);EEPROM.write(10,att_rf+30);EEPROM.write(11,att_lr+30);EEPROM.write(12,att_rr+30);
     EEPROM.write(13,att_l+30);EEPROM.write(14,att_r+30);EEPROM.write(15,sub_f);EEPROM.write(16,phase);EEPROM.write(17,bass_q);EEPROM.write(18,mid_q);
     EEPROM.write(18,mid_q);EEPROM.write(19,in0);EEPROM.write(20,vol0+15);EEPROM.write(21,vol1+15);EEPROM.write(22,vol2+15);EEPROM.write(23,vol3+15);EEPROM.write(24,vol4+15);
     EEPROM.write(25,vol5+15);
     w=0;menu=0;v0=1,v1=1,v2=1,v3=1,v4=1,v5=1,v6=1,v7=1,v8=1,v9=1,v10=1,v11=1,v12=1,v13=1,v14=1,v15=1,v16=1,v17=1,v18=1,v19=1,v20=1;y=0;xxx=1;
     }

}// loop
void screen(){ //////////// to save resources when changing when moving through parameters, update only the last two parameters
  switch(menu){
    case 0: v20=1;v0=1;v1=1; set_menu();break;
    case 1: v0=1;v1=1;v2=1; set_menu();break;
    case 2: v1=1;v2=1;v3=1; set_menu();break;
    case 3: v2=1;v3=1;v4=1; set_menu();break;
    case 4: v3=1;v4=1;v5=1; set_menu();break;
    case 5: v4=1;v5=1;v6=1; set_menu();break;
    case 6: v5=1;v6=1;v7=1; set_menu();break;
    case 7: v6=1;v7=1;v8=1; set_menu();break;
    case 8: v7=1;v8=1;v9=1; set_menu();break;
    case 9: v8=1;v9=1;v10=1; set_menu();break;
    case 10: v9=1;v10=1;v11=1; set_menu();break;
    case 11: v10=1;v11=1;v12=1; set_menu();break;
    case 12: v11=1;v12=1;v13=1; set_menu();break;
    case 13: v12=1;v13=1;v14=1; set_menu();break;
    case 14: v13=1;v14=1;v15=1; set_menu();break;
    case 15: v14=1;v15=1;v16=1; set_menu();break;
    case 16: v15=1;v16=1;v17=1; set_menu();break;
    case 17: v16=1;v17=1;v18=1; set_menu();break;
    case 18: v17=1;v18=1;v19=1; set_menu();break;
    case 19: v18=1;v19=1;v20=1; set_menu();break;
    case 20: v19=1;v20=1;v0=1; set_menu();break;
    }
  }
//////////////////// menu navigation function
 void set_menu(){if(xxx==0){newPosition1 = myEnc.read()/4;
      if (newPosition1 != oldPosition1) {
      oldPosition1 = newPosition1;
      menu=menu+newPosition1;myEnc.write(0);newPosition1=0;millis();w=1;screen();if(menu&gt;20){menu=0;}if(menu&lt;0){menu=20;}}}else{if(k==1);k=0;}
      }

void set_vol_att(){switch(in){case 0: vol_att = vol0;break;case 1: vol_att = vol1;break;case 2: vol_att = vol2;break;
                               case 4: vol_att = vol5;break;case 5: vol_att = vol3;break;case 6: vol_att = vol4;break;}}
void inn(){if(in0==3){in=6;}else{in=in0;}}

void audio(){
tda.setInput(in,1,1,2); // 0...7, 0...1, 0...1, 0...7
tda.setInput_2(0,0,1,1,1,1); // 0...7, 0...1, 0...1, 0...1, 0...1, 0...1 
tda.setMix_source(7,0); // 0...7, 0...-31
tda.setMix_cont(1,1,1,1,1,1,1,1); // all 0...1
tda.setMute(1,0,0,1,0,1,1); // 0...1, 0...1, 0...3, 0...1, 0...1, 0...1, 0...1
tda.setSoft_1(1,1,1,1,1,1,1,1); //all 0...1
tda.setSoft_2(1,1,1,1,0,3); // 0...1, 0...1, 0...1, 0...1, 0...2, 0...3
tda.setLoudness(loun,loun_f,1,1); // 0...-15, 0...3, 0...1, 0...1 
tda.setVol(vol_att,1,1); // -15...+15, 0...1, 0...1
tda.setTreble(treb,treb_f,1); // -15...+15, 0...3, 0...1
tda.setMiddle(mid,mid_q,1); // -15...+15, 0...3, 0...1
tda.setBass(bass,bass_q,1); // -15...+15, 0...3, 0...1
tda.setSMB(sub_f,phase,mid_f,bass_f,1); // 0...3, 0...1, 0...3, 0...3, 0...1
tda.setVol_LF(vol+att_lf,1); // 0...-79, 0...1
tda.setVol_RF(vol+att_rf,1); // 0...-79, 0...1
tda.setVol_LR(vol+att_lr,1); // 0...-79, 0...1
tda.setVol_RR(vol+att_rr,1); // 0...-79, 0...1
tda.setVol_SUB_L(vol+att_l,1); // 0...-79, 0...1
tda.setVol_SUB_R(vol+att_r,1); // 0...-79, 0...1
tda.setTest1(0,14,1,1); // 0...1, 0...15, 0...1, 0...1
tda.setTest2(0,1,1,3); // 0...1, 0...1, 0...1, 0...3
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[pued1970]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3346</uri>
			</author>
			<updated>2025-05-04T07:52:00Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=704&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Часы+будильник на П543 (ИЛЦ5-4/7М)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=696&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=133796">http://rcl-radio.ru/?p=133796</a></p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/03/72ec0f097f1224445d76c27e1a9c86fd.png" alt="http://forum.rcl-radio.ru/uploads/images/2025/03/72ec0f097f1224445d76c27e1a9c86fd.png" /></span> </p><p>Распиновка</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2025/03/83f80b566444da66a6317df5a7d0d53b.png" alt="http://forum.rcl-radio.ru/uploads/images/2025/03/83f80b566444da66a6317df5a7d0d53b.png" /></span></p><p>П543 (ИЛЦ5-4/7М) — четырёхразрядный люминесцентный индикатор, использующийся в электронных устройствах, таких как часы, будильники и таймеры. Его основу составляет технология катодолюминесценции, при которой нити накала, покрытые люминофором, светятся при прохождении электрического тока, образуя видимые цифры.</p><p>Достоинства:<br />Высокая яркость и контрастность изображения, обеспечивающие отличную читаемость даже в условиях недостаточного освещения.<br />Долговечность и устойчивость к механическим повреждениям благодаря прочному корпусу и технологии изготовления.<br />Универсальность применения: может отображать время (часы, минуты, секунды), дату и дни недели, а также отображает индикатор будильника и таймера.<br />Недостатки:<br />Высокое энергопотребление по сравнению с современными светодиодными и жидкокристаллическими дисплеями.<br />Необходимость использования высоковольтных источников питания, что усложняет конструкцию устройств.<br />Ограниченный угол обзора, особенно при взгляде сбоку.<br />Срок службы:<br />Средний срок службы П543 (ИЛЦ5-4/7М) составляет порядка 10–15 лет при нормальных условиях эксплуатации, однако это зависит от качества компонентов и условий использования.</p>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-03-27T12:12:13Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=696&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=693&amp;action=new" />
			<summary type="html"><![CDATA[<p><span class="attention-yellow"></span></p>]]></summary>
			<author>
				<name><![CDATA[vladbuharkin20]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2352</uri>
			</author>
			<updated>2025-02-06T12:19:24Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=693&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Объединение 2 скетчей в один]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=685&amp;action=new" />
			<summary type="html"><![CDATA[<p><span class="attention-yellow"></span> <br />Всем добрый день! В одно время сделал я для своего ПК,монитор ресурсов системы на дисплее lcd2004 и платы arduino nano(идея и код взяты с канала AlexGyver). А за монитор остановлена динамическая подсветка на адресной ленте и arduino nano(идея и код тоже взяты с канала AlexGyver). Вопрос в чем, для каждого элемента установлена своя ардуина, и для монитора ресурсов и для подсветки. Возможно ли объединить эти два кода в один и использовать одну ардуинку заместо двух?<br />Исходники каждого девайся и программы для пк приложу снизу.</p>]]></summary>
			<author>
				<name><![CDATA[vladbuharkin20]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2352</uri>
			</author>
			<updated>2024-12-18T18:36:21Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=685&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[attiny13 + 7-и сегм. 4-х разр. инд. на MAX7219]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=663&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=132443">http://rcl-radio.ru/?p=132443</a></p><p>тест</p><div class="codebox"><pre><code>// MAX7219
#define DIN PB0
#define CLK PB1
#define CS  PB2      

int ccc;

#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;

int main(void) {
   DDRB |=(1&lt;&lt;DIN)|(1&lt;&lt;CLK)|(1&lt;&lt;CS); 
   PORTB |=(1&lt;&lt;DIN)|(1&lt;&lt;CLK)|(1&lt;&lt;CS);
   WriteBit16(0x0F, 0);// тест выкл.
   WriteBit16(0x0C, 1);// вкл. индик.
   WriteBit16(0x0A, 2);// яркость
   WriteBit16(0x09, 0xFF);// дешифраторы вкл.
   WriteBit16(0x0B, 3);// кол-во разрядов         
 
while(1) { 
  ccc++;
  WriteBit16(1, ccc/1000%10);
  WriteBit16(2, ccc/100%10 + 0xF0);// запятая
  WriteBit16(3, ccc/10%10);
  WriteBit16(4, ccc%10);
  _delay_ms(1000);
  }
}

void WriteBit16(byte reg, byte data){  
     PORTB &amp;=~(1&lt;&lt;CLK);PORTB &amp;=~(1&lt;&lt;CS);
     for(int i = 7; i &gt;= 0; i--){
        if(((reg &gt;&gt; i) &amp; 1) == 1){PORTB |=(1&lt;&lt;DIN);}
         else{PORTB &amp;=~(1&lt;&lt;DIN);}
        PORTB |=(1&lt;&lt;CLK);PORTB &amp;=~(1&lt;&lt;CLK);
        }
     for(int i = 7; i &gt;= 0; i--){
        if(((data &gt;&gt; i) &amp; 1) == 1){PORTB |=(1&lt;&lt;DIN);}
         else{PORTB &amp;=~(1&lt;&lt;DIN);}
        PORTB |=(1&lt;&lt;CLK);PORTB &amp;=~(1&lt;&lt;CLK);
        }
     PORTB |=(1&lt;&lt;CS);PORTB &amp;=~(1&lt;&lt;CLK);PORTB &amp;=~(1&lt;&lt;DIN);
  }  </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-08-15T02:42:20Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=663&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[RFID-RC522]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=662&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=132410">http://rcl-radio.ru/?p=132410</a></p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/08/e4ad83c1838e16e5bd6c445ba473274c.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/08/e4ad83c1838e16e5bd6c445ba473274c.png" /></span> </p><br /><div class="codebox"><pre><code>#include &lt;SPI.h&gt;
#include &lt;MFRC522.h&gt;           // http://rcl-radio.ru/wp-content/uploads/2024/08/rfid-master.zip
#include &lt;EEPROM.h&gt;
#include &lt;Wire.h&gt; 
#include &lt;U8glib.h&gt;            // https://github.com/olikraus/u8glib/

U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
 
int x;
int uid[4];
int master_kart[4]{129,71,80,131}; 
int set,eeprom; 
unsigned long times,times_open,tim; 
bool open_,tim1; 

 
MFRC522 mfrc522(10,9); //(SS_PIN, RST_PIN)   
 
void setup() {
  Serial.begin(9600); 
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);  
  if(EEPROM.read(500)!=0){for(int i=0;i&lt;501;i++){EEPROM.update(i,0);}}              
  SPI.begin();              
  mfrc522.PCD_Init();      
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(7,OUTPUT);// zummer
  digitalWrite(7,HIGH);
}
 
void loop() {
// Чтение UID //////////////////////////////////////////////////////////////////////////////////
  if (mfrc522.PICC_IsNewCardPresent() &amp;&amp; mfrc522.PICC_ReadCardSerial()){delay(100);x=0; 
  
   for (int i = 0; i &lt; 4; i++) {
      uid[i] = mfrc522.uid.uidByte[i];
      if(uid[i]==master_kart[i]){
        x++;
      }}}
      else{cl();}
////////////////////////////////////////////////////////////////////////////////////////////////
      
//set ==0 read, set == 1 SAVE, set == 2 clear
   if(x==4 &amp;&amp; digitalRead(2)==LOW &amp;&amp; uid[0]!=0 &amp;&amp; set==0){set=1;ok();times=millis();cl();delay(2000);}
   if(x==4 &amp;&amp; digitalRead(3)==LOW &amp;&amp; uid[0]!=0 &amp;&amp; set==0){set=2;ok();times=millis();cl();delay(2000);}

   
  if(set&gt;0){
    if(digitalRead(2)==LOW){eeprom++;if(eeprom&gt;49){eeprom=49;}times=millis();delay(200);}
    if(digitalRead(3)==LOW){eeprom--;if(eeprom&lt;0){eeprom=0;}times=millis();delay(200);}
    }  
////////////////////////////////////////////////////////////////////////////////////////////////  
  if(uid[0]!=0 &amp;&amp; uid[1]!=0 &amp;&amp; uid[2]!=0 &amp;&amp; uid[3]!=0){
  Serial.print(&quot;UID: &quot;); 
  for(int i1=0;i1&lt;4;i1++){Serial.print(uid[i1]);Serial.print(&quot; &quot;);}Serial.println();}
////////////////////////////////////////////////////////////////////////////////////////////////

  u8g.firstPage();  
   do {
///////////////////////////////////////////////////////////////////////////// 
  if(set==1){
    u8g.setFont(u8g_font_profont17r);u8g.drawStr(0,12,&quot;SAVE UID&quot;);
    u8g.setFont(u8g_font_profont12r);
    u8g.drawLine(0, 17, 128, 17);
    u8g.drawStr(0,45,&quot;UID:&quot;);
    u8g.drawStr(0,30,&quot;Nomber:&quot;);u8g.setPrintPos(50, 30);u8g.print(eeprom);

    if(uid[0]!=0 &amp;&amp; uid[1]!=0 &amp;&amp; uid[2]!=0 &amp;&amp; uid[3]!=0){
      EEPROM.update(0+eeprom*4,uid[0]);
      EEPROM.update(1+eeprom*4,uid[1]);
      EEPROM.update(2+eeprom*4,uid[2]);
      EEPROM.update(3+eeprom*4,uid[3]);
      }
      
    u8g.setPrintPos(30, 45);u8g.print(EEPROM.read(0+eeprom*4));
    u8g.setPrintPos(55, 45);u8g.print(EEPROM.read(1+eeprom*4));
    u8g.setPrintPos(80, 45);u8g.print(EEPROM.read(2+eeprom*4));
    u8g.setPrintPos(105, 45);u8g.print(EEPROM.read(3+eeprom*4));
    }
////////////////////////////////////////////////////////////////////////////
  if(set==2){
    u8g.setFont(u8g_font_profont17r);u8g.drawStr(0,12,&quot;CLEAR UID&quot;);
    u8g.setFont(u8g_font_profont12r);
    u8g.drawLine(0, 17, 128, 17); 
    u8g.drawStr(0,45,&quot;UID:&quot;);
    u8g.drawStr(0,30,&quot;Number:&quot;);u8g.setPrintPos(50, 30);u8g.print(eeprom);

    if(uid[0]==master_kart[0]&amp;&amp;uid[1]==master_kart[1]&amp;&amp;uid[2]==master_kart[2]&amp;&amp;uid[3]==master_kart[3]){
      EEPROM.update(0+eeprom*4,0);
      EEPROM.update(1+eeprom*4,0);
      EEPROM.update(2+eeprom*4,0);
      EEPROM.update(3+eeprom*4,0);
      }

    u8g.setPrintPos(30, 45);u8g.print(EEPROM.read(0+eeprom*4));
    u8g.setPrintPos(55, 45);u8g.print(EEPROM.read(1+eeprom*4));
    u8g.setPrintPos(80, 45);u8g.print(EEPROM.read(2+eeprom*4));
    u8g.setPrintPos(105, 45);u8g.print(EEPROM.read(3+eeprom*4));
    }

//////////////////////////////////////////////////////////////////////////////  
  if(set==0){
  u8g.setFont(u8g_font_profont17r);   
  if(uid[0]!=0 &amp;&amp; uid[1]!=0 &amp;&amp; uid[2]!=0 &amp;&amp; uid[3]!=0&amp;&amp; millis()-times_open&gt;3000){
    for(int i=0;i&lt;50;i++){
     if(
      uid[0]==EEPROM.read(0+i*4)&amp;&amp;
      uid[1]==EEPROM.read(1+i*4)&amp;&amp;
      uid[2]==EEPROM.read(2+i*4)&amp;&amp;
      uid[3]==EEPROM.read(3+i*4))
      {open_=1;times_open=millis();tim=millis();break;}else{open_=0;times_open=millis();tim1=1;}
      }
    }
  }//set=0
  
  if(tim1==1){tim1=0;digitalWrite(7,LOW);delay(100);digitalWrite(7,HIGH);}
  
  if(open_==1 &amp;&amp; millis()-times_open&lt;3000){u8g.drawStr(40,30,&quot;OPEN&quot;);digitalWrite(4,HIGH);
  if(millis()-tim&lt;200){digitalWrite(7,LOW);}
  if(millis()-tim&gt;200){digitalWrite(7,HIGH);}
  if(millis()-tim&gt;400){tim=millis();}
  } else{digitalWrite(4,LOW);digitalWrite(7,HIGH);}
   
  if(open_==0 &amp;&amp; millis()-times_open&lt;3000){u8g.drawStr(35,30,&quot;ERROR&quot;);digitalWrite(5,HIGH);}
   else{digitalWrite(5,LOW);}
  
  } while( u8g.nextPage() );
 
 if(millis()-times&gt;20000){set=0;eeprom=0;}
}

void ok(){
    u8g.firstPage();  
   do {
    u8g.setFont(u8g_font_profont17r); 
    u8g.drawStr(55,30,&quot;OK&quot;);
  } while( u8g.nextPage() );
  }

void cl(){uid[0]=0;uid[1]=0;uid[2]=0;uid[3]=0;}  </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-08-12T09:46:52Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=662&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[DS18B20+ЖК-модуль HT1621, 2,4 дюйма (Arduino)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=656&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=132305">http://rcl-radio.ru/?p=132305</a></p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/07/26f5c52bd1f1845abf17e8158fae0b58.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/07/26f5c52bd1f1845abf17e8158fae0b58.png" /></span> </p><p><span class="postimg"><img src="http://rcl-radio.ru/wp-content/uploads/2024/06/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-%D0%BE%D1%82-2024-06-30-20-18-29.png" alt="http://rcl-radio.ru/wp-content/uploads/2024/06/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-%D0%BE%D1%82-2024-06-30-20-18-29.png" /></span></p><div class="codebox"><pre><code>#define LCD_CS    6
#define LCD_WR    7
#define LCD_DATA  8

#define UP  2
#define DW  3
#define SET 4

#define HT1621_BIAS                 0x52                    // 1/3duty 4com
#define HT1621_SYS_DIS              0x00                    // Turn off the oscillator system oscillator and LCD bias generator
#define HT1621_SYS_EN               0x02                    // Turn on the system oscillator
#define HT1621_LCD_OFF              0x04                    // Turn off LCD bias
#define HT1621_LCD_ON               0x06                    // Turn on the LCE bias
#define HT1621_XTAL                 0x28                    // external clock
#define HT1621_RC256                0x30                    // internal clock

#include &lt;EEPROM.h&gt;
#include &lt;OneWire.h&gt;        // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
OneWire  ds(11); // Вход датчика 18b20

unsigned long times;
int temp;

void setup() {
  pinMode(LCD_CS, OUTPUT);
  pinMode(LCD_WR, OUTPUT);
  pinMode(LCD_DATA, OUTPUT);
  pinMode(UP,INPUT_PULLUP);
  pinMode(DW,INPUT_PULLUP);
  pinMode(SET,INPUT_PULLUP);
  digitalWrite(LCD_CS,HIGH);
  digitalWrite(LCD_WR,HIGH);
  data_100(HT1621_SYS_EN); // Turn on the system oscillator
  data_100(HT1621_BIAS);   // BIAS 13 4 public ports
  data_100(HT1621_RC256);  // Use RC_256K system clock source, on-chip RC oscillator
  data_100(HT1621_LCD_ON);
  clear_lcd();
}

void loop(){
  if(millis()-times&gt;5000){temp=dsRead(0)*10;times=millis();}
  
  print_lcd(5, 10,false);
  print_lcd(4, temp/100%10,false);
  print_lcd(3, temp/10%10,false);
  print_lcd(2, temp%10,true);
  print_lcd(1, 12,false);
  print_lcd(0, 13,false);

  
  delay(200);
}

void print_lcd(byte raz, byte num, bool dp){
  switch(raz){
    case 0: raz=0;break;
    case 1: raz=2;break;
    case 2: raz=4;break;
    case 3: raz=6;break;
    case 4: raz=8;break;
    case 5: raz=10;break;
    }
  switch(num){
    case 0: data_101(raz,0b1110+dp);data_101(raz+1,0b1011);break;  // 0 
    case 1: data_101(raz,0b0110+dp);data_101(raz+1,0b0000);break;  // 1 
    case 2: data_101(raz,0b1100+dp);data_101(raz+1,0b0111);break;  // 2 
    case 3: data_101(raz,0b1110+dp);data_101(raz+1,0b0101);break;  // 3 
    case 4: data_101(raz,0b0110+dp);data_101(raz+1,0b1100);break;  // 4 
    case 5: data_101(raz,0b1010+dp);data_101(raz+1,0b1101);break;  // 5 
    case 6: data_101(raz,0b1010+dp);data_101(raz+1,0b1111);break;  // 6 
    case 7: data_101(raz,0b1110+dp);data_101(raz+1,0b0000);break;  // 7 
    case 8: data_101(raz,0b1110+dp);data_101(raz+1,0b1111);break;  // 8 
    case 9: data_101(raz,0b1110+dp);data_101(raz+1,0b1101);break;  // 9 
    case 10: data_101(raz,0);data_101(raz+1,0);break;  // пусто
    case 11: data_101(raz,0b0000);data_101(raz+1,0b0100);break;  // -
    case 12: data_101(raz,0b1100);data_101(raz+1,0b1100);break; // градус
    case 13: data_101(raz,0b1000);data_101(raz+1,0b1011);break; // C
    }
  }

void clear_lcd(){for(int a=0;a&lt;=32;a++){data_101(a,0);}}

void data_100(int data){
     digitalWrite(LCD_CS,LOW);
   for(int i = 2; i &gt;=0; i--){
     digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
     digitalWrite(LCD_DATA, (0b100 &gt;&gt; i) &amp; 1); 
     digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
     } 
   for(int i = 8; i &gt;=0; i--){
     digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
     digitalWrite(LCD_DATA, (data &gt;&gt; i) &amp; 1); 
     digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
     } 
     delayMicroseconds(10);digitalWrite(LCD_CS,HIGH);
     delayMicroseconds(10);digitalWrite(LCD_WR,LOW);
     delayMicroseconds(10);
  }

void data_101(int addr, int data){
     digitalWrite(LCD_CS,LOW);
   for(int i = 2; i &gt;=0; i--){
     digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
     digitalWrite(LCD_DATA, (0b101 &gt;&gt; i) &amp; 1); 
     digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
     } 
   for(int i = 5; i &gt;=0; i--){
     digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
     digitalWrite(LCD_DATA, (addr &gt;&gt; i) &amp; 1); 
     digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
     } 
   for(int i = 0; i &lt;=3; i++){
     digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
     digitalWrite(LCD_DATA, (data &gt;&gt; i) &amp; 1); 
     digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
     }   
     delayMicroseconds(10);digitalWrite(LCD_CS,HIGH);
     delayMicroseconds(10);digitalWrite(LCD_WR,LOW);
  } 

float dsRead(byte x) {
  byte data_[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  data_[0] = ds.read();// Чтение памяти byte low
  data_[1] = ds.read();// Чтение памяти byte high
  float value = ((data_[1] &lt;&lt; 8) | data_[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}   </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-07-01T13:19:00Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=656&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ТЕРМОПАРНЫЙ ПИД терморегулятор]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=638&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=131984">http://rcl-radio.ru/?p=131984</a></p><div class="codebox"><pre><code>#include &lt;Wire.h&gt; 
#include &lt;LiquidCrystal_I2C.h&gt;
#include &lt;EEPROM.h&gt;
#include &lt;OneWire.h&gt;           // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include &lt;Adafruit_ADS1015.h&gt;  // https://github.com/adafruit/Adafruit_ADS1X15/archive/master.zip
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
OneWire  ds(8); // Вход датчика 18b20
Adafruit_ADS1115 ads; 

int nagrev,set,up,dw,tip;
float t,temper,t_reg,kpp = 1,kii = 0,kdd = 0;
unsigned long times,times1,times2;
bool w,w1=1;
int16_t results;
float multiplier = 0.0078125F; 

//K
const float a[]{0,2.5173462*10,-1.1662878,-1.08336338,-8.9773540/10,-3.7342377/10,-8.6632643/100,-1.0450598/100,-5.1920577/10000};
const float a1[]{0,2.508355*10,7.860106/100,-2.503131/10,8.315270/100,-1.228034/100,9.804036/10000,-4.413030/100000,1.057734/1000000,-1.052755*pow(10,-8)};
const float a2[]{-1.318058*100,4.830222*10,-1.646031,5.464731/100,-9.6550715/10000,8.802193/1000000,-3.110810/100000000};
//L
const float b[]{1.1573067/10000,1.5884573*10,4.0458554/100,0.3170064,0.1666128,5.146958/100,9.5288883/1000,1.0301283/1000,6.0654431/100000,1.5131878/1000000};
const float b1[]{7.2069422/1000,1.5775525*10,-0.2261183,9.4286756/1000,-3.5394655/10000,1.0050886/100000,-1.9323678/10000000,2.3816891/1000000000,-1.7130654*pow(10,-11),5.4857331*pow(10,-14)};
//S
const float c[]={0,1.84949460*100,-8.00504062*10,1.02237430*100,-1.52248592*100,1.88821343*100,-1.59085941*100,8.23027880*10,-2.34181944*10,2.79786260};
const float c1[]={1.291507177*10,1.466298863*100,-1.534713402*10,3.145945973,-4.163257839/10,3.187963771/100,-1.291637500/1000,2.183475087/100000,-1.447379511/10000000,8.211272125/1000000000};
const float c2[]={-8.087801117*10,1.621573104*100,-8.536869453,4.719686976/10,-1.441693666/100,2.081618890/10000};
const float c3[]={5.333875126*10000,-1.235892298*10000,1.092657613*1000,-4.265693686*10,6.247205420/10};


void setup() {
  lcd.init();lcd.backlight();lcd.clear();
  Serial.begin(9600);
  ads.setGain(GAIN_SIXTEEN); 
  ads.begin();
  pinMode(9,OUTPUT);
  cli();TCCR1A = 0;TCCR1B = 0;TCNT1 = 0;
  TCCR1A = 1 &lt;&lt; COM1A1 |1 &lt;&lt; WGM11;
  TCCR1B = 1 &lt;&lt; WGM13 |1 &lt;&lt; WGM12 |1 &lt;&lt; CS12 | 1 &lt;&lt; CS10;
  TIMSK1 |= (1 &lt;&lt; OCIE1A);
  ICR1 = 10240; 
  OCR1A = 0; sei();
  pinMode(2,INPUT_PULLUP);// UP
  pinMode(3,INPUT_PULLUP);// DW
  pinMode(4,INPUT_PULLUP);// SET
  pinMode(5,INPUT_PULLUP);// TIP
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}
  EEPROM.get(1, t_reg);
  tip=EEPROM.read(30);
  kpp = EEPROM.read(0);if(kpp==0){kpp=1;}
  EEPROM.get(10, kii);
  EEPROM.get(20, kdd);
  temper = dsRead(0);
  delay(200);
}

void loop() {
  if(digitalRead(5)==LOW){tip++;if(tip&gt;2){tip=0;}w=1;w1=1;times1=millis();}
  if(digitalRead(4)==LOW){set++;if(set&gt;3){set=0;}w1=1;}
  if(digitalRead(2)==LOW &amp;&amp; set==0){if(up&gt;10){t_reg+=5;}else{t_reg++;}up++;w=1;w1=1;times1=millis();}
  if(digitalRead(3)==LOW &amp;&amp; set==0){if(dw&gt;10){t_reg-=5;}else{t_reg--;}dw++;w=1;w1=1;times1=millis();}
  if(digitalRead(2)==HIGH){up=0;}if(digitalRead(3)==HIGH){dw=0;}
  if(tip==0 &amp;&amp; t_reg&lt;0){t_reg=0;}if(tip==0 &amp;&amp; t_reg&gt;1372){t_reg=1372;}
  if(tip==1 &amp;&amp; t_reg&lt;0){t_reg=0;}if(tip==1 &amp;&amp; t_reg&gt;800){t_reg=800;}
  if(tip==2 &amp;&amp; t_reg&lt;0){t_reg=0;}if(tip==2 &amp;&amp; t_reg&gt;1768){t_reg=1768;}

  if(digitalRead(2)==LOW &amp;&amp; set==1){kpp++;;w=1;w1=1;times1=millis();}
  if(digitalRead(3)==LOW &amp;&amp; set==1){kpp--;if(kpp&lt;1){kpp=1;};w1=1;w=1;times1=millis();}

  if(digitalRead(2)==LOW &amp;&amp; set==2){kii+=0.01;;w=1;w1=1;times1=millis();}
  if(digitalRead(3)==LOW &amp;&amp; set==2){kii-=0.01;if(kii&lt;0){kii=0;};w=1;w1=1;times1=millis();}
  
  if(digitalRead(2)==LOW &amp;&amp; set==3){kdd++;;w=1;w1=1;times1=millis();}
  if(digitalRead(3)==LOW &amp;&amp; set==3){kdd--;if(kdd&lt;0){kdd=0;};w=1;w1=1;times1=millis();}
  
  if(w1==1){w1=0;
  results = ads.readADC_Differential_0_1();
  temper = dsRead(0); delay(100);
  lcd.setCursor(0, 0);
  if(t==10000){lcd.print(&quot;  HIGH  &quot;);}
  else if(t==-1000){lcd.print(&quot;  LOW   &quot;);}
  else{lcd.print(&quot;T=&quot;);lcd.print(t,0);lcd.print((char)223);lcd.print(&quot;C  &quot;);}
  lcd.setCursor(10, 0);lcd.print(&quot;P=&quot;);lcd.print(100.00/512.00*float(nagrev),0);lcd.print(&quot;%  &quot;);
  lcd.setCursor(0, 1);lcd.print(&quot;t=&quot;);lcd.print(t_reg,0);lcd.print((char)223);lcd.print(&quot;C  &quot;);  
  
  lcd.setCursor(9, 1);
  if(set==0){ 
    switch(tip){
    case 0: lcd.print(&quot; type K&quot;);break;
    case 1: lcd.print(&quot; type L&quot;);break;
    case 2: lcd.print(&quot; type S&quot;);break;
    }}
  if(set==1){lcd.print(&quot;kp=&quot;);lcd.print(kpp,0);lcd.print(&quot;   &quot;);}
  if(set==2){lcd.print(&quot;ki=&quot;);lcd.print(kii,2);lcd.print(&quot;   &quot;);}
  if(set==3){lcd.print(&quot;kd=&quot;);lcd.print(kdd,0);lcd.print(&quot;   &quot;);}
  }
  if(millis()-times1&gt;10000 &amp;&amp; w==1){w=0;EEPROM.update(0,kpp);EEPROM.put(1, t_reg);EEPROM.update(30,tip);EEPROM.put(10, kii);EEPROM.put(20, kdd);
  lcd.setCursor(9, 1);lcd.print(&quot;  SAVE  &quot;);delay(300);
  }
}

ISR(TIMER1_COMPA_vect){w1=1;delay(50);
  switch(tip){
    case 0: txa();break;
    case 1: txk();break;
    case 2: tpp_s();break;
    }
    nagrev = computePID(t, t_reg, kpp, kii, kdd, 0.6, 0, 511);
    OCR1A = nagrev*20;
    
    }

void txk(){float u=results * multiplier+temper*0.06555;// окружающая температура 0.06555 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXK(L)
if(u&lt;0){t=(b[0]*pow(u,0))+(b[1]*pow(u,1))+(b[2]*pow(u,2))+(b[3]*pow(u,3))+(b[4]*pow(u,4))+(b[5]*pow(u,5))+(b[6]*pow(u,6))+(b[7]*pow(u,7))+(b[8]*pow(u,8))+(b[9]*pow(u,9));}
if(u&gt;=0){t=(b1[0]*pow(u,0))+(b1[1]*pow(u,1))+(b1[2]*pow(u,2))+(b1[3]*pow(u,3))+(b1[4]*pow(u,4))+(b1[5]*pow(u,5))+(b1[6]*pow(u,6))+(b1[7]*pow(u,7))+(b1[8]*pow(u,8))+(b1[9]*pow(u,9));}
if(results * multiplier&lt;-9.49){t=-1000;} if(results * multiplier&gt;66.47){t=10000;}
}  

void txa(){float u=results * multiplier+temper*0.0403;// окружающая температура 0.0403 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXA(K)
if(u&lt;0){t=(a[0]*pow(u,0))+(a[1]*pow(u,1))+(a[2]*pow(u,2))+(a[3]*pow(u,3))+(a[4]*pow(u,4))+(a[5]*pow(u,5))+(a[6]*pow(u,6))+(a[7]*pow(u,7))+(a[8]*pow(u,8));}
if(u&gt;=0&amp;&amp;u&lt;=20.64){t=(a1[0]*pow(u,0))+(a1[1]*pow(u,1))+(a1[2]*pow(u,2))+(a1[3]*pow(u,3))+(a1[4]*pow(u,4))+(a1[5]*pow(u,5))+(a1[6]*pow(u,6))+(a1[7]*pow(u,7))+(a1[8]*pow(u,8))+(a1[9]*pow(u,9));}
if(u&gt;20.64){t=(a2[0]*pow(u,0))+(a2[1]*pow(u,1))+(a2[2]*pow(u,2))+(a2[3]*pow(u,3))+(a2[4]*pow(u,4))+(a2[5]*pow(u,5))+(a2[6]*pow(u,6));}
if(results * multiplier&lt;-6.35){t=-1000;} if(results * multiplier&gt;54.9){t=10000;}
}

void tpp_s(){float u=results * multiplier+temper*0.005875;// окружающая температура 0.005875 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TPPs(S)
if(u&lt;1.874){t=(c[0]*pow(u,0))+(c[1]*pow(u,1))+(c[2]*pow(u,2))+(c[3]*pow(u,3))+(c[4]*pow(u,4))+(c[5]*pow(u,5))+(c[6]*pow(u,6))+(c[7]*pow(u,7))+(c[8]*pow(u,8))+(c[9]*pow(u,9));}
if(u&gt;=1.874&amp;&amp;u&lt;10.332){t=(c1[0]*pow(u,0))+(c1[1]*pow(u,1))+(c1[2]*pow(u,2))+(c1[3]*pow(u,3))+(c1[4]*pow(u,4))+(c1[5]*pow(u,5))+(c1[6]*pow(u,6))+(c1[7]*pow(u,7))+(c1[8]*pow(u,8))+(c1[9]*pow(u,9));}
if(u&gt;=10.332&amp;&amp;u&lt;17.536){t=(c2[0]*pow(u,0))+(c2[1]*pow(u,1))+(c2[2]*pow(u,2))+(c2[3]*pow(u,3))+(c2[4]*pow(u,4))+(c2[5]*pow(u,5));}
if(u&gt;=17.536&amp;&amp;u&lt;=18.694){t=(c3[0]*pow(u,0))+(c3[1]*pow(u,1))+(c3[2]*pow(u,2))+(c3[3]*pow(u,3))+(c3[4]*pow(u,4));}
if(results * multiplier&lt;-0.236){t=-1000;}  if(results * multiplier&gt;18.70){t=10000;}
}


int computePID(float currentpoint, float setpoint, float kp, float ki, float kd, float dt, int minOut, int maxOut) {
  static float last_error;
  float P;
  float D;
  static float I;
  long PID;
  P = (setpoint - currentpoint);
  I = (I + (setpoint - currentpoint) * dt);
  D = (((setpoint - currentpoint) - last_error) / dt);
  if(I&gt;511){I=511;}if(I&lt;-511){I=-511;}
  last_error = setpoint - currentpoint;
  PID = (kp * P) + (ki * I) + (kd * D);
  return constrain(PID, minOut, maxOut);
}

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  data[0] = ds.read();// Чтение памяти byte low
  data[1] = ds.read();// Чтение памяти byte high
  float value = ((data[1] &lt;&lt; 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-05-14T06:13:52Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=638&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=636&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=131968">http://rcl-radio.ru/?p=131968</a></p><div class="codebox"><pre><code>#include &lt;Wire.h&gt; 
#include &lt;LiquidCrystal_I2C.h&gt;
#include &lt;EEPROM.h&gt;
#include &lt;OneWire.h&gt;        // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
OneWire  ds(8); // Вход датчика 18b20

int nagrev,set,up,dw;
float temper,t,kpp = 1,kii = 0,kdd = 0;
unsigned long times,times1;
bool w;

void setup() {
  lcd.init();lcd.backlight();lcd.clear();
  Serial.begin(9600);
  pinMode(9,OUTPUT);
  cli();TCCR1A = 0;TCCR1B = 0;TCNT1 = 0;
  TCCR1A = 1 &lt;&lt; COM1A1 |1 &lt;&lt; WGM11;
  TCCR1B = 1 &lt;&lt; WGM13 |1 &lt;&lt; WGM12 |1 &lt;&lt; CS12 | 1 &lt;&lt; CS10;
  TIMSK1 |= (1 &lt;&lt; OCIE1A);
  ICR1 = 5120; 
  OCR1A = 0; sei();
  pinMode(2,INPUT_PULLUP);// UP
  pinMode(3,INPUT_PULLUP);// DW
  pinMode(4,INPUT_PULLUP);// SET
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}
  t=EEPROM.read(1);
  kpp = EEPROM.read(0);if(kpp==0){kpp=1;}
  EEPROM.get(10, kii);
  EEPROM.get(20, kdd);
  delay(200);
}

void loop() {
  if(digitalRead(4)==LOW){set++;if(set&gt;3){set=0;}}
  if(digitalRead(2)==LOW &amp;&amp; set==0){if(up&gt;10){t+=5;}else{t++;}up++;w=1;times1=millis();}
  if(digitalRead(3)==LOW &amp;&amp; set==0){if(dw&gt;10){t-=5;}else{t--;}dw++;w=1;times1=millis();}
  if(digitalRead(2)==HIGH){up=0;}if(digitalRead(3)==HIGH){dw=0;}
  if(t&lt;0){t=0;}if(t&gt;100){t=100;}

  if(digitalRead(2)==LOW &amp;&amp; set==1){kpp++;;w=1;times1=millis();}
  if(digitalRead(3)==LOW &amp;&amp; set==1){kpp--;if(kpp&lt;1){kpp=1;};w=1;times1=millis();}

  if(digitalRead(2)==LOW &amp;&amp; set==2){kii+=0.01;;w=1;times1=millis();}
  if(digitalRead(3)==LOW &amp;&amp; set==2){kii-=0.01;if(kii&lt;0){kii=0;};w=1;times1=millis();}
  
  if(digitalRead(2)==LOW &amp;&amp; set==3){kdd++;;w=1;times1=millis();}
  if(digitalRead(3)==LOW &amp;&amp; set==3){kdd--;if(kdd&lt;0){kdd=0;};w=1;times1=millis();}
  
  delay(50);// период измерения dt
  
  lcd.setCursor(0, 0);lcd.print(&quot;T=&quot;);
  lcd.print(temper,1);lcd.print((char)223);lcd.print(&quot;C  &quot;);
  lcd.setCursor(10, 0);lcd.print(&quot;P=&quot;);lcd.print(100.00/512.00*float(nagrev),0);;lcd.print(&quot;%  &quot;);
  lcd.setCursor(0, 1);lcd.print(&quot;t=&quot;);lcd.print(t,0);lcd.print((char)223);lcd.print(&quot;C  &quot;);  
  
  lcd.setCursor(8, 1);
  if(set==0){lcd.print(&quot;  PID    &quot;);}
  if(set==1){lcd.print(&quot;kp=&quot;);lcd.print(kpp,0);lcd.print(&quot;   &quot;);}
  if(set==2){lcd.print(&quot;ki=&quot;);lcd.print(kii,2);lcd.print(&quot;   &quot;);}
  if(set==3){lcd.print(&quot;kd=&quot;);lcd.print(kdd,0);lcd.print(&quot;   &quot;);}

  if(millis()-times1&gt;10000 &amp;&amp; w==1){w=0;EEPROM.update(0,kpp);EEPROM.update(1,t);EEPROM.put(10, kii);EEPROM.put(20, kdd);
  lcd.setCursor(8, 1);lcd.print(&quot;   SAVE   &quot;);delay(300);
  }
}

ISR(TIMER1_COMPA_vect){
  _delay_ms(50);temper = dsRead(0);_delay_ms(50);
  nagrev = computePID(temper, t, kpp, kii, kdd, 0.3, 0, 512);
  OCR1A = nagrev*10;   
  }

int computePID(float currentpoint, float setpoint, float kp, float ki, float kd, float dt, int minOut, int maxOut) {
  static float last_error;
  float P;
  float D;
  static float I;
  signed int PID;
  P = (setpoint - currentpoint);
  I = (I + (setpoint - currentpoint) * dt);
  if(I&gt;511){I=511;}if(I&lt;-511){I=-511;}
  D = (((setpoint - currentpoint) - last_error) / dt);
  last_error = setpoint - currentpoint;
  PID = (kp * P) + (ki * I) + (kd * D);
  return constrain(PID, minOut, maxOut);
}

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  data[0] = ds.read();// Чтение памяти byte low
  data[1] = ds.read();// Чтение памяти byte high
  float value = ((data[1] &lt;&lt; 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-05-08T07:05:52Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=636&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[2-х канальный ТЕРМОРЕГУЛЯТОР ТЕРМОПАРНЫЙ ТИПА ХА ХК ППs НА ADS1115]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=632&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=131915">http://rcl-radio.ru/?p=131915</a></p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/04/749fd70fa8059e93dfcf90bcbf0c3278.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/04/749fd70fa8059e93dfcf90bcbf0c3278.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/04/35f50ce3549e4319ae592649459f73cf.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/04/35f50ce3549e4319ae592649459f73cf.png" /></span> </p><br /><div class="codebox"><pre><code>#define GIS 1.0

#include &lt;Wire.h&gt; 
#include &lt;Adafruit_ADS1015.h&gt;  // https://github.com/adafruit/Adafruit_ADS1X15/archive/master.zip
#include &lt;LiquidCrystal_I2C.h&gt;
#include &lt;LM75.h&gt;  //  https://github.com/thefekete/LM75.git
#include &lt;EEPROM.h&gt;
LiquidCrystal_I2C lcd(0x27,16,2); 
Adafruit_ADS1115 ads; 
LM75 sensor(LM75_ADDRESS | 0b111);  // if A0-&gt;Vcc, A1-&gt;Vcc and A2-&gt;Vcc

 int16_t results_0,results_1;
 float multiplier = 0.0078125F; 
 float t,u,t_iz,t_reg_0,t_reg_1,t_0,t_1;
 unsigned long times,times0;
 bool w,w1,kanal;
 int tip_0,tip_1,up_0,dw_0,up_1,dw_1;

//K
const float a[]{0,2.5173462*10,-1.1662878,-1.08336338,-8.9773540/10,-3.7342377/10,-8.6632643/100,-1.0450598/100,-5.1920577/10000};
const float a1[]{0,2.508355*10,7.860106/100,-2.503131/10,8.315270/100,-1.228034/100,9.804036/10000,-4.413030/100000,1.057734/1000000,-1.052755*pow(10,-8)};
const float a2[]{-1.318058*100,4.830222*10,-1.646031,5.464731/100,-9.6550715/10000,8.802193/1000000,-3.110810/100000000};
//L
const float b[]{1.1573067/10000,1.5884573*10,4.0458554/100,0.3170064,0.1666128,5.146958/100,9.5288883/1000,1.0301283/1000,6.0654431/100000,1.5131878/1000000};
const float b1[]{7.2069422/1000,1.5775525*10,-0.2261183,9.4286756/1000,-3.5394655/10000,1.0050886/100000,-1.9323678/10000000,2.3816891/1000000000,-1.7130654*pow(10,-11),5.4857331*pow(10,-14)};
//S
const float c[]={0,1.84949460*100,-8.00504062*10,1.02237430*100,-1.52248592*100,1.88821343*100,-1.59085941*100,8.23027880*10,-2.34181944*10,2.79786260};
const float c1[]={1.291507177*10,1.466298863*100,-1.534713402*10,3.145945973,-4.163257839/10,3.187963771/100,-1.291637500/1000,2.183475087/100000,-1.447379511/10000000,8.211272125/1000000000};
const float c2[]={-8.087801117*10,1.621573104*100,-8.536869453,4.719686976/10,-1.441693666/100,2.081618890/10000};
const float c3[]={5.333875126*10000,-1.235892298*10000,1.092657613*1000,-4.265693686*10,6.247205420/10};


void setup() {
  Wire.begin();delay(200);
  lcd.init();lcd.backlight();
  ads.setGain(GAIN_SIXTEEN); 
  ads.begin();
  analogReference(INTERNAL);// опорное 1,1 В
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);
  pinMode(4,INPUT_PULLUP);
  pinMode(5,INPUT_PULLUP);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}
  tip_0 = EEPROM.read(0);t_reg_0 = EEPROM.read(1)*256 + EEPROM.read(2);
  tip_1 = EEPROM.read(10);t_reg_1 = EEPROM.read(11)*256 + EEPROM.read(12);
}

void loop() {
  if(digitalRead(5)==LOW &amp;&amp; kanal==0){kanal=1;w=1;times0=millis();delay(300);}
  if(digitalRead(5)==LOW &amp;&amp; kanal==1){kanal=0;w=1;times0=millis();delay(300);}

  if(kanal==0){
  if(digitalRead(2)==LOW){tip_0++;if(tip_0&gt;2){tip_0=0;}w=1;times0=millis();delay(300);}
  if(digitalRead(3)==LOW){if(up_0&gt;10){t_reg_0+=10;}else{t_reg_0++;}up_0++;w=1;w1=1;times0=millis();delay(200);lcd.clear();}
  if(digitalRead(4)==LOW){if(dw_0&gt;10){t_reg_0-=10;}else{t_reg_0--;}dw_0++;w=1;w1=1;times0=millis();delay(200);lcd.clear();}
  if(digitalRead(3)==HIGH){up_0=0;}if(digitalRead(4)==HIGH){dw_0=0;}
  if(tip_0==0 &amp;&amp; t_reg_0&lt;-240){t_reg_0=-240;}if(tip_0==0 &amp;&amp; t_reg_0&gt;1372){t_reg_0=1372;}
  if(tip_0==1 &amp;&amp; t_reg_0&lt;-200){t_reg_0=-200;}if(tip_0==1 &amp;&amp; t_reg_0&gt;800){t_reg_0=800;}
  if(tip_0==2 &amp;&amp; t_reg_0&lt;-50){t_reg_0=-50;}  if(tip_0==2 &amp;&amp; t_reg_0&gt;1768){t_reg_0=1768;}
  }

  if(kanal==1){
  if(digitalRead(2)==LOW){tip_1++;if(tip_1&gt;2){tip_1=0;}w=1;times0=millis();delay(300);}
  if(digitalRead(3)==LOW){if(up_1&gt;10){t_reg_1+=10;}else{t_reg_1++;}up_1++;w=1;w1=1;times0=millis();delay(200);lcd.clear();}
  if(digitalRead(4)==LOW){if(dw_1&gt;10){t_reg_1-=10;}else{t_reg_1--;}dw_1++;w=1;w1=1;times0=millis();delay(200);lcd.clear();}
  if(digitalRead(3)==HIGH){up_1=0;}if(digitalRead(4)==HIGH){dw_1=0;}
  if(tip_1==0 &amp;&amp; t_reg_1&lt;-240){t_reg_1=-240;}if(tip_1==0 &amp;&amp; t_reg_1&gt;1372){t_reg_1=1372;}
  if(tip_1==1 &amp;&amp; t_reg_1&lt;-200){t_reg_1=-200;}if(tip_1==1 &amp;&amp; t_reg_1&gt;800){t_reg_1=800;}
  if(tip_1==2 &amp;&amp; t_reg_1&lt;-50){t_reg_1=-50;}  if(tip_1==2 &amp;&amp; t_reg_1&gt;1768){t_reg_1=1768;}
  }  
  
  if(millis()-times&gt;1000){times=millis();w=1;}
  if(w==1){w=0;
  results_0 = ads.readADC_Differential_0_1(); 
  results_1 = ads.readADC_Differential_2_3(); 
  t_iz = sensor.temp();
  switch(tip_0){
    case 0: txa(results_0);break;
    case 1: txk(results_0);break;
    case 2: tpp_s(results_0);break;
    }
    t_0=t;
  switch(tip_1){
    case 0: txa(results_1);break;
    case 1: txk(results_1);break;
    case 2: tpp_s(results_1);break;
    }  
    t_1=t;
  
  lcd.setCursor(0,0);
  if(t_0==10000){lcd.print(&quot;  HIGH   &quot;);}
   else if(t_0==-1000){lcd.print(&quot;  LOW    &quot;);}
    else{
       if(kanal==0){lcd.print(&quot;T1&gt;&quot;);}else{lcd.print(&quot;T1 &quot;);}lcd.print(t_0,0);lcd.print((char)223);lcd.print(&quot;C &quot;);}
  lcd.setCursor(0,1);
  if(t_1==10000){lcd.print(&quot;  HIGH   &quot;);}
   else if(t_1==-1000){lcd.print(&quot;  LOW    &quot;);}
    else{
       if(kanal==1){lcd.print(&quot;T2&gt;&quot;);}else{lcd.print(&quot;T2 &quot;);}lcd.print(t_1,0);lcd.print((char)223);lcd.print(&quot;C &quot;);}

  lcd.setCursor(10,0);
  switch(tip_0){
    case 0: lcd.print(&quot;K&quot;);break;
    case 1: lcd.print(&quot;L&quot;);break;
    case 2: lcd.print(&quot;S&quot;);break;
    }
  lcd.setCursor(10,1);
  switch(tip_1){
    case 0: lcd.print(&quot;K&quot;);break;
    case 1: lcd.print(&quot;L&quot;);break;
    case 2: lcd.print(&quot;S&quot;);break;
    }  
  
  lcd.setCursor(12,0);lcd.print(t_reg_0,0);
  lcd.setCursor(12,1);lcd.print(t_reg_1,0);

  }
  
 if(millis()-times0&gt;10000 &amp;&amp; w1==1){w1=0;
  EEPROM.update(0,tip_0);EEPROM.update(1,highByte(int(t_reg_0)));EEPROM.update(2,lowByte(int(t_reg_0)));
  EEPROM.update(10,tip_1);EEPROM.update(11,highByte(int(t_reg_1)));EEPROM.update(12,lowByte(int(t_reg_1)));
  }
  if(t_reg_0 &gt;= t_0 + GIS){digitalWrite(8,HIGH);}
  if(t_reg_0 &lt;= t_0 - GIS){digitalWrite(8,LOW);}
  if(t_reg_1 &gt;= t_1 + GIS){digitalWrite(9,HIGH);}
  if(t_reg_1 &lt;= t_1 - GIS){digitalWrite(9,LOW);}
}

void txa(float rez){u=rez * multiplier+t_iz*0.0403;// окружающая температура 0.0403 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXA(K)
if(u&lt;0){t=(a[0]*pow(u,0))+(a[1]*pow(u,1))+(a[2]*pow(u,2))+(a[3]*pow(u,3))+(a[4]*pow(u,4))+(a[5]*pow(u,5))+(a[6]*pow(u,6))+(a[7]*pow(u,7))+(a[8]*pow(u,8));}
if(u&gt;=0&amp;&amp;u&lt;=20.64){t=(a1[0]*pow(u,0))+(a1[1]*pow(u,1))+(a1[2]*pow(u,2))+(a1[3]*pow(u,3))+(a1[4]*pow(u,4))+(a1[5]*pow(u,5))+(a1[6]*pow(u,6))+(a1[7]*pow(u,7))+(a1[8]*pow(u,8))+(a1[9]*pow(u,9));}
if(u&gt;20.64){t=(a2[0]*pow(u,0))+(a2[1]*pow(u,1))+(a2[2]*pow(u,2))+(a2[3]*pow(u,3))+(a2[4]*pow(u,4))+(a2[5]*pow(u,5))+(a2[6]*pow(u,6));}
if(rez * multiplier&lt;-6.35){t=-1000;} if(rez * multiplier&gt;54.9){t=10000;}
}

void txk(float rez){u=rez * multiplier+t_iz*0.06555;// окружающая температура 0.06555 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXK(L)
if(u&lt;0){t=(b[0]*pow(u,0))+(b[1]*pow(u,1))+(b[2]*pow(u,2))+(b[3]*pow(u,3))+(b[4]*pow(u,4))+(b[5]*pow(u,5))+(b[6]*pow(u,6))+(b[7]*pow(u,7))+(b[8]*pow(u,8))+(b[9]*pow(u,9));}
if(u&gt;=0){t=(b1[0]*pow(u,0))+(b1[1]*pow(u,1))+(b1[2]*pow(u,2))+(b1[3]*pow(u,3))+(b1[4]*pow(u,4))+(b1[5]*pow(u,5))+(b1[6]*pow(u,6))+(b1[7]*pow(u,7))+(b1[8]*pow(u,8))+(b1[9]*pow(u,9));}
if(rez * multiplier&lt;-9.49){t=-1000;} if(rez * multiplier&gt;66.47){t=10000;}
}
void tpp_s(float rez){u=rez * multiplier+t_iz*0.005875;// окружающая температура 0.005875 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TPPs(S)
if(u&lt;1.874){t=(c[0]*pow(u,0))+(c[1]*pow(u,1))+(c[2]*pow(u,2))+(c[3]*pow(u,3))+(c[4]*pow(u,4))+(c[5]*pow(u,5))+(c[6]*pow(u,6))+(c[7]*pow(u,7))+(c[8]*pow(u,8))+(c[9]*pow(u,9));}
if(u&gt;=1.874&amp;&amp;u&lt;10.332){t=(c1[0]*pow(u,0))+(c1[1]*pow(u,1))+(c1[2]*pow(u,2))+(c1[3]*pow(u,3))+(c1[4]*pow(u,4))+(c1[5]*pow(u,5))+(c1[6]*pow(u,6))+(c1[7]*pow(u,7))+(c1[8]*pow(u,8))+(c1[9]*pow(u,9));}
if(u&gt;=10.332&amp;&amp;u&lt;17.536){t=(c2[0]*pow(u,0))+(c2[1]*pow(u,1))+(c2[2]*pow(u,2))+(c2[3]*pow(u,3))+(c2[4]*pow(u,4))+(c2[5]*pow(u,5));}
if(u&gt;=17.536&amp;&amp;u&lt;=18.694){t=(c3[0]*pow(u,0))+(c3[1]*pow(u,1))+(c3[2]*pow(u,2))+(c3[3]*pow(u,3))+(c3[4]*pow(u,4));}
if(rez * multiplier&lt;-0.236){t=-1000;}  if(rez * multiplier&gt;18.70){t=10000;}
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-04-23T08:18:59Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=632&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ТЕРМОРЕГУЛЯТОР ТЕРМОПАРНЫЙ ТИПА ХА ХК ППs НА ADS1115]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=631&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=131906">http://rcl-radio.ru/?p=131906</a></p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/04/c5cc652a4dd36e39a9e52a9a082a6cd3.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/04/c5cc652a4dd36e39a9e52a9a082a6cd3.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/04/828e6aa1e264555f91e2e4f74246c558.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/04/828e6aa1e264555f91e2e4f74246c558.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/04/9bc2ae1fa819e36ce992861df83f1dd5.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/04/9bc2ae1fa819e36ce992861df83f1dd5.png" /></span> </p><br /><br /><div class="codebox"><pre><code>#define GIS 1.0

#include &lt;Wire.h&gt; 
#include &lt;Adafruit_ADS1015.h&gt;  // https://github.com/adafruit/Adafruit_ADS1X15/archive/master.zip
#include &lt;LiquidCrystal_I2C.h&gt;
#include &lt;LM75.h&gt;  //  https://github.com/thefekete/LM75.git
#include &lt;EEPROM.h&gt;
LiquidCrystal_I2C lcd(0x27,16,2); 
Adafruit_ADS1115 ads; 
LM75 sensor(LM75_ADDRESS | 0b111);  // if A0-&gt;Vcc, A1-&gt;Vcc and A2-&gt;Vcc

 int16_t results;
 float multiplier = 0.0078125F; 
 float t,u,t_iz,t_reg;
 unsigned long times,times0;
 bool w,w1;
 int tip,up,dw;

//K
const float a[]{0,2.5173462*10,-1.1662878,-1.08336338,-8.9773540/10,-3.7342377/10,-8.6632643/100,-1.0450598/100,-5.1920577/10000};
const float a1[]{0,2.508355*10,7.860106/100,-2.503131/10,8.315270/100,-1.228034/100,9.804036/10000,-4.413030/100000,1.057734/1000000,-1.052755*pow(10,-8)};
const float a2[]{-1.318058*100,4.830222*10,-1.646031,5.464731/100,-9.6550715/10000,8.802193/1000000,-3.110810/100000000};
//L
const float b[]{1.1573067/10000,1.5884573*10,4.0458554/100,0.3170064,0.1666128,5.146958/100,9.5288883/1000,1.0301283/1000,6.0654431/100000,1.5131878/1000000};
const float b1[]{7.2069422/1000,1.5775525*10,-0.2261183,9.4286756/1000,-3.5394655/10000,1.0050886/100000,-1.9323678/10000000,2.3816891/1000000000,-1.7130654*pow(10,-11),5.4857331*pow(10,-14)};
//S
const float c[]={0,1.84949460*100,-8.00504062*10,1.02237430*100,-1.52248592*100,1.88821343*100,-1.59085941*100,8.23027880*10,-2.34181944*10,2.79786260};
const float c1[]={1.291507177*10,1.466298863*100,-1.534713402*10,3.145945973,-4.163257839/10,3.187963771/100,-1.291637500/1000,2.183475087/100000,-1.447379511/10000000,8.211272125/1000000000};
const float c2[]={-8.087801117*10,1.621573104*100,-8.536869453,4.719686976/10,-1.441693666/100,2.081618890/10000};
const float c3[]={5.333875126*10000,-1.235892298*10000,1.092657613*1000,-4.265693686*10,6.247205420/10};


void setup() {
  Wire.begin();delay(200);
  lcd.init();lcd.backlight();
  ads.setGain(GAIN_SIXTEEN); 
  ads.begin();
  analogReference(INTERNAL);// опорное 1,1 В
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);
  pinMode(4,INPUT_PULLUP);
  pinMode(8,OUTPUT);
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}
  tip = EEPROM.read(0);
  t_reg = EEPROM.read(1)*256 + EEPROM.read(2);
}

void loop() {
  if(digitalRead(2)==LOW){tip++;if(tip&gt;2){tip=0;}w=1;delay(300);}
  if(digitalRead(3)==LOW){if(up&gt;10){t_reg+=10;}else{t_reg++;}up++;w=1;w1=1;times0=millis();delay(200);lcd.clear();}
  if(digitalRead(4)==LOW){if(dw&gt;10){t_reg-=10;}else{t_reg--;}dw++;w=1;w1=1;times0=millis();delay(200);lcd.clear();}
  if(digitalRead(3)==HIGH){up=0;}
  if(digitalRead(4)==HIGH){dw=0;}
  if(tip==0 &amp;&amp; t_reg&lt;-240){t_reg=-240;}if(tip==0 &amp;&amp; t_reg&gt;1372){t_reg=1372;}
  if(tip==1 &amp;&amp; t_reg&lt;-200){t_reg=-200;}if(tip==1 &amp;&amp; t_reg&gt;800){t_reg=800;}
  if(tip==2 &amp;&amp; t_reg&lt;-50){t_reg=-50;}  if(tip==2 &amp;&amp; t_reg&gt;1768){t_reg=1768;}
  if(millis()-times&gt;1000){times=millis();w=1;}
  if(w==1){w=0;
  results = ads.readADC_Differential_0_1(); 
  t_iz = sensor.temp();
  switch(tip){
    case 0: txa();break;
    case 1: txk();break;
    case 2: tpp_s();break;
    }
  lcd.setCursor(0,0);
  if(t==10000){lcd.print(&quot;  HIGH  &quot;);}
  else if(t==-1000){lcd.print(&quot;  LOW   &quot;);}
  else{lcd.print(&quot;T=&quot;);lcd.print(t,0);lcd.print((char)223);lcd.print(&quot;C &quot;);}
  lcd.setCursor(9,0);lcd.print(results * multiplier,2);lcd.print(&quot;mV &quot;);
  lcd.setCursor(0,1);
  lcd.print(&quot;Tr=&quot;);lcd.print(t_reg,0);
  lcd.setCursor(8,1);
  switch(tip){
    case 0: lcd.print(&quot;K&quot;);break;
    case 1: lcd.print(&quot;L&quot;);break;
    case 2: lcd.print(&quot;S&quot;);break;
    }
  lcd.setCursor(10,1);lcd.print(t_iz,1);lcd.print((char)223);lcd.print(&quot;C &quot;);
  }
 if(millis()-times0&gt;10000 &amp;&amp; w1==1){w1=0;
  EEPROM.update(0,tip);EEPROM.update(1,highByte(int(t_reg)));EEPROM.update(2,lowByte(int(t_reg)));
  }
  if(t_reg &gt;= t + GIS){digitalWrite(8,HIGH);}
  if(t_reg &lt;= t - GIS){digitalWrite(8,LOW);}
}

void txa(){u=results * multiplier+t_iz*0.0403;// окружающая температура 0.0403 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXA(K)
if(u&lt;0){t=(a[0]*pow(u,0))+(a[1]*pow(u,1))+(a[2]*pow(u,2))+(a[3]*pow(u,3))+(a[4]*pow(u,4))+(a[5]*pow(u,5))+(a[6]*pow(u,6))+(a[7]*pow(u,7))+(a[8]*pow(u,8));}
if(u&gt;=0&amp;&amp;u&lt;=20.64){t=(a1[0]*pow(u,0))+(a1[1]*pow(u,1))+(a1[2]*pow(u,2))+(a1[3]*pow(u,3))+(a1[4]*pow(u,4))+(a1[5]*pow(u,5))+(a1[6]*pow(u,6))+(a1[7]*pow(u,7))+(a1[8]*pow(u,8))+(a1[9]*pow(u,9));}
if(u&gt;20.64){t=(a2[0]*pow(u,0))+(a2[1]*pow(u,1))+(a2[2]*pow(u,2))+(a2[3]*pow(u,3))+(a2[4]*pow(u,4))+(a2[5]*pow(u,5))+(a2[6]*pow(u,6));}
if(results * multiplier&lt;-6.35){t=-1000;} if(results * multiplier&gt;54.9){t=10000;}
}

void txk(){u=results * multiplier+t_iz*0.06555;// окружающая температура 0.06555 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXK(L)
if(u&lt;0){t=(b[0]*pow(u,0))+(b[1]*pow(u,1))+(b[2]*pow(u,2))+(b[3]*pow(u,3))+(b[4]*pow(u,4))+(b[5]*pow(u,5))+(b[6]*pow(u,6))+(b[7]*pow(u,7))+(b[8]*pow(u,8))+(b[9]*pow(u,9));}
if(u&gt;=0){t=(b1[0]*pow(u,0))+(b1[1]*pow(u,1))+(b1[2]*pow(u,2))+(b1[3]*pow(u,3))+(b1[4]*pow(u,4))+(b1[5]*pow(u,5))+(b1[6]*pow(u,6))+(b1[7]*pow(u,7))+(b1[8]*pow(u,8))+(b1[9]*pow(u,9));}
if(results * multiplier&lt;-9.49){t=-1000;} if(results * multiplier&gt;66.47){t=10000;}
}
void tpp_s(){u=results * multiplier+t_iz*0.005875;// окружающая температура 0.005875 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TPPs(S)
if(u&lt;1.874){t=(c[0]*pow(u,0))+(c[1]*pow(u,1))+(c[2]*pow(u,2))+(c[3]*pow(u,3))+(c[4]*pow(u,4))+(c[5]*pow(u,5))+(c[6]*pow(u,6))+(c[7]*pow(u,7))+(c[8]*pow(u,8))+(c[9]*pow(u,9));}
if(u&gt;=1.874&amp;&amp;u&lt;10.332){t=(c1[0]*pow(u,0))+(c1[1]*pow(u,1))+(c1[2]*pow(u,2))+(c1[3]*pow(u,3))+(c1[4]*pow(u,4))+(c1[5]*pow(u,5))+(c1[6]*pow(u,6))+(c1[7]*pow(u,7))+(c1[8]*pow(u,8))+(c1[9]*pow(u,9));}
if(u&gt;=10.332&amp;&amp;u&lt;17.536){t=(c2[0]*pow(u,0))+(c2[1]*pow(u,1))+(c2[2]*pow(u,2))+(c2[3]*pow(u,3))+(c2[4]*pow(u,4))+(c2[5]*pow(u,5));}
if(u&gt;=17.536&amp;&amp;u&lt;=18.694){t=(c3[0]*pow(u,0))+(c3[1]*pow(u,1))+(c3[2]*pow(u,2))+(c3[3]*pow(u,3))+(c3[4]*pow(u,4));}
if(results * multiplier&lt;-0.236){t=-1000;}  if(results * multiplier&gt;18.70){t=10000;}
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-04-22T09:09:40Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=631&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[MPR121 - малопотребляющий контроллер сенсорных емкостных клавиатур]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=607&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=131456">http://rcl-radio.ru/?p=131456</a></p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2024/01/72b13a16fc04d843e129b2635a214af9.png" alt="http://forum.rcl-radio.ru/uploads/images/2024/01/72b13a16fc04d843e129b2635a214af9.png" /></span> </p><p><span class="attention-yellow"></span> </p><br /><div class="codebox"><pre><code>#include &lt;MPR121.h&gt;
#include &lt;Wire.h&gt;

const uint8_t LEDPIN = 13;  // pin 4 is the MPR121 interrupt on the Bare Touch Board

void setup() {
   Serial.begin(9600);
   MPR121.begin(0x5A);   // MPR121 I2C address 
   MPR121.setInterruptPin(LEDPIN);
   MPR121.setTouchThreshold(40);  // Устанавливает порог касания равным 40, допустимые значения от 0 до&gt;255
   MPR121.setReleaseThreshold(20);  // Устанавливает порог разблокировки равным 20, допустимые значения от 0 до&gt;255.ПРИМЕЧАНИЕ: это значение должно быть меньше значения касания.
   MPR121.setFFI(FFI_10);
   MPR121.setSFI(SFI_10);
   MPR121.setGlobalCDT(CDT_4US);  // reasonable for larger capacitances
   MPR121.autoSetElectrodes();  // autoset all electrode settings
}

void loop() {
  MPR121.updateAll();
  for (int i = 0; i &lt; 12; i++) {
    if (MPR121.isNewTouch(i)) {
      Serial.print(&quot;button &quot;);
      Serial.println(i);
    }
  }

}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2024-01-26T04:11:41Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=607&amp;action=new</id>
		</entry>
</feed>
