โ˜€๏ธSiang
IoT & Home Automation

Battery Management untuk IoT: Hemat Energi Maksimal

TOKEN

Panduan komprehensif mengelola daya baterai untuk perangkat IoT โ€” dari deep sleep mode hingga solar charging agar proyek IoTmu bertahan berbulan-bulan

Artikel: Esp32 Battery Management Artikel: Esp32 Battery Management


1. Jenis Baterai untuk IoT

Memilih baterai yang tepat adalah langkah pertama dalam merancang perangkat IoT yang hemat energi. Setiap jenis baterai memiliki karakteristik berbeda dalam hal energy density, tegangan, arus maksimum, dan siklus hidup.

๐Ÿ”‹
Li-Ion / Li-Po
3.7V nominal
  • โœ… Energy density tinggi
  • โœ… Tegangan 3.0V โ€” 4.2V
  • โœ… Rechargeable
  • โœ… Banyak kapasitas tersedia
  • โŒ Perlu BMS untuk keamanan
  • โŒ Degradasi seiring waktu
Paling Populer
โšก
LiFePO4
3.2V nominal
  • โœ… Sangat aman & stabil
  • โœ… 2000+ siklus charge
  • โœ… Tahan suhu ekstrem
  • โŒ Energy density lebih rendah
  • โŒ Harga lebih mahal
  • โŒ Tegangan berbeda dari Li-Ion
Paling Aman
๐Ÿ”‹
Alkaline / NiMH
1.5V / 1.2V per sel
  • โœ… Mudah didapat
  • โœ… Murah & praktis
  • โœ… Tanpa BMS kompleks
  • โŒ Energy density rendah
  • โŒ Alkaline tidak rechargeable
  • โŒ Self-discharge tinggi (NiMH)
Budget Friendly
๐Ÿ’ก Tips

Untuk proyek IoT yang membutuhkan daya tahan lama dan bisa diisi ulang, Li-Po 3.7V adalah pilihan terbaik. Untuk proyek outdoor yang butuh ketahanan suhu ekstrem, pertimbangkan LiFePO4. Untuk prototyping cepat, baterai AA NiMH cukup memadai.



2. Analisis Konsumsi Daya

Sebelum merancang sistem manajemen baterai, kita perlu memahami berapa banyak daya yang dikonsumsi perangkat IoT dalam berbagai kondisi operasi. Konsumsi daya bervariasi drastis antara mode aktif dan mode tidur.

Mode Operasi Konsumsi Arus (ESP32) Keterangan
WiFi TX (transmisi data)160 โ€” 260 mASaat mengirim data ke server/broker
WiFi RX (menerima data)60 โ€” 80 mASaat menerima data dari WiFi
CPU aktif (tanpa WiFi)20 โ€” 40 mAProses data lokal, membaca sensor
Light Sleep0.8 mACPU tidur, RAM & WiFi tetap aktif
Deep Sleep10 โ€” 150 ยตAHanya RTC yang aktif, RAM hilang
Hibernation2.5 ยตAHanya RTC timer, paling hemat
Diagram Siklus Deep Sleep ESP32
DEEP SLEEP
(tidur)
โ€ข RTC only
โ€ข ~10 ยตA
โ€ข Timer aktif
BOOT / AKTIF
RESET โ–บ (bekerja) โ–บ
โ€ข Inisialisasi โ€ข Baca sensor
โ€ข Setup WiFi โ€ข Kirim data
โ€ข Setup GPIO โ€ข Proses data
โ–ฒ
Wake-up Timer /
External Interrupt
-

Contoh Program Deep Sleep

C++ โ€” deep_sleep_basic.ino

// Deep Sleep ESP32 - Battery Management
// BeebaneLabs

#define uS_TO_S 1000000
#define SLEEP_TIME 300  // tidur 5 menit (300 detik)

// RTC_DATA_ATTR: variabel tetap tersimpan selama deep sleep
RTC_DATA_ATTR int bootCount = 0;

void setup() {
  Serial.begin(115200);
  bootCount++;
  Serial.println("Boot #" + String(bootCount));

  // === Tahap 1: Baca sensor ===
  bacaSensor();

  // === Tahap 2: Kirim data via WiFi ===
  kirimData();

  // === Tahap 3: Konfigurasi & masuk deep sleep ===
  esp_sleep_enable_timer_wakeup(SLEEP_TIME * uS_TO_S);
  Serial.println("Masuk deep sleep selama " + String(SLEEP_TIME) + " detik...");
  esp_deep_sleep_start();
  // Program tidak pernah sampai ke loop()
}

void loop() {
  // Tidak akan pernah dieksekusi
}

void bacaSensor() {
  // Simulasi pembacaan sensor
  float suhu = 25.5;
  float kelembaban = 65.0;
  Serial.println("Suhu: " + String(suhu) + " ยฐC");
  Serial.println("Kelembaban: " + String(kelembaban) + " %");
}

void kirimData() {
  // Hubungkan WiFi, kirim data, putus koneksi
  WiFi.begin("SSID", "PASSWORD");
  // ... kirim data ke server/MQTT
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}
โš ๏ธ Peringatan

Variabel biasa (global/static) akan hilang saat deep sleep. Gunakan RTC_DATA_ATTR untuk menyimpan data yang perlu bertahan selama deep sleep. Namun, RTC RAM sangat terbatas (~8 KB).

Wake-up Sources

Metode Wake-up Fungsi ESP-IDF Penggunaan
Timeresp_sleep_enable_timer_wakeup()Bangun secara periodik
External GPIOesp_sleep_enable_ext0_wakeup()Tombol atau sensor interrupt
Touch Padesp_sleep_enable_touchpad_wakeup()Interaksi sentuhan
ULP Co-processoresp_sleep_enable_ulp_wakeup()Monitoring tanpa CPU utama


4. Sirkuit Monitoring Baterai

Untuk mengelola baterai dengan baik, kita perlu memantau tegangan baterai secara real-time. ESP32 memiliki ADC 12-bit yang bisa digunakan untuk membaca tegangan, namun tegangan baterai Li-Ion (3.0-4.2V) melebihi batas input ADC ESP32 (0-3.3V), sehingga diperlukan voltage divider.

Sirkuit Voltage Divider untuk Monitoring Baterai

Baterai Li-Ion (3.0-4.2V)

(-)

Kode Monitoring Baterai

C++ โ€” battery_monitor.ino

// Monitor Tegangan Baterai - ESP32
// BeebaneLabs

#define BATTERY_PIN 34        // Pin ADC untuk baca baterai
#define R1 100000.0           // Resistor atas 100kฮฉ
#define R2 100000.0           // Resistor bawah 100kฮฉ
#define VOLTAGE_DIVIDER_RATIO ((R1 + R2) / R2)
#define ADC_RESOLUTION 4095.0 // 12-bit ADC
#define ADC_VREF 3.3          // Tegangan referensi ADC

float bacaTeganganBaterai() {
  // Baca beberapa kali untuk akurasi
  long total = 0;
  for (int i = 0; i < 10; i++) {
    total += analogRead(BATTERY_PIN);
    delay(10);
  }
  int adcRaw = total / 10;  // Rata-rata

  // Konversi ADC ke tegangan aktual
  float voltage = (adcRaw / ADC_RESOLUTION) * ADC_VREF;
  float batteryVoltage = voltage * VOLTAGE_DIVIDER_RATIO;
  return batteryVoltage;
}

int hitungPersentase(float voltage) {
  if (voltage >= 4.2) return 100;
  if (voltage <= 3.0) return 0;
  // Linear approximation
  return (int)((voltage - 3.0) / 1.2 * 100);
}

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
}

void loop() {
  float voltage = bacaTeganganBaterai();
  int percentage = hitungPersentase(voltage);

  Serial.printf("Tegangan Baterai: %.2fV (%d%%)\n", voltage, percentage);

  if (percentage < 10) {
    Serial.println("WARNING: Baterai hampir habis!");
    // Masuk deep sleep lebih lama untuk hemat daya
  }

  delay(5000); // Cek setiap 5 detik
}

5. Solar Charging untuk IoT

Solar charging memungkinkan perangkat IoT beroperasi tanpa batas waktu tanpa perlu mengganti baterai. Kombinasi panel surya + baterai Li-Ion + charge controller adalah solusi ideal untuk proyek IoT outdoor.

Komponen yang Dibutuhkan

  • Panel Surya: 5V-6V, 1-2W (untuk node IoT kecil)
  • Charge Controller: IC TP4056 (murah) atau CN3791 (lebih bagus)
  • Baterai Li-Ion: 18650 (3.7V, 2000-3500mAh) atau Li-Po
  • Boost Converter: Jika perlu tegangan 5V atau 3.3V stabil
Diagram Sistem Solar Charging IoT
Baterai
Li-Ion
18650
ESP32
DevKit
โ˜€๏ธ Sinar Matahari
โ–ผ
Panel Surya TP4056
5V 1W โ–บ Charge โ–บ
Controller
โ–ผ
Boost/ Buck
Converter
3.3V stable
โ–ผ
๐Ÿ’ก Tips Solar Charging

Pilih panel surya yang tegangannya 1.5-2x tegangan baterai untuk efisiensi charging optimal. Di Indonesia (khatulistiwa), 1W panel bisa menghasilkan ~4-5 Wh/hari, cukup untuk node IoT yang mengonsumsi ~50mAh/hari.



6. Battery Management System (BMS)

BMS adalah sirkuit pelindung yang wajib ada pada setiap sistem baterai Li-Ion/Li-Po. BMS melindungi baterai dari kondisi berbahaya yang bisa menyebabkan kebakaran atau ledakan.

Fungsi Utama BMS

Proteksi Ambang Batas Akibat Jika Tidak Ada
Over-Charge Protection4.25V per selBaterai mengembung, risiko kebakaran
Over-Discharge Protection2.5-3.0V per selBaterai rusak permanen
Over-Current ProtectionTergantung BMSKorsleting, panas berlebih
Short Circuit ProtectionInstant cutoffKebakaran
Cell BalancingSelisih <50mVUmur baterai berkurang drastis
โš ๏ธ Peringatan Keselamatan

JANGAN PERNAH menggunakan baterai Li-Ion/Li-Po tanpa BMS! Risiko kebakaran sangat nyata. Selalu gunakan BMS yang sesuai dengan konfigurasi sel baterai Anda (1S, 2S, 3S, dll).

Rekomendasi BMS untuk Proyek IoT

  • 1S (single cell): Modul BMS 3.7V 1A โ€” murah (~Rp 5.000) dan mudah didapat
  • Dengan charging: Modul TP4056 + DW01 โ€” gabungan charge controller dan BMS
  • Multi-cell: BMS 2S atau 3S untuk kapasitas lebih besar

7. Estimasi Kapasitas & Umur Baterai

Mengetahui berapa lama baterai akan bertahan sangat penting untuk perencanaan proyek. Berikut adalah metode perhitungan yang bisa Anda gunakan.

Rumus Umur Baterai

Formula โ€” Perhitungan Umur Baterai
Umur (hari) = Kapasitas Baterai (mAh) ร— Efisiensi Regulator
Rata-rata Konsumsi per Hari (mAh)
Contoh:
Kapasitas: 2000 mAh (baterai 18650)
Efisiensi: 0.90 (90% untuk buck converter)
Konsumsi:  Deep sleep 99.5% + Wake 0.5%
= (0.05mA ร— 24h ร— 0.995) + (200mA ร— 24h ร— 0.005)
= 1.194 + 24.0 = 25.2 mAh/hari
Umur = 2000 ร— 0.90 / 25.2 = ~71 hari (~2.3 bulan)
Tips menambah umur baterai:
Perpanjang interval deep sleep (30 menit vs 5 menit)
Minimalkan waktu WiFi TX (kompres data)
Matikan sensor saat tidak dibaca
Gunakan WiFi power save mode
Kurangi power transmit WiFi
Interval Wake-up Konsumsi/Hari Umur 2000mAh Umur 3400mAh
Setiap 1 menit~120 mAh~15 hari~25 hari
Setiap 5 menit~25 mAh~72 hari~122 hari
Setiap 15 menit~10 mAh~180 hari~306 hari
Setiap 1 jam~4 mAh~450 hari~765 hari
Setiap 6 jam~2 mAh~900 hari~1530 hari


8. Best Practices Hemat Energi

Berikut adalah kumpulan best practices yang telah terbukti efektif untuk meminimalkan konsumsi energi pada perangkat IoT:

Teknik Hardware

  • Gunakan regulator switching (buck converter) โ€” efisiensi 85-95% vs regulator linear (LDO) yang hanya ~50% jika tegangan input jauh lebih tinggi
  • Putuskan power sensor โ€” gunakan MOSFET sebagai saklar untuk mematikan sensor saat tidak digunakan
  • Matikan LED onboard โ€” LED bisa mengonsumsi 3-5 mA, cukup signifikan
  • Pilih sensor hemat daya โ€” BME280 lebih hemat dari DHT22; gunakan SPI daripada I2C untuk data burst

Teknik Software

C++ โ€” power_optimization.ino

// Teknik Power Optimization - ESP32
// BeebaneLabs

void setup() {
  // 1. Kurangi frekuensi CPU (hemat daya signifikan)
  setCpuFrequencyMhz(80);  // Turunkan dari 240MHz ke 80MHz

  // 2. Matikan Bluetooth jika tidak digunakan
  btStop();

  // 3. WiFi power management
  WiFi.mode(WIFI_STA);
  WiFi.setSleep(WIFI_PS_MAX_MODEM);  // Power save mode

  // 4. Matikan ADC saat tidak digunakan
  adc_power_off();

  // 5. Gunakan ULP co-processor untuk tugas ringan
  //    (baca sensor tanpa menyalakan CPU utama)
}

void loop() {
  // Strategi: Wake โ†’ Baca โ†’ Kirim โ†’ Sleep
  // Semua operasi dalam satu burst, lalu langsung tidur
}

Checklist Hemat Energi

  • โ˜ Deep sleep diaktifkan saat idle
  • โ˜ WiFi hanya aktif saat mengirim data
  • โ˜ Bluetooth dimatikan jika tidak dipakai
  • โ˜ CPU frequency diturunkan jika tidak butuh komputasi berat
  • โ˜ Sensor dimatikan (power cut) saat tidak dibaca
  • โ˜ Data dikompres sebelum dikirim
  • โ˜ BMS terpasang untuk proteksi baterai
  • โ˜ Monitoring tegangan baterai aktif


9. Quiz: Uji Pemahamanmu!

Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang battery management untuk IoT:

Pertanyaan 1: Berapa konsumsi arus ESP32 dalam mode deep sleep?

a) 80 mA
b) 10 โ€” 150 ยตA
c) 2.5 mA
d) 260 mA

Pertanyaan 2: Mengapa diperlukan voltage divider saat membaca tegangan baterai Li-Ion dengan ESP32?

a) Untuk menghemat energi baterai
b) Karena tegangan baterai (4.2V) melebihi batas ADC ESP32 (3.3V)
c) Untuk mengubah arus DC ke AC
d) Untuk meningkatkan tegangan baterai

Pertanyaan 3: Apa fungsi utama BMS pada sistem baterai Li-Ion?

a) Meningkatkan kapasitas baterai
b) Mengubah AC ke DC
c) Melindungi dari over-charge, over-discharge, dan short circuit
d) Mengatur frekuensi WiFi ESP32

Pertanyaan 4: Keyword apa yang digunakan agar variabel tetap tersimpan selama deep sleep ESP32?

a) PERSISTENT_DATA
b) EEPROM_DATA
c) RTC_DATA_ATTR
d) FLASH_STORE

Pertanyaan 5: Teknik mana yang paling efektif untuk menghemat energi pada perangkat IoT?

a) Menggunakan WiFi 5GHz
b) Meningkatkan frekuensi CPU ke maksimum
c) Deep sleep dengan interval panjang dan burst transmission
d) Menambah LED indikator
๐Ÿ” Zoom
100%
๐ŸŽจ Tema