在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() 函数将再次 运行 并且需要再次进行任何初始化。

有几种方法可以跨睡眠周期保持状态。

显然,您可以使用 EEPROMSPIFFS 将数据存储在闪存中。写入闪存速度慢且耗电量大,因此如果您 运行 正在关闭电池,这不是很好。

您还可以将数据存储在作为 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 是一个关于深度睡眠的很好的教程并且有更多的信息。