在事件处理程序中使用时,delay()似乎根本不会延迟

时间:2017-03-12 23:48:08

标签: arduino esp8266

我的esp8266上有一张Arduino草图。每当客户端连接到esp8266上托管的wifi时,我想点亮内置LED几秒钟。该事件触发得很好,但delay()没有做任何事情 - 该处理程序中的所有日志消息立即出现,而LED只闪烁一次。

delay()中的setup()来电可以正常工作。

#include <ESP8266WiFi.h>

const char *ssid = "button";
const char *password = "buttonpassword";

void onWiFiEvent(WiFiEvent_t event) {
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("led on");
    delay(5000);
    Serial.println("delay over");
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.println("led off");
}

void setup() {
    Serial.begin(115200);
    Serial.println();
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.println("setup before delay");
    delay(5000);
    Serial.println("setup after delay");

    Serial.println("Setting up AP");
    WiFi.softAP(ssid, password);
    WiFi.onEvent(onWiFiEvent, WIFI_EVENT_SOFTAPMODE_STACONNECTED);
    Serial.println("AP ready");
}

void loop() {
}

1 个答案:

答案 0 :(得分:0)

这是预期的行为。由于看门狗定时器(WDT)导致的同步检查延迟,您无法阻止这些回调。您需要异步执行检查,就像在循环中用标记表示的那样。