• Система автоматизации с открытым исходным кодом на базе 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 деваться не должен.
 
Сверху Снизу