@MyEyesColoredIce

В чем ошибка веб сервера esp32 (ArduinoIDE)?

Делаю проект на esp32, уже несколько дней не могу понять, в чем ошибка. Сам сайт (наработка) рабочая, но при выполнении одной функции, которую взял из другого проекта (его отдельно проверял и дополнял, все работает). При загрузке выдает пустую страницу, при проверке запроса /slider показывает что данные передаются, но в отладке приложения пишет что пустое сообщение.
Код моего проекта
#include <Arduino.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <iostream>
#include <sstream>

using namespace std;

String slider_value="0";
const char* input_parameter = "value";

IPAddress localno(192,168,4,50);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);

/*
//точка доступа
const char* ssid     = "RobotArm";
const char* password = "12345789";
*/

//роутер_сервер
const char* ssid     = "Keenetic-4430";
const char* password = "JKMEZfXS";

/*
//от телефона
const char* ssid     = "@echo off";
const char* password = "12367890";
*/

AsyncWebServer server(80);

const char* htmlHomePage PROGMEM = R"HTMLHOMEPAGE(
<!DOCTYPE html>
<html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title> Управление роботом </title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <style>

    input[type=button]
    {
      background-color:red;color:white;border-radius:10px;width:65%;height:75px;font-size:30px;text-align:center;
    }

    .slidecontainer {
      width: 100%;
    }

    .slider {
      -webkit-appearance: none;
      width: 100%;
      height: 15px;
      border-radius: 6px;
      background: #d3d3d3;
      outline: none;
      opacity: 1;
      -webkit-transition: 0.2s;
      transition: opacity 0.2s;
    }

    .slider:hover {
      opacity: 1;
    }
  
    .slider::-webkit-slider-thumb {
      -webkit-appearance: none;
      appearance: none;
      width: 30px;
      height: 30px;
      border-radius: 30%;
      background: gray;
      cursor: pointer;
    }

    .slider::-moz-range-thumb {
      width: 40px;
      height: 40px;
      border-radius: 50%;
      background: red;
      cursor: pointer;
    }

    </style>
  
  </head>
  <body class="noselect" align="center" style="background-color:424187">
     
    <h1 style="color: 44bda1 ;text-align:center;font-size:45px;"Сварочный робот манипулятор</h1>
    <h2 style="color: 33917b ;text-align:center;font-size:35px;">Панель управления роботом</h2>
    
    <table id="mainTable" style="width:400px;margin:auto;table-layout:fixed" CELLSPACING=10>
      <tr>
        <td style="color: 008c7c ;text-align:left;font-size:30px"><b>Base:</b></td>
        <td colspan=2>
         <div class="slidecontainer">
            <input type="range" min="0" max="180" value="%SLIDERVALUE%" class="slider" id="Osnovanie" onchange="updateSlider(this)">
          </div>
        </td>
      </tr> 
      <tr></tr>
      <tr>
        <td style="color: 008c7c ;text-align:left;font-size:30px"><b>1 звено:</b></td>
        <td colspan=2>
         <div class="slidecontainer">
            <input type="range" min="0" max="180" value="90" class="slider" id="zv_1">
          </div>
        </td>
      </tr> 
      <tr/><tr/>      
      <tr>
        <td style="color: 008c7c ;text-align:left;font-size:30px"><b>2 звено:</b></td>
        <td colspan=2>
         <div class="slidecontainer">
            <input type="range" min="0" max="180" value="90" class="slider" id="zv_2">
          </div>
        </td>
      </tr>  
      <tr/><tr/>      
      <tr>  
    </table>

<form action="handler.php">
   <p style="color: 008c7c; font-size: 20px;">Координаты оси X (от * до *):</p>
   <p><input type="number" id="Xcoord" size="3" name="num" min="-100" max="100" value="0"></p>
  </form>

<button id="coordin" style= "background-color:red;color:white;border-radius:15px;width:400px;height:75px;font-size: 30px;text-align:center;">Применить выбранные координаты
</button>
<p style="color: 008c7c; font-size: 25px;text-align:center;">Сварка!:</p>
<input type="button" id="svar_butt" value="!!!" onclick="Svarka()>
<p id="test" style="color: 008c7c; font-size: 25px;text-align:center;">0!</p>
<p><span id="textslider_value">%SLIDERVALUE%</span></p>

<script>
var svar_butt = document.getElementById("svar_butt");
var coordin = document.getElementById("coordin");
var ServoSlider1 = document.getElementById("Osnovanie").value;
var Xcoord = document.getElementById("Xcoord");
var Ycoord = document.getElementById("Ycoord");
var Zcoord = document.getElementById("Zcoord");
var text = document.getElementById("test");

function updateSlider(element){
  var slider_value = document.getElementById("Osnovanie").value;
  document.getElementById("textslider_value").innerHTML = slider_value;
  Ycoord.value=slider.value;
  console.log(slider_value);
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "/slider?value="+slider_value, true);
  xhr.send();
}
</script>
</body>    
</html>
)HTMLHOMEPAGE";

String processor(const String& var){
  if(var == "SLIDERVALUE"){ 
    return slider_value;
  }
  return String();
}

void server_start(AsyncWebServerRequest *request) 
{
  request->send_P(200, "text/html", htmlHomePage, processor);
}

void Sliders(AsyncWebServerRequest *request){
  String message;
  if (request->hasParam(input_parameter)){
    message= request->getParam(input_parameter)->value();
    slider_value=message;
  }else{
    message = "No message sent";
  }
  Serial.println(message);
  request->send(200, "text/plain", "OK");
}

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

  /*
//точка доступа
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);
  delay(100);
  //WiFi.softAPConfig(localno, gateway, subnet);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
  Serial.println(" ");
*/

//для сервера по wifi
  delay(100);
  WiFi.softAPConfig(localno, gateway, subnet);
  WiFi.begin(ssid, password);
  while (WiFi.status()!=WL_CONNECTED){
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println(WiFi.localIP());


  server.on("/", HTTP_GET, server_start);
  server.on("/slider", HTTP_GET, Sliders);

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

}

void loop() {}

Если убрать данный метод, то все работает, но без передачи данных. Думал что проблема в том, что в примере берется массив данных и передается (у меня через функцию), но особой разницы не должно быть...
void server_start(AsyncWebServerRequest *request) 
{
  request->send_P(200, "text/html", htmlHomePage)//, processor);
}


Код, который брал для примера (рабочий)
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

const char* ssid     = "Keenetic-4430";
const char* password = "JKMEZfXS";

IPAddress localno(192,168,4,50);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);

const int led_pin = 14;
String slider_value = "0";

const int frequency = 5000;
const int led_channel = 0;
const int resolution = 8;

const char* input_parameter = "value";

AsyncWebServer server(80);

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ESP32 Brightness Control Web Server</title>
  <style>
    html {font-family: Times New Roman; display: inline-block; text-align: center;}
    h2 {font-size: 2.3rem;}
    p {font-size: 1.9rem;}
    body {max-width: 400px; margin:0px auto; padding-bottom: 25px;}
    .slider { -webkit-appearance: none; margin: 14px; width: 360px; height: 25px; background: #38c0ff  ;
      outline: none; -webkit-transition: .2s; transition: opacity .2s;}
    .slider::-webkit-slider-thumb {-webkit-appearance: none; appearance: none; width: 35px; height: 35px; background:#01070a; cursor: pointer;}
    .slider::-moz-range-thumb { width: 35px; height: 35px; background: #01070a; cursor: pointer; } 
  </style>
</head>
<body>
  <form action="handler.php">
   <p style="color: 008c7c; font-size: 20px;">Координаты оси X (от * до *):</p>
   <p><input type="number" id="Xcoord" size="3" name="num" min="-100" max="100" value="%SLIDERVALUE%"></p>
  </form>
  <h2>ESP32 Brightness Control Web Server</h2>
  <p><span id="textslider_value">%SLIDERVALUE%</span></p>
  <p><input type="range" onchange="updateSliderPWM(this)" id="pwmSlider" min="0" max="255" value="%SLIDERVALUE%" step="1" class="slider"></p>
<script>
function updateSliderPWM(element) {
  var slider_value = document.getElementById("pwmSlider").value;
  document.getElementById("textslider_value").innerHTML = slider_value;
  document.getElementById("Xcoord").value = slider_value;
  console.log(slider_value);
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "/slider?value="+slider_value, true);
  xhr.send();
}
</script>
</body>
</html>
)rawliteral";

String processor(const String& var){
  if (var == "SLIDERVALUE"){
    return slider_value;
  }
  return String();
}

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

  //WiFi.softAPConfig(localno, gateway, subnet);
  delay(100);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting...");
  }

  Serial.println(WiFi.localIP());

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });

  server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String message;
    if (request->hasParam(input_parameter)) {
      message = request->getParam(input_parameter)->value();
      slider_value = message;
      //ledcWrite(led_channel, slider_value.toInt());
    }
    else {
      message = "No message sent";
    }
    Serial.println(message);
    request->send(200, "text/plain", "OK");
  });
  
  server.begin();
}
  
void loop() {
  
}

Буду очень признателен любой помощи!
Надеюсь со средней сложностью не прогадал)
Для удобства оставил разные методы реализации сервера
  • Вопрос задан
  • 223 просмотра
Решения вопроса 1
@MyEyesColoredIce Автор вопроса
По всей видимости, проблема в выделении памяти. До этого пробовал сносить половину сайта, но результата не было. Освободил память (убрал ссылки и некоторые переменные) и все заработало. Так как запись сайта шла во flash память - видимо, она и исчерпалась.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы