簡體   English   中英

ESP8266 ESPAsyncWebServer 不會在回調中切換 GPIO

[英]ESP8266 ESPAsyncWebServer does not toggle GPIO in callback

當我按下網頁上的按鈕時,我只是想關閉和打開別針。 我知道硬件可以工作,因為我可以在不同的程序中切換它。 我是使用這個庫的新手,所以我確定我在這里遺漏了一些小東西......為什么它不會在回調中切換我的 output。 我已經執行了代碼以在回調之外切換該引腳 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(){
 
}

不要在異步 web 服務器的回調中調用delay() (或yield() )。 這樣做會阻止事件處理程序任務,並可能導致 TCP 連接或 HTTP 協議失敗。 異步 web 文檔在“要記住的重要事項”部分中對此進行了說明。

相反,設置一個標志,指示需要完成工作,然后在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為 output 那么您實際上並沒有觸發/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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM