<?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; Терморегулятор ESP32 Bluetooth]]></title>
		<link>http://forum.rcl-radio.ru/viewtopic.php?id=264</link>
		<atom:link href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=264&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Терморегулятор ESP32 Bluetooth».]]></description>
		<lastBuildDate>Wed, 17 Sep 2025 10:47:53 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Терморегулятор ESP32 Bluetooth]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=11914#p11914</link>
			<description><![CDATA[<p>Доброго дня очень понравился проект. Редко когда сразу работает. <br />А можно его переработать на более современные ESP S3, P4,&nbsp; C6 c выводом на LCD Touch?<br />Получился бы классный термостат</p>]]></description>
			<author><![CDATA[null@example.com (Pavel k)]]></author>
			<pubDate>Wed, 17 Sep 2025 10:47:53 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=11914#p11914</guid>
		</item>
		<item>
			<title><![CDATA[Re: Терморегулятор ESP32 Bluetooth]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=7329#p7329</link>
			<description><![CDATA[<p>Попробуйте выбрать плату DOIT ESP32 DEVKIT V1</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2023/01/d1ff8d2223ed0c43e0dc27f6857c817c.png" alt="http://forum.rcl-radio.ru/uploads/images/2023/01/d1ff8d2223ed0c43e0dc27f6857c817c.png" /></span></p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Sat, 28 Jan 2023 10:25:28 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=7329#p7329</guid>
		</item>
		<item>
			<title><![CDATA[Re: Терморегулятор ESP32 Bluetooth]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=7304#p7304</link>
			<description><![CDATA[<p>Ну, всё как обычно с arduino...<br />no matching function for call to &#039;BluetoothSerial::register_callback(void (&amp;)(esp_spp_cb_event_t, esp_spp_cb_param_t*))&#039;</p><p>Библиотека BluetoothSerial присутствует</p><p>Ругается на строку&nbsp; BL.register_callback(BTCallback);<br /> Плата: ESP32 Wroom.</p><p>ESP32 ver 1.0.6</p>]]></description>
			<author><![CDATA[null@example.com (olegfilatof)]]></author>
			<pubDate>Tue, 24 Jan 2023 15:39:54 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=7304#p7304</guid>
		</item>
		<item>
			<title><![CDATA[Re: Терморегулятор ESP32 Bluetooth]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=2976#p2976</link>
			<description><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/01/0903451611d098f59e003b55e4b6d1eb.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/01/0903451611d098f59e003b55e4b6d1eb.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/01/50fc91d707af658e7182ed2365bdbd9e.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/01/50fc91d707af658e7182ed2365bdbd9e.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/01/4ea546807396a19dfd72451293ac4c18.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/01/4ea546807396a19dfd72451293ac4c18.png" /></span> </p><div class="codebox"><pre><code>#include &lt;BluetoothSerial.h&gt;   // Входит в состав Arduino IDE 
#include &lt;OneWire.h&gt;           // Входит в состав Arduino IDE 
#include &lt;EEPROM.h&gt;            // Входит в состав Arduino IDE 
#include &lt;WiFi.h&gt;
#include &lt;NTPClient.h&gt;         // http://rcl-radio.ru/wp-content/uploads/2019/11/ntpclientmaster.zip
#include &lt;WiFiUdp.h&gt;
  OneWire  ds(15); // Вход датчика D15
  BluetoothSerial BL;
  const char* ssid     = &quot;Keenetic-9009&quot;;
  const char* password = &quot;32481975&quot;;
  WiFiUDP ntpUDP;
  /////////////////  https://www.ntppool.org/zone/@ - другие сервера  /////////////////////////////
  ///////////////// для России - ru.pool.ntp.org //////////////////////////////////////////////////
  NTPClient timeClient(ntpUDP, &quot;pool.ntp.org&quot;, 21600,3600123);// 21600 - временной сдвиг в секундах от UTC 

  float temper;
  int w,reg,buf[2],i,wb,rele,k,hh,mm,ss,h_reg,m_reg,tim=1,rty=1,t1,t2,t3,t4,reg_t,sett;
  int h1,m1,h2,m2,h3,m3,h4,m4;
  unsigned long buff,times,times1,times2;
  const int gis = 1; // int гистерезис
  String BT_CALLBACK = &quot;&quot;;
  
void setup() {
  Serial.begin(9600);
  EEPROM.begin(100); // под EEPROM выделить 100 ячеек памяти 
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ){delay (10);Serial.print ( &quot;.&quot; );timeClient.begin();}
  BL.register_callback(BTCallback);
  BL.begin(&quot;ESP32&quot;,false); // Имя Вашего устройства Bluetooth
  BL.setTimeout(100);
  Serial.println(&quot;Bluetooth OK&quot;);
  pinMode (2, OUTPUT);  // LED
  pinMode (22,OUTPUT);  // выход рег. реле D22
  reg=EEPROM.read(0);h1=EEPROM.read(1);m1=EEPROM.read(2);h2=EEPROM.read(3);m2=EEPROM.read(4);
  h3=EEPROM.read(5);m3=EEPROM.read(6);h4=EEPROM.read(7);m4=EEPROM.read(8);
  t1=EEPROM.read(9);t2=EEPROM.read(10);t3=EEPROM.read(11);t4=EEPROM.read(12);sett=EEPROM.read(13);
  if(sett&gt;1){sett=0;}
}

void loop() {
/////// ПРИЕМ ДАННЫХ /////////////////////////  
   if(BL.available()){
    for (i=0;i&lt;1;i++) { 
      buf[0] = BL.parseInt(); 
      buf[1] = BL.parseInt();}    
      times=millis();times=millis();wb=1;w=1;
      }

///////////// обработка команд /////////////////// 
   if((buf[0]&gt;10&amp;&amp;wb==1)||rty==1){ wb=0;rty=0;
     if(buf[0]==102){reg++;if(reg&gt;50){reg=50;}}
     if(buf[0]==101){reg--;if(reg&lt;10){reg=10;}}

     if(buf[0]==103&amp;&amp;sett==0){buf[0]=0;sett=1;}
     if(buf[0]==103&amp;&amp;sett==1){buf[0]=0;sett=0;}

     if(buf[0]==110){tim=1;}
     if(buf[0]==120){tim=2;}
     if(buf[0]==130){tim=3;}
     if(buf[0]==140){tim=4;}

     switch(tim){
     case 1: h_reg=h1;m_reg=m1;reg_t=t1;break;
     case 2: h_reg=h2;m_reg=m2;reg_t=t2;break;
     case 3: h_reg=h3;m_reg=m3;reg_t=t3;break;
     case 4: h_reg=h4;m_reg=m4;reg_t=t4;break;
     }  
     
     if(buf[0]==104){h_reg++;if(h_reg&gt;23){h_reg=0;}}
     if(buf[0]==105){h_reg--;if(h_reg&lt;0){h_reg=23;}}

     if(buf[0]==106){m_reg++;if(m_reg&gt;59){m_reg=0;}}
     if(buf[0]==107){m_reg--;if(m_reg&lt;0){m_reg=59;}}

     if(buf[0]==200){reg_t++;if(reg_t&gt;50){reg_t=50;}}
     if(buf[0]==300){reg_t--;if(reg_t&lt;10){reg_t=10;}}

     switch(tim){ 
     case 1: h1=h_reg;m1=m_reg;t1=reg_t;break;
     case 2: h2=h_reg;m2=m_reg;t2=reg_t;break;
     case 3: h3=h_reg;m3=m_reg;t3=reg_t;break;
     case 4: h4=h_reg;m4=m_reg;t4=reg_t;break;
     }
     }

//////////// reg temp
if(sett==0){
     if(reg &gt;= temper + gis){rele=1;digitalWrite(22,HIGH);}
     if(reg &lt;= temper - gis){rele=0;digitalWrite(22,LOW);} }
else{
  if(hh*100+mm&gt;=h1*100+m1&amp;&amp;hh*100+mm&lt;h2*100+m2){
    if(t1 &gt;= temper + gis){rele=1;digitalWrite(22,HIGH);}
    if(t1 &lt;= temper - gis){rele=0;digitalWrite(22,LOW);}
    }
  if(hh*100+mm&gt;=h2*100+m2&amp;&amp;hh*100+mm&lt;h3*100+m3){
    if(t2 &gt;= temper + gis){rele=1;digitalWrite(22,HIGH);}
    if(t2 &lt;= temper - gis){rele=0;digitalWrite(22,LOW);}    
    }
  if(hh*100+mm&gt;=h3*100+m3&amp;&amp;hh*100+mm&lt;h4*100+m4){
    if(t3 &gt;= temper + gis){rele=1;digitalWrite(22,HIGH);}
    if(t3 &lt;= temper - gis){rele=0;digitalWrite(22,LOW);}
    }
  if(hh*100+mm&gt;=h4*100+m4 &amp;&amp; hh*100+mm&lt;2359){
    if(t4 &gt;= temper + gis){rele=1;digitalWrite(22,HIGH);}
    if(t4 &lt;= temper - gis){rele=0;digitalWrite(22,LOW);}
    }
  if(hh*100+mm&lt;h1*100+m1 &amp;&amp; hh*100+mm&gt;=0){
    if(t4 &gt;= temper + gis){rele=1;digitalWrite(22,HIGH);}
    if(t4 &lt;= temper - gis){rele=0;digitalWrite(22,LOW);}   
    }
    }

     blue();
 
//////////////// EEPROM
  if(millis()-times&gt;5000&amp;&amp;w==1){EEPROM.write(0,reg);
  EEPROM.write(1,h1);EEPROM.write(2,m1);EEPROM.write(3,h2);EEPROM.write(4,m2);
  EEPROM.write(5,h3);EEPROM.write(6,m3);EEPROM.write(7,h4);EEPROM.write(8,m4);
  EEPROM.write(9,t1);EEPROM.write(10,t2);EEPROM.write(11,t3);EEPROM.write(12,t4);EEPROM.write(13,sett);
  times=millis();w=0;EEPROM.commit();}

  /////// измерение температуры 1 раз в секунду
  if(k==0){digitalWrite(2,LOW);}
  if(k==1){digitalWrite(2,HIGH);}
  if(k&gt;1){k=0;}
  if(millis()-times1&gt;1000){temper = dsRead(0);times1=millis();k++;
  }
/////////////// times 
  if(millis()-times2&gt;=1000){times2=millis();
   while(!timeClient.update()){timeClient.forceUpdate();}
   hh = timeClient.getHours();
   mm = timeClient.getMinutes();
   ss = timeClient.getSeconds();
  }
  
  delay(5);
}// loop

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; // Расчет температуры и вывод
}

void blue(){
  //////// отправка днный в android
   BL.print(temper,1);
   BL.print(&quot;:&quot;);
   BL.print(reg);
   BL.print(&quot;:&quot;);
   BL.print(rele);
   BL.print(&quot;:&quot;);
   BL.print(hh);
   BL.print(&quot;:&quot;);
   BL.print(mm);
   BL.print(&quot;:&quot;);
   BL.print(ss);
   BL.print(&quot;:&quot;);
   BL.print(h_reg);
   BL.print(&quot;:&quot;);
   BL.print(m_reg);
   BL.print(&quot;:&quot;);
   BL.print(tim);
   BL.print(&quot;:&quot;);
   BL.print(reg_t);
   BL.print(&quot;:&quot;);
   BL.print(h1);
   BL.print(&quot;:&quot;);
   BL.print(h2);
   BL.print(&quot;:&quot;);
   BL.print(h3);
   BL.print(&quot;:&quot;);
   BL.print(h4);
   BL.print(&quot;:&quot;);
   BL.print(m1);
   BL.print(&quot;:&quot;);
   BL.print(m2);
   BL.print(&quot;:&quot;);
   BL.print(m3);
   BL.print(&quot;:&quot;);
   BL.print(m4);
   BL.print(&quot;:&quot;);
   BL.print(t1);
   BL.print(&quot;:&quot;);
   BL.print(t2);
   BL.print(&quot;:&quot;);
   BL.print(t3);
   BL.print(&quot;:&quot;);
   BL.print(t4);
   BL.print(&quot;:&quot;);
   BL.println(sett);
  }

void BTCallback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param){
    if(event == ESP_SPP_SRV_OPEN_EVT){BT_CALLBACK = &quot;BTonConnect&quot;;}
    else if(event == ESP_SPP_CLOSE_EVT){ESP.restart();}
    else if(event == ESP_SPP_DATA_IND_EVT){BT_CALLBACK = &quot;BTonReceivedStart&quot;;}
    else if(event == ESP_SPP_WRITE_EVT){BT_CALLBACK = &quot;BTonWrite&quot;;}
}</code></pre></div><p>Приложение Android <span class="attention-yellow"></span> </p><p>Исходники Android Studio <span class="attention-yellow"></span></p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Wed, 27 Jan 2021 15:26:44 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=2976#p2976</guid>
		</item>
		<item>
			<title><![CDATA[Терморегулятор ESP32 Bluetooth]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=2955#p2955</link>
			<description><![CDATA[<div class="codebox"><pre><code>#include &lt;BluetoothSerial.h&gt;   // Входит в состав Arduino IDE 
#include &lt;OneWire.h&gt;           // Входит в состав Arduino IDE 
#include &lt;EEPROM.h&gt;            // Входит в состав Arduino IDE 
  OneWire  ds(15); // Вход датчика D15
  BluetoothSerial BL;

  float temper;
  int w,reg,buf[2],i,wb,rele,k,event;
  unsigned long buff,times,times1;
  const int gis = 1; // int гистерезис
  String BT_CALLBACK = &quot;&quot;;
  
void setup() {
  Serial.begin(9600);
  EEPROM.begin(100); // под EEPROM выделить 100 ячеек памяти 
  BL.register_callback(BTCallback);
  BL.begin(&quot;ESP32&quot;,false); // Имя Вашего устройства Bluetooth
  BL.setTimeout(100);
  Serial.println(&quot;Bluetooth OK&quot;);
  pinMode (2, OUTPUT);  // LED
  pinMode (22,OUTPUT);  // выход рег. реле D22
  reg=EEPROM.read(0);
}

void loop() {
/////// ПРИЕМ ДАННЫХ /////////////////////////  
   if(BL.available()){
    for (i=0;i&lt;1;i++) { 
      buf[0] = BL.parseInt(); 
      buf[1] = BL.parseInt();}    
      times=millis();times=millis();wb=1;w=1;
      }

///////////// обработка команд /////////////////// 
   if(buf[0]&gt;10&amp;&amp;wb==1){ wb=0;
     if(buf[0]==102){reg++;if(reg&gt;50){reg=50;}}
     if(buf[0]==101){reg--;if(reg&lt;10){reg=10;}}
     }

//////////// reg temp
     if(reg &gt;= temper + gis){rele=1;digitalWrite(22,HIGH);}
     if(reg &lt;= temper - gis){rele=0;digitalWrite(22,LOW);} 

     blue();

//////////////// EEPROM
  if(millis()-times&gt;5000&amp;&amp;w==1){EEPROM.write(0,reg);times=millis();w=0;EEPROM.commit();}

  /////// измерение температуры 1 раз в секунду
  if(k==0){digitalWrite(2,LOW);}
  if(k==1){digitalWrite(2,HIGH);}
  if(k&gt;1){k=0;}
  if(millis()-times1&gt;1000){temper = dsRead(0);times1=millis();k++;}
  delay(20);
}// loop

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; // Расчет температуры и вывод
}

void blue(){
  //////// отправка днный в android
   BL.print(temper,1);
   BL.print(&quot;:&quot;);
   BL.print(reg);
   BL.print(&quot;:&quot;);
   BL.println(rele);
  }

void BTCallback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param){
    if(event == ESP_SPP_SRV_OPEN_EVT){BT_CALLBACK = &quot;BTonConnect&quot;;}
    else if(event == ESP_SPP_CLOSE_EVT){ESP.restart();}
    else if(event == ESP_SPP_DATA_IND_EVT){BT_CALLBACK = &quot;BTonReceivedStart&quot;;}
    else if(event == ESP_SPP_WRITE_EVT){BT_CALLBACK = &quot;BTonWrite&quot;;}
}</code></pre></div><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/01/5f4b54e823ff550f3374878c38e48e4c.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/01/5f4b54e823ff550f3374878c38e48e4c.png" /></span> </p><p>Приложение Android <span class="attention-yellow"></span> </p><p>Исходники Android Studio - <span class="attention-yellow"></span></p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Mon, 25 Jan 2021 15:03:00 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=2955#p2955</guid>
		</item>
	</channel>
</rss>
