ESP8266 ESPAsyncWebServer 在回调中不切换 GPIO
ESP8266 ESPAsyncWebServer does not toggle GPIO in callback
我只是想在网页上按下按钮时关闭和打开引脚。我知道硬件可以正常工作,因为我可以在不同的程序中切换它。我是使用这个库的新手,所以我确定我在这里遗漏了一些小东西......为什么它不会在回调中切换我的输出。我已经执行了在回调之外切换引脚高电平和低电平的代码并且它有效。
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(){
}
不要在来自异步网络服务器的回调中调用 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();
这应该会告诉您 URL Web 服务器认为您请求的是什么。
我只是想在网页上按下按钮时关闭和打开引脚。我知道硬件可以正常工作,因为我可以在不同的程序中切换它。我是使用这个库的新手,所以我确定我在这里遗漏了一些小东西......为什么它不会在回调中切换我的输出。我已经执行了在回调之外切换引脚高电平和低电平的代码并且它有效。
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(){
}
不要在来自异步网络服务器的回调中调用 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();
这应该会告诉您 URL Web 服务器认为您请求的是什么。