Membuat firmware hemat energi: memahami sleep modes Sleep, Stop, dan Standby beserta trade-offnya, wake sources dari EXTI hingga RTC, pola event-driven dan tickless idle, pengukuran konsumsi arus, serta praktik mendesain firmware untuk perangkat bertenaga baterai.

Setelah di episode 10 firmware kita terstruktur dengan driver yang rapi, pada episode ini kita mengajarinya berhemat. Sebagian besar perangkat embedded tidak dicolok ke listrik: sensor bertenaga baterai AA, smartwatch, perangkat medis implant. Umur baterai — bukan fitur — sering jadi pembeda produk.
Mengapa low power penting? Karena setiap miliampere yang terbuang berarti baterai lebih cepat habis, dan di perangkat yang sulit dijangkau (sensor di ladang, alat medis) ganti baterai itu mahal atau berbahaya. Firmware engineer yang paham low power bisa memperpanjang umur produk berlipat ganda tanpa mengubah hardware.
Dua komponen konsumsi energi:
energi/hari = (I_aktif × t_aktif) + (I_idle × t_idle)
umur baterai ≈ kapasitas (mAh) ÷ rata-rata arus (mA)
Contoh: 2400 mAh, I_idle 5 uA, kerja 10 mA selama 1 detik per menit
rata-rata ≈ 5uA + (10mA × 1/60) ≈ 172 uA → umur ≈ 13.950 jam ≈ 580 hariPerhatikan: durasi tidur mendominasi. Tujuan utama low power bukan memperkecil arus kerja, melainkan menidurkan sistem sepanjang mungkin dan memperpendek waktu bangun.
Cortex-M modern menawarkan tiga tingkat tidur dengan trade-off:
| Mode | Arus (kira-kira) | CPU | RAM | Clock | Wake |
|---|---|---|---|---|---|
| Sleep | ~mA | Mati | Aktif | Mati | Interrupt apa pun |
| Stop | ~uA | Mati | Aktif | Mati semua | EXTI, RTC, timer |
| Standby | ~nA–uA | Mati | Hilang | Mati | EXTI khusus, RTC, reset |
Sleep : tunggu sebentar (ms), butuh respons cepat
Stop : tidur panjang (detik-menit), state RAM harus dipertahankan
Standby : tidur sangat lama (menit-jam-hari), boleh kehilangan RAM
(tapi jangan simpan data penting - RAM hilang!)ESP32 punya padanan: modem sleep (WiFi off, CPU jalan), light sleep (clock off), dan deep sleep (RAM RTC saja). Pilihan mode selalu trade-off antara arus dan waktu bangun — diukur dari aplikasi, bukan spek.
Bangun dari tidur hanya boleh via sumber tertentu:
| Wake Source | Sleep | Stop | Standby |
|---|---|---|---|
| GPIO/EXTI interrupt | ✓ | ✓ | ✓ (line khusus) |
| RTC alarm/wakeup timer | ✓ | ✓ | ✓ |
| Peripheral interrupt (UART, timer) | ✓ | ✓ | ✗ |
| Reset / watchdog | ✓ | ✓ | ✓ |
Praktik umum: RTC alarm membangunkan MCU tiap interval untuk membaca sensor, lalu tidur lagi. Contoh pola wakeup → kerja → tidur:
void sleep_until_alarm(uint32_t seconds) {
rtc_set_alarm(seconds); // bangun setelah N detik
PWR_EnterSTOPMode(...); // masuk Stop
// di sini: sistem terbangun oleh alarm RTC
}Polling = CPU menyala terus. Desain hemat memakai interrupt dan tidur di antaranya:
Naif : while(1) { if (btn_pressed()) {...} } // CPU aktif terus
Hemat : tidur -> EXTI bangunkan -> proses -> tidur lagiDefault RTOS bangun tiap tick (misal 1 kHz) — boros di idle. Tickless idle menghentikan tick saat semua task tidur dan mengkompensasi waktu saat bangun:
configUSE_TICKLESS_IDLE = 2 // dua fase: Sleep -> Stop di idle hook
// hook: masuk Sleep, lalu turunkan ke Stop jika idle lebih lamaNonaktifkan clock peripheral yang tidak dipakai (RCC — dari episode 4), matikan sensor di antara pembacaan, dan hindari resistor pemboros di board.
Tip
Ingat aturan 80/20 low power: tidur lebih lama mengalahkan menghemat mA aktif. Sebuah task yang bisa disatukan (baca 3 sensor sekaligus, bukan 3 kali bangun) mengurangi energi lebih banyak daripada menurunkan clock 10%. Desain jadwal kerja → tidur dulu, baru optimasi arus per-mode.
Tanpa pengukuran, optimasi low power adalah tebakan. Siapkan multimeter/ammeter serial atau power profiler:
1. Ukur arus kerja (saat tugas berjalan)
2. Ukur arus idle (saat tidur) - jangan lupa ukur per mode!
3. Catat durasi tiap fase dengan timestamp
4. Hitung rata-rata arus, bandingkan target desain
5. Verifikasi bahwa wake source benar-benar membangunkanJangan lupa: LED debug yang lupa dimatikan bisa menghabiskan 10-20 mA — lebih boros dari seluruh budget low power. Audit periferal yang "kebetulan menyala".
Inti yang harus dibawa pulang:
Di episode 12 selanjutnya kita menghubungkan firmware ke dunia luar: Communication & Networking — TCP/IP stack, MQTT, koneksi aman dengan TLS, dan praktik membangun firmware jaringan pertama di ESP32. Perangkat kalian siap "berkomunikasi"!