Belajar Firmware Engineer - Low Power Firmware
Episode 11 of 28

Belajar Firmware Engineer - Low Power Firmware

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.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

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.

Konsumsi Energi: dari Mana Datangnya?

Dua komponen konsumsi energi:

  • Arus aktif (saat CPU bekerja) — dikali durasi kerja.
  • Arus idle (saat tidur) — dikali durasi tidur.
Rumus dasar baterai
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 hari

Perhatikan: durasi tidur mendominasi. Tujuan utama low power bukan memperkecil arus kerja, melainkan menidurkan sistem sepanjang mungkin dan memperpendek waktu bangun.

Sleep Modes di STM32

Cortex-M modern menawarkan tiga tingkat tidur dengan trade-off:

ModeArus (kira-kira)CPURAMClockWake
Sleep~mAMatiAktifMatiInterrupt apa pun
Stop~uAMatiAktifMati semuaEXTI, RTC, timer
Standby~nA–uAMatiHilangMatiEXTI khusus, RTC, reset
Kapan memakai mode apa
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.

Wake Sources

Bangun dari tidur hanya boleh via sumber tertentu:

Wake SourceSleepStopStandby
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:

Pola tidur periodik dengan RTC
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
}

Pola Energy Efficiency

Event-Driven: Tidak Ada Polling

Polling = CPU menyala terus. Desain hemat memakai interrupt dan tidur di antaranya:

Naif vs hemat
Naif  : while(1) { if (btn_pressed()) {...} }   // CPU aktif terus
Hemat : tidur -> EXTI bangunkan -> proses -> tidur lagi

Tickless Idle (FreeRTOS)

Default RTOS bangun tiap tick (misal 1 kHz) — boros di idle. Tickless idle menghentikan tick saat semua task tidur dan mengkompensasi waktu saat bangun:

Konfigurasi tickless (konsep FreeRTOS)
configUSE_TICKLESS_IDLE = 2     // dua fase: Sleep -> Stop di idle hook
// hook: masuk Sleep, lalu turunkan ke Stop jika idle lebih lama

Clock Gating dan Peripheral Shutdown

Nonaktifkan 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.

Mengukur dan Memverifikasi

Tanpa pengukuran, optimasi low power adalah tebakan. Siapkan multimeter/ammeter serial atau power profiler:

Alur verifikasi konsumsi
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 membangunkan

Jangan lupa: LED debug yang lupa dimatikan bisa menghabiskan 10-20 mA — lebih boros dari seluruh budget low power. Audit periferal yang "kebetulan menyala".

Kesalahan Umum Low Power

  1. LED/peripheral nyala diam-diam — boros terbesar; audit clock gates.
  2. Polling saat tidur — CPU tidak pernah benar-benar tidur.
  3. Bangun terlalu sering — wake + kerja ulang lebih boros dari tidur terus.
  4. Menyimpan data penting di RAM lalu Standby — data hilang.
  5. Mengabaikan wake source config — sistem tidak bisa bangun (hang "mati").
  6. Mengukur sekali saja — konsumsi berubah per mode; ukur tiap fase.

Penutup

Inti yang harus dibawa pulang:

  • Tujuan low power = menidurkan sistem lebih lama, bukan hanya menurunkan mA aktif.
  • Mode: Sleep (responsif), Stop (uA, RAM aman), Standby (nA, RAM hilang); ESP32: light/deep sleep.
  • Wake source: EXTI, RTC alarm, timer; pilih sesuai mode.
  • Pola hemat: event-driven + tickless idle + clock gating.
  • Ukur dengan ammeter, hitung rata-rata arus, verifikasi tiap mode.

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"!

Belajar Firmware Engineer - Low Power Firmware | Belajar Firmware Engineer