Не загружается страница в браузер ранее рабочего проекта ESP8266+DS3231 +dfplayer+ HC-SR 501

123ksn
Offline
Зарегистрирован: 24.11.2014


Здравствуйте. Захотелось мне повторить проект говорящих часов Рубена Лачинова

"WeMos D1 mini + DS3231 + HC-SR 501"  https://yadi.sk/d/LSu3BGEA3AWo6n/index.htm http://ruben1.narod.ru/hobby/arduino/wemos_rtc_pir.html#

                Что мне понравилось в этом проекте?

1)Использование ESP8266

2)Использование dfplayer, DS3231

3)Идеалогия построения управления. Браузером из ПК или смартфона открываем страницу, которая прошита в ESP8266, и на которой расположен требуемый функционал управления часами, т.е. не надо создавать специальное управляющее приложение для ПК или смартфона. То есть из самих часов получаем кросс-платформенную программу управления часами!

4)Не требуется никаких "облаков".

Но нарисовалась проблема, которую я так и не смог решить. При попытке компиляции проекта в моей конфигурации (Windows_7_max_32bit + Arduino IDE v1.8.13 + плата WeMos R1 D1+ dfplayer + DS3231) проект не компилировался. Проблема оказалась в несовместимости последней Arduino IDE v1.8.13 с версией библиотеки для dfplayer в проекте Лачинова. Заменил библиотеку, поменял используемые выводы WeMos, исправил способ чтения из PROGMEM и проект откомпилировался и залился в ESP8266. Но при попытке открыть страницу из браузера она редко открывается. Сейчас пишет, что страница недоступна. При сбросе может воспроизвести рычание и несколько файлов. В HTML-коде, видимо, используется что-то из семейства java, в котором я не разбираюсь. Кто разбирается, может поможете заставить работать.

/* Ruben Lachinov clock with bell
 *  это часы с боем и датчиком движение PIR*/
#include <ESP8266WiFi.h>
//#include <WiFiServer.h>
//#include <ESP8266WebServer.h> //'class WiFiServer' has no member named 'handleClient'

//#include <ESP8266mDNS.h> //вариант 2
#include <pgmspace.h>   //PROGMEM
#include "DFRobotDFPlayerMini.h" //библиотека для DFPlayer
#include <SoftwareSerial.h>//библиотека для создания программного UART
//#include <Wire.h>   //I2C работает с часами и без неё
#include <RTClib.h> //у автора https://github.com/adafruit/RTClib

/* Какие GPIO задействованы в программе (схеме)?
GPIO 6-11 не выведены на разъем
1,3 Rx, Tx для Serial Monitor и прошивки
2 ledPin использование стандартного (встроенного) светодиода
4 (SDA) и 5 (SCL)для управления DS3231
12,14 UltraSonic ультразвуковой измеритель расстояния
16 pirPin для подключения датчика ???? 
13,15 для SoftwareSerial для управления с DFPlayer_Mini
Для анализа:
Подключаемся с ПК с браузером хром или лиса к этой точке. Браузером открываем режим разработчика через F12. Открываем вкладку "Сеть".
2. Заходим на страничку авторизации точки. Авторизуемся. Смотрим что браузер при этом отправляет на сервер - GET/POST запросы, cookie, URL. Записываем всё и запоминаем.
3. Очищаем кеш, повторяем. Смотрим не изменилось ли чего.
аутентификация через html страницу называется Captive Portal

html_return += F("some text stored in progmem"); //правильный способ чтения из PROGMEM
связь по Wi-Fi поддерживается автоматически, после каждого выполнения loop или при вызове delay
если loop выполняются более 50 микросекунд, надо вызывать delay для нормальной работы Wi-Fi.
Для ESP8266WebServer есть только send_P () и sendContent_P ()
Пояснялка: ESP8266-12F  GPIO16 =  16 вывод  в среде Arduino IDE,
часы DS3231? Ответ: GPIO5,4 в коде Arduino IDE). I2C по умолчанию использует 4 (SDA) и 5 (SCL).
Serial работает на GPIO1(TX) и GPIO3(RX). Serial можно переназначить на GPIO15 (TX) и GPIO13 (RX)
для этого после вызова функции Serial.begin необходимо вызвать Serial.swap(). 
Для отмены переназначения выводов необходимо снова вызвать Serial.swap(). 
В Serial1 доступен только TX (GPIO2).
ESP8266 может работать в трех разных режимах: 1)Станция (STA), 2)Точка доступа (AP), 3)STA+AP
*/

//#include <DFPlayer_Mini_Mp3.h> //не компилируктся. Устарела для Ардуино 1.8.13 и ядра 2.7.4 ESP8266

const int RX=13;
const int TX=15;
SoftwareSerial mySoftwareSerial(RX, TX); // RX, TX (у автора другие. Сменил, т.к. нерабочие) 
DFRobotDFPlayerMini myDFPlayer;//создаем объект myDFPlayer

//UltraSonic ультразвуковой измеритель расстояния ======
const int TRIG_PIN = 12;
const int ECHO_PIN = 14;//у автора 13

RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//==========================
//загоняем в память HTML-страницу (ответ) нашей программы при обращении к ней
const static char header0[] PROGMEM =
  "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'>\n\r"
  "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />\n\r"
  "<html><head><title>ESP8266 GPIO Control</title>\n\r"
  "<meta name=viewport content=\"width=device-width, initial-scale=1\">\n\r"
  "<style type=\"text/css\">\n\r"
  "#nav {border:2px solid #000047;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;}\n\r"
  "#nav, #nav ul {list-style:none;padding:0;width:166px;}\n\r"
  "#nav ul {position:relative;z-index:-1;}\n\r"
  "#nav li {position:relative;z-index:100;}\n\r"
  "#nav ul li {margin-top:-23px;-moz-transition:  0.4s linear 0.4s;-ms-transition: 0.4s linear 0.4s;-o-transition: 0.4s linear 0.4s;\n\r"
  "-webkit-transition: 0.4s linear 0.4s;transition: 0.4s linear 0.4s;}\n\r"
  "#nav li a {background-color:#d4d5d8;color:#000;display:block;font-size:12px;font-weight:bold;line-height:28px;outline:0;padding-left:15px;text-decoration:none;}\n\r"
  "#nav li a.sub {color:#fff; padding-left:-15px;text-align:center;background:#0000ff;}\n\r"
  "#nav li a:hover {background-color:#bcbdc1;}\n\r"
  "#nav ul li a {background-color:#00e;border-bottom:1px solid #ccc;color:#fff;font-size:16px;line-height:22px;}\n\r"
  "#nav ul li a:hover {background-color:#ddd;color:#444;}\n\r"
  "#nav a.sub:focus {background:#bcbdc1;outline:0;}\n\r"
  "#nav a:focus ~ ul li { margin-top:0; -moz-transition:  0.4s linear; -ms-transition: 0.4s linear; -o-transition: 0.4s linears;\n\r"
  " -webkit-transition: 0.4s linears; transition: 0.4s linear;}\n\r"
  "#nav a.sub:active {background:#bcbdc1;outline:0;}\n\r"
  "#nav a:active ~ ul li { margin-top:0;}\n\r"
  "#nav ul:hover {display:block;}\n\r";

const static char header1[] PROGMEM =
  "a {color:#FFF;font-weight:bold;text-decoration:none;}\n\r"
  ".cleared {float : none;clear : both;margin : 0;padding : 0;border : none;font-size : 1px;}\n\r"
  ".key {display: block;cursor: pointer;color: #444;font: bold 9pt arial;text-decoration: none;text-align: center;\n\r"
  "width: 44px;height: 41px;margin: 5px;background: #DDD1CC;\n\r"
  "-webkit-box-shadow: 0 0 8px rgba(0, 0, 0, .75);-moz-box-shadow: 0 0 8px rgba(0, 0, 0, .75);box-shadow: 1px 1px 8px rgba(0, 0, 0, .75);\n\r"
  "-moz-border-radius: 4px;border-radius: 4px;border-top: 1px solid #b5b5b5;\n\r"
  "-webkit-box-shadow: inset 0 0 25px #e8e8e8, 0 1px 0 #c3c3c3, 0 2px 0 #c9c9c9, 0 2px 3px #333;\n\r"
  "-moz-box-shadow: inset 0 0 25px #e8e8e8, 0 1px 0 #c3c3c3, 0 2px 0 #c9c9c9, 0 2px 3px #333;\n\r"
  "box-shadow: inset 0 0 25px #e8e8e8, 0 1px 0 #c3c3c3, 0 2px 0 #c9c9c9, 0 2px 3px #333;\n\r"
  "text-shadow: 0px 1px 0px #f5f5f5;}\n\r"
  ".key:active, .keydown {color: #00F;background: #D9D9FF;margin: 7px 5px 3px;\n\r"
  "-webkit-box-shadow: inset 0 0 25px #ddd, 0 0 3px #333;\n\r"
  "-moz-box-shadow: inset 0 0 25px #ddd, 0 0 3px #333;\n\r"
  "box-shadow: inset 0 0 25px #ddd, 0 0 3px #333;\n\r"
  "border-top: 1px solid #eee;}\n\r"
  ".key span {display: block;margin: 13px 0 0;text-transform: uppercase;}\n\r";

const static char header2[] PROGMEM =
  ".but {display: block;cursor: pointer;color: #333;font: bold 9pt arial;text-decoration: none;text-align: center;\n\r"
  "width: 44px;height: 41px;margin: 5px;background: #DDD1CC;\n\r"
  "-webkit-border-radius: 22px;-moz-border-radius: 22px;border-radius: 22px;\n\r"
  "-webkit-box-shadow: 0 0 8px rgba(0, 0, 0, .75);\n\r"
  "-moz-box-shadow: 0 0 8px rgba(0, 0, 0, .75);\n\r"
  "box-shadow: 1px 1px 8px rgba(0, 0, 0, .75);\n\r"
  "border-top: 1px solid #b5b5b5;\n\r"
  "-webkit-box-shadow: inset 0 0 25px #e8e8e8, 0 1px 0 #c3c3c3, 0 2px 0 #c9c9c9, 0 2px 3px #333;\n\r"
  "-moz-box-shadow: inset 0 0 25px #e8e8e8, 0 1px 0 #c3c3c3, 0 2px 0 #c9c9c9, 0 2px 3px #333;\n\r"
  "box-shadow: inset 0 0 25px #e8e8e8, 0 1px 0 #c3c3c3, 0 2px 0 #c9c9c9, 0 2px 3px #333;\n\r"
  "text-shadow: 0px 1px 0px #f5f5f5;}\n\r"
  ".but:active, .keydown {color: #00F;background: #D9D9FF;margin: 7px 5px 3px;\n\r"
  "-webkit-box-shadow: inset 0 0 25px #ddd, 0 0 3px #333;\n\r"
  "-moz-box-shadow: inset 0 0 25px #ddd, 0 0 3px #333;\n\r"
  "box-shadow: inset 0 0 25px #ddd, 0 0 3px #333;\n\r"
  "border-top: 1px solid #eee;}\n\r"
  ".but span {display: block;margin: 13px 0 0;text-transform: uppercase;}\n\r";

const static char header3[] PROGMEM =
  ".onoffswitch {position: relative;width: 24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select: none;}\n\r"
  ".onoffswitch-checkbox {display: none;}\n\r"
  ".onoffswitch-label {display: block;overflow: hidden;cursor: pointer;border: 2px solid #8084B0;border-radius: 10px;}\n\r"
  ".onoffswitch-inner {display: block;width: 200%;margin-left: 0%;transition: margin 0.3s ease-in 0s;}\n\r"
  ".onoffswitch-inner:before, .onoffswitch-inner:after {display: block;float: left;width: 50%;height: 6px;padding: 0;line-height: 6px;font-size: 14px;color: white;font-family: Trebuchet, Arial, sans-serif;font-weight: bold;box-sizing: border-box;}\n\r"
  ".onoffswitch-inner:before {content: \"\";padding-left: 10px;background-color: #FF0000;color: #999999;}\n\r"
  ".onoffswitch-inner:after {content: \"\";padding-right: 10px;background-color: #0AFF0A;color: #FFFFFF;text-align: right;}\n\r"
  ".onoffswitch-switch {display: block;width: 10px;margin: -2px;background: #FFFFFF;position: absolute;top: 0;bottom: 0;right: 14px;border: 2px solid #8084B0;border-radius: 10px;transition: all 0.3s ease-in 0s;}\n\r"
  ".onoffswitch-switch2 {display: block;width: 10px;margin: -2px;background: #FFFFFF;position: absolute;top: 0;bottom: 0;right: 0px;border: 2px solid #8084B0;border-radius: 10px;transition: all 0.3s ease-in 0s;}\n\r"
  ".onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {margin-left: -100%;}\n\r"
  ".onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {right: 0px;}\n\r"
  ".onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch2 {right: 14px;}\n\r";

const static char header4[] PROGMEM =
  ".onoffswitch-inner2 {display: block;width: 200%;margin-left: -100%;transition: margin 0.3s ease-in 0s;}\n\r"
  ".onoffswitch-inner2:before, .onoffswitch-inner2:after {display: block;float: left;width: 50%;height: 6px;padding: 0;line-height: 6px;font-size: 14px;color: white;font-family: Trebuchet, Arial, sans-serif;font-weight: bold;box-sizing: border-box;}\n\r"
  ".onoffswitch-inner2:before {content: \"\";padding-right: 10px;background-color: #0AFF0A;color: #FFFFFF;text-align: right;}\n\r"
  ".onoffswitch-inner2:after {content: \"\";padding-left: 10px;background-color: #FF0000;color: #999999;}\n\r"
  ".onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner2 {margin-left: 0;}\n\r"
  ".out_val {-webkit-appearance: none;appearance: none;padding: 0;margin-left:40px;border: 2px solid #eee;border-radius: 2px;box-shadow: inset 0 1px #ccc, inset 0 1px #575555, inset 0 -1px #00c;background: #fef linear-gradient(#BCBCBC, #fff0f5);overflow: hidden;}\n\r"
  "div.ex_output{width:258px;text-align:center;background-color: #000080;}\n\r"
  "div.ex_output output{font-weight:bold;font-size:16px;color: #CCC;}\n\r"
  "div.ex_pult {width:162px;text-align:center;background-color: #000080;margin-left:6px;}\n\r"
  "div.ex_pult output {font-weight:bold;font-size:16px;color: #CCC;}\n\r"
  "div.output {width:80px;background-color: #EFE3CF;border: 2px solid #006;text-align:center;margin-bottom:4px;margin-right:2px;float:left;}\n\r"
  "div.output div {width:80px;background-color:#C1C5F7;}\n\r"
  "div.output output {font-weight:bold;font-size:16px;color:#009;}\n\r";

const static char header5[] PROGMEM =
  ".rangeP {-webkit-appearance: none;appearance: none;padding: 0;border: 2px solid #eee;border-radius: 2px;background: #fef linear-gradient(#BCBCBC, #fff0f5);overflow: hidden;}\n\r"
  ".rangeP::-moz-range-thumb {border-radius: 2px;box-shadow: -13px 0 #40310a, -26px 0 #40310a, -39px 0 #40310a, -52px 0 #40310a, -65px 0 #40310a, -78px 0 #40310a, -91px 0 #40310a, -104px 0 #40310a, -117px 0 #40310a, -130px 0 #40310a, -143px 0 #40310a, -156px 0 #40310a;}\n\r"
  ".rangeP::-moz-range-track {background: none;border: none;}\n\r"
  ".rangeP::-webkit-slider-thumb { -webkit-appearance: none; width:15px; height:8px; border: 1px solid #000081; border-radius: 2px; background-image:linear-gradient(#dedede, #8282ff); box-shadow: -13px 0 #1c59f4, -26px 0 #1c59f4, -39px 0 #1c55eb, -52px 0 #1c50db, -65px 0 #1b49c9, -78px 0 #1b43b7, -91px 0 #1b3a9e, -104px 0 #1b338d, -117px 0 #1b2d7a, -130px 0 #1b286e, -143px 0 #1b286d, -156px 0 #1b2566;}\n\r"
  ".column_view-off {display: none;text-align: center;color: #000;}\n\r"
  ".column_view-on {background-color: #cbBEFF;}.mode_view-off {display: none;}.mode_view-on {background-color: #D1D2F3;}\n\r"
  ".css-checkbox input[type=checkbox] {\n\r"
  "display: none;}\n\r"
  ".css-checkbox label {\n\r"
  "position: relative;display: block;width: 64px;height: 10px;padding: 15px;\n\r"
  "border-radius: 50px;line-height: 10px;color: #31b3ff;font-size:48px;\n\r"
  "color: #0F0;text-shadow: 1px 1px 0px rgba(255, 255, 255, .15);background: rgb(71, 71, 71);\n\r"
  "box-shadow:\n\r"
  " 0 1px 0 rgba(255, 255, 255, .2), inset 0 0 0 5px rgb(60, 60, 60), inset 0 6px 6px rgba(0, 0, 0, .5), inset 0 -6px 1px rgba(255, 255, 255, .2);\n\r"
  "cursor: pointer;}\n\r"
  ".css-checkbox label:before {\n\r"
  "content: \"•\";font-size:48px;position: absolute;right: 15px;color: #F00;}\n\r"
  ".css-checkbox label:after {\n\r"
  "content: \"\";position: absolute;left: 5px;top: 5px;display: block;\n\r"
  "width: 50px;height: 30px;border-radius: 50px;\n\r"
  "background: #ccc linear-gradient(#fcfff4 0%, #dfe5d7 40%, #b3bead 100%);\n\r"
  "transition: .5s;}\n\r"
  ".css-checkbox input[type=checkbox]:checked + label:after {\n\r"
  "left: 40px;}\n\r"
  "</style>\n\r";

const static char header6[] PROGMEM =
  "<script type= \"text/javascript\">\n\r"
  "var get_ver = 1;\n\r"
  "var timer2;\n\r"
  "var str_URL = \"\"; var x = \"\";\n\r"

  "function sel_but(id_cb) {\n\r"
  "str_URL = id_cb.id;\n\r"
  "if (str_URL == \"rtc_ini\") {\n\r"
  "get_time();\n\r"
  "} else {\n\r"
  "if (str_URL == \"ok\") {\n\r"
  "if (document.getElementById(\"span_but\").textContent == \"▶\") {\n\r"
  "document.getElementById(\"span_but\").textContent = \"||\";\n\r"
  "str_URL += \"=1\";\n\r"
  "} else {\n\r"
  "document.getElementById(\"span_but\").textContent = \"▶\";\n\r"
  "str_URL += \"=0\";\n\r"
  "}}}\n\r"
  "trans_par(id_cb);}\n\r"
  "function get_time(){\n\r"
  "clock();\n\r"
  "str_URL += \"=\" +  Number(Year) + \",\" + (Number(Month)+1) +  \",\" + Number(Den) + \",\" + Number(hours) + \",\" + Number(minutes) + \",\" + Number(seconds);}\n\r"
  "function clock(){\n\r"
  "now = new Date();\n\r"
  "hours = now.getHours();\n\r"
  "minutes = now.getMinutes();\n\r"
  "seconds = now.getSeconds();\n\r"
  "Year = now.getFullYear();\n\r"
  "// var Month = checklength(now.getMonth()+1);\n\r"
  "Month = now.getMonth();\n\r"
  "Den = now.getDate();}\n\r"
  "function trans_par(id_cb) {\n\r"
  "var go_link = \"?\";\n\r"
  "if (document.getElementById(\"ip\").title != \"#\")  //есть WiFi IP\n\r"
  "{ switch (get_ver) {\n\r"
  "case 1: go_link = go_link + \"ip=\" + document.getElementById(\"ip\").title + ';'; break\n\r"
  "case 2: go_link = \"http://\" + document.getElementById(\"ip\").title + \"?ip=192.168.0.128\" + ';'; break\n\r"
  "default: alert(\"no get\"); break}}\n\r"
  "//var lag = document.getElementById(\"r_sec2\").value;\n\r"
  "if (document.getElementById(\"te2\")){\n\r"
  "if (document.getElementById(\"te2\").checked) {\n\r"
  "timer2 = window.setTimeout(function(){str_URL2 =  \"?\" + document.getElementById(\"pult\").title  + \":\" + \"zz=0\";trans_get();},4000);}}\n\r"
  "if (document.getElementById('pultname')) { //pultname только для IR\n\r"
  "str_URL2 = go_link + document.getElementById(\"pultname\").textContent  + ':' + str_URL;\n\r"
  "} else {str_URL2 = go_link + document.getElementById(\"pult\").title  + ':' + str_URL;}\n\r"
  "//alert(\"str_URL2 \"+str_URL2);\n\r"
  "trans_get();}\n\r";


const static char header7[] PROGMEM =
  "function trans_get() {\n\r"
  "var xmlhttp = getXmlHttp(); \n\r"
  "//alert(\"str_URL2= \" + str_URL2);\n\r"
  "xmlhttp.open(\"GET\", str_URL2, true);\n\r"
  "var http = new XMLHttpRequest(), href = this.href;\n\r"
  "http.open(\"GET\", str_URL2);\n\r"
  "http.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\r"
  "xmlhttp.onreadystatechange = function()\n\r"
  "{ if (xmlhttp.readyState == 4) {\n\r"
  "if (xmlhttp.status == 200) {\n\r"
  "x = xmlhttp.responseText;\n\r"
  "getParam(x);}}}\n\r"
  "xmlhttp.send(null);}\n\r";

const static char header8[] PROGMEM =
  "function getXmlHttp() {\n\r"
  "try {return new ActiveXObject(\"Msxml2.XMLHTTP\");}\n\r"
  "catch (e) {try {\n\r"
  "return new ActiveXObject(\"Microsoft.XMLHTTP\");}\n\r"
  "catch (ee) {}} if (typeof XMLHttpRequest != \"undefined\")\n\r"
  "{return new XMLHttpRequest();}}\n\r"
  "function getParam(get) {\n\r"
  "var tmp = new Array(); var tmp2 = new Array(); var param = new Array();\n\r"
  "//alert(\"get= \"+get)\n\r"
  "if (get != \"\") {\n\r"
  "tmp = (get.substr(1)).split(\"&\");\n\r"
  "for (var i = 0; i < tmp.length; i++) {\n\r"
  "tmp2 = tmp[i].split(\"=\");\n\r"
  "param[tmp2[0]] = tmp2[1];}\n\r"
  "for (var key in param) {\n\r"
  "if (param[key] != \"\") {\n\r"
  "if (key.indexOf(\"cb\") >= 0) {\n\r"
  "if (param[key] > 0) {\n\r"
  "document.getElementById(key).checked = true;\n\r"
  "} else {\n\r"
  "document.getElementById(key).checked = false;}\n\r"
  "} else {\n\r"
  "document.getElementById(key).value = param[key];\n\r"
  "}}}}}\n\r";

const static char header9[] PROGMEM =
  "function toggleView(source, tableId, tag) {\n\r"
  "var elems = document.getElementById(tableId).getElementsByTagName(tag);\n\r"
  "for (i = 0; i < elems.length; ++i) {\n\r"
  "toggleClasses(elems[i], \"column_view-off\", \"column_view-on\");}\n\r"
  "return false;}\n\r"
  "function toggleView_mode(source, tableId, tag) {\n\r"
  "var elems = document.getElementById(tableId).getElementsByTagName(tag);\n\r"
  "for (i = 0; i < elems.length; ++i) {\n\r"
  "toggleClasses(elems[i], \"mode_view-off\", \"mode_view-on\");}\n\r"
  "return false;}\n\r"
  "function toggleClasses(elem, className1, className2) {\n\r"
  "var clazz = elem.className.toString();\n\r"
  "if (clazz.indexOf(className1) >= 0) {\n\r"
  "elem.className = clazz.replace(className1, className2);\n\r"
  "} else if (clazz.indexOf(className2) >= 0) {\n\r"
  "elem.className = clazz.replace(className2, className1);}}\n\r";

const static char header10[] PROGMEM =
  "function my_timer(id_cb){\n\r"
  "if (document.getElementById(\"tt1\").checked){my_timer0(id_cb);}}\n\r"
  "function my_timer0(id_cb){\n\r"
  "var interval_id = setInterval(function() {\n\r"
  "if (document.getElementById(\"tt1\").checked == false){\n\r"
  "clearInterval(interval_id); }\n\r"
  "var my_clock = document.getElementById(\"my_clock\");\n\r"
  "var time =my_clock.innerHTML;\n\r"
  "var arr = time.split(\":\");\n\r"
  "var m = arr[0];\n\r"
  "var s = arr[1];\n\r"
  "if (s == 0) {\n\r"
  "s = document.getElementById(\"r_sec\").value;\n\r"
  "str_URL = \"zz=0\";\n\r"
  "trans_par(id_cb);\n\r"
  "}else s--; \n\r"
  "if (s < 10) s = \"0\" + s;\n\r"
  "if (document.getElementById(\"tt1\").checked) {\n\r"
  "document.getElementById(\"my_clock\").innerHTML = m + \":\" + s;}\n\r"
  "}, 1000);}\n\r"
  "function startTimer() {\n\r"
  "if (document.getElementById(\"pultname\")){\n\r"
  "if (document.getElementById(\"pultname\").textContent == \"wait\")\n\r"
  "{var my_host = unescape(document.location.pathname);\n\r"
  "var r = my_host.substring( my_host.lastIndexOf('/') + 1, my_host.length );\n\r"
  "str_URL = \"pn=\" + my_host.substring( my_host.lastIndexOf('/') + 1, my_host.length );\n\r"
  "trans_par(document.getElementById(\"pultname\"));}}\n\r"
  "setTimeout(startTimer, 1000);}\n\r";

const static char header11[] PROGMEM =
  "function sd_index(id_cb) {\n\r"
  "if (id_cb.id[0] == \"c\") {\n\r"
  "var l = id_cb.id.length;\n\r"
  "var sd = \"s\";\n\r"
  "for (var i = 1; i < id_cb.id.length; i++)\n\r"
  "sd = sd + id_cb.id[i];\n\r"
  "} else {\n\r"
  "sd = \"s\" + id_cb.id;}\n\r"
  "var indout = document.getElementById(sd);\n\r"
  "if (indout != null){\n\r"
  "if (document.getElementById(\"ce1\").checked) {\n\r"
  "indout.selectedIndex  = 1;\n\r"
  "indout.style.backgroundColor = \"#fff894\";}}}\n\r"
  "function sel_test(id_cb) {\n\r"
  "var colo = id_cb.options[id_cb.selectedIndex].index;\n\r"
  "switch (colo) {\n\r"
  "case 0: set_color(id_cb, \"#94fff8\"); break\n\r"
  "case 1: set_color(id_cb, \"#fff894\"); break\n\r"
  "case 2: set_color(id_cb, \"#f294ff\"); break\n\r"
  "default: set_color(id_cb, \"#FFFFFF\"); break}\n\r"
  "x = id_cb.id; str_URL = x + \"=\" + colo;\n\r"
  "trans_par(id_cb);}\n\r";

const static char header12[] PROGMEM =
  "function set_color(el, cl) {\n\r"
  "el.style.backgroundColor = cl;}\n\r"
  "function polsun_val(id_cb){\n\r"
  "var x = id_cb.id;\n\r"
  "var newstr = x.replace(new RegExp(\"cd\"),\"cb\");\n\r"
  "if(document.getElementById(newstr)){\n\r"
  "if (id_cb.value >0)\n\r"
  "{document.getElementById(newstr).checked=true;}else{document.getElementById(newstr).checked=false;}}\n\r"
  "str_URL = id_cb.id+\"=\" + id_cb.value;\n\r"
  "if (document.getElementById(\"pultname\").textContent == \"mp3\"){\n\r"
  "document.getElementById(\"result1\").value = id_cb.value;  \n\r"
  "}else{document.getElementById(\"result1\").value = str_URL;}\n\r"
  "sd_index(id_cb);trans_par(id_cb);}\n\r"
  "function cb_check0(id_cb) {\n\r"
  "y = id_cb.name;  //IP adress\n\r"
  "x = id_cb.id;\n\r"
  "if (x.indexOf(\"vv\") >=0 ){x=\"vv12\";}\n\r"
  "if (id_cb.checked) {\n\r"
  "str_URL = x + \"=1\";\n\r"
  "} else {str_URL = x + \"=0\";}\n\r"
  "if(y !=\"\"){\n\r"
  "var temp_ip = document.getElementById(\"ip\").title;\n\r"
  "document.getElementById(\"ip\").title = y;\n\r"
  "trans_par(id_cb);\n\r"
  "//восстановить значение\n\r"
  "document.getElementById(\"ip\").title = temp_ip;\n\r"
  "}else{\n\r"
  "trans_par(id_cb);}}\n\r"

  "function cb_check(id_cb) {\n\r"
  "x = id_cb.id;\n\r"
  "y = x.replace(\"cb\", \"cd\");\n\r"
  "var rng = document.getElementById(y);\n\r"
  "if (id_cb.checked) {\n\r"
  "str_URL = x + \"=1\";\n\r"
  "rng.value = rng.max; sd_index(id_cb);} else {\n\r"
  "str_URL = x + \"=0\";\n\r"
  "rng.value = rng.min;}\n\r"
  "trans_par(id_cb);}\n\r";

const static char header13[] PROGMEM =
  "function f_rec(id_cb){\n\r"
  "var yyy = document.getElementById(\"rec\").style.display;\n\r"
  "if (yyy == \"none\"){\n\r"
  "document.getElementById(\"rec\").style.display = \"block\";\n\r"
  "str_URL = \"rec=1\";}else{\n\r"
  "document.getElementById(\"rec\").style.display = \"none\";\n\r"
  "str_URL = \"rec=0\";}\n\r"
  "trans_par(id_cb);}\n\r"
  "var old_rid;\n\r"
  "function r_check(id_cb){\n\r"
  "if(id_cb.checked){ if (id_cb.id == old_rid){\n\r"
  "id_cb.checked=false;\n\r"
  "old_rid = \"\";\n\r"
  "document.getElementById(\"but_rec\").style.display =\"none\";\n\r"
  "document.getElementById(\"but_rec\").disabled;\n\r"
  "}else{\n\r"
  "document.getElementById(\"but_rec\").style.display =\"block\";\n\r"
  "document.getElementById(\"ex_input\").value = document.getElementById(\"ex_\"+id_cb.id).value; \n\r"
  "old_rid = id_cb.id;}}}\n\r"
  "function rec_edit(id_cb){\n\r"
  "var new_id;\n\r"
  "for (var i=1; i <5; i++){\n\r"
  "if (document.getElementById(\"r\"+String(i)).checked){\n\r"
  "new_id = \"ex_r\"+String(i);}}\n\r"
  "document.getElementById(new_id).value = document.getElementById(\"ex_input\").value;\n\r"
  "str_URL = new_id + \"=\" + document.getElementById(new_id).value;\n\r"
  "alert(\"rec URL \" + str_URL);\n\r"
  "trans_par(id_cb);\n\r"
  "}\n\r"
  "function rec_alarm(id_cb){\n\r"
  "str_URL = id_cb.id + '=' + document.getElementById(\"time_h\").value + ',' + document.getElementById(\"time_m\").value; \n\r"
  "trans_par(id_cb);}\n\r"
  "function t_open(id_cb){\n\r"
  "if (document.getElementById(\"pult2\").style.display == \"none\"){\n\r"
  "document.getElementById(\"pult2\").style.display=\"block\";\n\r"
  "}else{\n\r"
  "document.getElementById(\"pult2\").style.display =\"none\";\n\r"
  "}}\n\r"
  "</script>\n\r"
  "</head>\n\r"
  "<body onload=\"startTimer()\">\n\r";

const static char header14[] PROGMEM =
  "<ul id=\"nav\">\n\r"
  "<li><a href=\"#\" class=\"sub\" tabindex=\"1\">select&nbsp;&nbsp;&nbsp;&nbsp;pult</a>\n\r"
  "<ul>\n\r"
  "<li style=\"text-align:center\"><a href=\"/macro\">MACRO</a></li>\n\r"
  "<li><a href=\"jvc\">JVC</a></li>\n\r"
  "<li><a href=\"lg\">LG</a></li>\n\r"
  "<li><a href=\"panasonic\">PANASONIC</a></li>\n\r"
  "<li><a href=\"samsung\">SAMSUNG</a></li>\n\r"
  "<li><a href=\"/sony\">SONY</a></li>\n\r"
  "<li><a href=\"/grail\">G-Rail</a></li>\n\r"
  "<li><a href=\"/map\">map</a></li>\n\r"
  "<li><a href=\"/ESP8266\">ESP8266</a></li>\n\r"
  "<li><a href=\"/light1\">Light1</a></li>\n\r"
  "<li><a href=\"/light2\">Light2</a></li>\n\r"
  "<li><a href=\"/socket\">РОЗЕТКИ</a></li>\n\r"
  "<li style=\"text-align:center\"><a href=\"/daily\">DAILY</a></li>\n\r"
  "<li onclick=\"f_rec(this)\" style=\"text-align:center\"><a>SCAN</a> <span id= \"rec\" style=\"display: none; color:#F00; font-weight:bold\" align=\"float\">REC</span></li>\n\r"
  "</ul></li></ul><!--end-->\n\r";


const static char file_mp1[] PROGMEM =
  "<table id=\"pult\" title=\"mp3\" width=\"202\" border=\"1\" bgcolor=\"#000066\" bordercolor=\"#666666\" style=\"color:#888\">\n\r"
  "<tr><td colspan=\"3\"><div class= \"ex_output\" style=\"width:176px;\">\n\r"
  "<output id=\"ex_out\"><span>DevKit ESP8266 Control</span></output>\n\r"
  "</div></td></tr>\n\r"
  "<tr><td width=\"58\">&nbsp;</td>\n\r"
  "<td width=\"58\"><div class=\"but\" id=\"but_rec\" style=\"background-color: #999; color: #006; height:22px; width:50px;\" onclick=\"t_open(this)\" > <span style=\"margin-top:3px\" >clock</span> </div></td>\n\r"
  "<td width=\"58\">&nbsp;</td></tr></table>\n\r"
  "<table id=\"pult2\" title=\"mp3\" width=\"202px\" border=\"0\" bgcolor=\"#000066\" bordercolor=\"#666666\" style=\"color:#888; display: block\">\n\r"
  "<tr width=\"58\" id=\"t_line1\">\n\r"
  "<td colspan=\"3\" style=\"color:#CCC; font-weight:bolder;\">\n\r"
  "<div class=\"but\" id=\"rtc_ini\" style=\"background-color: #F00; color: #EEE; height:22px; width:135px;  margin-left:30px\" onClick=\"sel_but(this)\"><span style=\"margin-top:3px;\" >set real time</span> </div></td></tr>\n\r"
  "<tr id=\"t_line2\">\n\r"
  "<td width=\"58px\"><input type=\"number\" min=\"0\" max=\"23\" step=\"1\" id=\"time_h\" style=\"width:30px; text-align:center\" value=\"0\"/><span style=\"font-size:11px; color:#CCC\">&nbsp;час</span></td>\n\r"
  "<td width=\"58px\"><input type=\"number\" min=\"0\" max=\"59\" step=\"1\" id=\"time_m\" style=\"width:30px;text-align:center\" value=\"0\"/><span style=\"font-size:11px; color:#CCC\">&nbsp;мин</span></td>\n\r"
  "<td width=\"58px\"><div class=\"but\" id=\"alarm\" style=\"background-color: #999; color: #006; height:20px; width:50px;\" onclick=\"rec_alarm(this)\" > <span style=\"margin-top:4px\" >alarm</span> </div></td></tr></table>\n\r";


const static char file_mp2[] PROGMEM =
  "<table id=\"pult2\" width=\"202\" border=\"1\" bgcolor=\"#000066\" bordercolor=\"#666666\" style=\"color:#888\"><tr>\n\r"
  "<td width=\"58\"><input type=\"radio\" name=\"mp3\" id=\"ff1\" value=\"ie\" onclick=\"cb_check(this)\"> 1</td>\n\r"
  "<td width=\"58\"><input type=\"radio\" name=\"mp3\" id=\"ff2\" value=\"ie\" onclick=\"cb_check(this)\"> 2</td>\n\r"
  "<td width=\"58\"><input type=\"radio\" name=\"mp3\" id=\"ff3\" value=\"ie\" onclick=\"cb_check(this)\"> 3</td></tr>\n\r"
  "<tr><td><input type=\"radio\" name=\"mp3\" id=\"ff4\" value=\"ie\" onclick=\"cb_check(this)\"> 4</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff5\" value=\"ie\" onclick=\"cb_check(this)\"> 5</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff6\" value=\"ie\" onclick=\"cb_check(this)\"> 6</td></tr>\n\r"
  "<tr><td><input type=\"radio\" name=\"mp3\" id=\"ff7\" value=\"ie\" onclick=\"cb_check(this)\"> 7</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff8\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "8</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff9\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "9</td></tr>\n\r"
  "<tr><td><input type=\"radio\" name=\"mp3\" id=\"ff10\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "10</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff11\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "11</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff12\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "12</td></tr>\n\r";

const static char file_mp3[] PROGMEM =
  "<tr><td><input type=\"radio\" name=\"mp3\" id=\"ff13\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "13</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff14\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "14</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff15\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "15</td></tr>\n\r"
  "<tr><td><input type=\"radio\" name=\"mp3\" id=\"ff16\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "16</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff17\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "17</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff18\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "18</td></tr>\n\r"
  "<tr><td><input type=\"radio\" name=\"mp3\" id=\"ff19\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "19</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff20\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "20</td>\n\r"
  "<td><input type=\"radio\" name=\"mp3\" id=\"ff21\" value=\"ie\" onclick=\"cb_check(this)\">\n\r"
  "21</td></tr>\n\r"
  "<tr><td ><div class=\"key\" id=key_left onclick=\"sel_but(this)\"><span  style=\"font-size:24px; margin:2px;\">&laquo;</span></div></td>\n\r"
  "<td><div class=\"but\" id=ok onclick=\"sel_but(this)\"><span id=span_but style=\"font-size:24px;margin:2px;\">&#x25B6;</span></div></td>\n\r"
  "<td><div class=\"key\" id=key_right onclick=\"sel_but(this)\"><span  style=\"font-size:24px;margin:2px;\">&raquo;</span></div></td>\n\r"
  "</tr><tr>\n\r"
  "<td colspan=\"3\" align=\"center\" >volume =<span >\n\r"
  "<output id=\"result1\">0</output>\n\r"
  "</span></td></tr>\n\r"
  "<tr><td colspan=\"3\" align=\"center\"><input type=\"range\" onchange=\"polsun_val(this)\" class=\"rangeP\" id=\"cd30\" value=\"30\" max=\"30\" min=\"0\"  /></td></tr>\n\r"
  "<tr><td colspan=\"3\"><div class=\"cleared\"></div>\n\r"
  "<div class= \"ex_pult\" style=\"width:192px; margin-left:0px;\">\n\r"
  "<output id=\"pultname\"><span>mp3</span></output>\n\r"
  "</div></td></tr></table>\n\r"
  "<div id=\"ip\" title=\"#\"></div>\n\r"
  "</body></html>\n\r";

const char* const html_header[] PROGMEM = {header0, header1, header2, header3, header4, header5, header6, header7,
                                           header8, header9, header10, header11, header12, header13, header14
                                          };
const char* const html_mp3[] PROGMEM = {file_mp1, file_mp2, file_mp3};
/*--вариант 2---*/
const char* ssid = "ESP8266";      //имя точки подключения (WiFi сети), которую создаёт этот ESP8266 (WiFi router)
const char* password = "testwifi"; //ключ или пароль WiFi сети (WiFi router)

//----------------
//вариант 1 const char WiFiAPPSK[] = "testwifi"; //свой пароль, сеть будет (что-то вроде ThingDev-A37) IP 192.168.4.1
//---------
//=======================
int  maxval = 30;
//======================
int pin = 2;//????????
int sos = 0;
int cikl_avto = 1000; //интервал ~1 сек
int cikl_current = 0; //интервал ~1 сек
String priem = "";
String mess = "";
byte out_ip[] = { 192, 168, 4, 1 };
int k_time = 0;
int k_speed = 1;
int tt_time = 0;
int cikl_count = 0;
//======================
int num_trek = 20;//номер мп3-записи

//pir =================
int pirPin = 16;//у автора 15 //вывод, пин, контакт для подключения датчика ???? к Arduino
int ledPin = 2;              //использование стандартного (встроенного) светодиода
int val_pir = 0;                  //переменная для хранения состояния датчика ???
int count_pir = 0;
//=====================
//int SDA_I2C_Pin=4;//RTC ds3231, D14(D4) Arduino, GPIO4 ESP8266-12E
//int SCL_I2C_Pin=5;//RTC ds3231, D15(D3) Arduino, GPIO5 ESP8266-12E
int time_year;
int time_month;
int time_day;
int time_week;
int time_hour;
int time_minute;
int time_second;
int alarm_h;
int alarm_m;
boolean time_boy = false;

String zapros;
String ex_link = "";
String ex_ip = "";
String temp_ip = "192.168.4.1";
int ind1, ind2;
WiFiServer server(80); //создаем объект WEB-server на 80 порту
WiFiClient client; //создаем объект client класса WiFiClient
DateTime  t_now;

void setup()
{
  mySoftwareSerial.begin (9600);
  Serial.begin(74880);
  //сообщаю что к каким пинам должно быть подключено
  Serial.println("");
  Serial.println(F("for DFPlayer_Mini, mySoftwareSerial RX,TX=")); 
  Serial.println(RX);
  Serial.println(TX);
  Serial.println("");
  Serial.println(F("for DS3231 I2C define SDA, SCL=")); 
  Serial.println(SDA);
  Serial.println(SCL);
  Serial.println();
  Serial.println(F("UltraSonic TRIG_PIN, ECHO_PIN=")); 
  Serial.println(TRIG_PIN);
  Serial.println(ECHO_PIN);
  Serial.println();
  Serial.println(F("pir=")); 
  Serial.println(pirPin);
  Serial.println(F("ledPin=")); 
  Serial.println(ledPin);

 //Wire.begin(4, 5); //I2C для часов (int sda, int scl) , по умолчанию 4 (SDA) и 5 (SCL).
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  //для mp3 модуля
  //mp3_set_serial (mySoftwareSerial);
  
     // initializing the rtc
    if(!rtc.begin()) {
        Serial.println("setup_rtc.begin().Test RTC_DS3231. Couldn't find RTC!");
        Serial.flush();//Ожидает завершения передачи исходящих последовательных данных.
        abort();
        /* Функция abort () вызывает аварийное завершение программы.
    Эта реализация отключает прерывания и переходит к функции _exit ().
    с аргументом, равным 1. В ограниченной среде AVR выполнение
    эффективно останавливается входом в бесконечный цикл.
         */
    }
 else
{
  Serial.println(F("setup_connection to RTC_DS3231"));
}
 
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
    }
else
{
  Serial.println(F("connection to DFPlayer"));
}



  myDFPlayer.volume(20);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
    //----Read imformation----
//  Serial.println(myDFPlayer.readState()); //read mp3 state
//  Serial.println(myDFPlayer.readVolume()); //read current volume
//  Serial.println(myDFPlayer.readEQ()); //read EQ setting
//  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
//  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
//  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03

  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  
  //      rtc.adjust(DateTime(__DATE__, __TIME__));
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //установка часов при компиляции
  pinMode(pirPin, INPUT);       //настоить контакт для датчика как вход
  pinMode(ledPin, OUTPUT);      //определить контакт со светодиодом как выход

IPAddress ip(192, 168, 4, 1); //Node static IP
IPAddress gateway(192, 168, 4, 2);
IPAddress subnet(255, 255, 255, 0); //- See more at: http://www.esp8266.com/viewtopic.php?f=6&t=3522#sthash.sWvIJ5y5.dpuf

//вариант 1 
//WiFiClient client; //ruben
//---------
//вариант 2
//WiFiClient client = server.available(); //проверяем, не подключен ли к нашему серверу клиент-браузер
//--------

  //---------вариант 2--------------------------
//====мне НЕ надо подключаться к сети. Подключаются по мне!!!! Я точка доступа!!!

// Если мне надо подключиться к существующей WiFi-сети (роутеру/точке доступа)
//  WiFi.begin(ssid, password);
//WiFi.config(ip, gateway, subnet);  ////Node static IP установить статический IP адрес
//delay(100);
//  Serial.println("");

  //запускаю точку доступа, к которой будут подключаться клиенты(не более 5шт)
  WiFi.softAP(ssid);//, password что бы входить без пароля
  WiFi.softAPConfig(ip, gateway, subnet);
  delay(100);
  Serial.print("setup_Start_Soft-AP IP address = ");
         //  "IP-адрес программной точки доступа = "
Serial.println(WiFi.softAPIP());
//WiFiClient client = server.available(); //запускаю постоянную проверку не подключен ли к нашему серверу клиент-браузер

  server.begin();//"Веб-сервер запущен
  Serial.println("setup_HTTP server started");

  // Wait for connection
//  Serial.print("WL_CONNECTED=");
//  Serial.println(WL_CONNECTED);//WL_CONNECTED=3
  //WL_CONNECTED - если соединение с сетью установлено
//WL_IDLE_STATUS - если включено питание, но соединение с сетью не установлено
  //while (WiFi.status() != WL_CONNECTED) {
  //здесь программа будет зациклена, пока к ней неподключится клиент
  //А это неправильно!!!!!
//  while (WiFi.status() !=1) {
//    delay(500);
//    Serial.print(".");
    //Serial.print("now_WiFi.status()=");
    //Serial.println(WiFi.status());
//  }

//  Serial.print("Connected to ");
//  Serial.println(ssid);
//  Serial.print("IP address: ");
//  Serial.println(WiFi.localIP());
  /*
  String str_ip = String(WiFi.localIP()); //192.168.0.104 = 1744873664
  Serial.println(str_ip);
  */
//  IPAddress ip = WiFi.localIP();
  //file3a = "str_URL2=\"http://" + String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]) + "/led?\" + str_URL;";

  t_now = rtc.now();
  //===
  Serial.println("setup_YYYY/MM/DD(dayOfTheWeek) HH:MM:SS");
  Serial.print(t_now.year(), DEC);
  Serial.print('/');
  Serial.print(t_now.month(), DEC);
  Serial.print('/');
  Serial.print(t_now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[t_now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(t_now.hour(), DEC);
  Serial.print(':');
  Serial.print(t_now.minute(), DEC);
  Serial.print(':');
  Serial.print(t_now.second(), DEC);
  Serial.println();
  //====================================
  num_trek = random(1, 90);
  myDFPlayer.play(num_trek);  
  //mp3_play(num_trek);
  // mp3_play ();
  // mp3_random_play ();
}

void loop(){
  //Serial.printf("Stations connected to soft-AP = %d\n", WiFi.softAPgetStationNum());
          //  "количество Станций, подключенные к точке доступа = "
  //bell - бой часов ========================
  time_get();
  Serial.println("loop_start+time_get()");
  delay (100); //400 без задержки (time_minute = 0 всегда!!!)
//  //===alarm - будильник===
//  if (alarm_h != 0 || alarm_m != 0) {
//    if (time_hour == alarm_h && time_minute == alarm_m) {
//      //mp3_
//      myDFPlayer.stop();
//      delay (400);
//      //mp3_
//      myDFPlayer.play(246);
//      delay (20000);
//    }
//  }
//  if (time_minute == 0) {
//    if (time_boy == false) {
//      //mp3_
//      myDFPlayer.stop();
//      delay (400);
//      if (time_hour == 12) {
//        //mp3_
//        myDFPlayer.play(212);
//      } else {
//        //mp3_
//        myDFPlayer.play(202);
//      }
//      time_boy = true;
//      delay (20000);
//    }
//  }
//  if (time_minute == 30) {
//    if (time_boy == false) {
//      //mp3_
//      myDFPlayer.stop();
//      delay (400);
//      //mp3_
//      myDFPlayer.play(231);
//      time_boy = true;
//      delay (20000);
//    }
//  }
//  if (time_minute != 00 && time_minute != 30) { //сброс флага боя часов
//    time_boy = false;
//  }
////проверяем сигнал на pirPin
//  if (digitalRead(pirPin) != val_pir) {
//    val_pir = digitalRead(pirPin);
//    if (val_pir == 1) {
//      count_pir += 1;
//      if (time_hour >= 10 && time_hour < 22) {
//        num_trek = random(1, 90);
//        //mp3_
//        myDFPlayer.play(num_trek);
//      }
//    }
//    /*else {
//      digitalWrite(ledPin, HIGH);
//    }*/
//    Serial.print ("loop_pir count= ");
//    Serial.print (count_pir);
//    Serial.print ("   val_pir= ");
//    Serial.println (val_pir);
//  }
//  digitalWrite(ledPin, val_pir);//digitalRead(pirPin));
  /*
    //====UltraSonic=================
    long duration, distanceCm, distanceIn;
    //mp3_next ();
    //delay(4000);
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    duration = pulseIn(ECHO_PIN, HIGH); //длительность импульса в микросекундах

    // convert the time into a distance
    distanceCm = duration / 29.1 / 2 ;  //расстояние в см.
    distanceIn = duration / 74 / 2;     //расстояние в дюймах

    if (distanceCm <= 0) {
      Serial.println("Out of range");
    }
    else {
      if (distanceCm < 110 && distanceCm > 100) {
        num_trek = random(14, 15);
        play_treck (10, num_trek);
        //      mp3_play_physical (num_trek);
        delay (6000);
        //  delay (8000);//      tone(beep, 3000, 500); //30*distanceCm); //tone(pin, frequency, duration)
        //      tone(beep,4000-distanceCm*100,30*distanceCm); //tone(pin, frequency, duration)
        //      delay(distanceCm * 100);
      }

      else {
        num_trek = random(1, 88);
        if (distanceCm <= 100  && distanceCm > 80) {

          play_treck (6, num_trek);
          delay (8000);
        }
        else {
          if (distanceCm <= 80  && distanceCm > 70) {
            //mp3_next ();// mp3_play (10);
            play_treck (6, num_trek);
            delay (7000);
          }
          else {
            if (distanceCm <= 70  && distanceCm > 60) {
              //mp3_prev ();
              play_treck (6, num_trek);
              delay (6000);
            }
            else {
              if (distanceCm <= 60  && distanceCm > 50) {
                play_treck (6, num_trek);
                delay (5000);
              }
              else {
                if (distanceCm <= 50  && distanceCm > 40) {
                  play_treck (6, num_trek);
                  delay (4000);
                }
                else {
                  if (distanceCm <= 40  && distanceCm > 30) {
                    play_treck (6, num_trek);
                    delay (3000);
                  }
                  else {
                    if (distanceCm <= 30) {
                      mp3_next ();
                      delay (2000);
                    }
                  }
                }
              }
            }
          }
        }
        Serial.print(distanceIn);
        Serial.print("in, ");
        Serial.print(distanceCm);
        Serial.print("cm");
        Serial.println();
      }
      delay(500);

    }
    */
  //-=============================
 //   WiFiClient client = server.available(); //так было ruben
// Serial.print("loop_server.handleClient()=");
// Serial.println(server.handleClient());//class WiFiServer' has no member named 'handleClient'

  Serial.print("loop_server.available()=");
 Serial.println(server.available());

  //client = server.available();
  if (! server.available()) {
    Serial.println("loop_no connect to ESP8266. return");
    return;//в начало loop
  }
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.print("loop. From client: ");
  Serial.println(req);
  priem = req;
  mess = "";
  int length_priem=priem.length();
  if(length_priem > 2)
  {
   Serial.print("loop. string.length(priem)=");
  Serial.println(length_priem);
    analis();
  }
  delay(10);
  Serial.println("loop finish");
}

void time_get(void) {
  t_now = rtc.now();
  time_year = t_now.year();
  time_month = t_now.month();
  time_day = t_now.day();
  //time_week = t_now.week();
  time_hour = t_now.hour();
  time_minute = t_now.minute();
  /*
    Serial.print("time_minute: ");
    Serial.println(time_minute);
  */
  time_second = t_now.second();
}

//String zapros;
//String ex_link = "";
//String ex_ip = "";
//String temp_ip = "192.168.4.1";
//int ind1, ind2;

//===========================
void analis()
{
  boolean fl_mess = true;
  String vetka;
    Serial.println("analis().start");
  ex_ip = "";
  ex_link = "";
  ind1 = priem.indexOf("?ip=");              //это внешний запрос?
  if (ind1 >= 0) {                           //да  &ip=192.168.0.128;map:cb12=1
    ind1 = priem.indexOf("=");              //это внешний запрос?
    ind2 = priem.indexOf(';');
    ex_ip = priem.substring(ind1 + 1, ind2);    //ip запроса
    //    Serial.println(ex_ip);
    priem.remove(0, ind2 + 1);             //
  } else {                                  //удаляем все вплоть до "?"
    ind1 = priem.indexOf('?');
    priem.remove(0, ind1 + 1);
  }
  ind2 = priem.indexOf(':');     //GET /?map:cb0=0 HTTP/1.1  или  map:cb0=0 HTTP/1.1
  ex_link = priem.substring(0, ind2);    // map  - страничка запроса
  priem.remove(0, ind2 + 1);           //cb0=0 HTTP/1.1
  if (priem.indexOf("key_right") >= 0) {
    //mp3_
    myDFPlayer.next();
    mess = "play next";
  } else {
    if (priem.indexOf("key_left") >= 0) {
      //mp3_
      myDFPlayer.previous();  
      mess = "play prev";
    } else {
      //Serial.println("ex_link " + ex_link);
      //Serial.println("1- " + priem);
      ind2 = priem.indexOf('=');
      String zapros = priem.substring(0, ind2);    //cb0  (=0) или cbA0
      //  Serial.println("2- " + zapros);
      //==================================================
      vetka = zapros.substring(0, 2);       //cb
      //  Serial.println(zapros);
      zapros.remove(0, 2);                //2 или A0
      pin = zapros.toInt();               //номер песни

      priem.remove(0, ind2 + 1);          //оставить все после знака =  0 HTTP/1.1
      ind1 = priem.indexOf(' ');          //найти пробел
      zapros = priem.substring(0, ind1);  //все до пробела    0
      sos = zapros.toInt();               //преобразовали значение в цифру
      //int vol_sos = sos;
      if (vetka == "GE" or vetka == "ne")     //первый запрос- обновить страницу, проверка
      {
        client.flush();
        for (int i = 0; i < 15; i++)       //грузим общий HEADER
        { //mess = html_header[i];//неправильно!!!!
          mess = FPSTR(html_header[i]);
          Serial.print("945_otvet na zapros=");
          Serial.println(mess);
          client.print(mess);
          delay( 10 );
        }
        for (int i = 0; i < 3; i++)
        { //mess =  html_mp3[i];
          mess =  FPSTR(html_mp3[i]);
          client.print(mess);
          delay( 10 );
        }
        fl_mess = false;
      } else {
        //out_mess("Get result=&out2=34&out1=19&out3=test");  //проверка обратной связи @test@
        if (vetka == "ok")          //on/off
        {
          if (sos == 0) {
            //mp3_pause ();
            myDFPlayer.pause();
          } else {

            //mp3_random_play ();
            myDFPlayer.randomAll(); //Random play all the mp3.
            //mp3_play ();
            myDFPlayer.play();
          }
          mess = " mp3(play";

        } else {
          if (vetka == "cd") {    //potenciometr
            if (pin == 30) {
              //mp3_set_volume(sos);
              myDFPlayer.volume(sos);  //Set volume value. From 0 to 30
              mess = "volume";
            }
          } else {
            if (vetka == "ff") {
              Serial.print("ff = ");
              Serial.println(pin);
              //mp3_
              myDFPlayer.play(pin);
              mess = "play #";
              Serial.println(mess);
            } else {
              fl_mess = false;
              if (vetka == "zz") {  //сбор и передача параметров на центральный сервер 192.168.0.128
                out_mess (obzor());
                // sborka();
              } else {
                if (vetka == "rt") {  //утановка часов "rtc_ini="
                  ind1 = priem.indexOf('=');
                  ind2 = priem.indexOf(" HT");
                  mess = priem.substring(ind1 + 1, ind2);
                  //Serial.println("mess= " + mess);
                  rtc_razbor(mess);
                  //Serial.println("mess= " + mess);
                  rtc.adjust(DateTime(time_year, time_month, time_day, time_hour, time_minute, time_second)); //уcтановка!!!
                  //rtc.adjust(DateTime(2016, 11, 7, 16, 20, 0)); //уcтановка!!!
                } else {
                  if (vetka == "al") {
                    Serial.println("priems= " + priem);
                    ind1 = priem.indexOf('=');
                    ind2 = priem.indexOf(" HT");
                    mess = priem.substring(ind1 + 1, ind2);
                    ind2 = mess.indexOf(',');
                    alarm_h = mess.substring(0, ind2).toInt();  //???
                    mess.remove(0, ind2 + 1);
                    alarm_m = mess.toInt();
                    out_mess("Get result=&ex_out=alarm: " + String(alarm_h) + ':' + String(alarm_m));
                  } else {
                    if (vetka == "ce") {
                      out_mess("Get result=&out2=34&out1=19&out3=test");
                    } else {
                      if (vetka == "tt") {
                        tt_time = sos;
                        Serial.println("tt_time = " + tt_time);
                        //ex_ip = "192.168.0.128";
                        //out_mess("?map:result=&out2=34&out1=19&out3=test");
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  if (fl_mess) {
    form_mess(mess, pin, sos);

  }
  Serial.println("analis() finish. vetka - " + vetka + ", pin - " + pin + ", vol - " + sos);
}

void rtc_razbor(String str_time) {
  int count_t = 0;
  while (str_time.indexOf(',') >= 0) {
    ind1 = str_time.indexOf(',');
    count_t += 1;
    switch (count_t) {
      case 1: {
          time_year = str_time.substring(0, ind1).toInt();
          break;
        }
      case 2: {
          time_month = str_time.substring(0, ind1).toInt();
          break;
        }
      case 3: {
          time_day = str_time.substring(0, ind1).toInt();
          break;
        }
      case 4: {
          time_hour = str_time.substring(0, ind1).toInt();
          break;
        }
      case 5: {
          time_minute = str_time.substring(0, ind1).toInt();
          break;
        }
      default:
        // if nothing else matches, do the default
        // default is optional
        break;
    }
    str_time.remove(0, ind1 + 1);
  }
  time_second = str_time.substring(0, ind1).toInt();
}
void sborka() {
  ex_ip = temp_ip;   //"192.168.0.128"; //должны получить при внешнем запросе
  out_mess (obzor());           //("result=&out2=34&out1=19&out3=test");
}

String obzor() {       //состояние элементов управления
  String result;
  result = "result=&16=" + String(analogRead(16)) + "&5=" + String(analogRead(5)) + "&4=" + String(analogRead(4)) + "&0=" + String(analogRead(0)) + "&12=" + String(analogRead(12)) + "&13=" + String(analogRead(13));
  return result;
}

void form_mess(String m_str, int spin, int ssos) {
  if (ex_ip == "") {
    mess = "Get result=&ex_out=" + m_str;
  } else {
    mess = "result=" + m_str;
  }
  if (spin != 20) {
    mess += spin;
  } else {
    mess += "A0";
  }
  if (ssos != -1) {
    mess += ", ";
    if (ssos == -2) {
      mess += "OUTPUT";
    } else {
      if (ssos == -3) {
        mess += "INPUT";
      } else    mess += ssos;
    }
    mess += ");";
  }
  out_mess(mess);
}

void out_mess(String m_str)
{
  if (ex_ip != "") {
    convert_ip();             //ex_ip
    if (client.connect(out_ip, 80)) {
      Serial.print("connected - ");
      client.flush();
      m_str = "/" + ex_link + "?" + m_str;
      client.println(m_str);
      client.println();
    }
  } else {
    client.flush();
     mess = "HTTP / 1.1 200 OK\r\n";                 //ruben
     mess += "Content - Type: text / html\r\n\r\n";  //ruben
    client.print(mess);
    client.print(m_str);
  }
  Serial.println(m_str);
}

void convert_ip(void) {
  priem = ex_ip;                 //ip в чистом виде 192.168.0.121
  temp_ip = ex_ip;               //запомнили для передачи параметров по таймеру
  for (int i = 0; i < 3; i++) {
    ind2 = priem.indexOf('.');     //192.168.0.   121/?
    out_ip[i] =  priem.substring(0, ind2).toInt();
    priem.remove(0, ind2 + 1);
    //Serial.println(cod_note);  //test
  }
  out_ip[3] =  priem.toInt();
}


//--========================================================--

void INTERRUPT_ok()
{
  Serial.print("INTERRUPT ok - ");
  Serial.println(pin);
}


//void play_treck (int tt, int num_) {
//  delay(tt * 1000);
//  mp3_play_physical (num_);
//}
/* function library DFPlayer_Mini_Mp3.h
   mp3_play ();    //start play
   mp3_play (5);  //play "mp3/0005.mp3"
   mp3_next ();   //play next
   mp3_prev ();   //play previous
   mp3_set_volume (uint16_t volume);  //0~30
   mp3_set_EQ (); //0~5
   mp3_pause ();
   mp3_stop ();
   void mp3_get_state ();   //send get state command
   void mp3_get_volume ();
   void mp3_get_u_sum ();
   void mp3_get_tf_sum ();
   void mp3_get_flash_sum ();
   void mp3_get_tf_current ();
   void mp3_get_u_current ();
   void mp3_get_flash_current ();
   void mp3_single_loop (boolean state);  //set single loop
   void mp3_DAC (boolean state);
   void mp3_random_play ();
 */
/* функции библиотеки DFRobotDFPlayerMini.h
   //----Set volume----
  myDFPlayer.volume(10);  //Set volume value (0~30).
  myDFPlayer.volumeUp(); //Volume Up
  myDFPlayer.volumeDown(); //Volume Down

  //----Set different EQ эквалайзер----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
//  myDFPlayer.EQ(DFPLAYER_EQ_POP);
//  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
//  myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
//  myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
//  myDFPlayer.EQ(DFPLAYER_EQ_BASS);

  //----Set device we use SD as default----
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH);

   //----Mp3 control----
//  myDFPlayer.sleep();     //sleep
//  myDFPlayer.reset();     //Reset the module
//  myDFPlayer.enableDAC();  //Enable On-chip DAC
//  myDFPlayer.disableDAC();  //Disable On-chip DAC
//  myDFPlayer.outputSetting(true, 15); //output setting, enable the output and set the gain to 15

 //----Mp3 play----
  myDFPlayer.next();  //Play next mp3
  myDFPlayer.previous();  //Play previous mp3
  myDFPlayer.play(1);  //Play the first mp3
  myDFPlayer.loop(1);  //Loop the first mp3
  myDFPlayer.pause();  //pause the mp3
  myDFPlayer.start();  //start the mp3 from the pause
  myDFPlayer.playFolder(15, 4);  //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)
  myDFPlayer.enableLoopAll(); //loop all mp3 files.
  myDFPlayer.disableLoopAll(); //stop loop all mp3 files.
  myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)
  myDFPlayer.advertise(3); //advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535)
  myDFPlayer.stopAdvertise(); //stop advertise
  myDFPlayer.playLargeFolder(2, 999); //play specific mp3 in SD:/02/004.mp3; Folder Name(1~10); File Name(1~1000)
  myDFPlayer.loopFolder(5); //loop all mp3 files in folder SD:/05.
 myDFPlayer.randomAll(); //Random play all the mp3.
  myDFPlayer.enableLoop(); //enable loop.
  myDFPlayer.disableLoop(); //disable loop.
   */

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Вы правда думаете, что кто-то станет копать 1200 строчек нечитаемого кода. даже не имея от вас четких указаний. что же не работает?

Попробуйте для начала упростить код. Если вы считаете. что дело в веб-контенте - оставьте только сервер и этот контент. проверьте, как будет работать.

Не говоря уж о том, что примерно четверть кода в листинге закомментирована... Если этот код не нужен. зачем Вы его выложили?

123ksn
Offline
Зарегистрирован: 24.11.2014

b707 пишет:

Вы правда думаете, что кто-то станет копать 1200 строчек нечитаемого кода. даже не имея от вас четких указаний. что же не работает?

Попробуйте для начала упростить код. Если вы считаете. что дело в веб-контенте - оставьте только сервер и этот контент. проверьте, как будет работать.

Не говоря уж о том, что примерно четверть кода в листинге закомментирована... Если этот код не нужен. зачем Вы его выложили?

1)Спасибо, что откликнулись. Мне никто ничего не должен и поэтому если этот проект заглянувшему в эту ветку не интересен - воспитанный человек молча пройдёт мимо. Но! Я ведь привёл не только "проштудированный" мной код, и дал ссылки на оригинал. Не нравится мой код-посмотрите код автора. Он конечно более красивый, но даже не компилируется.

2)Я очень четко указал, что не работает - страница не грузится в браузер. Другие проблемы меня не интересуют. Я их сам разгребу. 

3)Некорый Код автора закомментирован. Я его не правил. Мои комментарии в основном вверху и носят справочный характер.  Я люблю делать для себя памятки.

4)Если кто-то решит посмотреть в чем "собака зарыта" я думаю не проблема скопипастить этот огромный код и увидеть суть проблемы.

Повторяю, что меня интересует ТОЛЬКО почему не полностью грузится страница в браузер. И если бы она никода не грузилась!!!! А так ведь у автора работала и даже у меня пару раз из ста с этим кодом загрузилась.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот это почему сделано?

//client = server.available(); 

Вообще, как мне кажется после беглого чтения - код крайне... как бы это выразится... оригинальный. Я бы на месте ESP-шки заглючил.

b707
Онлайн
Зарегистрирован: 26.05.2017

123ksn пишет:

Повторяю, что меня интересует ТОЛЬКО почему не полностью грузится страница в браузер. И если бы она никода не грузилась!!!! А так ведь у автора работала и даже у меня пару раз из ста с этим кодом загрузилась.

какая именно страница? Если речь о том жутком ява коде. что занимает первую половину скетча - то я как не старался - так и не нашел, где же вы этот код в своем скетче используете

Вы из кода всю работу с HTML. насколько я вижу - выкинули... метод handle_client() закомментирован. Говорите у вас страница "иногда загружается" ? - покажите строчку в коде. где это происходит. По-моему. она не загружается вообще... и не должна с таким кодом.

Вы, видимо, кое-что понимаете в коде (или, точнее, думаете что понимаете) - поэтому полезли править работающий код, не разобравшись в том, как он работает. Был бы на вашем месте менее самоувереный новичок - он бы, обнаружив ошибку, пошел спрашивать на форум и выяснил, что нужно просто найти именно те библиотеки, которыми пользовался автор - с ними бы собралось без проблем. А вкерсия ардуино иде тут вовсе не при чем.

123ksn
Offline
Зарегистрирован: 24.11.2014

sadman41 пишет:

Вот это почему сделано?

//client = server.available(); 

Вообще, как мне кажется после беглого чтения - код крайне... как бы это выразится... оригинальный. Я бы на месте ESP-шки заглючил.

Спасибо, что уделили моей проблеме время. Прямо сейчас я не могу на этот вопрос ответить. С ESP8266 я столкнулся в первый раз, поэтому даже не знаю, я ли это сделал и если я - то сейчас не помню почему. Я на месяц этот проект отложил, так как было много других проблем.

123ksn
Offline
Зарегистрирован: 24.11.2014

b707 пишет:

123ksn пишет:

Повторяю, что меня интересует ТОЛЬКО почему не полностью грузится страница в браузер. И если бы она никода не грузилась!!!! А так ведь у автора работала и даже у меня пару раз из ста с этим кодом загрузилась.

какая именно страница? Если речь о том жутком ява коде. что занимает первую половину скетча - то я как не старался - так и не нашел, где же вы этот код в своем скетче используете

А что их несколько? Я не могу Вам ответить на Ваш вопрос. По тому, что я видел у себя на ПК и по описанию автора грузится одна страница с элементами настройки часов. Так вот, в основном в браузере ничего не появлялось. Поэтому я попытался посмотреть, принял ли браузер хоть что-нибудь. На тот момент, когда я смотрел в браузере было несколько строк. Т.е. ESP8266 что-то успевал передать. Сейчас попробую поискать скриншоты на компьютере. 

b707
Онлайн
Зарегистрирован: 26.05.2017

не надо, я уже нашел.

123ksn
Offline
Зарегистрирован: 24.11.2014

b707 пишет:

Вы из кода всю работу с HTML. насколько я вижу - выкинули... метод handle_client() закомментирован. Говорите у вас страница "иногда загружается" ? - покажите строчку в коде. где это происходит. По-моему. она не загружается вообще... и не должна с таким кодом.

Вы, видимо, кое-что понимаете в коде (или, точнее, думаете что понимаете) - поэтому полезли править работающий код, не разобравшись в том, как он работает. Был бы на вашем месте менее самоувереный новичок - он бы, обнаружив ошибку, пошел спрашивать на форум и выяснил, что нужно просто найти именно те библиотеки, которыми пользовался автор - с ними бы собралось без проблем. А вкерсия ардуино иде тут вовсе не при чем.

Уважаемый b707, Возможно Вы абсолютно правы, что я что-нибудь лишнее заремировал. Но код был точно неработающий на моей версии arduino IDE. Я заставил работать на своей конфигурации arduino IDE другой проект автора с аналогичной идеалогией http://ruben1.narod.ru/hobby/arduino/wemos_control.html  Поэтому я не полный идиот, как Вам может сейчас показаться. Я заставил в говорящих часах работать ту часть кода, которая отвечает за dfPlayer и DS3231. C HTML и JAVA я совершенно незнаком. Поэтому когда уперся в эти "стены", после нескольких попыток, решил обратиться на форум.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

123ksn пишет:



Но нарисовалась проблема, которую я так и не смог решить. При попытке компиляции проекта в моей конфигурации (Windows_7_max_32bit + Arduino IDE v1.8.13 + плата WeMos R1 D1+ dfplayer + DS3231) проект не компилировался. Проблема оказалась в несовместимости последней Arduino IDE v1.8.13 с версией библиотеки для dfplayer в проекте Лачинова. Заменил библиотеку, поменял используемые выводы WeMos, исправил способ чтения из PROGMEM и проект откомпилировался и залился в ESP8266. Но при попытке открыть страницу из браузера она редко открывается. Сейчас пишет, что страница недоступна. При сбросе может воспроизвести рычание и несколько файлов. В HTML-коде, видимо, используется что-то из семейства java, в котором я не разбираюсь. Кто разбирается, может поможете заставить работать.

В принципе, подход, при котором правится старое, чтобы добиться совместимости с новым,  верен. Но коль скоро Вы столкнулись с проблемами на этом пути, мне кажется, целесообразнее было бы подойти с другой стороны: добиться работоспособности проекта на более старой версии Arduino IDE. И только в случае, если проект оправдает ожидания, пытаться "осовременить" его.

123ksn
Offline
Зарегистрирован: 24.11.2014

andriano пишет:

В принципе, подход, при котором правится старое, чтобы добиться совместимости с новым,  верен. Но коль скоро Вы столкнулись с проблемами на этом пути, мне кажется, целесообразнее было бы подойти с другой стороны: добиться работоспособности проекта на более старой версии Arduino IDE. И только в случае, если проект оправдает ожидания, пытаться "осовременить" его.

Абсолютно с Вами согласен!!! Но проблема в том, что авторы проектов не думают о завтрашнем дне и подсознательно надеются на адекватность разработчиков Arduino IDE. В том смысле, что разработчики будут поддерживать совместимомть версий. Поэтому не указывают какие версии, а правильнее от какой даты, библиотеки они использовали в своём проекте. Я сам наступил на эти грабли. В 2015г реализовал проект, а в 2018 не смог его "подпилить", так как не сохранил исходную конфигурацию библиотек. А потом так и не смог восстановить. С тех пор вместе с проектом храню копию Arduino IDE. 

В данном оригинальном проекте автор не указывает конкретные версии библиотек. Кроме того, у меня другая плата с ESP8266. Думаю было бы бессмысленно обращаться на форум с моей проблемой, если бы проект не "взлетел". Вы бы первым предложили обновить Arduino IDE и библиотеки до последней версии. Как-то так....

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а смысл хранить копию IDE если для ESP библиотеки хранятся как системные, обновился с версии 1.0. и всё )))

123ksn
Offline
Зарегистрирован: 24.11.2014

ua6em пишет:

а смысл хранить копию IDE если для ESP библиотеки хранятся как системные, обновился с версии 1.0. и всё )))

А кто говорит про ESP библиотеки? Я говорю про ВСЕ библиотеки, используемые в проекте.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вобщем, вывод: во всем виноват Чубайс. Он же Рубен.

b707
Онлайн
Зарегистрирован: 26.05.2017

123ksn пишет:

 проблема в том, что авторы проектов не думают о завтрашнем дне и подсознательно надеются на адекватность разработчиков Arduino IDE. В том смысле, что разработчики будут поддерживать совместимомть версий. Поэтому не указывают какие версии, а правильнее от какой даты, библиотеки они использовали в своём проекте. Я сам наступил на эти грабли. В 2015г реализовал проект, а в 2018 не смог его "подпилить", так как не сохранил исходную конфигурацию библиотек. А потом так и не смог восстановить. С тех пор вместе с проектом храню копию Arduino IDE.

ну ерунду же полную пишете!

Как это вижу я - был у человека проект, работающий. Прошло несколько лет, немного обновился ИДЕ, вышли новые версии некоторых библиотек (далеко не всех). Проект перестал собираться. - Обычное дело.

В таком случае, как правило, достаточно поменять пару-тройку строчек, чтобы все собралось. Большинство программистов консервативны. изменения в библиотеках, такие, чтобы она стала полностью несовместима с ранними версиями - довольно редкий случай. Вы же рубите с плеча, начали кромсать код, похоже, не особо его понимая.

Особенно характерно выглядит случай с "вашим собственным проектом", который вы не смогли собрать спустя некоторое время. Это уж ни в какие ворота... Такое может быть только в одном случае - когда на самом деле это никакой не "ваш проект", а всего лишь надерганный по кусочкам из чужих скетчей, кусочкам, в которых вы ни черта не понимаете.

Пока у меня складывается впечатление, что относительно своих знаний в области программирования вы либо очень заблуждаетесь, либо банально приукрашиваете. Вам не надо, извините, выпендриваться, пытаясь "исправить" код, который в этом, имхо, не нуждается... Нужно вернутся к оригиналу и попытаться разобраться, почему жже он не собирается.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Вобщем, вывод: во всем виноват Чубайс. Он же Рубен.

проверил тот проект, что ТС запустил, под версией 2.74 (ESP8266) компилируется, заливается но валится в стеке, под версией 2.00 (а это минимально доступная) не работает, но сериале попытки вывода страниц имеются, видимо проблемы всё таки в коде )))
 

..R_WeMos_control_V1.13
Connected to OpenWrt
IP address: 192.168.1.206
mDNS responder started
TCP server started

GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

GET / HTTP/1.1

 

b707
Онлайн
Зарегистрирован: 26.05.2017

это не меняет общего принципа : не понимаешь - не лезь

123ksn
Offline
Зарегистрирован: 24.11.2014

b707 пишет:

Особенно характерно выглядит случай с "вашим собственным проектом", который вы не смогли собрать спустя некоторое время. Это уж ни в какие ворота... Такое может быть только в одном случае - когда на самом деле это никакой не "ваш проект", а всего лишь надерганный по кусочкам из чужих скетчей, кусочкам, в которых вы ни черта не понимаете.

Пока у меня складывается впечатление, что относительно своих знаний в области программирования вы либо очень заблуждаетесь, либо банально приукрашиваете. Вам не надо, извините, выпендриваться, пытаясь "исправить" код, который в этом, имхо, не нуждается... Нужно вернутся к оригиналу и попытаться разобраться, почему жже он не собирается.

Кто Вам сказал, что я его повторно не собрал? Я его собрал и он даже некоторое время работает, но потом "падает".  Поскольку повторный проект для меня был не критичный - я его забросил. Первая версия работает - и ладно. Поэтому не делайте поспешных умозаключений. Ардуино - это моё хобби. И тратить слишком много времени на него я не могу. Из этого следует вывод, что как программист Си - я уровнем около плинтуса. Но это вовсе не значит, что я не могу разобраться в коде для Ардуино. И я не выпендриваюсь. Я тупо хотел повторить рабочий проект, но обнаружилось столько нюансов....

Еще раз хочу подчеркнуть свою просьбу и проблему. HTML страница из ESP8266 частично передаётся в браузер (я это проверил), но не вся. Почему так происходит? Мне кажется, что это связано с изменением ядра ESP8266, а код Ардуино или Java этого не учитывает.

И еще... Это неправильный принцип "не понимаешь - не лезь". Правильный другой - если хуже уже не сделаешь, то хоть узнаешь как работает. Поэтому врачи проводят вскрытие трупов, когда не знают отчего человек умер. Технику безопасности тоже надо очень учитывать, разбирая гранату.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

тот код, что приведен ТС-ом в первом посте неработоспособен вообще. Например потому, что "client" нигде не соединяется. То есть то,  что хоть что-то работает - либо случайность, либо враньё.

Следует взять самый простой пример на веб вервер и "плясать" от него.

Вот пример WiFiManualWebServer прямо из IDE.

/*
    This sketch demonstrates how to set up a simple HTTP-like server.
    The server will set a GPIO pin depending on the request
      http://server_ip/gpio/0 will set the GPIO2 low,
      http://server_ip/gpio/1 will set the GPIO2 high
    server_ip is the IP address of the ESP8266 module, will be
    printed to Serial when the module is connected.
*/

#include <ESP8266WiFi.h>

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK  "your-password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  Serial.begin(115200);

  // prepare LED
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 0);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print(F("Connecting to "));
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }
  Serial.println();
  Serial.println(F("WiFi connected"));

  // Start the server
  server.begin();
  Serial.println(F("Server started"));

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println(F("new client"));

  client.setTimeout(5000); // default is 1000

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(F("request: "));
  Serial.println(req);

  // Match the request
  int val;
  if (req.indexOf(F("/gpio/0")) != -1) {
    val = 0;
  } else if (req.indexOf(F("/gpio/1")) != -1) {
    val = 1;
  } else {
    Serial.println(F("invalid request"));
    val = digitalRead(LED_BUILTIN);
  }

  // Set LED according to the request
  digitalWrite(LED_BUILTIN, val);

  // read/ignore the rest of the request
  // do not client.flush(): it is for output only, see below
  while (client.available()) {
    // byte by byte is not very efficient
    client.read();
  }

  // Send the response to the client
  // it is OK for multiple small client.print/write,
  // because nagle algorithm will group them into one single packet
  client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now "));
  client.print((val) ? F("high") : F("low"));
  client.print(F("<br><br>Click <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/1'>here</a> to switch LED GPIO on, or <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/0'>here</a> to switch LED GPIO off.</html>"));

  // The client will actually be *flushed* then disconnected
  // when the function returns and 'client' object is destroyed (out-of-scope)
  // flush = ensure written data are received by the other side
  Serial.println(F("Disconnecting from client"));
}

Обращаем внимание на то, что ПЕРЕД выводом в браузер клиента (client.print()) мы его подключаем, проверяя, нет ли подключений (строка 57). Аналогичного НЕТ у ТС.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

123ksn пишет:

И еще... Это неправильный принцип "не понимаешь - не лезь". Правильный другой - если хуже уже не сделаешь, то хоть узнаешь как работает. Поэтому врачи проводят вскрытие трупов, когда не знают отчего человек умер. Технику безопасности тоже надо очень учитывать, разбирая гранату.

В настоящий момент ты более похож на вивисектора, вскрывающего пока живого ;))) или зольдатен, разбирающего неразряженную гранату! Уж прости, неудержался! ;))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

в оригинале, который кстати под 1.8.9 прекрасно компилируется и заливается, эта строка есть (749), в правленом это 888 и чуток повыше, но они закомментированны, но не в этом суть, ядро использую 2.0 на ESP8266, та же бодяга с выводом страницы:

From client: GET / HTTP/1.1
vetka - GE, pin - 0, vol - 0
From client: GET / HTTP/1.1
vetka - GE, pin - 0, vol - 0
From client: GET / HTTP/1.1
vetka - GE, pin - 0, vol - 0
From client: GET / HTTP/1.1
vetka - GE, pin - 0, vol - 0
From client: GET / HTTP/1.1
vetka - GE, pin - 0, vol - 0
From client: GET / HTTP/1.1
vetka - GE, pin - 0, vol - 0

Вопрос в другом, были ли для ESP8266 ядра ниже версии 2.0?
сам и отвечу, были, проекты компилировались под ядро - esp8266 1.6.5-947-g39819f0
найти его, не удалось

123ksn
Offline
Зарегистрирован: 24.11.2014

ua6em, спасибо за конструктивизм!!!

Всех с наступающим Новым годом!!!! Счастья и здоровья даром!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

123ksn пишет:

ua6em, спасибо за конструктивизм!!!

Вот тебе еще: