ESP32 Web Server触发函数失效问题求助
ESP32 Web Server触发功能失效问题排查与修复
核心问题分析与修复步骤
1. 赋值运算符误用(最关键的功能阻塞点)
在loop()函数的标志位更新逻辑中,错误使用比较运算符==替代了赋值运算符=,导致标志位无法正确更新,后续功能逻辑永远无法触发:
// 错误代码 enter_flag == 0; exit_flag == 0; // 修正为 enter_flag = 0; exit_flag = 0;
2. 未等待WiFi连接完成就启动Web Server
当前代码在调用WiFi.begin()后直接启动服务,此时ESP32可能还未完成WiFi连接,导致Web服务无法正常响应请求。需添加等待连接的逻辑:
WiFi.begin(ssid, password); // 等待WiFi连接完成,同时打印连接状态 while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); // 打印ESP32的IP地址,方便测试触发链接
3. 输入引脚状态不稳定
MZ80_ENTER和MZ80_EXIT设置为INPUT模式时,若未配置内部上拉/下拉电阻,会导致引脚状态浮动,digitalRead()返回值不可靠。建议改为INPUT_PULLUP模式(对应按钮接地的接线方式):
pinMode(MZ80_ENTER, INPUT_PULLUP); pinMode(MZ80_EXIT, INPUT_PULLUP);
该修改后按钮按下时digitalRead()仍返回LOW(0),与原代码判断逻辑一致,无需额外调整条件。
4. 阻塞式延迟导致Web请求响应慢
loop()中的delay(500)会阻塞程序执行,导致server.handleClient()无法及时处理Web请求,严重时会出现触发链接无响应的情况。建议用非阻塞的millis()替代:
先定义记录时间的变量:
unsigned long lastEnterTime = 0; unsigned long lastExitTime = 0; const long delayDuration = 500;
再修改loop()中的逻辑:
void loop(){ server.handleClient(); unsigned long currentMillis = millis(); if (state){ if (digitalRead(MZ80_ENTER) == 0 && enter_flag == 1) { if (currentMillis - lastEnterTime >= delayDuration) { servo_enter.write(100); servo_exit.write(0); exit_flag = 1; enter_flag = 0; Serial.println ("Up"); lastEnterTime = currentMillis; } } } else{ if (digitalRead(MZ80_EXIT) == 0 && exit_flag == 1) { if (currentMillis - lastExitTime >= delayDuration) { servo_exit.write(100); servo_enter.write(0); enter_flag = 1; exit_flag = 0; Serial.println ("Down"); lastExitTime = currentMillis; } } } }
修改后的完整代码
#include <WiFi.h> #include <WebServer.h> #include <Servo.h> #define MZ80_ENTER 32 #define MZ80_EXIT 33 #define SERVO_ENTER 22 #define SERVO_EXIT 23 int enter_flag = 1, exit_flag = 0; unsigned long lastEnterTime = 0; unsigned long lastExitTime = 0; const long delayDuration = 500; Servo servo_enter; Servo servo_exit; const char* ssid = "ssid"; const char* password = "pass"; WebServer server(80); bool state = false; void setup (){ Serial.begin(9600); // 配置输入引脚为上拉模式,避免状态浮动 pinMode(MZ80_ENTER, INPUT_PULLUP); pinMode(MZ80_EXIT, INPUT_PULLUP); servo_enter.attach(SERVO_ENTER); servo_exit.attach(SERVO_EXIT); servo_enter.write(0); delay(100); WiFi.begin(ssid, password); // 等待WiFi连接完成 while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.on("/", handleRoot); server.on("/up", handleup); server.on("/down", handledown); server.onNotFound(handleNotFound); server.begin(); Serial.println("Web Server Running !"); } void loop(){ server.handleClient(); unsigned long currentMillis = millis(); if (state){ if (digitalRead(MZ80_ENTER) == 0 && enter_flag == 1) { if (currentMillis - lastEnterTime >= delayDuration) { servo_enter.write(100); servo_exit.write(0); exit_flag = 1; enter_flag = 0; Serial.println ("Up"); lastEnterTime = currentMillis; } } } else{ if (digitalRead(MZ80_EXIT) == 0 && exit_flag == 1) { if (currentMillis - lastExitTime >= delayDuration) { servo_exit.write(100); servo_enter.write(0); enter_flag = 1; exit_flag = 0; Serial.println ("Down"); lastExitTime = currentMillis; } } } } String answer = "Web Loaded !"; void handleRoot(){ server.send(200,"text/plain",answer); } void handleup(){ state = true ; server.send(200,"text/plain",answer); } void handledown(){ state = false ; server.send(200,"text/plain",answer); } void handleNotFound(){ server.send(404,"text/plain","Error 404 NOT FOUND"); }
内容的提问来源于stack exchange,提问作者Huismori
相关产品推荐
相关产品推荐

