【问题标题】:ESP8266 ESPAsyncWebServer does not toggle GPIO in callbackESP8266 ESPAsyncWebServer 不会在回调中切换 GPIO
【发布时间】:2021-07-16 04:04:24
【问题描述】:

当我按下网页上的按钮时,我只是想关闭和打开 pin。我知道硬件可以工作,因为我可以在不同的程序中切换它。我是使用这个库的新手,所以我确定我在这里遗漏了一些小东西......为什么它不会在回调中切换我的输出。我已经执行了代码以在回调之外切换该引脚的 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 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(){
 
}

【问题讨论】:

    标签: html c++ esp8266 arduino-ide asynccallback


    【解决方案1】:

    不要在异步 Web 服务器的回调中调用 delay()(或 yield())。这样做会阻止事件处理程序任务,并可能导致 TCP 连接或 HTTP 协议失败。异步 Web 文档在 "Important things to remember" 部分中对此进行了说明。

    相反,设置一个标志,指示需要完成的工作,然后在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();
    

    这应该会显示 Web 服务器认为您请求的 URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      相关资源
      最近更新 更多