ESP8266 ESPAsyncWebServer не переключает GPIO в обратном вызове - PullRequest
0 голосов
/ 04 августа 2020

Я просто пытаюсь выключить и включить булавку, когда нажимаю кнопку с веб-страницы. Я знаю, что оборудование работает, так как могу переключать его в другой программе. Я новичок в использовании этой библиотеки, поэтому я уверен, что мне здесь не хватает чего-то небольшого ... Почему он не переключает мой вывод в обратном вызове. Я выполнил код для переключения этого вывода HIGH и LOW вне функции обратного вызова, и он работает.

  server.on("/door1", HTTP_GET, [] (AsyncWebServerRequest *request) {
    pinMode(5, OUTPUT);
    delay(10);
    digitalWrite(5, HIGH);
    delay(5000);
    digitalWrite(5, LOW);
    request->send(SPIFFS, "/index.html", String(), false);
  });

Полный код ниже:

// Import required libraries
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <FS.h>

// NetworkCreds
const char* ssid = "******";
const char* password = "*****";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);

  // Initialize the sensor

  // Initialize SPIFFS
  if(!SPIFFS.begin()){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html", String(), false);
  });
  
//  // Route to load style.css file
  server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/style.css", "text/css");
  });

  server.on("/door1", HTTP_GET, [] (AsyncWebServerRequest *request) {
    pinMode(5, OUTPUT);
    delay(10);
    digitalWrite(5, HIGH);
    delay(5000);
    digitalWrite(5, LOW);
    request->send(SPIFFS, "/index.html", String(), false);
  });

  // Start server
  server.begin();
}

void loop(){
 
}

1 Ответ

1 голос
/ 04 августа 2020

Не вызывать delay() (или yield()) внутри обратных вызовов от веб-сервера asyn c. Это блокирует задачу обработчика событий и может привести к сбою соединения TCP или протокола HTTP. Веб-документация asyn c называет это в разделе «Важные вещи, которые следует помнить» .

Вместо этого установите флаг, который указывает, что работа должна быть выполнена, а затем выполните работать в loop().

Например,

AsyncWebServer server(80);

boolean toggle_gpio = false;

void setup(){

и

  server.on("/door1", HTTP_GET, [] (AsyncWebServerRequest *request) {
    Serial.println("requesting toggle gpio");
    toggle_gpio = true;
    request->send(SPIFFS, "/index.html", String(), false);
  });

и

void loop() {
  if(toggle_gpio) {
    Serial.println("toggling GPIO");
    pinMode(5, OUTPUT);
    delay(10);
    digitalWrite(5, HIGH);
    delay(5000);
    digitalWrite(5, LOW);
    toggle_gpio = false;
  }
}

Этот код включает два сообщения отладки ; если вы не видите requesting toggle gpio в качестве вывода, значит, вы на самом деле не запускаете обработчик /door1.

Если вы не видите это сообщение, я бы добавил этот обработчик в setup():

server.onNotFound([](AsyncWebServerRequest *request){
  Serial.print("got unhandled request for ");
  Serial.println(request->url();
  request->send(404);
});

// Start server
server.begin();

Это должно показать вам, какой URL-адрес, по мнению веб-сервера, вы запрашивали.

...