• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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

 
Сверху Снизу