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

Нужна помощь подвисает скетч

JIEXA

New member
Изменил скетч под свою задачу, но при отправке запроса через браузер виснет. Мигние светодиода сделал для контроля.
Код:
#include <ESP8266WiFi.h>
// Создаем сервер и порт для прослушки 80
WiFiServer server(80);

#ifdef ESP8266
extern "C" {
#include "user_interface.h"
}
#endif


//ssid and пароль точки доступа на ESP8266
const char *esp_ssid = "SKUD";
const char *esp_password = "12345678";

void createAccessPoint() {
  Serial.print("Configuring access point for wifi network: ");
  Serial.println(esp_ssid);
  WiFi.softAP(esp_ssid, esp_password);
  IPAddress accessIP = WiFi.softAPIP();
  Serial.print("AccessPoint IP address: ");
  Serial.println(accessIP);
  /* Go to http://192.168.4.1 in a web browser
   * connected to this access point to see it.
   */
}

void setup() {
  Serial.begin(74880);
  delay(10);
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output

      // Подготовка GPIO
  pinMode(5, OUTPUT);
  digitalWrite(5, 1);
  pinMode(4, OUTPUT);
  digitalWrite(4, 1);
  pinMode(0, OUTPUT);
  digitalWrite(0, 1);
  pinMode(2, OUTPUT);
  digitalWrite(2, 1);
  //Создание точки доступа
  createAccessPoint();
  Serial.println("Access Point On");
  // Запуск сервера
  server.begin();
  Serial.println("Server started");
  // Try pushing frequency to 80MHz.
    system_update_cpu_freq(SYS_CPU_80MHZ);
}

void loop() {
  digitalWrite(LED_BUILTIN, LOW);                               
  delay(500);                     

 
  // Проверка подключения
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Ожидание данных
  Serial.println("new client");
  while (!client.available()) {
    delay(10);
  }

  // Чтение первой строки запроса
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();

  // Работа с GPIO
  if (req.indexOf("/D1/0") != -1)
    digitalWrite(5, 0);
  else if (req.indexOf("/D1/1") != -1)
    digitalWrite(5, 1);
  else if (req.indexOf("/D2/0") != -1)
    digitalWrite(4, 0);
  else if (req.indexOf("/D2/1") != -1)
    digitalWrite(4, 1);
  else if (req.indexOf("/D3/0") != -1)
    digitalWrite(0, 0);
  else if (req.indexOf("/D3/1") != -1)
    digitalWrite(0, 1);
  else if (req.indexOf("/D4/0") != -1)
    digitalWrite(2, 0);
  else if (req.indexOf("/D4/1") != -1)
      digitalWrite(2, 1);

  else if (req.indexOf("/test") != -1) {
    Serial.println("TEST OK");
    String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nTest OK. Uptime: ";

    // Подстчет UpTime
    int  Sec   = (millis() / 1000UL) % 60;
    int  Min   = ((millis() / 1000UL) / 60UL) % 60;
    int  Hours = ((millis() / 1000UL) / 3600UL) % 24;
    int  Day   = ((millis() / 1000UL) / 3600UL / 24UL);
    s += Day;
    s += "d ";
    s += Hours;
    s += ":";
    s += Min;
    s += ":";
    s += Sec;
    s += "</html>\n";
    client.print(s);
    client.stop();
    return;
  }
  else
    // Если неверный запрос написать об ошибке
  {
    Serial.println("invalid request");
    String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nInvalid request";
    s += "</html>\n";
    client.print(s);
    client.stop();
    return;
  }

  client.flush();

  // Формирование ответа
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO set OK";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(10);
  Serial.println("Client disonnected");
 
    digitalWrite(LED_BUILTIN, HIGH); 
    delay(500);

}
Задача стоит в подключении к точке доступа на ESP8266 без использования маршрутизатора и управлении выходами контроллера при помощи мобильника. Не могу понять почему виснет.
 

Сергей_Ф

Moderator
Команда форума
@JIEXA вроде не виснит ничего. Другое дело, что Вы хотите получить и что Вы написали делать в программе. Наверное Ваши ожидания не совпадают с Вашими командами. На чём запускаете, кстати? Уверены что память на 80 Мгц работает стабильно?
 
Последнее редактирование:

JIEXA

New member
@JIEXA вроде не виснит ничего. Другое дело, что Вы хотите получить и что Вы написали делать в программе. Наверное Ваши ожидания не совпадают с Вашими командами. На чём запускаете, кстати? Уверены что память на 80 Мгц работает стабильно?
Код:
  // Ожидание данных
  Serial.println("new client");
  while (!client.available()) {
    delay(10);
  }
Убрал этот цикл и перестало виснуть.
В порт льется эта инфа:
Код:
new client
GET /D4/1 HTTP/1.1
Client disonnected
new client

invalid request
С этим циклом виснет в этот момент:
Код:
new client
GET /D4/1 HTTP/1.1
Client disonnected
new client
При отправке команды происходит исполнение, отключение клиента и вновь его подключение. После этого все виснет.
Я недавно начал ковырять плату поэтому не все понятно. Ковыряю Wemos D1.
 
Сверху Снизу