[英]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.