1)在硬件 reset 时,GPIO 状态不能保持。当 ESP8266 硬件复位时,所有的 GPIO 将恢复到默认状态,通常是高阻态。
2)在 deep-sleep 中,GPIO 状态也不能保持。当 ESP8266 进入 deep-sleep 模式时,除了 RTC 相关的 GPIO 外,其他 GPIO 将被禁用,以降低功耗。因此,它们的状态在唤醒后不能保持。
3)要实现选择性地保持 GPIO 状态,你可以使用 RTC IO。RTC IO 是一种特殊的 GPIO,它们可以在 deep-sleep 模式下保持状态。但是,RTC IO 的数量有限,通常只有几个。在 ESP8266 中,RTC IO 包括 GPIO 16 和 GPIO 14。但是,请注意,GPIO 14 在 deep-sleep 模式下不能保持状态,因为它被用作 XTAL(外部晶体振荡器)。
4)以下是一个示例代码,演示如何在 deep-sleep 模式下保持 GPIO 16 的状态:
```cpp
#include
#include
#include
#include
#include
#include
#include
ESP8266WebServer server(80);
void setup() {
pinMode(16, OUTPUT);
digitalWrite(16, LOW); // Set GPIO 16 to LOW
// Set GPIO 16 as an RTC IO
ESP.rtcUserMemoryWrite(0, &GPIO, sizeof(GPIO));
server.on("/", HTTP_GET, handleRoot);
SPIFFS.begin();
}
void loop() {
server.handleClient();
}
void handleRoot() {
server.send(200, "text/html", "Hello, world!");
}
void goToSleep() {
// Read the GPIO state from RTC memory
uint32_t gpioState;
ESP.rtcUserMemoryRead(0, &gpioState, sizeof(gpioState));
// Set GPIO 16 to the saved state
digitalWrite(16, (gpioState & 1) ? HIGH : LOW);
// Enter deep-sleep mode for 10 seconds
ESP.deepSleep(10000000);
}
```
在这个示例中,我们将 GPIO 16 设置为输出并将其状态保存到 RTC 内存中。在 deep-sleep 唤醒后,我们将从 RTC 内存中读取 GPIO 16 的状态,并将其恢复。
然而,由于 GPIO 14 不能作为 RTC IO 保持状态,你可以考虑使用其他 GPIO,例如 GPIO 5 或 GPIO 4,这些 GPIO 可以作为 RTC IO 使用。但是,请注意,这些 GPIO 可能与其他功能冲突,例如 GPIO 5 用于 LEDC 功能,GPIO 4 用于 SPI 功能。在使用这些 GPIO 之前,请确保它们不会影响你的其他功能。
1)在硬件 reset 时,GPIO 状态不能保持。当 ESP8266 硬件复位时,所有的 GPIO 将恢复到默认状态,通常是高阻态。
2)在 deep-sleep 中,GPIO 状态也不能保持。当 ESP8266 进入 deep-sleep 模式时,除了 RTC 相关的 GPIO 外,其他 GPIO 将被禁用,以降低功耗。因此,它们的状态在唤醒后不能保持。
3)要实现选择性地保持 GPIO 状态,你可以使用 RTC IO。RTC IO 是一种特殊的 GPIO,它们可以在 deep-sleep 模式下保持状态。但是,RTC IO 的数量有限,通常只有几个。在 ESP8266 中,RTC IO 包括 GPIO 16 和 GPIO 14。但是,请注意,GPIO 14 在 deep-sleep 模式下不能保持状态,因为它被用作 XTAL(外部晶体振荡器)。
4)以下是一个示例代码,演示如何在 deep-sleep 模式下保持 GPIO 16 的状态:
```cpp
#include
#include
#include
#include
#include
#include
#include
ESP8266WebServer server(80);
void setup() {
pinMode(16, OUTPUT);
digitalWrite(16, LOW); // Set GPIO 16 to LOW
// Set GPIO 16 as an RTC IO
ESP.rtcUserMemoryWrite(0, &GPIO, sizeof(GPIO));
server.on("/", HTTP_GET, handleRoot);
SPIFFS.begin();
}
void loop() {
server.handleClient();
}
void handleRoot() {
server.send(200, "text/html", "Hello, world!");
}
void goToSleep() {
// Read the GPIO state from RTC memory
uint32_t gpioState;
ESP.rtcUserMemoryRead(0, &gpioState, sizeof(gpioState));
// Set GPIO 16 to the saved state
digitalWrite(16, (gpioState & 1) ? HIGH : LOW);
// Enter deep-sleep mode for 10 seconds
ESP.deepSleep(10000000);
}
```
在这个示例中,我们将 GPIO 16 设置为输出并将其状态保存到 RTC 内存中。在 deep-sleep 唤醒后,我们将从 RTC 内存中读取 GPIO 16 的状态,并将其恢复。
然而,由于 GPIO 14 不能作为 RTC IO 保持状态,你可以考虑使用其他 GPIO,例如 GPIO 5 或 GPIO 4,这些 GPIO 可以作为 RTC IO 使用。但是,请注意,这些 GPIO 可能与其他功能冲突,例如 GPIO 5 用于 LEDC 功能,GPIO 4 用于 SPI 功能。在使用这些 GPIO 之前,请确保它们不会影响你的其他功能。
举报