在 esp32 中使用深度睡眠时,void setup() 代码是否被清除

Qua*_* Lê 2 c arduino thread-sleep sleep-mode esp32

我正在使用 esp32 (slave) 和 rf24l01 模块做无线传感器节点。我的下一步是将我的奴隶置于睡眠模式(可能是深度睡眠)。我可以在我的项目中使用深度睡眠吗?

他们说

存储在该内存中的所有内容都被清除并且无法访问。

那么我所有的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));
}
Run Code Online (Sandbox Code Playgroud)

rom*_*key 6

当 ESP32 进入深度睡眠时,它会关闭运行代码的处理器。内存的内容和处理器的当前状态都将丢失。维持其内存内容和 CPU 状态需要消耗电力,而深度睡眠的目的是尽可能节省电力,因此它停止为这些东西供电。

因此,当它从深度睡眠中重新启动时,就好像它刚刚通电一样。您的setup()函数将再次运行,并且需要再次进行任何初始化。

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

显然,您可以使用EEPROM或将数据存储在闪存中SPIFFS。写入闪存很慢并且会消耗大量电量,因此如果您的电池电量不足,这不是很好。

您还可以将数据存储在作为实时时钟 (RTC) 一部分的静态 RAM 中。该 RAM 内置于 ESP32 中,并在深度睡眠期间保持不变。当 ESP32 掉电或闪烁时,其内容将丢失或清除。

您可以使用RTC_DATA_ATTR. 例如:

RTC_DATA_ATTR unsigned wakeups;

void setup() {
  wakeups++;

  Serial.begin(115200);
  Serial.printf("%u wakeups\n", wakeups);

  // do other stuff and enter deep sleep
}
Run Code Online (Sandbox Code Playgroud)

只有 8KB 的静态 RAM,因此您无法在其中存储大量数据。

您还需要小心使用它。在深度睡眠重启后,在其中存储复杂的 C++ 对象几乎肯定无法正常工作。存储指向数据的指针(如char*指向 C 字符串)将不起作用,因为从深度睡眠重新启动后,指针指向的数据将丢失。

难以预测深度睡眠对连接到 ESP32 的任何电子设备的影响。ESP32 将在深度睡眠期间停止为其 GPIO 线供电。设备是否保持通电以及它们对 GPIO 线浮动的反应取决于设备。如果它们保持通电,它们可能会保持前一个周期的状态。这实际上取决于设备和电路。

这篇文章是一个很好的深度睡眠教程,有更多的信息。