在esp32中使用深度睡眠时void setup()代码是否被清除
Is void setup() code wiped out when deep sleep is used in esp32
我正在使用 esp32(从)和 rf24l01 模块做无线传感器节点。我的下一步是让我的奴隶进入睡眠模式(也许是深度睡眠)。我可以为我的项目使用深度睡眠吗?
他们说
everything stored in that memory is wiped out and cannot be accessed.
所以我所有的 void setup()
代码都被清除了吗?或者只是我的 pack0.temp,潮湿的土壤被擦掉了?
我的代码附在下面
struct package0
{
float temperature = 0;
float humidity = 0;
int soil = 0;
};
typedef struct package0 Package0;
Package0 pack0;
/**********************************/
/**************RF24****************/
RF24 radio(25,26);
RF24Network network(radio);
const uint16_t this_node = 01;
const uint16_t master00 = 00;
const unsigned long interval = 3000;
/**********************************/
void setup() {
dht.begin();
radio.begin();
network.begin(90, this_node);
radio.setPALevel(RF24_PA_MIN);
radio.setDataRate(RF24_250KBPS);
}
void loop() {
// put your main code here, to run repeatedly:
network.update();
unsigned long now = millis();
if (now - last_sent >= interval)
{
last_sent = now;
send();
}
}
void send()
{
pack0.humidity = dht.readHumidity();
pack0.temperature = dht.readTemperature();
pack0.soil = map(analogRead(SOILPIN), 0, 4096, 100, 0);//convert to percentage
if (isnan(pack0.humidity) || isnan(pack0.temperature))
{
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
RF24NetworkHeader header(master00);
bool ok = network.write(header, &pack0, sizeof(pack0));
}
当 ESP32 进入深度睡眠时,它会关闭正在 运行 执行您的代码的处理器。内存的内容和处理器的当前状态都丢失了。维持其内存内容和 CPU 状态需要消耗电力,而深度睡眠的目的是尽可能节省电力,因此它停止为这些东西供电。
所以当它从深度睡眠中重新启动时,就好像它刚刚启动一样。您的 setup()
函数将再次 运行 并且需要再次进行任何初始化。
有几种方法可以跨睡眠周期保持状态。
显然,您可以使用 EEPROM
或 SPIFFS
将数据存储在闪存中。写入闪存速度慢且耗电量大,因此如果您 运行 正在关闭电池,这不是很好。
您还可以将数据存储在作为 real-time-clock (RTC) 一部分的静态 RAM 中。该 RAM 内置于 ESP32 中,并在深度睡眠期间保持不变。当ESP32掉电或闪烁时,其内容将丢失或清除。
您可以使用 RTC_DATA_ATTR
声明一个存在于 RTC RAM 中的变量。例如:
RTC_DATA_ATTR unsigned wakeups;
void setup() {
wakeups++;
Serial.begin(115200);
Serial.printf("%u wakeups\n", wakeups);
// do other stuff and enter deep sleep
}
只有 8KB 的静态 RAM,因此您不能在那里存储大量数据。
你也需要小心使用它。将复杂的 C++ 对象存储在其中几乎肯定无法在深度睡眠重启时正常工作。存储指向数据的指针(如 char*
指向 C 字符串)将不起作用,因为指针指向的数据在从深度睡眠重新启动后将丢失。
深度睡眠如何影响连接到 ESP32 的任何电子设备很难预测。 ESP32 将在深度睡眠期间停止为其 GPIO 线供电。设备是否保持供电以及它们如何对浮动的 GPIO 线做出反应取决于设备。如果它们保持通电状态,它们可能会保留上一个周期的状态。这实际上取决于设备和电路。
This article 是一个关于深度睡眠的很好的教程并且有更多的信息。
我正在使用 esp32(从)和 rf24l01 模块做无线传感器节点。我的下一步是让我的奴隶进入睡眠模式(也许是深度睡眠)。我可以为我的项目使用深度睡眠吗?
他们说
everything stored in that memory is wiped out and cannot be accessed.
所以我所有的 void setup()
代码都被清除了吗?或者只是我的 pack0.temp,潮湿的土壤被擦掉了?
我的代码附在下面
struct package0
{
float temperature = 0;
float humidity = 0;
int soil = 0;
};
typedef struct package0 Package0;
Package0 pack0;
/**********************************/
/**************RF24****************/
RF24 radio(25,26);
RF24Network network(radio);
const uint16_t this_node = 01;
const uint16_t master00 = 00;
const unsigned long interval = 3000;
/**********************************/
void setup() {
dht.begin();
radio.begin();
network.begin(90, this_node);
radio.setPALevel(RF24_PA_MIN);
radio.setDataRate(RF24_250KBPS);
}
void loop() {
// put your main code here, to run repeatedly:
network.update();
unsigned long now = millis();
if (now - last_sent >= interval)
{
last_sent = now;
send();
}
}
void send()
{
pack0.humidity = dht.readHumidity();
pack0.temperature = dht.readTemperature();
pack0.soil = map(analogRead(SOILPIN), 0, 4096, 100, 0);//convert to percentage
if (isnan(pack0.humidity) || isnan(pack0.temperature))
{
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
RF24NetworkHeader header(master00);
bool ok = network.write(header, &pack0, sizeof(pack0));
}
当 ESP32 进入深度睡眠时,它会关闭正在 运行 执行您的代码的处理器。内存的内容和处理器的当前状态都丢失了。维持其内存内容和 CPU 状态需要消耗电力,而深度睡眠的目的是尽可能节省电力,因此它停止为这些东西供电。
所以当它从深度睡眠中重新启动时,就好像它刚刚启动一样。您的 setup()
函数将再次 运行 并且需要再次进行任何初始化。
有几种方法可以跨睡眠周期保持状态。
显然,您可以使用 EEPROM
或 SPIFFS
将数据存储在闪存中。写入闪存速度慢且耗电量大,因此如果您 运行 正在关闭电池,这不是很好。
您还可以将数据存储在作为 real-time-clock (RTC) 一部分的静态 RAM 中。该 RAM 内置于 ESP32 中,并在深度睡眠期间保持不变。当ESP32掉电或闪烁时,其内容将丢失或清除。
您可以使用 RTC_DATA_ATTR
声明一个存在于 RTC RAM 中的变量。例如:
RTC_DATA_ATTR unsigned wakeups;
void setup() {
wakeups++;
Serial.begin(115200);
Serial.printf("%u wakeups\n", wakeups);
// do other stuff and enter deep sleep
}
只有 8KB 的静态 RAM,因此您不能在那里存储大量数据。
你也需要小心使用它。将复杂的 C++ 对象存储在其中几乎肯定无法在深度睡眠重启时正常工作。存储指向数据的指针(如 char*
指向 C 字符串)将不起作用,因为指针指向的数据在从深度睡眠重新启动后将丢失。
深度睡眠如何影响连接到 ESP32 的任何电子设备很难预测。 ESP32 将在深度睡眠期间停止为其 GPIO 线供电。设备是否保持供电以及它们如何对浮动的 GPIO 线做出反应取决于设备。如果它们保持通电状态,它们可能会保留上一个周期的状态。这实际上取决于设备和电路。
This article 是一个关于深度睡眠的很好的教程并且有更多的信息。