在esp32中使用深度睡眠时是否清除了无效的setup()代码

时间:2019-06-25 14:41:18

标签: c arduino thread-sleep esp32 sleep-mode

我正在使用esp32(从站)和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));
}

1 个答案:

答案 0 :(得分:2)

ESP32进入深度睡眠时,它将关闭正在运行您的代码的处理器。内存的内容和处理器的当前状态均丢失。维护内存的内容和CPU状态会消耗大量电源,而深度睡眠的重点是节省尽可能多的电源,因此它将停止为这些设备供电。

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

有两种方法可以在整个睡眠周期中保持状态。

很明显,您可以使用EEPROMSPIFFS将数据存储在闪存中。写入闪存的速度很慢,并且耗费大量电量,因此,如果电池电量不足,这并不好。

您还可以将数据存储在实时时钟(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 ++对象存储在其中将无法正常工作。存储指向数据的指针(例如指向C字符串的char*)将不起作用,因为从深度睡眠重启后,指针所指向的数据将丢失。

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

This article是一个很好的深度睡眠教程,并提供了更多信息。