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

Нужна помощь ESP-01. Отображения значения переменной на Web странице

bavspb

New member
Здравствуйте, коллеги!

Есть ESP-01. Работает подключение по WiFi, поднят веб-сервер.

Удается вывести на страницу текст "Hello world".

Вопрос: как вывести на HTML страницу значение переменной, которая будет накапливать количество срабатывания геркона? Т.е. при заходе на 8266local/ получать обычную страницу с текстом:

"Количество срабатываний - N(переменная счетчика)"
 

CodeNameHawk

Moderator
Команда форума
Код:
server.on("/", handleRoot);
Код:
char temp[1600]; //buffer dla html strony
void handleRoot()
{
    snprintf(temp,1600,

        "<html>\
  <head>\
    <meta http-equiv='refresh' Connection:'close' content='10'/>\
    <style>body {background-color:#ECECEC;}</style>\
    <title>Kotlownia</title>\
  </head>\
    <table border=1 cellspacing=2 cellpadding=7 bgcolor='#c0c000' bordercolor='blue'>\
    <caption><h1>Kotlownia</h1></caption>\
  <tr>\
     <td colspan='4' align='center'><b>Temperatura</b></td>\
  </tr>\
    <tr>\
      <td align='center'></td>\
      <td align='center'><b>Podacza</b></td>\
      <td align='center'><b>Obratka</b></td>\
    <td rowspan='2' bgcolor='#8c8c00' align='center'><b>Pompa</b></td>\
    </tr>\
    <tr>  \
      <td align='center'><b> Kociol </b></td>\
      <td align='center'> %s </td>\
      <td align='center'> %s </td>\
  </tr>     \
    <tr>\
      <td align='center'><b>Podloga</b></td>\
      <td align='center'> %s</td>\
      <td align='center'> %s</td>\
      <td bgcolor='#8c8c00' align='center'> %s </td>\
  </td>\
    </tr>\
    <tr>\
      <td align='center'><b> Batarei </b></td>\
      <td align='center'>  %s </td>\
      <td align='center'>  %s </td>\
    <td bgcolor='#8c8c00' align='center'>  %s </td>\
    </td>\
    </tr>\
    <tr>\
      <td align='center'><b>Boiler</b></td>\
      <td align='center'> %s</td>\
      <td align='center'> %s</td>\
    <td bgcolor='#8c8c00' align='center'>  %s </td> \
  </td>\
    </tr>\
  <tr>\
  <td colspan='4' align='center'>Data : %02d.%02d.%04d</td>\
  </tr>\
  <tr>\
  <td colspan='4' align='center'>Time : %02d:%02d:%02d</td>\
  </tr>\
  <tr>\
  <td colspan='4' align='center'>Work mode : %s</td>\
  </tr>\
  <body>\
  </body>\
</html>", koc_pod_s, koc_obr_s, pod_pod_s, pod_obr_s, pod_pom_on, bat_pod_s, bat_obr_s, bat_pom_on, bol_pod_s, bol_obr_s, bol_pom_on, dzien, miesiac, rok, hr, minut, sec, work_mode_s);
    server.send(200, "text/html", temp);
}
Это из моего проекта.
Вместо %s показывает строку, а вместо %02d значение целочисленной переменной.

Переменные декларированы так :
Код:
char koc_pod_s[7];
int rok;
Мне надо было выводить переменные типа float.

Код:
float temp_f;

dtostrf(temp_f, 0, 1, koc_pod_s);
 

bavspb

New member
Спасибо всем отозвавшимся!

Ниже код
Код:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>

const char* ssid     = "MySSID";        
const char* password = "MyPSW";    
const int CounterPin = 2;
int CounterState = 0;

ESP8266WebServer server(80);
void handleRootPath()
{                        
  server.send_P(200, "text/html", "Hello"); // Хотелось бы вместо "Hello" выводить значение счетчика CounterState.
}

void setup() {
  Serial.begin(115200);        
  delay(10);
  Serial.println('\n');
 
  WiFi.begin(ssid, password);            
  Serial.print("Connecting to ");
  Serial.print(ssid); Serial.println(" ...");

  int i = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(++i); Serial.print(' ');
  }

  Serial.println('\n');
  Serial.println("Connection established!");
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());      


server.on("/", HTTP_GET, handleRootPath);


 if (MDNS.begin("esp8266")) {            
    Serial.println("mDNS responder started");
  } else {
    Serial.println("Error setting up MDNS responder!");
  }

// server.on("/", handleRootPath);  
  server.begin();                  
  Serial.println("Server listening");

  pinMode(CounterPin, INPUT);
  digitalWrite(CounterPin,LOW);
 
}
 
void loop() {
 
server.handleClient();
CounterState = digitalRead(CounterPin);

  if (CounterState == LOW) {   //замыкание геркона
     CounterState=CounterState+10; // увеличиваем счет на единицу
 
  }
}
 
Последнее редактирование модератором:

bavspb

New member
Картина поменялась

Теперь на странице отображается "ello"

Почему-то пропала "H" и числа тоже не видно :)
 

bavspb

New member
Теперь появилось

"ext/html"

Не то, конечно, но уже ближе к "Hello"+Counter :)
 

bavspb

New member
Так же, по вашей ссылке, обратил внимание на объявленные объекты

В руководстве - WiFiserver server(80);
У меня - ESP8266WebServer server(80);

Если как в руководстве, то не работает. Видимо, нужна соответствующая библиотека . h
 

Сергей_Ф

Moderator
Команда форума
Код:
void loop() {
 
server.handleClient();
CounterState = digitalRead(CounterPin);

  if (CounterState == LOW) {   //замыкание геркона
     CounterState=CounterState+10; // увеличиваем счет на единицу
 
  }
}
А вот тут точно считать не будет. За одно срабатывание геркона насчитает сотню или тысячи, если не больше.
@nikolz вы правы, отвыкать я стал от Ардуино :)
А нет, АрдуиноИДЕ как всегда непредсказуема ;)
Ну вот так кстати работает. Почему не работает без String(...) - оставим на совести производителя библиотеки.
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
Сергей_Ф, Тут вообще считать не будет :) потому что CounterState одновременно и текущее состояние и счетчик...

bavspb, Что за браузер кстати? Давайте для начала проверим как работает у вас пример HelloServer с которого это по всей видимости скопипасчено:
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "........";
const char* password = "........";

ESP8266WebServer server(80);

const int led = 13;

void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp8266!");
  digitalWrite(led, 0);
}

void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  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());

  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
}
 

Юрий Ботов

Moderator
Команда форума
Ну вот так кстати работает. Почему не работает без String(...) - оставим на совести производителя библиотеки.

Код:
server.send(200, "text/html", "Hello "+String(CounterState));
Исправьте вот это:
Код:
CounterState = digitalRead(CounterPin);
  if (CounterState == LOW) {   //замыкание геркона
     CounterState=CounterState+10; // увеличиваем счет на единицу
  }
Это явный бред.
 

bavspb

New member
Подскажите, я правильно понимаю, что если esp-01 снять с USB-UART, то весь конфиг потеряется и надо сохранять его в EEPROM?
 

Юрий Ботов

Moderator
Команда форума
И да...Реального EEPROM у esp8266 - нет. Для его эмуляции используется часть внешнего Flash на плате .
 

Юрий Ботов

Moderator
Команда форума
Весь этот скетч пишется во флэш. И никуда из него при отделении USB/UART деваться не должен.
 
Сверху Снизу