• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Не работает код на ESP8266

Melandr

Member
Добрый день, уважаемые форумчане. Изучаю реализацию AJAX на ESP и на сайте https://circuits4you.com/ нашел интересную реализацию с использованием необработанного строкового литерала R. Ссылка на статью https://circuits4you.com/2018/02/04...bf1dcf095c19dd9e1bbf12f5bbbf88e4#comment-5018 Сделал все как в статье, модуль прошивается, стартует http сервер, но при попытке открытия вэб-интерфейса происходит перезагрузка ESP с выдачей отладочной информации в последовательный порт.
ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3584, room 16
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld

…….
Connected to ASUS
IP address: 192.168.1.251
HTTP server started

————— CUT HERE FOR EXCEPTION DECODER —————

Exception (3):
epc1=0x4000bf64 epc2=0x00000000 epc3=0x00000000 excvaddr=0x4023d741 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffd00 end: 3fffffc0 offset: 0190
3ffffe90: 00000001 3ffee39c 4023d741 402058fb
3ffffea0: 3ffef470 00000001 3ffef26c 40203226
3ffffeb0: 3fffff00 3fffff10 80fffef0 40201c34
3ffffec0: 00000001 4020841c 3ffffef0 402083ea
3ffffed0: 3fffff10 3ffee3b8 3ffef26c 401000e1
3ffffee0: 3ffef26c 3ffee3b8 3ffef26c 40201c6c
3ffffef0: 3ffe0000 3fff0000 80fee510 80000030
3fffff00: 3ffef26c 3ffee3b8 3ffee378 40203356
3fffff10: 0000002f 80000000 81fefb00 0000008f
3fffff20: 80005054 c35f9b9e 40100200 0000121c
3fffff30: 3ffee3b8 00000000 00000001 00000001
3fffff40: 00000001 3ffef26c 3ffee378 3ffee510
3fffff50: 00000001 3ffee39c 3ffee378 3ffee510
3fffff60: 00000001 3ffee39c 3ffee378 402035ef
3fffff70: 00000000 00000000 00001388 80efef00
3fffff80: 00000000 00000000 00000001 40100170
3fffff90: 3fffdad0 00000000 3ffee4d0 40203690
3fffffa0: 3fffdad0 00000000 3ffee4d0 4020683c
3fffffb0: feefeffe feefeffe 3ffe84ec 40100c45
<<<stack<<<
При этом уже готовый проект с другой статьи на этом сайте нормально работает.
Но там немного другая реализация, с использованием SPIFFS.
Архив во вложении, может попробует кто проверить, в чем может быть проблема. Заранее спасибо.
 

Вложения

Melandr

Member
Если Вы внимательно прочитали мой пост, то я написал, что взял со статьи
ESP8266 (ajax) update part of web page without refreshing код
Копия этого кода в архиве во вложении. Я ничего не менял в этом коде. И несколько примеров такой реализации выдают похожую ошибку, хотя в статье есть скриншот вэб-интерфейса, с импользованием этого кода.
 

nikolz

Well-known member
Если Вы внимательно прочитали мой пост, то я написал, что взял со статьи
ESP8266 (ajax) update part of web page without refreshing код
Копия этого кода в архиве во вложении. Я ничего не менял в этом коде. И несколько примеров такой реализации выдают похожую ошибку, хотя в статье есть скриншот вэб-интерфейса, с импользованием этого кода.
покажите скрин экрана с ошибкой
 

Melandr

Member
У меня уже взрыв мозга. Попробовал с сайта следующий код
C:
/*
* ESP8266 NodeMCU LED Control over WiFi Demo
*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

//ESP Web Server Library to host a web page
#include <ESP8266WebServer.h>

//---------------------------------------------------------------
//Our HTML webpage contents in program memory
const char MAIN_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<body>
<center>
<h1>WiFi LED on off demo: 1</h1><br>
Ciclk to turn <a href="ledOn" target="myIframe">LED ON</a><br>
Ciclk to turn <a href="ledOff" target="myIframe">LED OFF</a><br>
LED State:<iframe name="myIframe" width="100" height="25" frameBorder="0"><br>
<hr>
<a href="https://circuits4you.com">circuits4you.com</a>
</center>

</body>
</html>
)=====";
//---------------------------------------------------------------
//On board LED Connected to GPIO2
#define LED 2

//SSID and Password of your WiFi router
const char* ssid = "ASUS";
const char* password = "gCU8YNZs";

//Declare a global object variable from the ESP8266WebServer class.
ESP8266WebServer server(80); //Server on port 80

//===============================================================
// This routine is executed when you open its IP in browser
//===============================================================
void handleRoot() {
Serial.println("You called root page");
String s = MAIN_page; //Read HTML contents
server.send(200, "text/html", s); //Send web page
}

void handleLEDon() {
Serial.println("LED on page");
digitalWrite(LED,LOW); //LED is connected in reverse
server.send(200, "text/html", "ON"); //Send ADC value only to client ajax request
}

void handleLEDoff() {
Serial.println("LED off page");
digitalWrite(LED,HIGH); //LED off
server.send(200, "text/html", "OFF"); //Send ADC value only to client ajax request
}
//==============================================================
//                  SETUP
//==============================================================
void setup(void){
  Serial.begin(115200);

  WiFi.begin(ssid, password);     //Connect to your WiFi router
  Serial.println("");

  //Onboard LED port Direction output
  pinMode(LED,OUTPUT);
  //Power on LED state off
  digitalWrite(LED,HIGH);

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  //If connection successful show IP address in serial monitor
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());  //IP address assigned to your ESP

  server.on("/", handleRoot);      //Which routine to handle at root location. This is display page
  server.on("/ledOn", handleLEDon); //as Per  <a href="ledOn">, Subroutine to be called
  server.on("/ledOff", handleLEDoff);

  server.begin();                  //Start server
  Serial.println("HTTP server started");
}
//==============================================================
//                     LOOP
//==============================================================
void loop(void){
  server.handleClient();          //Handle client requests
}
Не работает.
потом в сети нашел проект - https://sxem.org/forum/termometry-t...p-01-upravlenie-cherez-internet-protokol-mqtt
Скачал исходник, подключил недостающие библиотеки, прошил ESP и страница загрузилась. тоже используется для хранения страниц необработанный строковый литерал
Ниже скрины из среды разработки и последовательного порта
2020-09-06_181544.jpg2020-09-06_181753.jpg
 

nikolz

Well-known member
Если я правильно понял, то у Вас не работает ни один из примеров. Верно?
Если так, то работает ли у Вас какой-либо другой пример в котором есть работа c wifi?
 

CodeNameHawk

Moderator
Команда форума
использованием необработанного строкового литерала R.
Я то таких слов и не слышал.
Как правильно работать с флешь памятью описано здесь https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html

У меня уже взрыв мозга. Попробовал с сайта следующий код
Этот код заставить работать можно так :
Код:
const char * MAIN_page PROGMEM = R"=====(
или, если эту строку не переделывать, то так :
Код:
void handleRoot()
{
Serial.println("You called root page");
//String s = MAIN_page; //Read HTML contents
server.send_P(200, "text/html", MAIN_page); //Send web page
}
Остальные наверное также, но как говорит Дядька Максим с YouTuba, это все неправильно.
 
Последнее редактирование:

Melandr

Member
Спасибо, тоже уже допер насчет второго решения, сравнивая с кодом выше указанного термостата. Собирался запостить в тему. Насчет префикса R -https://en.cppreference.com/w/cpp/language/string_literal
 

Melandr

Member
PS: не успел отредактировать, но больше всего непонятно, зачем на сайте-источнике https://circuits4you.com/ страница объявляется как массив констант const char MAIN_page[] PROGMEM = R"=====(
при этом присваивая его переменной String s = MAIN_page; фактически копируя неизменяемую строку в ОЗУ, если можно объявить как указатель и использовать прямое чтение из флеша при помощи функции send_P

 
Сверху Снизу