Tutorial: Moduri Deep Sleep pentru Proiecte pe Baterii
Una dintre cele mai puternice funcționalități ale ESP32 este consumul extrem de redus de energie în modul "deep sleep". Aceasta este cheia pentru a construi dispozitive IoT care pot funcționa luni sau chiar ani pe o singură baterie.
Componente Necesare
- 1x Placă de dezvoltare ESP32
- 1x Cablu Micro-USB
Ce este "Deep Sleep"?
Când ESP32 intră în modul "deep sleep", el oprește aproape toate componentele interne, inclusiv procesorul principal, Wi-Fi-ul și Bluetooth-ul. Doar un mic co-procesor (ULP - Ultra Low Power) și un ceas în timp real (RTC) rămân active. Consumul de energie scade de la zeci de miliamperi la doar câțiva microamperi, o reducere de peste 99%.
Dispozitivul rămâne în această stare până când este "trezit" de o sursă externă. Cele mai comune surse de trezire sunt:
- Timer: ESP32 se trezește singur după o perioadă de timp predefinită.
- Pin extern: O schimbare de tensiune pe un anumit pin (de ex., de la un buton sau un senzor) trezește procesorul.
Codul Sursă (Trezire cu Timer)
Acest cod va porni, va afișa un mesaj, va intra în "deep sleep" pentru 10 secunde, iar apoi se va restarta (trezi) și va relua procesul. Nu este nevoie de niciun circuit extern.
/*
Exemplu Deep Sleep cu Timer
Acest cod demonstreaza cum sa pui un ESP32 in deep sleep
si sa il trezesti dupa o anumita perioada de timp.
*/
// Factor de conversie de la microsecunde la secunde
#define uS_TO_S_FACTOR 1000000ULL
// Timpul de somn in secunde
#define TIME_TO_SLEEP 10
// Variabila pentru a numara de cate ori s-a trezit dispozitivul
// RTC_DATA_ATTR pastreaza valoarea variabilei chiar si in timpul deep sleep
RTC_DATA_ATTR int bootCount = 0;
void print_wakeup_reason(){
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason)
{
case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Trezire cauzata de timer"); break;
// Alte cazuri pot fi adaugate aici
default : Serial.printf("Trezire nu din cauza timer-ului: %d\n",wakeup_reason); break;
}
}
void setup(){
Serial.begin(115200);
delay(1000); // Asteapta ca Serial Monitor sa se stabilizeze
// Incrementeaza si afiseaza numarul de porniri
++bootCount;
Serial.println("Numar de porniri: " + String(bootCount));
// Afiseaza cauza trezirii
print_wakeup_reason();
// Setam timer-ul de trezire
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("Voi intra in deep sleep pentru " + String(TIME_TO_SLEEP) + " secunde");
// Intra in deep sleep. Codul de dupa aceasta linie nu va mai fi executat.
// La trezire, placa se va restarta complet.
esp_deep_sleep_start();
}
void loop(){
// Acest cod nu este niciodata executat
}