• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как добавить обновление на вебсервер

selan61

Member
Здравствуйте. Есть простенький вебсервер. Код взял отсюда
1_5.png
Код:
[
/* Терморегулятор одиночный

*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//------------------------------------------------------------------------
#define ONE_WIRE_BUS      0                    // pin DS18B20
#define HeaterPin         2                    // Heater pin 0-отключено, 1-включено
//------------------------------------------------------------------------
const char* ssid = "ХХХ";
const char* password = "ХХХ";
//------------------------------------------------------------------------
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature t(&oneWire);
ESP8266WebServer server(80);
ESP8266HTTPUpdateServer httpUpdater;
//------------------------------------------------------------------------
int temper;
int reg_t = 20;
int gis=1;
String ind;
bool OUT,UPDATE;
//------------------------------------------------------------------------
void setup(void){
  pinMode(HeaterPin, OUTPUT);                           // выход управления нагрузкой
  t.begin();
  t.setResolution(10);                                 // 10 бит

  delay(1000);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  while(WiFi.status() != WL_CONNECTED){delay(500); Serial.print(".");}
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/",       [](){web();});
  server.on("/obn",    [](){web();});
  server.on("/update", [](){web_upd();});
  server.on("/reg+",   [](){reg_t++;web();});
  server.on("/reg-",   [](){reg_t--;web();});
  server.on("/reg+10", [](){reg_t=reg_t+10;web();});
  server.on("/reg-10", [](){reg_t=reg_t-10;web();});


  server.begin();
  Serial.println("HTTP server started");
}
//------------------------------------------------------------------------
void loop(void){
    server.handleClient();
    t.requestTemperatures();
    temper = t.getTempCByIndex(0);
  if(reg_t<=0)  {reg_t=0;}
  if(reg_t>=125){reg_t=125;}
  if(reg_t >= temper + gis){digitalWrite(HeaterPin,HIGH);ind="ВКЛ"; OUT=true;}
  if(reg_t <= temper - gis){digitalWrite(HeaterPin,LOW); ind="ВЫКЛ";OUT=false;}
    yield();
}
//------------------------------------------------------------------------
void web(){
String webPage = "<!DOCTYPE HTML><html>";
       webPage += "<meta charset='utf-8'><meta name='viewport' content='width=540, user-scalable=no' />";
       webPage += "<style>table {background-color:#F5F5F5;border-radius: 5px;}</style>";
       webPage += "<TABLE align='center' width='520' BORDER='1' cellspacing='0' cellpadding='5'><tr><td colspan='3' bgcolor='#006400' align='center'>";
       webPage += "<font color='#FFFFFF'><h2>Терморегулятор 0...125 &#176;C</font></td></tr></h2>";
       webPage += "<meta http-equiv='Refresh' content='5; URL=/obn' />"; // автоматическое обновление страницы каждые 5 секунд
       webPage += "<tr><td>Температура</td><td align='center'><a href=\"obn\"><button>Обновить</button></a></td><td bgcolor='#FFFFFF' align='center'><big><b>";
       webPage += temper;
       webPage += " &#176;C</b></big></td></tr>";
       webPage += "<tr><td>Регулировка температуры</td><td align='center'><a href=\"reg+\"><button>+1&nbsp;&nbsp;</button>";
       webPage += "</a><a href=\"reg-\"><button>-1&nbsp;&nbsp;</button></a><br><a href=\"reg+10\"><button>+10</button></a>";
       webPage += "<a href=\"reg-10\"><button>-10</button></a></td><td bgcolor='#FFFFFF' align='center'><big><b>";
       webPage += reg_t;
       webPage += " &#176;C</b></big></td></tr>";
       webPage += "<tr><td colspan='2'>Нагрев</td>";
       if(OUT){webPage +="<td align='center' bgcolor='#50FF50'><big><b>";}
       else   {webPage +="<td align='center' bgcolor='#FF5050'><big><b>";}
       webPage += ind;
       webPage += "</b></big></td></tr></html>";
       webPage += "<tr><td align='center'>Обновление прошивки</td><td align='center'colspan='2'><a href=\"update\"><button>Обновить</button></a></td></tr></html>";
    
    server.send(200, "text/html", webPage);
     delay(300);
}
//-----------------------------------------------------
void web_upd(){
  if(!UPDATE){
    httpUpdater.setup(&server);
     Serial.print("WiFi.localIP:  ");
     Serial.println(WiFi.localIP());
     Serial.println("HTTP UpdateServer started");
      yield();
    UPDATE = true;}
}
//END---------------------------------------------------------------------
Но у меня такая проблема хочу добавить обновление прошивки через ESP8266HTTPUpdateServer. Но что то никак не получается.
Создаю дополнительно ESP8266HTTPUpdateServer httpUpdater; и флаг UPDATE;
Добавляю на страницу ESP8266 строку с кнопкой "обновить". Она вызывает событие
server.on("/update", [](){web_upd();});
Запускается
void web_upd(){
if(!UPDATE){
httpUpdater.setup(&server);
Serial.print("WiFi.localIP: ");
Serial.println(WiFi.localIP());
Serial.println("HTTP UpdateServer started");
yield();
UPDATE = true;}
}
Однако на сервер обновления не переходит. Подобная процедура у меня проверена и работает на обычных проектах без веб серверов. А тут на получается, к одному серверу надо как то подключить второй. Я не пойму, надо ли останавливать работающий сервер и запускать новый httpServer или можно как привязаться к работающему server.
Не могли бы Вы меня наставить на путь истинный? Автору писал, но он не смог помочь.
 

Сергей_Ф

Moderator
Команда форума
Здравствуйте. Есть простенький вебсервер. Код взял отсюда
Посмотреть вложение 11662
Код:
[
/* Терморегулятор одиночный

*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//------------------------------------------------------------------------
#define ONE_WIRE_BUS      0                    // pin DS18B20
#define HeaterPin         2                    // Heater pin 0-отключено, 1-включено
//------------------------------------------------------------------------
const char* ssid = "ХХХ";
const char* password = "ХХХ";
//------------------------------------------------------------------------
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature t(&oneWire);
ESP8266WebServer server(80);
ESP8266HTTPUpdateServer httpUpdater;
//------------------------------------------------------------------------
int temper;
int reg_t = 20;
int gis=1;
String ind;
bool OUT,UPDATE;
//------------------------------------------------------------------------
void setup(void){
  pinMode(HeaterPin, OUTPUT);                           // выход управления нагрузкой
  t.begin();
  t.setResolution(10);                                 // 10 бит

  delay(1000);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  while(WiFi.status() != WL_CONNECTED){delay(500); Serial.print(".");}
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/",       [](){web();});
  server.on("/obn",    [](){web();});
  server.on("/update", [](){web_upd();});
  server.on("/reg+",   [](){reg_t++;web();});
  server.on("/reg-",   [](){reg_t--;web();});
  server.on("/reg+10", [](){reg_t=reg_t+10;web();});
  server.on("/reg-10", [](){reg_t=reg_t-10;web();});


  server.begin();
  Serial.println("HTTP server started");
}
//------------------------------------------------------------------------
void loop(void){
    server.handleClient();
    t.requestTemperatures();
    temper = t.getTempCByIndex(0);
  if(reg_t<=0)  {reg_t=0;}
  if(reg_t>=125){reg_t=125;}
  if(reg_t >= temper + gis){digitalWrite(HeaterPin,HIGH);ind="ВКЛ"; OUT=true;}
  if(reg_t <= temper - gis){digitalWrite(HeaterPin,LOW); ind="ВЫКЛ";OUT=false;}
    yield();
}
//------------------------------------------------------------------------
void web(){
String webPage = "<!DOCTYPE HTML><html>";
       webPage += "<meta charset='utf-8'><meta name='viewport' content='width=540, user-scalable=no' />";
       webPage += "<style>table {background-color:#F5F5F5;border-radius: 5px;}</style>";
       webPage += "<TABLE align='center' width='520' BORDER='1' cellspacing='0' cellpadding='5'><tr><td colspan='3' bgcolor='#006400' align='center'>";
       webPage += "<font color='#FFFFFF'><h2>Терморегулятор 0...125 &#176;C</font></td></tr></h2>";
       webPage += "<meta http-equiv='Refresh' content='5; URL=/obn' />"; // автоматическое обновление страницы каждые 5 секунд
       webPage += "<tr><td>Температура</td><td align='center'><a href=\"obn\"><button>Обновить</button></a></td><td bgcolor='#FFFFFF' align='center'><big><b>";
       webPage += temper;
       webPage += " &#176;C</b></big></td></tr>";
       webPage += "<tr><td>Регулировка температуры</td><td align='center'><a href=\"reg+\"><button>+1&nbsp;&nbsp;</button>";
       webPage += "</a><a href=\"reg-\"><button>-1&nbsp;&nbsp;</button></a><br><a href=\"reg+10\"><button>+10</button></a>";
       webPage += "<a href=\"reg-10\"><button>-10</button></a></td><td bgcolor='#FFFFFF' align='center'><big><b>";
       webPage += reg_t;
       webPage += " &#176;C</b></big></td></tr>";
       webPage += "<tr><td colspan='2'>Нагрев</td>";
       if(OUT){webPage +="<td align='center' bgcolor='#50FF50'><big><b>";}
       else   {webPage +="<td align='center' bgcolor='#FF5050'><big><b>";}
       webPage += ind;
       webPage += "</b></big></td></tr></html>";
       webPage += "<tr><td align='center'>Обновление прошивки</td><td align='center'colspan='2'><a href=\"update\"><button>Обновить</button></a></td></tr></html>";
   
    server.send(200, "text/html", webPage);
     delay(300);
}
//-----------------------------------------------------
void web_upd(){
  if(!UPDATE){
    httpUpdater.setup(&server);
     Serial.print("WiFi.localIP:  ");
     Serial.println(WiFi.localIP());
     Serial.println("HTTP UpdateServer started");
      yield();
    UPDATE = true;}
}
//END---------------------------------------------------------------------
Но у меня такая проблема хочу добавить обновление прошивки через ESP8266HTTPUpdateServer. Но что то никак не получается.
Создаю дополнительно ESP8266HTTPUpdateServer httpUpdater; и флаг UPDATE;
Добавляю на страницу ESP8266 строку с кнопкой "обновить". Она вызывает событие
server.on("/update", [](){web_upd();});
Запускается
void web_upd(){
if(!UPDATE){
httpUpdater.setup(&server);
Serial.print("WiFi.localIP: ");
Serial.println(WiFi.localIP());
Serial.println("HTTP UpdateServer started");
yield();
UPDATE = true;}
}
Однако на сервер обновления не переходит. Подобная процедура у меня проверена и работает на обычных проектах без веб серверов. А тут на получается, к одному серверу надо как то подключить второй. Я не пойму, надо ли останавливать работающий сервер и запускать новый httpServer или можно как привязаться к работающему server.
Не могли бы Вы меня наставить на путь истинный? Автору писал, но он не смог помочь.
У вас обновление где лежит? Вот к тому серверу и надо подключиться клиентом и забрать его. А вы делаете сервер обновления на самом esp, как я понял. Разберитесь в двух примерах клиента и сервера ESP8266HTTPUpdateClient/ESP8266HTTPUpdateServer.
 

selan61

Member
Спасибо за ответ. Обновление у меня бин-файл, лежит на компе. Проблема именно в том, что уже работает один вебсервер, который выводит страничку. И к нему по клику надо подключить второй вебсервер, который бы вышел на стандартную страницу обновления
upd.png
Вроде добился, заработало. Но надо вручную вводить адрес/update. А как сделать, что бы автоматически переходило на эту ссылку?
 

Сергей_Ф

Moderator
Команда форума
Спасибо за ответ. Обновление у меня бин-файл, лежит на компе. Проблема именно в том, что уже работает один вебсервер, который выводит страничку. И к нему по клику надо подключить второй вебсервер, который бы вышел на стандартную страницу обновления
Посмотреть вложение 11663
Вроде добился, заработало. Но надо вручную вводить адрес/update. А как сделать, что бы автоматически переходило на эту ссылку?
Что значит автоматически переходило? Откуда?
Если у вас есть сервер, так добавьте к нему нужные обработчики с любыми адресами и/или кнопками.
 

selan61

Member
Извините, пока ждал ответа, переделал и заработало, но не до конца. Надо вручную вводить адрес/update.
Сделал так. Кнопка
Код:
webPage += "<tr><td align='center'>Обновление прошивки</td><td align='center'colspan='2'><a href=\"upd\"><button>Обновить</button></a></td></tr></html>";
Вызывает событие
Код:
server.on("/upd", [](){web_upd();});
Событие вызывает функцию
Код:
void web_upd(){
if(!UPDATE){
httpUpdater.setup(&server, "/update");
Serial.print("WiFi.localIP: ");
Serial.println(WiFi.localIP());
Serial.println("HTTP UpdateServer started");
yield();
UPDATE = true;}
}
Которая, однократно запускает сервер httpUpdater, и ставит флаг UPDATE = true. Но на странице ничего не выводится.
Теперь если вручную набрать адрес/update, выводится страница обновления прошивки. что и надо было сделать. С этим разобрался. Остался вопрос, что надо вставить в функцию web_upd(), что бы после запуска сервера httpUpdater, страница сама перенаправлялась на адрес/update?
 

Сергей_Ф

Moderator
Команда форума
Извините, пока ждал ответа, переделал и заработало, но не до конца. Надо вручную вводить адрес/update.
Сделал так. Кнопка
Код:
webPage += "<tr><td align='center'>Обновление прошивки</td><td align='center'colspan='2'><a href=\"upd\"><button>Обновить</button></a></td></tr></html>";
Вызывает событие
Код:
server.on("/upd", [](){web_upd();});
Событие вызывает функцию
Код:
void web_upd(){
if(!UPDATE){
httpUpdater.setup(&server, "/update");
Serial.print("WiFi.localIP: ");
Serial.println(WiFi.localIP());
Serial.println("HTTP UpdateServer started");
yield();
UPDATE = true;}
}
Которая, однократно запускает сервер httpUpdater, и ставит флаг UPDATE = true. Но на странице ничего не выводится.
Теперь если вручную набрать адрес/update, выводится страница обновления прошивки. что и надо было сделать. С этим разобрался. Остался вопрос, что надо вставить в функцию web_upd(), что бы после запуска сервера httpUpdater, страница сама перенаправлялась на адрес/update?
Мне кажется, вы не совсем понимаете что делает http update . Вам наверное нужен web update, а вовсе не то что вы пытаетесь использовать.

 
Последнее редактирование:

selan61

Member
Мне кажется, вы не совсем понимаете что делает http update . Вам наверное нужен web update, а вовсе не то что вы пытаетесь использовать.
Да, не понимаю в чем различие. Для меня это только название сервера. Но он делает, то что мне надо. Взял из примера
 

Сергей_Ф

Moderator
Команда форума
Да, не понимаю в чем различие. Для меня это только название сервера. Но он делает, то что мне надо. Взял из примера
Так у вас пример WebUpdate, а не HttpUpdate!! Блин!. Почти идентичные название библиотек Ардуино :( HTTPServerUpdate и httpUpdate.
Вы хотите по нажатию кнопки на главной странице перейти на страницу обновления? Ну так поставьте переход для неё, зачем вы поставили href=upd?
Вы и так можете перейти по адресу /update, без всяких UPDATE = true;

 

selan61

Member
Почти идентичные название библиотек
Ну в этом я не виноват, сам по началу запутался.
Ну так поставьте переход для неё, зачем вы поставили href=upd?
Вы и так можете перейти по адресу /update, без всяких UPDATE = true;
Увы, я так и думал, но не работает. А вот через /upd работает. UPDATE = true; обязательно, для однократного запуска сервера обновления.
Переход по адресу /update возможен только после запуска сервера обновления, поэтому и сделан такой двойной переход.
Вы мне может подскажете как сделать, что бы после запуска сервера обновления, заставить страницу перейти на адрес /update.
 

Сергей_Ф

Moderator
Команда форума
Которая, однократно запускает сервер httpUpdater.
Это не запуск сервера. Это регистрация обработчика события на сервере. Зачем его поместили в условный оператор, да ещё в другом обработчике?
Зарегистрируйте обработчик без условий в setup() и будет переходить по /update всегда!

Но на странице ничего не выводится.
И не должно. Обратитесь к нему по адресу /update и увидите страницу.
 

Сергей_Ф

Moderator
Команда форума
server.on("/update", [](){web_upd();});
Это регистрация обработчика web_upd на сервере server
httpUpdater.setup(&server);
и это регистрация обработчика httpUpdate на сервере server, в другой записи и с более сложным функционалом, который описан в библиотеки.

Естественно, что на один адрес /update два обработчика поставить нельзя! Нужно выбрать второй вариант.

Это всё надо выполнить один раз в setup().
Затем надо описать переход на страницу /update по нажатию кнопки "Обновить" на вашей заглавной странице. Всё.
 

selan61

Member
Код:
server.on("/update", [](){web_upd();});
Это регистрация обработчика web_upd на сервере server
Затем надо описать переход на страницу /update по нажатию кнопки "Обновить" на вашей заглавной странице. Всё.
Так я об этом и спрашиваю. Как описать переход на адрес /update.
Это всё надо выполнить один раз в setup().
Зачем мне в setup? Мне надо, что бы запускалось по кнопке. У меня уже всё работает. Не хватает автоперехода на адрес /update. Не понимаю как его описать.
 

Сергей_Ф

Moderator
Команда форума
Зачем мне в setup? Мне надо, что бы запускалось по кнопке.
Это не запуск!!! Это регистрация обработчика. Зачем вы остальные обработчики в setup описываете?

У меня уже всё работает.
Ну тогда в чём вопрос?

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

selan61

Member
Вопрос изначально был, как заставить вебстраницу по кнопке переходить на адрес /update
 

Сергей_Ф

Moderator
Команда форума
вы всего на 5 лет старше меня.
заставить вебстраницу по кнопке переходить на адрес /update
Код:
<form action="update">
   <button>Обновить</button>
Но ваш href по идеи тоже должен работать, только обработчик должен быть уже определён. А у вас его нет.

всегда работает адрес /update . А я хотел бы, что бы он срабатывал по кнопке
какой в этом смысл?
 
Сверху Снизу