Modul 3 – Menjelajahi Deep Sleep ESP32 (2/4)

Timer Wake Up

Membangunkan ESP32 dari Deep Sleep dengan Timer

ESP32 Anda dapat masuk ke mode tidur dalam (deep sleep) dan kemudian bangun pada periode waktu yang telah ditentukan sebelumnya. Fitur ini sangat berguna jika Anda menjalankan proyek yang memerlukan penanda waktu (time stamping) atau tugas harian sambil tetap menjaga konsumsi daya yang rendah.

Kontroler RTC ESP32 memiliki timer bawaan yang dapat Anda gunakan untuk membangunkan ESP32 setelah jangka waktu tertentu. Dalam Unit ini, kami akan menunjukkan cara mengimplementasikannya menggunakan Arduino IDE.

1
Mengaktifkan Timer Wake Up

Fungsi Timer Wake Up

Mengaktifkan ESP32 untuk bangun setelah jangka waktu tertentu sangatlah mudah. Di Arduino IDE, Anda hanya perlu menentukan waktu tidur dalam mikrodetik dalam fungsi berikut:

esp_sleep_enable_timer_wakeup(time_in_us);

Parameter time_in_us adalah waktu dalam mikrodetik. Sebagai referensi:

  • 1 detik = 1.000.000 mikrodetik
  • 1 menit = 60.000.000 mikrodetik
  • 1 jam = 3.600.000.000 mikrodetik

Catatan Penting: Untuk waktu tidur yang sangat lama (lebih dari beberapa jam), perhatikan bahwa parameter time_in_us memiliki batasan karena menggunakan tipe data uint64_t. Untuk interval yang sangat panjang, pertimbangkan untuk menggunakan RTC eksternal atau strategi lain.

2
Menganalisis Kode Contoh

Contoh Kode Timer Wake Up

Mari kita lihat cara kerjanya menggunakan contoh dari library. Buka Arduino IDE, lalu pergi ke File → Examples → ESP32 → Deep Sleep, dan buka sketsa TimerWakeUp.

Berikut adalah penjelasan bagian-bagian utama dari kode contoh tersebut:

/*
 * Deep Sleep Sederhana dengan Timer Wake Up
 * =====================================
 * ESP32 menawarkan mode deep sleep untuk penghematan daya yang efektif
 * karena daya adalah faktor penting untuk aplikasi IoT. Dalam mode ini
 * CPU, sebagian besar RAM, dan semua periferal digital yang mendapat
 * clock dari APB_CLK dimatikan. Bagian chip yang masih bisa menyala adalah:
 * Kontroler RTC, periferal RTC, dan memori RTC
 *
 * Kode ini menampilkan deep sleep paling dasar dengan
 * timer untuk membangunkannya dan cara menyimpan data di
 * memori RTC untuk digunakan setelah boot ulang
 *
 * Kode ini berada di bawah Lisensi Domain Publik.
 *
 * Penulis:
 * Pranav Cherukupalli <cherukupallip@gmail.com>
 */

#define uS_TO_S_FACTOR 1000000  /* Faktor konversi dari mikrodetik ke detik */
#define TIME_TO_SLEEP  5        /* Waktu ESP32 akan tidur (dalam detik) */

RTC_DATA_ATTR int bootCount = 0;

/*
 * Metode untuk mencetak alasan mengapa ESP32
 * telah bangun dari tidur
 */
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("Bangun disebabkan oleh sinyal eksternal menggunakan RTC_IO"); break;
    case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Bangun disebabkan oleh sinyal eksternal menggunakan RTC_CNTL"); break;
    case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Bangun disebabkan oleh timer"); break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Bangun disebabkan oleh touchpad"); break;
    case ESP_SLEEP_WAKEUP_ULP : Serial.println("Bangun disebabkan oleh program ULP"); break;
    default : Serial.printf("Bangun bukan disebabkan oleh deep sleep: %d\n", wakeup_reason); break;
  }
}

Definisi Waktu Tidur

Dua baris pertama kode mendefinisikan periode waktu ESP32 akan tidur:

#define uS_TO_S_FACTOR 1000000  /* Faktor konversi dari mikrodetik ke detik */
#define TIME_TO_SLEEP  5        /* Waktu ESP32 akan tidur (dalam detik) */

Contoh ini menggunakan faktor konversi dari mikrodetik ke detik sehingga Anda dapat mengatur waktu tidur dalam variabel TIME_TO_SLEEP dalam satuan detik. Dalam kasus ini, contoh akan menempatkan ESP32 ke dalam mode deep sleep selama 5 detik.

Menyimpan Data di Memori RTC

Dengan ESP32, Anda dapat menyimpan data di memori RTC. ESP32 memiliki 8kB SRAM pada bagian RTC, yang disebut RTC fast memory. Data yang disimpan di sini tidak terhapus selama deep sleep. Namun, data ini akan terhapus ketika Anda menekan tombol reset (tombol berlabel EN pada board ESP32).

Untuk menyimpan data di memori RTC, Anda hanya perlu menambahkan RTC_DATA_ATTR sebelum definisi variabel. Contoh ini menyimpan variabel bootCount di memori RTC. Variabel ini akan menghitung berapa kali ESP32 telah bangun dari deep sleep.

RTC_DATA_ATTR int bootCount = 0;

Tip Praktis: Penggunaan memori RTC sangat berguna untuk menyimpan data penting seperti pembacaan sensor terakhir, stempel waktu, atau penghitung sehingga informasi ini tidak hilang selama siklus deep sleep. Ini memungkinkan Anda untuk melanjutkan pengoperasian dari titik terakhir setelah bangun.

3
Fungsi Setup dan Loop

Bagian Setup

Di dalam bagian setup() adalah tempat Anda harus menempatkan kode Anda. Anda perlu menulis semua instruksi sebelum memanggil fungsi esp_deep_sleep_start().

void setup(){
  Serial.begin(115200);
  delay(1000); // Beri waktu untuk membuka Serial Monitor
  
  // Tambahkan bootCount dan cetak nilainya setiap kali boot
  ++bootCount;
  Serial.println("Jumlah boot: " + String(bootCount));
  
  // Cetak alasan bangun untuk ESP32
  print_wakeup_reason();
  
  /*
   * Pertama kita mengonfigurasi sumber bangun
   * Kita mengatur ESP32 untuk bangun setiap 5 detik
   */
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  Serial.println("Siapkan ESP32 untuk tidur selama " + String(TIME_TO_SLEEP) + " Detik");
  
  /*
   * Berikutnya kita memutuskan periferal mana yang akan dimatikan/tetap dinyalakan
   * Secara default, ESP32 akan secara otomatis mematikan periferal
   * yang tidak dibutuhkan oleh sumber bangun, tetapi jika Anda ingin menjadi
   * pengguna daya yang bijak, ini untuk Anda. Baca detailnya di dokumentasi API
   * http://esp-idf.readthedocs.io/en/latest/api-reference/system/deep_sleep.html
   * Baris di bawah dikomentari sebagai contoh cara mengonfigurasi periferal.
   * Baris berikut mematikan semua periferal RTC dalam 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");
  
  /*
   * Sekarang setelah kita mengatur sumber bangun dan jika diperlukan mengatur
   * status periferal dalam deep sleep, kita dapat mulai masuk ke
   * deep sleep.
   * Jika tidak ada sumber bangun yang disediakan tetapi deep sleep
   * dimulai, itu akan tertidur selamanya kecuali terjadi reset perangkat keras.
   */
  Serial.println("Tidur sekarang");
  Serial.flush(); 
  esp_deep_sleep_start();
  Serial.println("Ini tidak akan pernah dicetak");
}

Contoh ini dimulai dengan menginisialisasi komunikasi serial pada baud rate 115200.

Kemudian, variabel bootCount ditambah satu pada setiap boot ulang, dan nomor tersebut dicetak di serial monitor.

++bootCount;
Serial.println("Jumlah boot: " + String(bootCount));

Selanjutnya, kode memanggil fungsi print_wakeup_reason(), tetapi Anda dapat memanggil fungsi apa pun yang Anda inginkan untuk melakukan tugas yang diinginkan. Misalnya, Anda mungkin ingin membangunkan ESP32 Anda sekali sehari untuk membaca nilai dari sensor.

Kemudian, kode mendefinisikan sumber bangun dengan menggunakan fungsi berikut:

esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

Fungsi ini menerima waktu tidur dalam mikrodetik sebagai argumen. Dalam kasus kita, kita menggunakan:

esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

Kemudian, setelah semua tugas dilakukan, ESP32 masuk ke mode tidur dengan memanggil fungsi berikut:

esp_deep_sleep_start();

Bagian Loop

Bagian loop() kosong karena ESP32 akan tidur sebelum mencapai bagian ini dari kode. Jadi, Anda perlu menulis semua sketsa Anda di setup() sebelum memanggil fungsi esp_deep_sleep_start().

void loop(){
  // Ini tidak akan pernah dipanggil
}

Catatan Penting: Ketika ESP32 bangun dari deep sleep, ia melakukan reset penuh, yang berarti kode dimulai dari awal. Inilah mengapa Anda perlu menyimpan data di memori RTC jika Anda ingin mempertahankan nilai antar sesi tidur.

4
Menguji Contoh

Menjalankan dan Mengamati Hasilnya

Unggah contoh sketsa ke ESP32 Anda. Pastikan Anda telah memilih board dan port COM yang benar.

Buka Serial Monitor pada baud rate 115200.

Setiap 5 detik, ESP bangun, mencetak pesan di serial monitor, dan kembali ke mode deep sleep.

Setiap kali ESP bangun, variabel bootCount bertambah. Kode juga mencetak alasan bangun, seperti yang ditunjukkan pada gambar di bawah ini.

Output Serial Monitor menunjukkan jumlah boot dan alasan bangun

Namun, perhatikan bahwa jika Anda menekan tombol EN pada board ESP32, itu akan mereset bootCount ke 1 lagi, karena memori RTC akan terhapus saat reset perangkat keras.

Tip Pengujian: Saat menguji aplikasi deep sleep, ada baiknya untuk menggunakan multimeter untuk mengukur konsumsi arus aktual. Hal ini akan membantu Anda memverifikasi bahwa ESP32 benar-benar memasuki mode deep sleep dan mengkonsumsi daya sesuai yang diharapkan (sekitar 10µA).

5
Kesimpulan

Kesimpulannya, kami telah menunjukkan cara menggunakan sumber bangun timer untuk membangunkan ESP dalam unit ini.

  • Untuk mengaktifkan bangun timer, Anda menggunakan fungsi esp_sleep_enable_timer_wakeup(time_in_us);
  • Gunakan fungsi esp_deep_sleep_start() untuk memulai deep sleep;
  • Data dapat disimpan di memori RTC menggunakan RTC_DATA_ATTR agar tetap ada selama siklus tidur.

Anda dapat memodifikasi contoh yang disediakan, dan alih-alih mencetak pesan, Anda dapat membuat ESP melakukan tugas lain. Timer wake-up sangat berguna untuk melakukan tugas berkala dengan ESP32, seperti tugas harian, tanpa menguras banyak daya.

Aplikasi praktis dari timer wake-up meliputi:

  • Stasiun pemantauan lingkungan yang mengirimkan data secara berkala
  • Sistem peringatan yang memeriksa kondisi pada interval tetap
  • Pencatat data dengan stempel waktu
  • Perangkat berbasis baterai dengan umur baterai yang panjang

Selanjutnya

Pada unit berikutnya, kita akan mempelajari cara membangunkan ESP32 dari deep sleep menggunakan sensor sentuh. Ini adalah metode bangun lain yang memungkinkan interaksi pengguna dengan ESP32 meskipun dalam keadaan tidur dalam.

Lanjut ke Unit 3: Deep Sleep – Touch Wake Up →

👥

Komunitas & Dukungan

Jika Anda memiliki pertanyaan atau ingin berbagi proyek yang telah Anda buat dengan menggunakan timer wake-up ESP32, silakan bergabung dengan grup telegram https://t.me/kodingindonesia. Komunitas akan senang melihat kreasi Anda dan membantu jika Anda menghadapi tantangan!

 

Anton Prafanto

Konten developer kodingindonesia.com & staf pengajar tetap di Universitas Mulawarman Samarinda

all author posts