Код void setup () уничтожен, когда в esp32 используется глубокий сон - PullRequest
2 голосов
/ 25 июня 2019

Я делаю узел беспроводного датчика, используя 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));
}

1 Ответ

2 голосов
/ 25 июня 2019

Когда ESP32 входит в глубокий сон, он выключает процессор, на котором выполняется ваш код. Содержимое памяти и текущее состояние процессора теряются. Это требует энергии для поддержания содержимого памяти и состояния процессора, а точка глубокого сна заключается в том, чтобы максимально экономить электроэнергию, поэтому он перестает питать эти устройства.

Так что, когда он выходит из глубокого сна, он как будто просто включается. Ваша setup() функция снова запустится и ей потребуется выполнить любую инициализацию снова.

Существует несколько способов сохранить состояние во время циклов сна.

Очевидно, что вы можете хранить данные во флэш-памяти, используя EEPROM или SPIFFS. Запись на флэш-память выполняется медленно и стоит много энергии, поэтому это не очень хорошо, если вы работаете от батареи.

Вы также можете хранить данные в статическом ОЗУ, которое является частью часов реального времени (RTC). Это ОЗУ встроено в ESP32 и поддерживается во время глубокого сна. Его содержимое будет потеряно или очищено, когда ESP32 теряет питание или мигает.

Вы можете объявить переменную для использования в RTC RAM, используя 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
}

Там всего 8 КБ статической памяти, поэтому вы не можете хранить там огромное количество данных.

Вы также должны быть осторожны, используя его. Хранение сложных объектов C ++ в нем почти наверняка не будет работать корректно при перезапусках глубокого сна. Сохранение указателей на данные (например, char*, указывающих на строку C) не будет работать, поскольку данные, на которые указатель указал, будут потеряны после перезапуска из глубокого сна.

Трудно предсказать, как глубокий сон влияет на любую электронику, подключенную к ESP32. ESP32 прекратит питание своих линий GPIO во время глубокого сна. От того, останутся ли устройства включенными и как они реагируют на плавающие линии GPIO, зависит от устройства. Если они остаются включенными, они могут сохранять свое состояние из предыдущего цикла. Это действительно зависит от устройства и схемы.

Эта статья является хорошим руководством по глубокому сну и содержит больше информации.

...