You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:06:42