<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; ESP8266]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;fid=11&amp;type=atom" />
	<updated>2025-12-18T17:58:07Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/index.php</id>
		<entry>
			<title type="html"><![CDATA[прошивка linux-ESP-01]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=720&amp;action=new" />
			<summary type="html"><![CDATA[<p>оказалось что все возможно<br />Не работает по двум причинам: изначально<br />где её брать саму прошивку, и команды, и ещё нет необходимых пакетов</p><p>Значит все по порядку, установить пакет<br /><span style="color: red"><strong>esptool</strong></span><br />Достаточно трудно , но вполне решаем.<br />Почему трудно, идет переделка пакета, меняются команда, но когда все установлено терминал сам подскажет что и где поменять))<br />сейчас не смогу точно отписать как сам это сделал, однако очень скоро вернусь и допишу как <br />по случаю система моя не стабильна и может сломаться тогда и вернусь. ))</p><p>проверка платы в режиме прошивки<br /><strong>esptool --port /dev/ttyUSB0 flash-id</strong></p><br /><p>Вывод этой команды в терминале два примера</p><p>okk@okk1:~$ esptool --port /dev/ttyUSB0 flash-id<br />esptool v5.1.0<br />Serial port /dev/ttyUSB0:</p><p><strong>A fatal error occurred: Could not open /dev/ttyUSB0, the port is busy or doesn&#039;t exist.<br />([Errno 16] could not open port /dev/ttyUSB0: [Errno 16] Device or resource busy: &#039;/dev/ttyUSB0&#039;)</strong><br />второй<br /><strong>okk@okk1:~$ esptool --port /dev/ttyUSB0 flash-id<br />esptool v5.1.0<br />Connected to ESP8266 on /dev/ttyUSB0:<br />Chip type:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ESP8266EX<br />Features:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Wi-Fi, 160MHz<br />Crystal frequency:&nbsp; 26MHz<br />MAC:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cc:50:e3:78:1f:70</strong></p><p><strong>Stub flasher running.</strong></p><p><strong>Flash Memory Information:<br />=========================<br />Manufacturer: 85<br />Device: 2014<br />Detected flash size: 1MB</strong></p><p><strong>Hard resetting via RTS pin...<br />okk@okk1:~$ </strong></p><p>Первый ошибка : плата не подключена по питанию<br />Вторая:<br />плата видна и её все настройки видны, Плата готова к прошивке.</p><p>Вторая часть где брать. ? ещё тот вопрос??<br />Оказалось на GitHub все есть но найти трудно, почему так.<br />Разные релизы разложены по веткам.<br />это последний релиз этой платы, <br /><a href="https://github.com/espressif/esp-at/releases/tag/v2.2.2.0_esp8266">https://github.com/espressif/esp-at/rel … .0_esp8266</a><br />а это основной<br /><a href="https://github.com/espressif/esp-at">https://github.com/espressif/esp-at</a><br />как выбрать релиз<br />место есть выбрать не мастер а ветка релиза, попробуйте по нажимать на ветки и будет понятно как и где искать))<br />для начала думаю достаточно</p><p>ещё ссылка в ней все платы, выбрать свою из главного её не видно, поэтому такие трудности<br /><a href="https://github.com/espressif/esp-at/releases/">https://github.com/espressif/esp-at/releases/</a></p><p>Вот то место где лежат все прошивки без GitHub напрямую<br /><a href="https://docs.espressif.com/projects/esp-at/en/release-v2.3.0.0_esp8266/AT_Binary_Lists/ESP8266_AT_binaries.html">https://docs.espressif.com/projects/esp … aries.html</a><br />Кто не читает иглиш переводчик гугла справится</p>]]></summary>
			<author>
				<name><![CDATA[Okruru]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3955</uri>
			</author>
			<updated>2025-12-18T17:58:07Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=720&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Многозадачность PubSubClient.h]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=697&amp;action=new" />
			<summary type="html"><![CDATA[<p>Добрый день!<br />Подскажите, пожалуйста, кто знает.<br />Делаю проект, в котором esp8266 выступает в роли контроллера управления звуковым процессором по i2c, с управлением по ir, энкодером, oled экраном. Параллельно нужно управление по mqtt. <br />Отдельно все работает, но, как только пытаюсь совместить - начинаются проблемы. Нет нормального описания PubSubClient.h, соответственно, не понятен ее алгоритм работы. Если нет коннекта - все висит и ждет коннекта, приоритет в работе у mqtt, и т.д.<br />В какую сторону копать так, чтобы настроить работу PubSubClient.h таким образом, чтобы она не мешала основному коду?<br />Спасибо!</p>]]></summary>
			<author>
				<name><![CDATA[introway]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=3342</uri>
			</author>
			<updated>2025-04-02T06:55:18Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=697&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Работа с WIFI ESP8266(gyverPortal)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=677&amp;action=new" />
			<summary type="html"><![CDATA[<p>Добрый день делаю проект на ESP8266. Её использую для вывода информации на дисплей OLED 128x64 и отправки на сайт некоторых значений, для простой постройки WEB странички куда будет приходить информация использую библиотеку GyverPortal.h. Столкнулся со следующей проблемой, а именно в скетче я указал название и пароль от своей wifi сети, когда ESP находится в зоне действия вай фай сети-то всё ок(ESP без проблем к ней подключается и запускается основной скетч и функция void loop). Но когда домашняя сеть не добивает до ESP она бесконечно пытается подключиться к ней и блокирует основной цикл программы. Хотелось бы узнать, можно ли сделать так чтобы ESP сначала полностью запускалась и выполняла задали скетча, а затем уже пыталась подключиться к сети WIFI (а если подключиться не удается,то повторить попытку через определенный промежуток времени).<br /></p><div class="codebox"><pre><code>#include &lt;Wire.h&gt;                       // Подключение библиотеки Wire
#include &lt;Adafruit_GFX.h&gt;               // Подключение библиотеки Adafruit_GFX
#include &lt;Adafruit_SSD1306.h&gt;           // Подключение библиотеки Adafruit_SSD1306
#include &lt;microDS18B20.h&gt;
#include &lt;Servo.h&gt;
#include &lt;ESP8266WiFi.h&gt;
#include &lt;GyverPortal.h&gt;

#define AP_SSID &quot;iPhone&quot; //имя сети
#define AP_PASS &quot;12345678&quot; //пароль
GyverPortal ui;

MicroDS18B20&lt;0&gt; sensor;
Servo myservo;

int temp, pos,i_dig,i_sum,i_iz,n;
float v,i_su,i_di,i_i,f,tempera;
long V;
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 
#define OLED_RESET     13 
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, OLED_RESET);
int nmin = 25;
int nmax = 60;

int analogInput = A0; 

float vout = 0.0;
float vin = 0.0;
float R1 = 98700;                // Resistor R1 100k 
float R2 = 9740;                 // Resistor R2 10k
int value = 0;

void build() {
  GP.BUILD_BEGIN(GP_DARK);
GP.ONLINE_CHECK();
GP.UPDATE(&quot;tempr,voltes,position&quot;);
  GP.TITLE(&quot;IZH Jupiter-4&quot;, &quot;t1&quot;);
  GP.HR();

GP_MAKE_BLOCK_TAB(
&quot;Блок настроек&quot;,
GP.LABEL(&quot;Настройки холостого хода&quot;);
GP_MAKE_BOX(GP.LABEL(&quot;Мин.температура&quot;);     GP.NUMBER(&quot;num&quot;, &quot;&quot;, nmin);    );
GP_MAKE_BOX(GP.LABEL(&quot;Макс.температура&quot;);    GP.NUMBER(&quot;num1&quot;,&quot;&quot;,nmax);     );
);
GP_MAKE_BLOCK_TAB(
&quot;Блок показателей&quot;,
GP.LABEL(&quot;Показатели&quot;);
GP_MAKE_BOX(GP.LABEL(&quot;Температура&quot;);       GP.LABEL(&quot;tempr&quot;, &quot;tempr&quot;);         );
GP_MAKE_BOX(GP.LABEL(&quot;Напряжение&quot;);        GP.LABEL(&quot;voltes&quot;, &quot;voltes&quot;);       );
GP_MAKE_BOX(GP.LABEL(&quot;Положение серво&quot;);   GP.LABEL(&quot;position&quot;, &quot;position&quot;);   );
)

  GP.BUILD_END();
}
void setup() {
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3c); // Указываем адрес дисплея
  pinMode(analogInput, INPUT);

  WiFi.mode(WIFI_STA);
  WiFi.begin(AP_SSID, AP_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(&quot;.&quot;);
  }
  Serial.println(WiFi.localIP());

  // подключаем конструктор и запускаем
  ui.attachBuild(build);
  ui.attach(action);
  ui.start();

    myservo.attach(2);
    myservo.write(0);
}
ui.updateFloat(&quot;tempr&quot;, tempera);
ui.updateFloat(&quot;voltes&quot;,i_i);
ui.updateInt(&quot;position&quot;,temp);

  if (ui.clickInt(&quot;num&quot;, nmin)) {
      Serial.print(&quot;Number: &quot;);

      Serial.println(nmin);
    }
     if (ui.clickInt(&quot;num1&quot;, nmax)) {
      Serial.print(&quot;Number1: &quot;);

      Serial.println(nmax);
    }
}
void loop() {
ui.tick();
sensor.requestTemp();

pos=map(i_iz,nmin,nmax,180,0);//map полодения сервы в завимости от температуры 
myservo.write(pos);
/////чтение температуры и отделение десятой части/////
v=sensor.getTemp();
V=round(v*10);
i_iz=V/10;
//////мин. и макс. значение температуры для map////
if(i_iz&gt;60){i_iz=60;}
if(i_iz&lt;nmin){i_iz=nmin;}
/////////вольтметр///////////////
 i_di = analogRead(analogInput);
 i_su = i_su+i_di;
 f++;if(f&gt;9){f=0;i_i=i_su/293.0;i_su=0;}
 
tempera = sensor.getTemp();

draw();//вывод на дисплей
}
void draw(){
display.clearDisplay(); 
display.setTextColor(WHITE);

display.setCursor(26,0);  
display.setTextSize(1);                  
display.println(&quot;temperature:&quot;);//текст &quot;температура:&quot;

display.setCursor(15,33);  
display.setTextSize(1);                  
display.println(&quot;pos:&quot;);// текст &quot;положение серво машинки 0-180*&quot;

display.setCursor(78,33);  
display.setTextSize(1);                  
display.println(&quot;volts:&quot;);// текст &quot;напряжение:&quot;

display.setCursor(56,42);  
display.setTextSize(3);                  
display.println(i_i,1);//вывод напряжения             

display.setCursor(25,10);  
display.setTextSize(3);                  
display.println(sensor.getTemp(),1);//вывод температуры 
  
display.setCursor(0,42);                    
display.setTextSize(3);                       
display.println(pos); // вывод положения сервы           
display.display(); 
}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[vladbuharkin20]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2352</uri>
			</author>
			<updated>2024-10-16T13:04:27Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=677&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ESP32 + PCM5102A Интернет радио]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=435&amp;action=new" />
			<summary type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/01/9d5a6754a6b9b5205e325be3360aa20e.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/01/9d5a6754a6b9b5205e325be3360aa20e.png" /></span> </p><br /><p>Управление: энкодер, 2 кнопки</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/01/ab1c8e9900e2f938a924c7087a92db09.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/01/ab1c8e9900e2f938a924c7087a92db09.png" /></span> <br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/01/c25f0d4b26fe60bd4706c3a8d6a5f599.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/01/c25f0d4b26fe60bd4706c3a8d6a5f599.png" /></span> <br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/01/837ca459eb9128d28b205233bb914ace.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/01/837ca459eb9128d28b205233bb914ace.png" /></span> <br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/01/7d42770c163c5415a37fd7fa919ebe4a.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/01/7d42770c163c5415a37fd7fa919ebe4a.png" /></span> <br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/01/6ae6df1c72f6da1dfedef76b2219af88.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/01/6ae6df1c72f6da1dfedef76b2219af88.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/01/577862984566b06587e335ce349077ef.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/01/577862984566b06587e335ce349077ef.png" /></span> </p><div class="codebox"><pre><code>#include &quot;Arduino.h&quot;
#include &quot;WiFi.h&quot;
#include &quot;Audio.h&quot;             // https://github.com/schreibfaul1/ESP32-audioI2S.git
#include &lt;Wire.h&gt; 
#include &lt;LiquidCrystal_I2C.h&gt; // http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=45&amp;download=1
#include &lt;ESP32Encoder.h&gt;      // https://github.com/madhephaestus/ESP32Encoder.git
#include &lt;EEPROM.h&gt;

#define I2S_DOUT      25  // DIN connection
#define I2S_BCLK      27  // Bit clock
#define I2S_LRC       26  // Left Right Clock
#define CLK           19  // CLK ENCODER
#define DT            18  // DT ENCODER
#define SW             5  // SW ENCODER  
#define CH_UP         13  // CH_UP BUTTON 
#define CH_DOWN       12  // CH_DOWN BUTTON    

#define CH             6  // кол-во станций

  Audio audio;
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
  ESP32Encoder encoder;

  String ssid =     &quot;Keenetic-9009&quot;;     // ssid сети WI-FI
  String password = &quot;32481975&quot;;     // пароль от сети WI-FI
  String ch = &quot;connection      &quot;;
  String bitr;
  unsigned long oldPosition  = -999,newPosition,times1;
  bool w=1,w1,ball_1,bass_1,mid_1,treb_1,vol_1;
  int ct,old_ct = 1,menu,ball,bass,mid,treb,vol=15;
  bool e_vol,e_ball,e_bass,e_mid,e_treb,e_ct;
  
  hw_timer_t * timer = NULL;
  portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
  
  const char *listch[]{
  &quot;https://rusradio.hostingradio.ru/rusradio96.aacp&quot;,
  &quot;https://str.pcradio.ru/funradio_sk_80s90s-hi&quot;,
  &quot;http://radio.promodj.com:8000/186mph-192&quot;,
  &quot;http://live.novoeradio.by:8000/narodnoe-radio-128k&quot;,
  &quot;http://listen1.myradio24.com:9000/3355&quot;,
  &quot;http://101.ru/api/channel/getServers/192/channel/AAC/128/dataFormat/mobile&quot;,
  };

void setup() {
  ESP32Encoder::useInternalWeakPullResistors=UP;
  encoder.attachHalfQuad(DT, CLK);
  encoder.setCount(0);
  Serial.begin(9600);
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid.c_str(), password.c_str());
  lcd.init();lcd.backlight();
  lcd.setCursor(0,0);lcd.print(&quot;  ESP32  RADIO   &quot;);
  lcd.setCursor(0,1);lcd.print(&quot;    PCM5102A     &quot;);
  delay(2000);
  while (WiFi.status() != WL_CONNECTED) delay(100);
  lcd.clear();
  lcd.setCursor(0,0);lcd.print(&quot;IP:&quot;);lcd.print(WiFi.localIP());
  delay(2000);
  lcd.clear();
  EEPROM.begin(10);
  vol = EEPROM.read(0);
  ball = EEPROM.read(1)-16;
  bass = EEPROM.read(2)-40;
  mid = EEPROM.read(3)-40;
  treb = EEPROM.read(4)-40;
  ct = EEPROM.read(5);
  if(vol&gt;21){vol=0;}
  if(ball&gt;16){ball=0;}
  if(bass&gt;16){bass=0;}
  if(mid&gt;16){mid=0;}
  if(treb&gt;16){treb=0;}
  if(ct&gt;CH-1){ct=0;}
  audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
  delay(2000);
  audio.setBalance(ball);//+-16
  audio.setVolume(vol); // 0...21
  audio.setTone(0,0,0);//-40+16
  pinMode(CH_UP, INPUT_PULLUP);
  pinMode(CH_DOWN, INPUT_PULLUP);
  pinMode(SW,INPUT);          // ENCODER SW 
}

void loop(){   
   newPosition = encoder.getCount()/2;
//// ENCODER VOLUME ////////////////////////////////////////////// 
 if(menu==0){ 
 if(newPosition != oldPosition){oldPosition = newPosition;vol=vol-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(vol&gt;21){vol=21;}if(vol&lt;0){vol=0;}audio.setVolume(vol);vol_1=1;e_vol=1;}
    if(vol_1==1){vol_1=0;lcd.setCursor(9,1);lcd.print(&quot;VOL &quot;);lcd.print(vol);lcd.print(&quot; &quot;);}}
///// ENCODER BALANCE ////////////////////////////////////////////
 if(menu==1){ 
 if(newPosition != oldPosition){oldPosition = newPosition;ball=ball-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(ball&gt;16){ball=16;}if(ball&lt;-16){ball=-16;}audio.setBalance(ball);ball_1=1;e_ball=1;}
    if(ball_1==1){ball_1=0;lcd.setCursor(0,0);lcd.print(&quot;BALANCE &quot;);lcd.print(ball);lcd.print(&quot; dB  &quot;);}} 
///// ENCODER BASS ////////////////////////////////////////////
 if(menu==2){ 
 if(newPosition != oldPosition){oldPosition = newPosition;bass=bass-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(bass&gt;16){bass=16;}if(bass&lt;-40){bass=-40;}audio.setTone(bass,mid,treb);bass_1=1;e_bass=1;}
    if(bass_1==1){bass_1=0;lcd.setCursor(0,0);lcd.print(&quot;BASS &quot;);lcd.print(bass);lcd.print(&quot; dB  &quot;);}}
///// ENCODER MIDDLE ////////////////////////////////////////////
 if(menu==3){ 
 if(newPosition != oldPosition){oldPosition = newPosition;mid=mid-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(mid&gt;16){mid=16;}if(mid&lt;-40){mid=-40;}audio.setTone(bass,mid,treb);mid_1=1;e_mid=1;}
    if(mid_1==1){mid_1=0;lcd.setCursor(0,0);lcd.print(&quot;MIDDLE &quot;);lcd.print(mid);lcd.print(&quot; dB  &quot;);}} 
///// ENCODER TREBLE ////////////////////////////////////////////
 if(menu==4){ 
 if(newPosition != oldPosition){oldPosition = newPosition;treb=treb-newPosition;encoder.setCount(0);
    newPosition=0;times1=millis();w1=1;if(treb&gt;16){treb=16;}if(treb&lt;-40){treb=-40;}audio.setTone(bass,mid,treb);treb_1=1;e_treb=1;}
    if(treb_1==1){treb_1=0;lcd.setCursor(0,0);lcd.print(&quot;TREBLE &quot;);lcd.print(treb);lcd.print(&quot; dB  &quot;);}}                 
//// BUTTON //////////////////////////////////////////////   
 if (digitalRead(13)==LOW){ct++;if(ct&gt;CH-1){ct=0;}w=1;times1=millis();w1=1;ch=&quot;connection      &quot;;lcd.setCursor(0,0);lcd.print(ch);menu=0;e_ct=1;}
 if (digitalRead(12)==LOW){ct--;if(ct&lt;0){ct=CH-1;}w=1;times1=millis();w1=1;ch=&quot;connection      &quot;;lcd.setCursor(0,0);lcd.print(ch);menu=0;e_ct=1;Serial.println(ct);}
 if (digitalRead(5)==LOW){menu++;if(menu&gt;4){menu=0;}times1=millis();w1=1;lcd.clear();vol_1=1;ball_1=1;bass_1=1;mid_1=1;treb_1=1;if(menu==0){w=1;}delay(300);}
////////////////////////////////////////////////////////// 
 if (ct != old_ct) {ch!=&quot;connection      &quot;;audio.connecttohost(listch[ct]);Serial.println(ct);old_ct = ct;w=1;}

 if(menu==0){
  if(w==1&amp;&amp;ch!=&quot;connection      &quot;){
  lcd.clear();w=0;
  lcd.setCursor(0,0);lcd.print(ch);
  lcd.setCursor(0,1);lcd.print(&quot;CH&quot;);lcd.print(ct);lcd.print(&quot; &quot;);
  lcd.print(float(bitr.toInt()/1000),0);lcd.print(&quot;k &quot;);
  lcd.setCursor(9,1);lcd.print(&quot;VOL &quot;);lcd.print(vol);lcd.print(&quot; &quot;);
  }}
  
  audio.loop();

//// EEPROM ///////////////////////////////////
  if(millis()-times1&gt;5000&amp;&amp;w1==1){
  if(e_vol==1){e_vol=0;EEPROM.write(0,vol);}
  if(e_ball==1){e_ball=0;EEPROM.write(1,ball+16);}
  if(e_bass==1){e_bass=0;EEPROM.write(2,bass+40);}
  if(e_mid==1){e_mid=0;EEPROM.write(3,mid+40);}
  if(e_treb==1){e_treb=0;EEPROM.write(4,treb+40);}
  if(e_ct==1){e_ct=0;EEPROM.write(5,ct);}
  EEPROM.commit();}
  if(millis()-times1&gt;10000&amp;&amp;w1==1){
  w1=0;if(menu!=0){w=1;menu=0;}}
  
} // loop

void audio_showstation(const char *info) {Serial.print(&quot;station     &quot;); ch=info; Serial.println(info);}
void audio_showstreamtitle(const char *info) {Serial.print(&quot;streamtitle &quot;); Serial.println(info);}
void audio_bitrate(const char *info) {Serial.print(&quot;bitrate     &quot;);bitr = info; Serial.println(info);}
void audio_icyurl(const char *info) {Serial.print(&quot;icyurl      &quot;); Serial.println(info);}
void audio_lasthost(const char *info) {Serial.print(&quot;lasthost    &quot;); Serial.println(info);}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-01-07T06:34:06Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=435&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Библиотека ESP32_TM1637_4LED]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=434&amp;action=new" />
			<summary type="html"><![CDATA[<p><span class="attention-yellow"></span> </p><br /><p>ESP32_TM1637_4LED.h</p><div class="codebox"><pre><code>//  ESP32_TM1637_4LED
//  Alexander Liman
//  liman324@yandex.ru
//  rcl-radio.ru

#ifndef  ESP32_TM1637_4LED_H
#define  ESP32_TM1637_4LED_H

#include &lt;Arduino.h&gt;

#define CODE0    0b10001000
#define CODE1    0x40
#define ADDR0    0xC0

class  ESP32_TM1637_4LED
  {
    public:

  ESP32_TM1637_4LED(uint8_t, uint8_t);
  void print(int t, byte pd_t,   int h0, int h1, int h2, int h3);
  void brig(byte br);
  
    private:
  
  void dec(byte dig);
  void stop();
  void start();
  void del();
  byte qwer;
  uint8_t DIO;
  uint8_t CLK;
  };
#endif</code></pre></div><p>ESP32_TM1637_4LED.cpp</p><div class="codebox"><pre><code>#include &lt;ESP32_TM1637_4LED.h&gt;

ESP32_TM1637_4LED::ESP32_TM1637_4LED(uint8_t clk, uint8_t dio){
         CLK = clk;
         DIO = dio;
};

void ESP32_TM1637_4LED::brig(byte br){
     qwer = br + CODE0;
  }

void ESP32_TM1637_4LED::del(){delayMicroseconds(100);}


void ESP32_TM1637_4LED::dec(byte dig){
       for(int i = 0; i &lt; 8; i++) {
         pinMode(CLK,OUTPUT);del();
       if (dig &amp; 0x01)
         pinMode(DIO,INPUT);
       else
         pinMode(DIO,OUTPUT);del();
         pinMode(CLK,INPUT);del();
         dig = dig &gt;&gt; 1;
  }
         pinMode(CLK,OUTPUT);
         pinMode(DIO,INPUT);del();
         pinMode(CLK,INPUT);del();

       
       if (digitalRead(DIO) == 0)
         pinMode(DIO,OUTPUT);del();
         pinMode(CLK,OUTPUT);del();
  }
            
void ESP32_TM1637_4LED::stop(){
         pinMode(DIO,OUTPUT);del();
         pinMode(CLK,INPUT);del();
         pinMode(DIO,INPUT);del();
  }  

void ESP32_TM1637_4LED::start(){
         pinMode(DIO,OUTPUT);del();
  }


void ESP32_TM1637_4LED::print(int t, byte pd_t,   int h0, int h1, int h2, int h3){
        start();dec(qwer);stop();start();
        dec(CODE1);stop();start();
 
        int data0 = t / 1000 % 10;
        int data1 = t / 100 % 10;
        int data2 = t / 10 % 10;
        int data3 = t % 10;
 
      for(byte n = 0; n &lt; 4; n++){
        int data;
      switch(n){
        case 0: data = data0;break;
        case 1: data = data1;break;
        case 2: data = data2;break;
        case 3: data = data3;break;
        }
 
      switch(data){    // XGFEDCBA
        case 0:  data = 0b00111111;break;     // 0
        case 1:  data = 0b00000110;break;     // 1
        case 2:  data = 0b01011011;break;     // 2
        case 3:  data = 0b01001111;break;     // 3
        case 4:  data = 0b01100110;break;     // 4
        case 5:  data = 0b01101101;break;     // 5
        case 6:  data = 0b01111101;break;     // 6
        case 7:  data = 0b00000111;break;     // 7
        case 8:  data = 0b01111111;break;     // 8
        case 9:  data = 0b01101111;break;     // 9
        }
 
        if(n == 0){data0 = data;}
        if(n == 1){data1 = data;}
        if(n == 2){data2 = data;}
        if(n == 3){data3 = data;}
        }
      switch(pd_t){
        case 1 : data2 = data2+0b10000000;break;
        case 2 : data1 = data1+0b10000000;break;
        case 3 : data0 = data0+0b10000000;break;
        }
        if(h0&gt;=0){data0 = h0;}
        if(h1&gt;=0){data1 = h1;}
        if(h2&gt;=0){data2 = h2;}
        if(h3&gt;=0){data3 = h3;}
      dec(0xC0);dec(data0);dec(data1);dec(data2);dec(data3);stop();
}  </code></pre></div><p>test.ino</p><div class="codebox"><pre><code>#include &lt;ESP32_TM1637_4LED.h&gt;
  ESP32_TM1637_4LED  tm(12,13);// CLK, DIO

void setup() {
  delay(100);
  tm.brig(7); // яркость 0...7
  
}

void loop() {
  tm.print(100,0,  0b01111000,-1,-1,-1);
  delay(100);

}</code></pre></div><p>tm.print(x, dp,&nbsp; &nbsp; h0, h1, h2, h3);<br />x — число от 0 до 9999<br />dp — положение запятой от 0 до 3<br />h0-h3 — замена цифры на символ<br />h0-h3 = -1 замена цифры не происходит</p> <br /><br /><p>Для замены цифры символом можно использовать следующие значения:<br />0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//&nbsp; (пусто)<br />0b01000000&nbsp; // — (минус)<br />0b01110111&nbsp; &nbsp;// A<br />0b01111100&nbsp; &nbsp;// b<br />0b00111001&nbsp; // C<br />0b01011110&nbsp; // d<br />0b01111001&nbsp; // E<br />0b01110001&nbsp; // F<br />0b01111000&nbsp; // t<br />0b01110011&nbsp; // P</p><p>****************************<br />XGFEDCBA<br />0b00000000</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/01/7649cff9e1cb48cee7ef17c8980aca12.png" alt="http://forum.rcl-radio.ru/uploads/images/2022/01/7649cff9e1cb48cee7ef17c8980aca12.png" /></span></p>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-01-04T10:30:07Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=434&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ESP32 + Bluetooth — терморегулятор (2) (доработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=433&amp;action=new" />
			<summary type="html"><![CDATA[<p>Добавлен индикатор TM1637 для вывода показаний температуры</p><p>Основная статья - <a href="http://rcl-radio.ru/?p=92597">http://rcl-radio.ru/?p=92597</a></p><p>Требуется тестирование!!!</p><div class="codebox"><pre><code>#define CLK 12 /// D12  TM1637
#define DIO 13 /// D13  TM1637

#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;Имя_сети&quot;;
  const char* password = &quot;Пароль_сети&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();
  }

 print_time(temper*10,3,7,   0b01111000,-1,-1,-1);
  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 tm_dec(byte dig){
       for(int i = 0; i &lt; 8; i++) {
         pinMode(CLK,OUTPUT);del();
       if (dig &amp; 0x01)
         pinMode(DIO,INPUT);
       else
         pinMode(DIO,OUTPUT);del();
         pinMode(CLK,INPUT);del();
         dig = dig &gt;&gt; 1;
  }
         pinMode(CLK,OUTPUT);
         pinMode(DIO,INPUT);del();
         pinMode(CLK,INPUT);del();

       
       if (digitalRead(DIO) == 0)
         pinMode(DIO,OUTPUT);del();
         pinMode(CLK,OUTPUT);del();
  }  
 
void tm_stop(){
         pinMode(DIO,OUTPUT);del();
         pinMode(CLK,INPUT);del();
         pinMode(DIO,INPUT);del();
  }  
 
void tm_start(){
         pinMode(DIO,OUTPUT);del();
  }

void print_time(int t, byte pd_t, int br,   int h0, int h1, int h2, int h3){
        tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
        tm_dec(0x40);tm_stop();tm_start();
 
        int data0 = t / 1000 % 10;
        int data1 = t / 100 % 10;
        int data2 = t / 10 % 10;
        int data3 = t % 10;
 
      for(byte n = 0; n &lt; 4; n++){
        int data;
      switch(n){
        case 0: data = data0;break;
        case 1: data = data1;break;
        case 2: data = data2;break;
        case 3: data = data3;break;
        }
 
      switch(data){    // XGFEDCBA
        case 0:  data = 0b00111111;break;     // 0
        case 1:  data = 0b00000110;break;     // 1
        case 2:  data = 0b01011011;break;     // 2
        case 3:  data = 0b01001111;break;     // 3
        case 4:  data = 0b01100110;break;     // 4
        case 5:  data = 0b01101101;break;     // 5
        case 6:  data = 0b01111101;break;     // 6
        case 7:  data = 0b00000111;break;     // 7
        case 8:  data = 0b01111111;break;     // 8
        case 9:  data = 0b01101111;break;     // 9
        case 10: data = 0b00000000;break;     // пусто
        case 11: data = 0b01000000;break;     // -
        }
 
        if(n == 0){data0 = data;}
        if(n == 1){data1 = data;}
        if(n == 2){data2 = data;}
        if(n == 3){data3 = data;}
        }
      switch(pd_t){
        case 1 : data2 = data2+0b10000000;break;
        case 2 : data1 = data1+0b10000000;break;
        case 3 : data0 = data0+0b10000000;break;
        }
        if(h0&gt;=0){data0 = h0;}
        if(h1&gt;=0){data1 = h1;}
        if(h2&gt;=0){data2 = h2;}
        if(h3&gt;=0){data3 = h3;}
      tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}  
 
void del(){delayMicroseconds(200);}
 
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>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-01-04T06:46:01Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=433&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ESP32 ретро часы (разработка)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=292&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=97415">http://rcl-radio.ru/?p=97415</a></p><p>Источник +180В</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/03/2becd857450ad23b9a41ebe899673b35.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/03/2becd857450ad23b9a41ebe899673b35.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/03/5fc04ce4fc443b3856a51ac01b1bb21f.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/03/5fc04ce4fc443b3856a51ac01b1bb21f.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/03/cef3e7c22ca2dac25da6494f987ed4f0.jpeg" alt="http://forum.rcl-radio.ru/uploads/images/2021/03/cef3e7c22ca2dac25da6494f987ed4f0.jpeg" /></span> </p><p>ESP32<br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/03/7c76d93afda31fb04e2f44093cddf8ba.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2021/03/7c76d93afda31fb04e2f44093cddf8ba.jpg" /></span> <br />ИН-18<br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/03/de589a45bc54e934532e87a668da14ed.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2021/03/de589a45bc54e934532e87a668da14ed.jpg" /></span> </p><div class="codebox"><pre><code>void setup(){
  ledcSetup(0, 20000, 6);// канал 0, частота 20000гц, 6 бит
  ledcAttachPin(15, 0);// GPIO15, канал 0
  ledcWrite(0, 31); // шим 50% (6 бит = 63)
}

void loop(){
  

}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2021-03-24T03:59:37Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=292&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[ESP8266+WS2811 = часы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=245&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья <a href="http://rcl-radio.ru/?p=91626">http://rcl-radio.ru/?p=91626</a></p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2020/12/39be3e2696b52be2ee9888759e90260d.png" alt="http://forum.rcl-radio.ru/uploads/images/2020/12/39be3e2696b52be2ee9888759e90260d.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2020/12/66edf9b8bff371dc40730dea592c7771.png" alt="http://forum.rcl-radio.ru/uploads/images/2020/12/66edf9b8bff371dc40730dea592c7771.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2020/12/3be2f93644b154af150d4cb5da050408.png" alt="http://forum.rcl-radio.ru/uploads/images/2020/12/3be2f93644b154af150d4cb5da050408.png" /></span> </p><p><span class="attention-yellow"></span> </p><br /><p><strong>SM16703</strong><br /><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2020/12/10d548f86e3e76f12f77e5ecb9f125a2.png" alt="http://forum.rcl-radio.ru/uploads/images/2020/12/10d548f86e3e76f12f77e5ecb9f125a2.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2020/12/62151f111d015b015ad2e86c7378397e.png" alt="http://forum.rcl-radio.ru/uploads/images/2020/12/62151f111d015b015ad2e86c7378397e.png" /></span> </p><p><span class="attention-yellow"></span> </p><div class="codebox"><pre><code>#include &lt;NTPClient.h&gt;
#include &lt;ESP8266WiFi.h&gt; 
#include &lt;WiFiUdp.h&gt; 
#include &lt;Wire.h&gt; 
#include &lt;Adafruit_NeoPixel.h&gt;
 WiFiUDP ntpUDP;
      /////////////////  https://www.ntppool.org/zone/@ - другие сервера  /////////////////////////////
      ///////////////// для России - ru.pool.ntp.org //////////////////////////////////////////////////
 NTPClient timeClient(ntpUDP, &quot;pool.ntp.org&quot;, 21600,3600123);// 21600 - временной сдвиг в секундах от UTC 
 Adafruit_NeoPixel strip = Adafruit_NeoPixel(45, D6, NEO_GRB + NEO_KHZ400);//  трек, D6  
 const char *ssid = &quot;Redmi Note 3&quot;; 
 const char *password = &quot;32481975&quot;;
 String date_time,date;
 unsigned long times;
 int ss,mm,hh,dd,mon,yer,brignes = 250;
 int hear10,hear0,min10,min0,sec10,sec0;
 
void setup(){
  Serial.begin(9600);strip.begin();
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ){delay (500);Serial.print (&quot;.&quot;);timeClient.begin();}
  Serial.print(&quot;ok&quot;);
}
 
void loop(){
  
  //// Time //////////////////////////////////////////
  if(millis()-times&gt;=1000){times=millis();
   while(!timeClient.update()){timeClient.forceUpdate();}
   hh = timeClient.getHours();
   mm = timeClient.getMinutes();
   ss = timeClient.getSeconds();
  date_time = timeClient.getFormattedDate();
  int index_date = date_time.indexOf(&quot;T&quot;);
  date = date_time.substring(0, index_date);
  char charBufVar[11];date.toCharArray(charBufVar, 11);
   dd = int(charBufVar[0]-&#039;0&#039;)*10+int(charBufVar[1]-&#039;0&#039;);
   mon = int(charBufVar[3]-&#039;0&#039;)*10+int(charBufVar[4]-&#039;0&#039;);
   yer = int(charBufVar[8]-&#039;0&#039;)*10+int(charBufVar[9]-&#039;0&#039;);
  Serial.println(dd);
  Serial.println(mon);
  Serial.println(yer);
  }
  //// ws2812 /////////////////////////////////////////

 if(ss&gt;10&amp;&amp;ss&lt;15){hear10=dd/10;hear0=dd%10;min10=mon/10;min0=mon%10;sec10=yer/10;sec0=yer%10;}
  else{hear10=hh/10;hear0=hh%10;min10=mm/10;min0=mm%10;sec10=ss/10;sec0=ss%10;}
  
  switch(hear10){   
    case 0: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,1);ws(5,1);ws(6,0);break;
    case 1: ws(0,0);ws(1,1);ws(2,1);ws(3,0);ws(4,0);ws(5,0);ws(6,0);break;
    case 2: ws(0,1);ws(1,2);ws(2,0);ws(3,1);ws(4,1);ws(5,0);ws(6,1);break;
    case 3: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,0);ws(5,0);ws(6,1);break;
    case 4: ws(0,0);ws(1,1);ws(2,1);ws(3,0);ws(4,0);ws(5,1);ws(6,1);break;
    case 5: ws(0,1);ws(1,0);ws(2,1);ws(3,1);ws(4,0);ws(5,1);ws(6,1);break;
    case 6: ws(0,1);ws(1,0);ws(2,1);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;
    case 7: ws(0,1);ws(1,1);ws(2,1);ws(3,0);ws(4,0);ws(5,0);ws(6,0);break;
    case 8: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;
    case 9: ws(0,1);ws(1,1);ws(2,1);ws(3,1);ws(4,0);ws(5,1);ws(6,1);break;
   case 10: ws(0,0);ws(1,0);ws(2,0);ws(3,0);ws(4,0);ws(5,0);ws(6,0);break;// &quot; &quot;
   case 11: ws(0,0);ws(1,0);ws(2,0);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;// &quot;t&quot;
   case 12: ws(0,1);ws(1,1);ws(2,0);ws(3,0);ws(4,1);ws(5,1);ws(6,1);break;// &quot;P&quot;
   case 13: ws(0,0);ws(1,1);ws(2,1);ws(3,0);ws(4,1);ws(5,1);ws(6,1);break;// &quot;H&quot;
   case 14: ws(0,1);ws(1,0);ws(2,0);ws(3,1);ws(4,1);ws(5,1);ws(6,1);break;// &quot;C&quot;
   case 15: ws(0,1);ws(1,1);ws(2,0);ws(3,0);ws(4,0);ws(5,1);ws(6,1);break;// градус
    }
   switch(hear0){   
    case 0: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,1);ws(12,1);ws(13,0);break;
    case 1: ws(7,0);ws(8,1);ws(9,1);ws(10,0);ws(11,0);ws(12,0);ws(13,0);break;
    case 2: ws(7,1);ws(8,2);ws(9,0);ws(10,1);ws(11,1);ws(12,0);ws(13,1);break;
    case 3: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,0);ws(12,0);ws(13,1);break;
    case 4: ws(7,0);ws(8,1);ws(9,1);ws(10,0);ws(11,0);ws(12,1);ws(13,1);break;
    case 5: ws(7,1);ws(8,0);ws(9,1);ws(10,1);ws(11,0);ws(12,1);ws(13,1);break;
    case 6: ws(7,1);ws(8,0);ws(9,1);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;
    case 7: ws(7,1);ws(8,1);ws(9,1);ws(10,0);ws(11,0);ws(12,0);ws(13,0);break;
    case 8: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;
    case 9: ws(7,1);ws(8,1);ws(9,1);ws(10,1);ws(11,0);ws(12,1);ws(13,1);break;
   case 10: ws(7,0);ws(8,0);ws(9,0);ws(10,0);ws(11,0);ws(12,0);ws(13,0);break;// &quot; &quot;
   case 11: ws(7,0);ws(8,0);ws(9,0);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;// &quot;t&quot;
   case 12: ws(7,1);ws(8,1);ws(9,0);ws(10,0);ws(11,1);ws(12,1);ws(13,1);break;// &quot;P&quot;
   case 13: ws(7,0);ws(8,1);ws(9,1);ws(10,0);ws(11,1);ws(12,1);ws(13,1);break;// &quot;H&quot;
   case 14: ws(7,1);ws(8,0);ws(9,0);ws(10,1);ws(11,1);ws(12,1);ws(13,1);break;// &quot;C&quot;
   case 15: ws(7,1);ws(8,1);ws(9,0);ws(10,0);ws(11,0);ws(12,1);ws(13,1);break;// градус   
    } 
     
    strip.setPixelColor(14, strip.Color(brignes, brignes, brignes));
    strip.setPixelColor(15, strip.Color(brignes, brignes, brignes));
    
   switch(min10){   
    case 0: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,1);ws(21,1);ws(22,0);break;
    case 1: ws(16,0);ws(17,1);ws(18,1);ws(19,0);ws(20,0);ws(21,0);ws(22,0);break;
    case 2: ws(16,1);ws(17,2);ws(18,0);ws(19,1);ws(20,1);ws(21,0);ws(22,1);break;
    case 3: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,0);ws(21,0);ws(22,1);break;
    case 4: ws(16,0);ws(17,1);ws(18,1);ws(19,0);ws(20,0);ws(21,1);ws(22,1);break;
    case 5: ws(16,1);ws(17,0);ws(18,1);ws(19,1);ws(20,0);ws(21,1);ws(22,1);break;
    case 6: ws(16,1);ws(17,0);ws(18,1);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;
    case 7: ws(16,1);ws(17,1);ws(18,1);ws(19,0);ws(20,0);ws(21,0);ws(22,0);break;
    case 8: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;
    case 9: ws(16,1);ws(17,1);ws(18,1);ws(19,1);ws(20,0);ws(21,1);ws(22,1);break;
   case 10: ws(16,0);ws(17,0);ws(18,0);ws(19,0);ws(20,0);ws(21,0);ws(22,0);break;// &quot; &quot; 
   case 11: ws(16,0);ws(17,0);ws(18,0);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;// &quot;t&quot; 
   case 12: ws(16,1);ws(17,1);ws(18,0);ws(19,0);ws(20,1);ws(21,1);ws(22,1);break;// &quot;P&quot;
   case 13: ws(16,0);ws(17,1);ws(18,1);ws(19,0);ws(20,1);ws(21,1);ws(22,1);break;// &quot;H&quot;
   case 14: ws(16,1);ws(17,0);ws(18,0);ws(19,1);ws(20,1);ws(21,1);ws(22,1);break;// &quot;C&quot;
   case 15: ws(16,1);ws(17,1);ws(18,0);ws(19,0);ws(20,0);ws(21,1);ws(22,1);break;// градус  
    }
   switch(min0){   
    case 0: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,1);ws(28,1);ws(29,0);break;
    case 1: ws(23,0);ws(24,1);ws(25,1);ws(26,0);ws(27,0);ws(28,0);ws(29,0);break;
    case 2: ws(23,1);ws(24,2);ws(25,0);ws(26,1);ws(27,1);ws(28,0);ws(29,1);break;
    case 3: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,0);ws(28,0);ws(29,1);break;
    case 4: ws(23,0);ws(24,1);ws(25,1);ws(26,0);ws(27,0);ws(28,1);ws(29,1);break;
    case 5: ws(23,1);ws(24,0);ws(25,1);ws(26,1);ws(27,0);ws(28,1);ws(29,1);break;
    case 6: ws(23,1);ws(24,0);ws(25,1);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;
    case 7: ws(23,1);ws(24,1);ws(25,1);ws(26,0);ws(27,0);ws(28,0);ws(29,0);break;
    case 8: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;
    case 9: ws(23,1);ws(24,1);ws(25,1);ws(26,1);ws(27,0);ws(28,1);ws(29,1);break;
   case 10: ws(23,0);ws(24,0);ws(25,0);ws(26,0);ws(27,0);ws(28,0);ws(29,0);break;// &quot; &quot; 
   case 11: ws(23,0);ws(24,0);ws(25,0);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;// &quot;t&quot; 
   case 12: ws(23,1);ws(24,1);ws(25,0);ws(26,0);ws(27,1);ws(28,1);ws(29,1);break;// &quot;P&quot;
   case 13: ws(23,0);ws(24,1);ws(25,1);ws(26,0);ws(27,1);ws(28,1);ws(29,1);break;// &quot;H&quot;
   case 14: ws(23,1);ws(24,0);ws(25,0);ws(26,1);ws(27,1);ws(28,1);ws(29,1);break;// &quot;C&quot;
   case 15: ws(23,1);ws(24,1);ws(25,0);ws(26,0);ws(27,0);ws(28,1);ws(29,1);break;// градус  
    } 

    strip.setPixelColor(30, strip.Color(brignes, brignes, brignes));

   switch(sec10){   
    case 0: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,1);ws(36,1);ws(37,0);break;
    case 1: ws(31,0);ws(32,1);ws(33,1);ws(34,0);ws(35,0);ws(36,0);ws(37,0);break;
    case 2: ws(31,1);ws(32,2);ws(33,0);ws(34,1);ws(35,1);ws(36,0);ws(37,1);break;
    case 3: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,0);ws(36,0);ws(37,1);break;
    case 4: ws(31,0);ws(32,1);ws(33,1);ws(34,0);ws(35,0);ws(36,1);ws(37,1);break;
    case 5: ws(31,1);ws(32,0);ws(33,1);ws(34,1);ws(35,0);ws(36,1);ws(37,1);break;
    case 6: ws(31,1);ws(32,0);ws(33,1);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;
    case 7: ws(31,1);ws(32,1);ws(33,1);ws(34,0);ws(35,0);ws(36,0);ws(37,0);break;
    case 8: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;
    case 9: ws(31,1);ws(32,1);ws(33,1);ws(34,1);ws(35,0);ws(36,1);ws(37,1);break;
   case 10: ws(31,0);ws(32,0);ws(33,0);ws(34,0);ws(35,0);ws(36,0);ws(37,0);break;// &quot; &quot; 
   case 11: ws(31,0);ws(32,0);ws(33,0);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;// &quot;t&quot; 
   case 12: ws(31,1);ws(32,1);ws(33,0);ws(34,0);ws(35,1);ws(36,1);ws(37,1);break;// &quot;P&quot;
   case 13: ws(31,0);ws(32,1);ws(33,1);ws(34,0);ws(35,1);ws(36,1);ws(37,1);break;// &quot;H&quot;
   case 14: ws(31,1);ws(32,0);ws(33,0);ws(34,1);ws(35,1);ws(36,1);ws(37,1);break;// &quot;C&quot;
   case 15: ws(31,1);ws(32,1);ws(33,0);ws(34,0);ws(35,0);ws(36,1);ws(37,1);break;// градус    
    }
   switch(sec0){   
    case 0: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,1);ws(43,1);ws(44,0);break;
    case 1: ws(38,0);ws(39,1);ws(40,1);ws(41,0);ws(42,0);ws(43,0);ws(44,0);break;
    case 2: ws(38,1);ws(39,2);ws(40,0);ws(41,1);ws(42,1);ws(43,0);ws(44,1);break;
    case 3: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,0);ws(43,0);ws(44,1);break;
    case 4: ws(38,0);ws(39,1);ws(40,1);ws(41,0);ws(42,0);ws(43,1);ws(44,1);break;
    case 5: ws(38,1);ws(39,0);ws(40,1);ws(41,1);ws(42,0);ws(43,1);ws(44,1);break;
    case 6: ws(38,1);ws(39,0);ws(40,1);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;
    case 7: ws(38,1);ws(39,1);ws(40,1);ws(41,0);ws(42,0);ws(43,0);ws(44,0);break;
    case 8: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;
    case 9: ws(38,1);ws(39,1);ws(40,1);ws(41,1);ws(42,0);ws(43,1);ws(44,1);break;
   case 10: ws(38,0);ws(39,0);ws(40,0);ws(41,0);ws(42,0);ws(43,0);ws(44,0);break;// &quot; &quot; 
   case 11: ws(38,0);ws(39,0);ws(40,0);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;// &quot;t&quot; 
   case 12: ws(38,1);ws(39,1);ws(40,0);ws(41,0);ws(42,1);ws(43,1);ws(44,1);break;// &quot;P&quot;
   case 13: ws(38,0);ws(39,1);ws(40,1);ws(41,0);ws(42,1);ws(43,1);ws(44,1);break;// &quot;H&quot;
   case 14: ws(38,1);ws(39,0);ws(40,0);ws(41,1);ws(42,1);ws(43,1);ws(44,1);break;// &quot;C&quot;
   case 15: ws(38,1);ws(39,1);ws(40,0);ws(41,0);ws(42,0);ws(43,1);ws(44,1);break;// градус    
    } 
  strip.show();
  delay(100);
  }

 void ws(int ind, bool datt){
  if(datt==1){strip.setPixelColor(ind, strip.Color(brignes, brignes, brignes));}
  if(datt==0){strip.setPixelColor(ind, strip.Color(0, 0, 0));}
  } </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2020-12-09T17:01:01Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=245&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Умный дом]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=101&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=67860">http://rcl-radio.ru/?p=67860</a></p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2019/12/f83c13a93db8fe5300bdb1e728384ec3.png" alt="http://forum.rcl-radio.ru/uploads/images/2019/12/f83c13a93db8fe5300bdb1e728384ec3.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2019/12/605080f17351f4a07b45e19e67826a95.png" alt="http://forum.rcl-radio.ru/uploads/images/2019/12/605080f17351f4a07b45e19e67826a95.png" /></span> </p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2019/12/e9152e7dde1086982a5fd64ab6d36447.png" alt="http://forum.rcl-radio.ru/uploads/images/2019/12/e9152e7dde1086982a5fd64ab6d36447.png" /></span> </p><p><span class="postimg"><img src="http://rcl-radio.ru/wp-content/uploads/2018/08/%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-2018-08-29-184536.png" alt="http://rcl-radio.ru/wp-content/uploads/2018/08/%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-2018-08-29-184536.png" /></span></p><div class="codebox"><pre><code>#include &lt;ESP8266WiFi.h&gt;
#include &lt;WiFiClient.h&gt;
#include &lt;NTPClient.h&gt;
#include &lt;WiFiUdp.h&gt;
#include &lt;ESP8266WebServer.h&gt;
#include &lt;ESP8266mDNS.h&gt;
#include &lt;OneWire.h&gt;//https://github.com/PaulStoffregen/OneWire/archive/master.zip
#include &lt;DallasTemperature.h&gt;
#include &lt;EEPROM.h&gt;
OneWire oneWire1(14);// D5 вход датчика 18b20
OneWire oneWire2(5); // D1 вход датчика 18b20
DallasTemperature temp1(&amp;oneWire1);
DallasTemperature temp2(&amp;oneWire2);
MDNSResponder mdns;
 WiFiUDP ntpUDP;
// впишите сюда данные, соответствующие вашей сети:
const char* ssid = &quot;Redmi Note 3&quot;;
const char* password = &quot;32481975&quot;;
 ESP8266WebServer server(80);
 NTPClient timeClient(ntpUDP, &quot;pool.ntp.org&quot;, 21600,3600123);
 
//unsigned long times;
String webPage = &quot;&quot;,t,date_time,date;
int hh,mm,ss;

int time1_sum,time1of_sum,time2_sum,time2of_sum,time3_sum,time3of_sum,time4_sum,time4of_sum,time5_sum,time5of_sum;
int time_ds,temper1,temper2,reg_t1,reg_t2,gis=1,res=1000,list=1;
String d0=&quot;OFF&quot;,d1=&quot;OFF&quot;,d2=&quot;OFF&quot;,d3=&quot;OFF&quot;,d4=&quot;OFF&quot;,ind1,ind2;
int stop_d0,stop_d3,stop_d6,stop_d7,stop_d8;
int h1,m1,h1of,m1of,h2,m2,h2of,m2of,h3,m3,h3of,m3of,h4,m4,h4of,m4of,h5,m5,h5of,m5of;
int socket16,socket0,socket12,socket13,socket15;

 
void setup(void){
  EEPROM.begin(512);
  reg_t1=EEPROM.read(0);
  socket16=EEPROM.read(1);socket0=EEPROM.read(2);socket12=EEPROM.read(3);socket13=EEPROM.read(4);socket15=EEPROM.read(5);
  h1=EEPROM.read(10);m1=EEPROM.read(11);h1of=EEPROM.read(12);m1of=EEPROM.read(13);
  h2=EEPROM.read(14);m2=EEPROM.read(15);h2of=EEPROM.read(16);m2of=EEPROM.read(17);
  h3=EEPROM.read(18);m3=EEPROM.read(19);h3of=EEPROM.read(20);m3of=EEPROM.read(21);
  h4=EEPROM.read(22);m4=EEPROM.read(23);h4of=EEPROM.read(24);m4of=EEPROM.read(25);
  h5=EEPROM.read(26);m5=EEPROM.read(27);h5of=EEPROM.read(28);m5of=EEPROM.read(29);
  res=EEPROM.read(30);reg_t2=EEPROM.read(31);
  
  pinMode(16, OUTPUT);digitalWrite(16, LOW);
  pinMode(0, OUTPUT);digitalWrite(0, LOW);
  pinMode(12, OUTPUT);digitalWrite(12, LOW);
  pinMode(13, OUTPUT);digitalWrite(13, LOW);
  pinMode(15, OUTPUT);digitalWrite(15, LOW);
  pinMode(4, OUTPUT);digitalWrite(4, LOW);
  pinMode(2, OUTPUT);digitalWrite(2, LOW);
   temp1.begin();temp1.setResolution(10);//10 бит  
   temp2.begin();temp2.setResolution(10);//10 бит
   delay(1000);
  Serial.begin(9600);
  WiFi.begin(ssid, password);
  Serial.println(&quot;&quot;);
   while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(&quot;.&quot;);}
  Serial.println(&quot;&quot;);
  Serial.print(&quot;Connected to &quot;);  
  Serial.println(ssid);
  Serial.print(&quot;IP address: &quot;);  
  Serial.println(WiFi.localIP());
   timeClient.begin();
  if (mdns.begin(&quot;esp8266&quot;, WiFi.localIP())) {Serial.println(&quot;MDNS responder started&quot;);}

  server.on(&quot;/&quot;, [](){;web();});
  server.on(&quot;/temperatura&quot;, [](){list=1;web();});
  server.on(&quot;/rele&quot;, [](){list=2;web();});
  server.on(&quot;/rele_time&quot;, [](){list=3;web();});
  server.on(&quot;/obn&quot;, [](){web();});
  server.on(&quot;/restart_off&quot;, [](){res=1000;web();});
  server.on(&quot;/restart_10_on&quot;, [](){res=10;web();});
  server.on(&quot;/restart_30_on&quot;, [](){res=30;web();});
  server.on(&quot;/restart_60_on&quot;, [](){res=60;web();});
  server.on(&quot;/socket16On&quot;, [](){socket16=1;web();});
  server.on(&quot;/socket16Off&quot;, [](){socket16=0;web();});
  server.on(&quot;/socket0On&quot;, [](){socket0=1;web();});
  server.on(&quot;/socket0Off&quot;, [](){socket0=0;web();});
  server.on(&quot;/socket12On&quot;, [](){socket12=1;web();});
  server.on(&quot;/socket12Off&quot;, [](){socket12=0;web();});
  server.on(&quot;/socket13On&quot;,  [](){socket13=1;web();});
  server.on(&quot;/socket13Off&quot;,  [](){socket13=0;web();});
  server.on(&quot;/socket15On&quot;,  [](){socket15=1;web();});
  server.on(&quot;/socket15Off&quot;,  [](){socket15=0;web();});
  server.on(&quot;/eeprom&quot;, [](){EEPROM.begin(512);EEPROM.write(0,reg_t1);
  EEPROM.write(1,socket16);EEPROM.write(2,socket0);EEPROM.write(3,socket12);EEPROM.write(4,socket13);EEPROM.write(5,socket15);
  EEPROM.write(10,h1);EEPROM.write(11,m1);EEPROM.write(12,h1of);EEPROM.write(13,m1of);
  EEPROM.write(14,h2);EEPROM.write(15,m2);EEPROM.write(16,h2of);EEPROM.write(17,m2of);
  EEPROM.write(18,h3);EEPROM.write(19,m3);EEPROM.write(20,h3of);EEPROM.write(21,m3of);
  EEPROM.write(22,h4);EEPROM.write(23,m4);EEPROM.write(24,h4of);EEPROM.write(25,m4of);
  EEPROM.write(26,h5);EEPROM.write(27,m5);EEPROM.write(28,h5of);EEPROM.write(29,m5of);EEPROM.write(30,res);EEPROM.write(31,reg_t2);
  EEPROM.commit();web();});
  
  server.begin();
  Serial.println(&quot;HTTP server started&quot;);
}
  
void loop(){ sumbit();
   temp1.requestTemperatures();temper1=temp1.getTempCByIndex(0); // измерение температуры 18B20
   temp2.requestTemperatures();temper2=temp2.getTempCByIndex(0); // измерение температуры 18B20
    if(reg_t1 &gt;= temper1 + gis){digitalWrite(2,HIGH);}
    if(reg_t1 &lt;= temper1 - gis){digitalWrite(2,LOW);}
    if(reg_t2 &gt;= temper2 + gis){digitalWrite(4,HIGH);}
    if(reg_t2 &lt;= temper2 - gis){digitalWrite(4,LOW);}
  timeClient.update();
  t = timeClient.getFormattedDate();
   date_time = timeClient.getFormattedDate();
   int index_date = date_time.indexOf(&quot;T&quot;);
   date = date_time.substring(0, index_date);
   hh = timeClient.getHours();
   mm = timeClient.getMinutes();
   ss = timeClient.getSeconds();

  time_ds=hh*100+mm;// время как число
   time1_sum=h1*100+m1;
   time1of_sum=h1of*100+m1of;
   time2_sum=h2*100+m2;
   time2of_sum=h2of*100+m2of;
   time3_sum=h3*100+m3;
   time3of_sum=h3of*100+m3of;
   time4_sum=h4*100+m4;
   time4of_sum=h4of*100+m4of;
   time5_sum=h5*100+m5;
   time5of_sum=h5of*100+m5of;
 
   if(time1_sum==time1of_sum){stop_d0=1;} else{stop_d0=0;if(time_ds&gt;=time1_sum&amp;&amp;time_ds&lt;time1of_sum){digitalWrite(16,HIGH);}else{digitalWrite(16,LOW);}}
   if(time2_sum==time2of_sum){stop_d3=1;} else{stop_d3=0;if(time_ds&gt;=time2_sum&amp;&amp;time_ds&lt;time2of_sum){digitalWrite(0,HIGH);}else{digitalWrite(0,LOW);}}
   if(time3_sum==time3of_sum){stop_d6=1;} else{stop_d6=0;if(time_ds&gt;=time3_sum&amp;&amp;time_ds&lt;time3of_sum){digitalWrite(12,HIGH);}else{digitalWrite(12,LOW);}}
   if(time4_sum==time4of_sum){stop_d7=1;} else{stop_d7=0;if(time_ds&gt;=time4_sum&amp;&amp;time_ds&lt;time4of_sum){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}}
   if(time5_sum==time5of_sum){stop_d8=1;} else{stop_d8=0;if(time_ds&gt;=time5_sum&amp;&amp;time_ds&lt;time5of_sum){digitalWrite(15,HIGH);}else{digitalWrite(15,LOW);}}
 
   if(socket16==1&amp;&amp;stop_d0==1){digitalWrite(16, HIGH);}if(socket16==0&amp;&amp;stop_d0==1){digitalWrite(16, LOW);}
   if(socket0==1&amp;&amp;stop_d3==1){digitalWrite(0, HIGH);}if(socket0==0&amp;&amp;stop_d3==1){digitalWrite(0, LOW);}
   if(socket12==1&amp;&amp;stop_d6==1){digitalWrite(12, HIGH);}if(socket12==0&amp;&amp;stop_d6==1){digitalWrite(12, LOW);}
   if(socket13==1&amp;&amp;stop_d7==1){digitalWrite(13, HIGH);}if(socket13==0&amp;&amp;stop_d7==1){digitalWrite(13, LOW);}
   if(socket15==1&amp;&amp;stop_d8==1){digitalWrite(15, HIGH);}if(socket15==0&amp;&amp;stop_d8==1){digitalWrite(15, LOW);}
  
  server.handleClient();
}

void web(){sumbit();
    
String webPage = &quot;&lt;!DOCTYPE HTML&gt;&lt;html&gt;&quot;;
       webPage += &quot;&lt;script src=&#039;//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js&#039;&gt;&lt;/script&gt;&quot;;
       webPage += &quot;&lt;meta charset=&#039;utf-8&#039;&gt;&lt;meta name=&#039;viewport&#039; content=&#039;width=480, user-scalable=no&#039; /&gt;&quot;;
       webPage += &quot;&lt;meta http-equiv=&#039;Cache-Control&#039; content=&#039;private&#039;&gt;&quot;;
       if(list==1){
       webPage += &quot;&lt;meta http-equiv=&#039;Refresh&#039; content=&#039;&quot;;
       webPage += res;
       webPage += &quot;; URL=/obn&#039; /&gt;&quot;;}

       //style
       webPage += &quot;&lt;head&gt;&lt;style&gt;.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}&quot;;
       webPage += &quot;#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}&quot;;
       webPage += &quot;#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}&quot;;
       webPage += &quot;#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
       webPage += &quot;#menu1 a:hover{color:#fff; background:#555;}&quot;;
       webPage += &quot;#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}&quot;;
       webPage += &quot;&lt;/style&gt;&lt;/head&gt;&quot;;
        // menu
       webPage += &quot;&lt;table  bgcolor=&#039;#4682B4&#039; align=&#039;center&#039; width=&#039;470&#039;  border=&#039;0&#039; cellspacing=&#039;0&#039; cellpadding=&#039;0&#039; &gt;&lt;td&gt;&quot;;
       webPage += &quot;&lt;ul id=&#039;menu1&#039;&gt;&quot;;
       webPage += &quot;&lt;li&gt;&lt;a &lt;a href=\&quot;temperatura\&quot;&gt;Терморегулятор&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;&quot;;
       webPage += &quot;&lt;li&gt;&lt;a href=\&quot;rele\&quot;&gt;Управление реле&lt;/a&gt;&lt;/li&gt;&quot;;
       webPage += &quot;&lt;li&gt;&lt;a href=\&quot;rele_time\&quot;&gt;Реле времени&lt;/a&gt;&lt;/li&gt;&quot;;
       webPage += &quot;&lt;li&gt;&lt;b&gt;ESP8266&lt;/b&gt;&lt;/li&gt;&quot;;
       webPage += &quot;&lt;/ul&gt;&lt;/td&gt;&quot;;
       webPage += &quot;&lt;/table&gt;&lt;br&gt;&quot;;
       // end nemu

       if(list==1){ // temperatura
   if(reg_t1&lt;=0){reg_t1=0;}if(reg_t1&gt;=125){reg_t1=125;}
   if(reg_t1 &gt;= temper1 + gis){ind1=&quot; ВКЛ&quot;;}
   if(reg_t1 &lt;= temper1 - gis){ind1=&quot; ВЫКЛ&quot;;}
   
   if(reg_t2&lt;=0){reg_t2=0;}if(reg_t2&gt;=125){reg_t2=125;}
   if(reg_t2 &gt;= temper2 + gis){ind2=&quot; ВКЛ&quot;;}
   if(reg_t2&lt;= temper2 - gis){ind2=&quot; ВЫКЛ&quot;;}
 ///////////////// temp 1//////////////////////
       webPage += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;5&#039;&gt;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;&quot;;
       webPage += &quot;&lt;h1&gt;Терморегулятор 0...125 &amp;#176;C&lt;/td&gt;&lt;tr&gt;&lt;/h1&gt;&quot;;
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;Температура 1&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button&gt;Обновить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;b&gt;&quot;;
       webPage += temper1;
       webPage += &quot; &amp;#176;C&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;Регулировка температуры&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;reg_t1&#039; autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&lt;/input&gt;  &quot;;
       webPage += &quot;&lt;a href=\&quot;temperatura\&quot;&gt;&lt;button&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&lt;/form&gt;&quot;;
       webPage +=&quot;&lt;td align=&#039;center&#039;&gt;&lt;b&gt;&quot;;
       webPage += reg_t1;
       webPage += &quot; &amp;#176;C&lt;/b&gt;&lt;/td&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;Нагрев: &quot;;
       webPage += ind1;
       webPage += &quot;  D4 &lt;/td&gt;&lt;tr&gt;&quot;;
 //////////////// temp 2 ////////////////////////
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;Температура 2&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button&gt;Обновить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;b&gt;&quot;;
       webPage += temper2;
       webPage += &quot; &amp;#176;C&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;Регулировка температуры&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;reg_t2&#039; autocomplete=&#039;off&#039; maxlength=&#039;3&#039; size=&#039;1&#039;&gt;&lt;/input&gt;  &quot;;
       webPage += &quot;&lt;a href=\&quot;temperatura\&quot;&gt;&lt;button&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&lt;/form&gt;&quot;;
       webPage +=&quot;&lt;td align=&#039;center&#039;&gt;&lt;b&gt;&quot;;
       webPage += reg_t2;
       webPage += &quot; &amp;#176;C&lt;/b&gt;&lt;/td&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;Нагрев: &quot;;
       webPage += ind2;
       webPage += &quot;  D2 &lt;/td&gt;&quot;;

       
       webPage +=&quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039;&gt; IP адрес: &quot;;
       webPage += WiFi.localIP().toString();
       webPage +=&quot;&lt;br&gt; Сеть Wi-Fi: &quot;;
       webPage += ssid;
       webPage += &quot;&lt;br&gt; Уровень сигнала: &quot;;
       webPage += WiFi.RSSI();
       webPage += &quot; дБм&lt;br&gt;MAC адрес: &quot;;
       webPage += WiFi.macAddress();
       webPage += &quot;&lt;br&gt;&quot;;

       webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039;&gt;Время Интернет: &quot;;
       webPage += date + &quot; &quot; + hh/10+hh%10 + &quot;:&quot; + mm/10+mm%10 + &quot;:&quot; + ss/10+ss%10;
       webPage += &quot;&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039;&gt;Время Сети: &quot;;
       webPage +=&quot;&lt;script type=&#039;text/javascript&#039;&gt;window.onload = function(){(function(){var date = new Date();var time = date;document.getElementsByTagName(&#039;div&#039;)[0].innerHTML = time;window.setTimeout(arguments.callee, 1000);})();};&lt;/script&gt;&lt;div&gt;&lt;/div&gt;&quot;;
       webPage += &quot;&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       
       webPage += &quot;&lt;td align=&#039;center&#039; colspan=&#039;3&#039;&gt; Автообновление страницы &lt;a href=\&quot;restart_off\&quot;&gt;&lt;button&gt; OFF &lt;/button&gt;&lt;/a&gt; &quot;;
       webPage += &quot; &lt;a href=\&quot;restart_10_on\&quot;&gt;&lt;button&gt; 10 c &lt;/button&gt;&lt;/a&gt; &lt;a href=\&quot;restart_30_on\&quot;&gt;&lt;button&gt; 30 c&lt;/button&gt;&lt;/a&gt; &lt;a href=\&quot;restart_60_on\&quot;&gt;&lt;button&gt; 60 c &lt;/button&gt;&lt;/a&gt; &quot;;
       if(res==1000){webPage += &quot;OFF&quot;;}else{webPage += res;webPage += &quot; c&quot;;}
       webPage +=&quot;&lt;/td&gt;&lt;tr&gt;&quot;; 
       webPage += &quot;&lt;td align=&#039;center&#039; colspan=&#039;3&#039;&gt; Cохранить настройки в энергонезависимую память:  &lt;a href=\&quot;eeprom\&quot;&gt;&lt;button&gt; YES &lt;/button&gt;&lt;/a&gt;&lt;/td&gt; &quot;;
       webPage +=&quot;&lt;/table&gt;&quot;;
}

   if(list==2)  { // rele
 
       webPage += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;5&#039;&gt;&quot;;  
       webPage += &quot;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;&lt;h1&gt;Управление реле&lt;/h1&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;Номер реле (выхода)&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;Вкл/Выкл&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;Выход реле&lt;/td&gt;&quot;;
 
       webPage += &quot;&lt;tr&gt;&lt;td align=&#039;center&#039;&gt;Реле 1 (D0)&lt;/td&gt;&quot;;
       if(stop_d0==1){
       if(socket16==1){d0=&quot; ON&quot;;}if(socket16==0){d0=&quot; OFF&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;socket16On\&quot;&gt;&lt;button&gt;ON&lt;/button&gt;&lt;/a&gt;&quot;;
       webPage += &quot;&lt;a href=\&quot;socket16Off\&quot;&gt;&lt;button&gt;OFF&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;}else{webPage += &quot;&lt;td align=&#039;center&#039;&gt;Реле времени&lt;/td&gt;&quot;;d0=&quot;N/A&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&quot;;
       webPage += d0;
 
       webPage += &quot;&lt;/td&gt;&lt;tr&gt;&lt;td align=&#039;center&#039;&gt;Реле 2 (D3)&lt;/td&gt;&quot;;
       if(stop_d3==1){
       if(socket0==1){d1=&quot; ON&quot;;}if(socket0==0){d1=&quot; OFF&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;socket0On\&quot;&gt;&lt;button&gt;ON&lt;/button&gt;&lt;/a&gt;&quot;;
       webPage += &quot;&lt;a href=\&quot;socket0Off\&quot;&gt;&lt;button&gt;OFF&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;}else{webPage += &quot;&lt;td align=&#039;center&#039;&gt;Реле времени&lt;/td&gt;&quot;;d1=&quot;N/A&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&quot;;
       webPage += d1;
 
       webPage += &quot;&lt;/td&gt;&lt;tr&gt;&lt;td align=&#039;center&#039;&gt;Реле 3 (D6)&lt;/td&gt;&quot;;
       if(stop_d6==1){
       if(socket12==1){d2=&quot; ON&quot;;}if(socket12==0){d2=&quot; OFF&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;socket12On\&quot;&gt;&lt;button&gt;ON&lt;/button&gt;&lt;/a&gt;&quot;;
       webPage += &quot;&lt;a href=\&quot;socket12Off\&quot;&gt;&lt;button&gt;OFF&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;}else{webPage += &quot;&lt;td align=&#039;center&#039;&gt;Реле времени&lt;/td&gt;&quot;;d2=&quot;N/A&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&quot;;
       webPage += d2;
 
       webPage += &quot;&lt;/td&gt;&lt;tr&gt;&lt;td align=&#039;center&#039;&gt;Реле 4 (D7)&lt;/td&gt;&quot;;
       if(stop_d7==1){
       if(socket13==1){d3=&quot; ON&quot;;}if(socket13==0){d3=&quot; OFF&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;socket13On\&quot;&gt;&lt;button&gt;ON&lt;/button&gt;&lt;/a&gt;&quot;;
       webPage += &quot;&lt;a href=\&quot;socket13Off\&quot;&gt;&lt;button&gt;OFF&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;}else{webPage += &quot;&lt;td align=&#039;center&#039;&gt;Реле времени&lt;/td&gt;&quot;;d3=&quot;N/A&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&quot;;
       webPage += d3;
 
       webPage += &quot;&lt;/td&gt;&lt;tr&gt;&lt;td align=&#039;center&#039;&gt;Реле 5 (D8)&lt;/td&gt;&quot;;
       if(stop_d8==1){
       if(socket15==1){d4=&quot; ON&quot;;}if(socket15==0){d4=&quot; OFF&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;socket15On\&quot;&gt;&lt;button&gt;ON&lt;/button&gt;&lt;/a&gt;&quot;;
       webPage += &quot;&lt;a href=\&quot;socket15Off\&quot;&gt;&lt;button&gt;OFF&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;}else{webPage += &quot;&lt;td align=&#039;center&#039;&gt;Реле времени&lt;/td&gt;&quot;;d4=&quot;N/A&quot;;}
       webPage += &quot;&lt;td align=&#039;center&#039;&gt;&quot;;
       webPage += d4;
       webPage +=&quot;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td align=&#039;center&#039; colspan=&#039;3&#039;&gt; Cохранить настройки в энергонезависимую память:  &lt;a href=\&quot;eeprom\&quot;&gt;&lt;button&gt; YES &lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&lt;/table&gt;&quot;;
    }
 
    if(list==3){  // rele time
       webPage += &quot;&lt;TABLE class=&#039;tab1&#039; align=&#039;center&#039; width=&#039;470&#039; BORDER=&#039;1&#039; cellspacing=&#039;0&#039; cellpadding=&#039;3&#039;&gt;&quot;;  
       webPage += &quot;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;&lt;h3&gt;Реле времени&lt;/h3&gt;&quot;;
       webPage +=&quot;&lt;script type=&#039;text/javascript&#039;&gt;window.onload = function(){(function(){var date = new Date();var time = date;document.getElementsByTagName(&#039;div&#039;)[0].innerHTML = time;window.setTimeout(arguments.callee, 1000);})();};&lt;/script&gt;&lt;div&gt;&lt;/div&gt;&quot;;
       webPage += &quot;&lt;/td&gt;&quot;;
  // реле 1     
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;&lt;b&gt;Реле 1 (D0)&quot;;
       if(hh*100+mm&gt;=h1*100+m1&amp;&amp;hh*100+mm&lt;h1of*100+m1of){webPage +=&quot;  ON&quot;;}
       else if(h1*100+m1==h1of*100+m1of){webPage +=&quot;  N/A&quot;;}
       else{webPage +=&quot;  OFF&quot;;}
       webPage +=&quot;&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td&gt; Время включения  &amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;;
       if(h1&lt;10){webPage += &quot;0&quot;;}if(h1&gt;23){h1=0;}webPage += h1;
       webPage += &quot;:&quot;;  
       if(m1&lt;10){webPage += &quot;0&quot;;}if(m1&gt;59){m1=0;}webPage += m1;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h1&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m1&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
 
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td&gt;Время выключения  &quot;; 
       if(h1of&lt;10){webPage += &quot;0&quot;;if(h1of&gt;23){h1of=0;}}webPage += h1of;
       webPage += &quot;:&quot;;  
       if(m1of&lt;10){webPage += &quot;0&quot;;}if(m1of&gt;59){m1of=0;}webPage += m1of;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h1of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m1of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
 
 // реле 2     
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;&lt;b&gt;Реле 2 (D3)&quot;;
       if(hh*100+mm&gt;=h2*100+m2&amp;&amp;hh*100+mm&lt;h2of*100+m2of){webPage +=&quot;  ON&quot;;}
       else if(h2*100+m2==h2of*100+m2of){webPage +=&quot;  N/A&quot;;}
       else{webPage +=&quot;  OFF&quot;;}
       webPage +=&quot;&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td&gt; Время включения  &amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;;
       if(h2&lt;10){webPage += &quot;0&quot;;}if(h2&gt;23){h2=0;}webPage += h2;
       webPage += &quot;:&quot;;  
       if(m2&lt;10){webPage += &quot;0&quot;;}if(m2&gt;59){m2=0;}webPage += m2;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h2&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m2&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
 
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td&gt;Время выключения  &quot;; 
       if(h2of&lt;10){webPage += &quot;0&quot;;if(h2of&gt;23){h2of=0;}}webPage += h2of;
       webPage += &quot;:&quot;;  
       if(m2of&lt;10){webPage += &quot;0&quot;;}if(m2of&gt;59){m2of=0;}webPage += m2of;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h2of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m2of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
 
// реле 3     
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;&lt;b&gt;Реле 3 (D6)&quot;;
       if(hh*100+mm&gt;=h3*100+m3&amp;&amp;hh*100+mm&lt;h3of*100+m3of){webPage +=&quot;  ON&quot;;}
       else if(h3*100+m3==h3of*100+m3of){webPage +=&quot;  N/A&quot;;}
       else{webPage +=&quot;  OFF&quot;;}
       webPage +=&quot;&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td&gt; Время включения  &amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;;
       if(h3&lt;10){webPage += &quot;0&quot;;}if(h3&gt;23){h3=0;}webPage += h3;
       webPage += &quot;:&quot;;  
       if(m3&lt;10){webPage += &quot;0&quot;;}if(m3&gt;59){m3=0;}webPage += m3;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h3&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m3&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
 
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td&gt;Время выключения  &quot;; 
       if(h3of&lt;10){webPage += &quot;0&quot;;if(h3of&gt;23){h3of=0;}}webPage += h3of;
       webPage += &quot;:&quot;;  
       if(m3of&lt;10){webPage += &quot;0&quot;;}if(m3of&gt;59){m3of=0;}webPage += m3of;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h3of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m3of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
 
// реле 4     
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;&lt;b&gt;Реле 4 (D7)&quot;;
       if(hh*100+mm&gt;=h4*100+m4&amp;&amp;hh*100+mm&lt;h4of*100+m4of){webPage +=&quot;  ON&quot;;}
       else if(h4*100+m4==h4of*100+m4of){webPage +=&quot;  N/A&quot;;}
       else{webPage +=&quot;  OFF&quot;;}
       webPage +=&quot;&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td&gt; Время включения  &amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;;
       if(h4&lt;10){webPage += &quot;0&quot;;}if(h4&gt;23){h4=0;}webPage += h4;
       webPage += &quot;:&quot;;  
       if(m4&lt;10){webPage += &quot;0&quot;;}if(m4&gt;59){m4=0;}webPage += m4;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h4&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m4&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
 
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td&gt;Время выключения  &quot;; 
       if(h4of&lt;10){webPage += &quot;0&quot;;if(h4of&gt;23){h4of=0;}}webPage += h4of;
       webPage += &quot;:&quot;;  
       if(m4of&lt;10){webPage += &quot;0&quot;;}if(m4of&gt;59){m4of=0;}webPage += m4of;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h4of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m4of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
 
// реле 5     
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td colspan=&#039;3&#039; align=&#039;center&#039;&gt;&lt;b&gt;Реле 5 (D8)&quot;;
       if(hh*100+mm&gt;=h5*100+m5&amp;&amp;hh*100+mm&lt;h5of*100+m2of){webPage +=&quot;  ON&quot;;}
       else if(h5*100+m5==h5of*100+m5of){webPage +=&quot;  N/A&quot;;}
       else{webPage +=&quot;  OFF&quot;;}
       webPage +=&quot;&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td&gt; Время включения  &amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;;
       if(h5&lt;10){webPage += &quot;0&quot;;}if(h5&gt;23){h5=0;}webPage += h5;
       webPage += &quot;:&quot;;  
       if(m5&lt;10){webPage += &quot;0&quot;;}if(m5&gt;59){m5=0;}webPage += m5;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h5&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m5&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
 
       webPage += &quot;&lt;form action=&#039;&#039; method=&#039;post&#039;&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td&gt;Время выключения  &quot;; 
       if(h5of&lt;10){webPage += &quot;0&quot;;if(h5of&gt;23){h5of=0;}}webPage += h5of;
       webPage += &quot;:&quot;;  
       if(m5of&lt;10){webPage += &quot;0&quot;;}if(m5of&gt;59){m5of=0;}webPage += m5of;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;input type=&#039;text&#039; name=&#039;h5of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt;&lt;/input&gt;:&quot;;
       webPage += &quot;&lt;input type=&#039;text&#039; name=&#039;m5of&#039; autocomplete=&#039;off&#039; maxlength=&#039;2&#039; size=&#039;1&#039;&gt; &lt;/input&gt;  &quot;;
       webPage += &quot;&lt;/td&gt;&lt;td align=&#039;center&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button type=&#039;submit&#039;&gt;Подтвердить&lt;/button&gt;&lt;/a&gt;&lt;/td&gt;&quot;;
       webPage +=&quot;&lt;/form&gt;&quot;;
       webPage += &quot;&lt;tr&gt;&lt;td align=&#039;center&#039; colspan=&#039;3&#039;&gt;&lt;a href=\&quot;obn\&quot;&gt;&lt;button&gt;Обновить&lt;/button&gt;&lt;/a&gt;&lt;tr&gt;&quot;;
       webPage += &quot;&lt;td align=&#039;center&#039; colspan=&#039;3&#039;&gt; Cохранить настройки в энергонезависимую память:  &lt;a href=\&quot;eeprom\&quot;&gt;&lt;button&gt; YES &lt;/button&gt;&lt;/a&gt;&lt;/td&gt; &quot;;
       webPage +=&quot;&lt;/td&gt;&lt;/table&gt;&lt;/html&gt;&quot;;
    }

server.send(200, &quot;text/html&quot;, webPage);
       
       // end style
}

void sumbit(){
    if (server.args() &gt; 0 ) {
    for ( uint8_t i = 0; i &lt; server.args(); i++ ) {
      if (server.argName(i) == &quot;h1&quot;){h1 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m1&quot;){m1 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;h1of&quot;){h1of = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m1of&quot;){m1of = server.arg(i).toInt();}
 
      if (server.argName(i) == &quot;h2&quot;){h2 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m2&quot;){m2 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;h2of&quot;){h2of = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m2of&quot;){m2of = server.arg(i).toInt();}
 
      if (server.argName(i) == &quot;h3&quot;){h3 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m3&quot;){m3 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;h3of&quot;){h3of = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m3of&quot;){m3of = server.arg(i).toInt();}
 
      if (server.argName(i) == &quot;h4&quot;){h4 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m4&quot;){m4 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;h4of&quot;){h4of = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m4of&quot;){m4of = server.arg(i).toInt();}
 
      if (server.argName(i) == &quot;h5&quot;){h5 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m5&quot;){m5 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;h5of&quot;){h5of = server.arg(i).toInt();}
      if (server.argName(i) == &quot;m5of&quot;){m5of = server.arg(i).toInt();}  
 
      if (server.argName(i) == &quot;reg_t1&quot;){reg_t1 = server.arg(i).toInt();}
      if (server.argName(i) == &quot;reg_t2&quot;){reg_t2 = server.arg(i).toInt();}
      }}
  }</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2019-12-06T00:11:49Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=101&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Интернет часы ESP8266 + TFT 3'2 SPI]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=99&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=67569">http://rcl-radio.ru/?p=67569</a></p><div class="codebox"><pre><code>#include &lt;NTPClient.h&gt;
#include &lt;ESP8266WiFi.h&gt; 
#include &lt;WiFiUdp.h&gt;
#include &lt;UTFT.h&gt;
#include &lt;SPI.h&gt;
 WiFiUDP ntpUDP;
 NTPClient timeClient(ntpUDP, &quot;pool.ntp.org&quot;, 21600);
 extern uint8_t BigFont[],SmallFont[];
 UTFT myGLCD ( ILI9341_S5P, 13, 14, 15, 0, 12 );//SDI (MOSI), SCK, CS, RESET, DC == D7 D5 D8 D3 D6
 const char *ssid     = &quot;Keenetic-9009&quot;;
 const char *password = &quot;32481975&quot;;
 String date_time;
 float sx,sy,osx,osy,mx,my,omx,omy,hx,hy,ohx,ohy;
 unsigned long times;

void setup(){
  Serial.begin(9600);
  WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);Serial.print(&quot;.&quot;);
    timeClient.begin();}  
  myGLCD.InitLCD(0);myGLCD.fillRect(0,0,320,240);myGLCD.setFont(BigFont);myGLCD.clrScr(); // первоначальные настройки экрана
  myGLCD.fillScr(0x0000);myGLCD.setColor(0xffff);myGLCD.setBackColor(0x0000); 

   for(int i=0;i&lt;360;i+=30){
    sx=cos((i-90)*0.0174532925);
    sy=sin((i-90)*0.0174532925);
    myGLCD.drawLine(sx*120+120,sy*120+120,sx*110+120,sy*110+120);}

   for(int i=0;i&lt;360;i+=6){
    sx=cos((i-90)*0.0174532925);
    sy=sin((i-90)*0.0174532925);
    myGLCD.drawPixel(sx*115+120,sy*115+120);}
}

void loop(){
  if(millis()-times&gt;=1000){times=millis();
   while(!timeClient.update()){timeClient.forceUpdate();}
 int hh = timeClient.getHours();
 int mm = timeClient.getMinutes();
 int ss = timeClient.getSeconds();
  date_time = timeClient.getFormattedDate();
 int index_date = date_time.indexOf(&quot;T&quot;);
 String date = date_time.substring(0, index_date);
  hx=cos(((hh*30+mm*6*0.08333333)-90)*0.0174532925);
  hy=sin(((hh*30+mm*6*0.08333333)-90)*0.0174532925);
  mx=cos(((mm*6+ss*6*0.01666667)-90)*0.0174532925);
  my=sin(((mm*6+ss*6*0.01666667)-90)*0.0174532925);
  sx=cos((ss*6-90)*0.0174532925);
  sy=sin((ss*6-90)*0.0174532925);
 myGLCD.setColor(0x0000);// clear
 myGLCD.drawLine(osx,osy,120,120);
 myGLCD.drawLine(omx,omy,120,120);
 myGLCD.drawLine(ohx,ohy,120,120); 
 myGLCD.setColor(0xffff);
 myGLCD.print(&quot;12&quot;,104,0);
 myGLCD.print(&quot;6&quot;,112,225);
 myGLCD.print(&quot;9&quot;,0,112);
 myGLCD.print(&quot;3&quot;,224,112);
  ohx = hx*70+120;
  ohy = hy*70+120;
  omx = mx*100+120;
  omy = my*100+120;  
  osx = sx*110+120;
  osy = sy*110+120;
 myGLCD.setColor(0xf000);
 myGLCD.drawLine(osx,osy,120,120);
 myGLCD.setColor(0xffff);
 myGLCD.drawLine(omx,omy,120,120);
 myGLCD.setColor(0xfff5);
 myGLCD.drawLine(ohx,ohy,120,120);
 myGLCD.setColor(0xf000);
 myGLCD.fillCircle(120,120,4);
 myGLCD.setColor(0xffff);
///////////////////////////////////////////////////////
 myGLCD.print(timeClient.getFormattedTime(),60,275);
 myGLCD.print(date,45,295);
  }
 }//loop</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2019-11-25T08:09:29Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=99&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Интернет часы ESP8266 + TM1637]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=98&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=67569">http://rcl-radio.ru/?p=67569</a></p><div class="codebox"><pre><code>#include &lt;NTPClient.h&gt;
#include &lt;ESP8266WiFi.h&gt; 
#include &lt;WiFiUdp.h&gt; 
#include &lt;Wire.h&gt; 
#include &lt;TM1637Display.h&gt;
 TM1637Display display(D4, D3);// CLK,DIO
 WiFiUDP ntpUDP;
 NTPClient timeClient(ntpUDP, &quot;pool.ntp.org&quot;, 21600,60000);
 const char *ssid     = &quot;Redmi Note 3&quot;;
 const char *password = &quot;32481975&quot;;
 int times,x;
 unsigned long t;

void setup(){
  Serial.begin(9600);
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);Serial.print(&quot;.&quot;);
    timeClient.begin();}
    display.setBrightness(3);// ЯРКОСТЬ    
}

void loop(){
  timeClient.update();
  int hh = timeClient.getHours();
  int mm = timeClient.getMinutes();
 // int ss = timeClient.getSeconds();
  if(millis()-t&lt;500){x=0x00;}
  if(millis()-t&gt;500){x=0x40;}
  if(millis()-t&gt;999){t=millis();}
  times=hh*100+mm;
  display.showNumberDecEx(times,x,true); // вывод информации на индикатор TM1637
  }

  </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2019-11-21T02:47:41Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=98&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Интернет часы ESP8266 + LCD1602_I2C]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=95&amp;action=new" />
			<summary type="html"><![CDATA[<p>Основная статья - <a href="http://rcl-radio.ru/?p=67569">http://rcl-radio.ru/?p=67569</a></p><p><span class="attention-yellow"></span> <br /><a href="http://rcl-radio.ru/wp-content/uploads/2019/11/I2C-LCD-ESP8266-Library.zip">http://rcl-radio.ru/wp-content/uploads/ … ibrary.zip</a></p><div class="codebox"><pre><code>#include &lt;NTPClient.h&gt;
#include &lt;ESP8266WiFi.h&gt; 
#include &lt;WiFiUdp.h&gt; 
#include &lt;Wire.h&gt; 
#include &lt;LiquidCrystal_I2C.h&gt;
 LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
 WiFiUDP ntpUDP;
 NTPClient timeClient(ntpUDP, &quot;pool.ntp.org&quot;, 21600,60000);
 const char *ssid     = &quot;Redmi Note 3&quot;;
 const char *password = &quot;32481975&quot;;
 String date_time;

void setup(){
  Serial.begin(9600);
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( &quot;.&quot; );
    timeClient.begin();}
  lcd.init();                    
  lcd.backlight();// Включаем подсветку дисплея
}

void loop(){
  timeClient.update();
  int hh = timeClient.getHours();
  int mm = timeClient.getMinutes();
  int ss = timeClient.getSeconds();
  date_time = timeClient.getFormattedDate();
  int index_date = date_time.indexOf(&quot;T&quot;);
  String date = date_time.substring(0, index_date);
 

  lcd.setCursor(4,0);
  lcd.print(hh/10);lcd.print(hh%10);lcd.print(&quot;:&quot;);
  lcd.print(mm/10);lcd.print(mm%10);lcd.print(&quot;:&quot;);
  lcd.print(ss/10);lcd.print(ss%10);
  lcd.setCursor(3,1);
  lcd.print(date);
 
  }

  </code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2019-11-20T07:10:39Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=95&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Wi-Fi метеостанция (рус)]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?id=58&amp;action=new" />
			<summary type="html"><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2019/09/1a780f2db673f98cd8ce20d7c7b474b4.png" alt="http://forum.rcl-radio.ru/uploads/images/2019/09/1a780f2db673f98cd8ce20d7c7b474b4.png" /></span> </p><p>Основная статья - <a href="http://rcl-radio.ru/?p=66004">http://rcl-radio.ru/?p=66004</a></p><p><span class="attention-yellow"></span> </p><br /><div class="codebox"><pre><code>#include &lt;ESP8266WiFi.h&gt;
#include &lt;WiFiClientSecure.h&gt; 
#include &lt;Wire.h&gt;
#include &lt;UTFT.h&gt;
#include &lt;SPI.h&gt;
#include &lt;DS3231.h&gt;//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
DS3231 vrem;// Связываем объект clock с библиотекой DS3231
RTCDateTime DateTime;// Определяем сущность структуры RTCDateTime (описанной в библиотеке DS3231) для хранения считанных с часов даты и времени

 UTFT myGLCD ( ILI9341_S5P, 13, 14, 15, 0, 12 );//SDI (MOSI), SCK, CS, RESET, DC == D7 D5 D8 D3 D6
 extern uint8_t SmallRusFont[];
 extern uint8_t BigRusFont[];
const uint8_t utf8_rus_charmap[] PROGMEM = {&#039;A&#039;,128,&#039;B&#039;,129,130,&#039;E&#039;,131,132,133,134,135,&#039;K&#039;,136,&#039;M&#039;,&#039;H&#039;,&#039;O&#039;,137,&#039;P&#039;,&#039;C&#039;,&#039;T&#039;,138,139,&#039;X&#039;,140,141,
142,143,144,145,146,147,148,149,&#039;a&#039;,150,151,152,153,&#039;e&#039;,154,155,156,157,158,159,160,161,162,&#039;o&#039;,163,&#039;p&#039;,&#039;c&#039;,164,&#039;y&#039;,165,&#039;x&#039;,166,167,168,169,170,
171,172,173,174,175};
char * den[7] = {&quot;ПОН&quot;,&quot;ВТР&quot;,&quot;СРД&quot;,&quot;ЧЕТ&quot;,&quot;ПЯТ&quot;,&quot;СУБ&quot;,&quot;ВСК&quot;};
char * mes[12] = {&quot;ЯНВАРЯ&quot;,&quot;ФЕВРАЛЯ&quot;,&quot;МАРТА&quot;,&quot;АПРЕЛЯ&quot;,&quot;МАЯ&quot;,&quot;ИЮНЯ&quot;,&quot;ИЮЛЯ&quot;,&quot;АВГУСТА&quot;,&quot;СЕНТЯБРЯ&quot;,&quot;ОКТЯБРЯ&quot;,&quot;НОЯБРЯ&quot;,&quot;ДЕКАБРЯ&quot;};

 
const char* ssid = &quot;Keenetic-9009&quot;;
const char* password = &quot;32481975&quot;;
char host[] = &quot;export.yandex.ru&quot;; 
const int port = 443;
const char fingerprint[] PROGMEM = &quot;F3 DB F7 38 AA 71 13 15 1E E8 53 FC 0F 29 8C AB 3D F4 80 9F&quot;; 
int w=1,i,w1=1,y,y01,y02;
unsigned long times;
String line;
String Link;
 
void setup ( ) { Wire.begin();  vrem.begin();// Инициализируем работу с объектом библиотеки DS3231
  myGLCD.InitLCD(0);myGLCD.fillRect(0,0,320,240);myGLCD.setFont(BigRusFont);myGLCD.clrScr();myGLCD.setColor(0,0,0); // первоначальные настройки экрана
 // myGLCD.setBrightness(16);myGLCD.setContrast(64);
  //  vrem.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
    Serial.begin(9600); delay(1000);
    WiFi.mode(WIFI_STA); WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED) {delay(1000);
    myGLCD.setColor(0xffff);printRus(myGLCD,&quot;Connecting...&quot;,0,0,0);}
 //   printRus(myGLCD,ssid,0,15,0);Serial.print(&quot;IP address: &quot;);Serial.println(WiFi.localIP());delay(3000);
    myGLCD.fillScr(0x0000);myGLCD.setColor(0x0000);myGLCD.setBackColor(0x0000);
}
 
void loop(){ to_Timer();delay(100);
  if(DateTime.minute==0&amp;&amp;DateTime.second==0||DateTime.minute==30&amp;&amp;DateTime.second==0||w==1){
    i++;
 
    WiFiClientSecure client;
    Serial.printf(&quot;Using fingerprint &#039;%s&#039;\n&quot;, fingerprint);
     client.setFingerprint(fingerprint);
     client.setTimeout(1000); // 5 Seconds
     delay(1000); while((!client.connect(host, port))){delay(100);}
 
     Link = &quot;/bar/reginfo.xml?region=66&quot;;
     client.print(String(&quot;GET &quot;) + Link + &quot; HTTP/1.1\r\n&quot; +
               &quot;Host: &quot; + host + &quot;\r\n&quot; +               
               &quot;Connection: close\r\n\r\n&quot;);Serial.println(&quot;request sent&quot;);delay(1000);
 
  while (client.connected()) {String line = client.readStringUntil(&#039;\n&#039;);if (line == &quot;\r&quot;) {Serial.println(&quot;headers received&quot;);break;}}
  delay(1000);while (client.available()) {line = client.readStringUntil(&#039;\r&#039;); 
 
         myGLCD.setColor(0xffff);  
 
         int a;a =line.indexOf(&quot;&lt;temperature class&quot;);
         printRus(myGLCD,&quot;Темп_2&quot;,10,90,0);myGLCD.printNumI(line.substring(a+45, a+90).toInt(),130,90,2);printRus(myGLCD,&quot;C&quot;,200,90,0);
 
         myGLCD.drawLine(5,115,235,115);
 
         a =line.indexOf(&quot;&lt;torr&gt;&quot;); 
         myGLCD.setColor(0xfdfd);printRus(myGLCD,&quot;Давление&quot;,10,125,0);myGLCD.setColor(0xffff);myGLCD.printNumI(line.substring(a+6, a+15).toInt(),170,125,3);//printRus(myGLCD,&quot;C&quot;,200,125,0);
 
         a =line.indexOf(&quot;&lt;dampness&gt;&quot;); 
         myGLCD.setColor(0xcdcd);printRus(myGLCD,&quot;Влажность&quot;,10,150,0);myGLCD.setColor(0xffff);myGLCD.printNumI(line.substring(a+10, a+15).toInt(),155,150,3);printRus(myGLCD,&quot;%&quot;,200,150,0);
 
         a =line.indexOf(&quot;&lt;wind_speed&gt;&quot;); 
         myGLCD.setColor(0xeded);printRus(myGLCD,&quot;Скор.ветра&quot;,10,175,0);myGLCD.setColor(0xffff);myGLCD.printNumI(line.substring(a+12, a+15).toInt(),140,175,2);printRus(myGLCD,&quot;м/с&quot;,180,175,0);
 
         a =line.indexOf(&quot;&lt;sun_rise&gt;&quot;); 
         myGLCD.setColor(0xdddd);printRus(myGLCD,&quot;Восход&quot;,10,200,0);myGLCD.setColor(0xffff);myGLCD.print(line.substring(a+10, a+15),145,200,0);
 
         a =line.indexOf(&quot;&lt;sunset&gt;&quot;); 
         myGLCD.setColor(0xdddd);printRus(myGLCD,&quot;Закат&quot;,10,225,0);myGLCD.setColor(0xffff);myGLCD.print(line.substring(a+8, a+13),145,225);
 
         a =line.indexOf(&quot;&lt;observation&gt;&quot;); 
         myGLCD.setFont(SmallRusFont);myGLCD.setColor(0xbbbb);myGLCD.setColor(0xffff);myGLCD.print(line.substring(a+13, a+32),CENTER,255,0);
 
         myGLCD.setColor(0xffff);  myGLCD.drawLine(5,280,235,280);
 
         myGLCD.setFont(SmallRusFont);
         myGLCD.setColor(0xf000);printRus(myGLCD,&quot;pogoda.yandex.ru&quot;,CENTER,285,0);
         myGLCD.setColor(0xcdcd);printRus(myGLCD,&quot;Количество запросов&quot;,20,300,0);myGLCD.printNumI(i,200,300);
  }}w=0;
  }//loop
 
 void to_Timer(){
       DateTime = vrem.getDateTime();   // Считываем c часов текущие значения даты и времени в сущность DateTime
       myGLCD.setFont(BigRusFont);myGLCD.setColor(0xffff);
 
       if(DateTime.hour&lt;10){myGLCD.printNumI(0,57,10);y02=15;}
       else{y02=0;}myGLCD.printNumI(DateTime.hour, 57+y02, 10);printRus(myGLCD,&quot;:&quot;, 90, 10,0);
       // минуты
       if(DateTime.minute&lt;10){myGLCD.printNumI(0,105,10);y01=15;}
       else{y01=0;}myGLCD.printNumI(DateTime.minute, 105+y01, 10);printRus(myGLCD,&quot;:&quot;, 135, 10,0);
       //секунды
       if(DateTime.second&lt;10){myGLCD.printNumI(0,150,10);y=15;}
       else{y=0;}myGLCD.printNumI(DateTime.second, 150+y, 10);
       
       if(DateTime.second==0||w==1){myGLCD.setFont(SmallRusFont);myGLCD.setColor(0xcdcd);printRus(myGLCD,den[DateTime.dayOfWeek-1], 50,35,0);
       myGLCD.setColor(0xcdcd);myGLCD.printNumI(DateTime.day, 95,35,2);
       myGLCD.setColor(0xcdcd);printRus(myGLCD,mes[DateTime.month-1], 130,35,0);
       
       
       myGLCD.setColor(0xffff);myGLCD.drawLine(5,55,235,55);  
       myGLCD.setFont(BigRusFont);myGLCD.setColor(200,200,200);printRus(myGLCD,&quot;Темп_1&quot;,10,65,0);myGLCD.printNumF(vrem.readTemperature(),1,130,65);printRus(myGLCD,&quot;C&quot;,200,65,0);}
  }

  void printRus(UTFT rus,char *st, int x, int y_r, int deg){
 int stl, i_r;
 stl = strlen(st);
 if (rus.orient==PORTRAIT){
    if (x==RIGHT) x=(rus.disp_x_size+1)-(stl*rus.cfont.x_size);
    if (x==CENTER) x=((rus.disp_x_size+1)-(stl*rus.cfont.x_size))/2;
 } else {
  if (x==RIGHT) x=(rus.disp_y_size+1)-(stl*rus.cfont.x_size);
  if (x==CENTER) x=((rus.disp_y_size+1)-(stl*rus.cfont.x_size))/2;
 }
 uint8_t utf_high_byte = 0;
 uint8_t ch, ch_pos = 0;
 for (i_r = 0; i_r &lt; stl; i_r++) {
  ch = st[i_r];
   if ( ch &gt;= 128) {
     if ( utf_high_byte == 0 &amp;&amp; (ch ==0xD0 || ch == 0xD1)) {
         utf_high_byte = ch;
      continue;
     } else {
     if ( utf_high_byte == 0xD0) {
    if (ch == 0x81) { //Ё
      ch = 6;
    } else {
    if(ch &lt;= 0x95) {
       ch -= 0x90;
    } else if( ch &lt; 0xB6){
    ch -= (0x90 - 1);
    } else {
    ch -= (0x90 - 2);
    }}
    ch = pgm_read_byte(utf8_rus_charmap + ch);
    } else if (utf_high_byte == 0xD1) {
           if (ch == 0x91) {//ё
           ch = 39;
       } else {
        ch -= 0x80;
        ch += 50;
       }
           ch = pgm_read_byte(utf8_rus_charmap + ch);
    }
    utf_high_byte = 0;
   }
   } else {
     utf_high_byte = 0;
     }
     if (deg==0) {rus.printChar(ch, x + (ch_pos * (rus.cfont.x_size)), y_r);} else {
          rus.rotateChar(ch, x, y_r, ch_pos, deg);
        }
      ++ch_pos;
 }
};</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2019-09-07T18:19:51Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?id=58&amp;action=new</id>
		</entry>
</feed>
