Mengaktifkan mode deep sleep di ESP32 Menggunakan Timer
Mengaktifkan ESP32 ketika mode deep sleep menggunakan timer ini sangat cocok digunakan ketika kita membuat sebuah projek dimana pekerjaan yang dilakukan oleh peralatan tersebut merupakan aktifitas daily.sehingga dengan memanfaatkan timer ini maka konsumsi dayanya bisa berkurang.
didalam ESP32 ini adalah RTC Controller yang bisa kita manfaatkan mejadi sebuah timer sehingga bisa kita manfaatkan untuk mengaktifkan ESP32 ketika dalam mode deep sleep.
Mengaktifkan Timer di ESP32 (Enable Timer Wakeup)
untuk mengaktifkan timer di ESP32 ini terbilang sangat mudah untuk dilakukan.Kita tinggal buka saja IDE Arduino kemudian silahkan ketik syntaxnya seperti dibawah ini.
esp_sleep_enable_timer_wakeup(time_in_us)
Code
Langsung saja silahkan anda praktekan dengan cara buka IDE Arduino kemudian silahkan klik FILE>EXAMPLE>ESP32>Deep Sleep, kemudian buka TimerWakeUp Sketchnya
/* Simple Deep Sleep with Timer Wake Up ===================================== ESP32 offers a deep sleep mode for effective power saving as power is an important factor for IoT applications. In this mode CPUs, most of the RAM, and all the digital peripherals which are clocked from APB_CLK are powered off. The only parts of the chip which can still be powered on are: RTC controller, RTC peripherals ,and RTC memories This code displays the most basic deep sleep with a timer to wake it up and how to store data in RTC memory to use it over reboots This code is under Public Domain License. Author: Pranav Cherukupalli <cherukupallip@gmail.com> */ #define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */ #define TIME_TO_SLEEP 5 /* Time ESP32 will go to sleep (in seconds) */ RTC_DATA_ATTR int bootCount = 0; /* Method to print the reason by which ESP32 has been awaken from sleep */ 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_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break; case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break; case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break; case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break; case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break; default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break; } } void setup(){ Serial.begin(115200); delay(1000); //Take some time to open up the Serial Monitor //Increment boot number and print it every reboot ++bootCount; Serial.println("Boot number: " + String(bootCount)); //Print the wakeup reason for ESP32 print_wakeup_reason(); /* First we configure the wake up source We set our ESP32 to wake up every 5 seconds */ esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) + " Seconds"); /* Next we decide what all peripherals to shut down/keep on By default, ESP32 will automatically power down the peripherals not needed by the wakeup source, but if you want to be a poweruser this is for you. Read in detail at the API docs http://esp-idf.readthedocs.io/en/latest/api-reference/system/deep_sleep.html Left the line commented as an example of how to configure peripherals. The line below turns off all RTC peripherals in deep sleep. */ //esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); //Serial.println("Configured all RTC Peripherals to be powered down in sleep"); /* Now that we have setup a wake cause and if needed setup the peripherals state in deep sleep, we can now start going to deep sleep. In the case that no wake up sources were provided but deep sleep was started, it will sleep forever unless hardware reset occurs. */ Serial.println("Going to sleep now"); delay(1000); Serial.flush(); esp_deep_sleep_start(); Serial.println("This will never be printed"); } void loop(){ //This is not going to be called }
Dari program diatas kita bisa melihat pada mode deep sleep ini hanya komponen-kompenen tertentu yang aktif seperti : RTC controller, RTC perpheral, dan Memori RTC.
In this mode CPUs, most of the RAM, and all the digital peripherals which are clocked from APB_CLK are powered off. The only parts of the chip which can still be powered on are: RTC controller, RTC peripherals ,and RTC memories
jadi kesimpulannya adalah ketika kita menggunakan timer untuk mode deep sleep ini yang akan aktif hanya RTC controller, RTC peripheral dan Memori RTC
Mendeklarasikan sleep time
berikut ini adalah dua baris kode program untuk mendefinisikan periode waktu kapan ESP32 akan sleep.
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */ #define TIME_TO_SLEEP 5 /* Time ESP32 will go to sleep (in seconds) */
Program diatas yang baris pertama adalah akan mengkonversi satuan waktu dari mikro detik ke detik, kemudian baris kedua adalah waktu yang akan digunakan untuk metode deep sleep yaitu 5 detik.
Menyimpan data di memori RTC
Pada ESP32 mempunyai 9kB SRAM atau biasa disebut dengan RTC fast Memory yang fungsinya adalah untuk menyimpan data selama mode deep sleep.selama mode ini data yang ada di memori RTC ini tidak bisa dihapus walaupun anda tekan tombol reset.
untuk melakukan penyimpanan data ini di memori RTC ini sangatlah mudah yaitu hanya dengan menambahkan syntax RTC_DATA_ATTR dan penulisannya sebelum variabel yang digunakan.misalnya data ini nanti akan disimpan di bootCount, maka syntaxnya adalah sbb :
RTC_DATA_ATTR int bootCount = 0;
Wake Up Reason
pada program diatas juga ada yang namanya fungsi print_wakeup_reason() , fungsi ini digunakan untuk menampilkan informasi mengapa ESP32 ini diaktifkan dari mode deep sleep.
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_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break; case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break; case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break; case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break; case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break; default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break; } }
The setup()
fungsi the setup() ini adalah tempat dimana kita akan meletakan code program kita, jadi untuk membuat mode deep sleep ini kita hanya bisa menuliskan programnya di fungsi ini saja.
berikut ini adalah contoh syntax untuk menginisialisasi komunikasi serial dengan boud rate 115200
Serial.begin(115200);
kemudian variabel bootCount nilainya akan bertambah satu setiap kali direstart, dan untuk menampilkan datanya ini di layar monitor bisa menggunakan perintah dibawah ini
++bootCount; Serial.println("Boot number: " + String(bootCount));
Kemudian setelah baris program diatas ada fungsi print_wakeup_reason().fungsi ini bisa kita panggil ketika akan melakukan pembacaan data ( misalnya ESP32 akan aktif sehari sekali untuk membaca nilai dari sensor).
selanjutnya adalah fungsi untuk mengaktifkan ESP32
esp_sleep_enable_timer_wakeup(time_in_us)
fungsi diatas berfungsi untuk mengaktifkan mode deep sleep sesuai dengan waktu yang sudah ditentukan sebelumnya pada deklarasi program.
demikian tutorial bagaimana cara untuk mengaktifkan esp32 ketika dalam mode deep sleep