<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; ПИД терморегулятор DS18B20]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=636&amp;type=atom" />
	<updated>2026-02-12T03:09:01Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=636</id>
		<entry>
			<title type="html"><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=12426#p12426" />
			<content type="html"><![CDATA[<p>Не идет. Белый экран с периодической перезагрузкой на величину задержки. Без задержки работает, но только в трехпроводном режиме. Пробовал играться величиной сопротивления подтяжки, но пока без толку.</p>]]></content>
			<author>
				<name><![CDATA[ivanbazanov]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=4127</uri>
			</author>
			<updated>2026-02-12T03:09:01Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=12426#p12426</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=12422#p12422" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2026-02-11T11:33:06Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=12422#p12422</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=12420#p12420" />
			<content type="html"><![CDATA[<p>А с чем это связано? У меня этот датчик работает по паразитному питанию, правда на тиньке 2313. Но на ней колебания температуры меня не устаивают, понравилось как в Вашем варианте работает, только вот подключение бы датчика изменить...</p>]]></content>
			<author>
				<name><![CDATA[ivanbazanov]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=4127</uri>
			</author>
			<updated>2026-02-11T04:12:09Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=12420#p12420</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=12418#p12418" />
			<content type="html"><![CDATA[<p>Скетч не будет поддерживать режим паразитного питания</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2026-02-10T17:50:27Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=12418#p12418</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=12414#p12414" />
			<content type="html"><![CDATA[<p>Все работает очень неплохо. Но хотелось бы включить датчик через паразитное питание и включение подсветки только при нажатии клавиш. Это сложно? Питание так включать&nbsp; &nbsp;ds.write(0x44, 1)&nbsp; ?</p>]]></content>
			<author>
				<name><![CDATA[ivanbazanov]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=4127</uri>
			</author>
			<updated>2026-02-10T11:36:31Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=12414#p12414</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=12377#p12377" />
			<content type="html"><![CDATA[<p>Спасибо )</p>]]></content>
			<author>
				<name><![CDATA[ivanbazanov]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=4127</uri>
			</author>
			<updated>2026-02-06T11:56:17Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=12377#p12377</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=12376#p12376" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2026-02-06T11:52:26Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=12376#p12376</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=12375#p12375" />
			<content type="html"><![CDATA[<p>Здравствуйте. Скажите, почему Ваш скетч на температуру до 100 С, датчик же поддерживает до 124 С ? И что нужно изменить в скетче для расширения диапазона?</p>]]></content>
			<author>
				<name><![CDATA[ivanbazanov]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=4127</uri>
			</author>
			<updated>2026-02-06T11:50:36Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=12375#p12375</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ПИД терморегулятор DS18B20]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=10362#p10362" />
			<content 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>]]></content>
			<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?pid=10362#p10362</id>
		</entry>
</feed>
