<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[forum.rcl-radio.ru &mdash; ПИД терморегулятор DS18B20]]></title>
		<link>http://forum.rcl-radio.ru/viewtopic.php?id=636</link>
		<atom:link href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=636&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «ПИД терморегулятор DS18B20».]]></description>
		<lastBuildDate>Thu, 12 Feb 2026 03:09:01 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12426#p12426</link>
			<description><![CDATA[<p>Не идет. Белый экран с периодической перезагрузкой на величину задержки. Без задержки работает, но только в трехпроводном режиме. Пробовал играться величиной сопротивления подтяжки, но пока без толку.</p>]]></description>
			<author><![CDATA[null@example.com (ivanbazanov)]]></author>
			<pubDate>Thu, 12 Feb 2026 03:09:01 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12426#p12426</guid>
		</item>
		<item>
			<title><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12422#p12422</link>
			<description><![CDATA[<div class="codebox"><pre><code>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, 1);  // ВАЖНО: второй параметр = 1 для паразитного питания
  
  // Ждём завершения преобразования (максимум 750 мс при 12-битном разрешении)
  delay(750);
  
  ds.reset();          // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Повторное обращение к датчику
  ds.write(0xBE);    // Чтение памяти
  
  data[0] = ds.read(); // Чтение младшего байта
  data[1] = ds.read(); // Чтение старшего байта
  
  float value = ((data[1] &lt;&lt; 8) | data[0]) / 16.0;
  return value;
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Wed, 11 Feb 2026 11:33:06 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12422#p12422</guid>
		</item>
		<item>
			<title><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12420#p12420</link>
			<description><![CDATA[<p>А с чем это связано? У меня этот датчик работает по паразитному питанию, правда на тиньке 2313. Но на ней колебания температуры меня не устаивают, понравилось как в Вашем варианте работает, только вот подключение бы датчика изменить...</p>]]></description>
			<author><![CDATA[null@example.com (ivanbazanov)]]></author>
			<pubDate>Wed, 11 Feb 2026 04:12:09 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12420#p12420</guid>
		</item>
		<item>
			<title><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12418#p12418</link>
			<description><![CDATA[<p>Скетч не будет поддерживать режим паразитного питания</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Tue, 10 Feb 2026 17:50:27 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12418#p12418</guid>
		</item>
		<item>
			<title><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12414#p12414</link>
			<description><![CDATA[<p>Все работает очень неплохо. Но хотелось бы включить датчик через паразитное питание и включение подсветки только при нажатии клавиш. Это сложно? Питание так включать&nbsp; &nbsp;ds.write(0x44, 1)&nbsp; ?</p>]]></description>
			<author><![CDATA[null@example.com (ivanbazanov)]]></author>
			<pubDate>Tue, 10 Feb 2026 11:36:31 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12414#p12414</guid>
		</item>
		<item>
			<title><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12377#p12377</link>
			<description><![CDATA[<p>Спасибо )</p>]]></description>
			<author><![CDATA[null@example.com (ivanbazanov)]]></author>
			<pubDate>Fri, 06 Feb 2026 11:56:17 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12377#p12377</guid>
		</item>
		<item>
			<title><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12376#p12376</link>
			<description><![CDATA[<p>if(t&lt;0){t=0;}if(t&gt;100){t=100;}&gt;&gt;&gt;if(t&lt;0){t=0;}if(t&gt;124){t=124;}</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Fri, 06 Feb 2026 11:52:26 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12376#p12376</guid>
		</item>
		<item>
			<title><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=12375#p12375</link>
			<description><![CDATA[<p>Здравствуйте. Скажите, почему Ваш скетч на температуру до 100 С, датчик же поддерживает до 124 С ? И что нужно изменить в скетче для расширения диапазона?</p>]]></description>
			<author><![CDATA[null@example.com (ivanbazanov)]]></author>
			<pubDate>Fri, 06 Feb 2026 11:50:36 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=12375#p12375</guid>
		</item>
		<item>
			<title><![CDATA[ПИД терморегулятор DS18B20]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=10362#p10362</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Wed, 08 May 2024 07:05:52 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=10362#p10362</guid>
		</item>
	</channel>
</rss>
