elektronika

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

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *