---
# System prepended metadata

title: TP_IOT8_DaffaHardhan_2306161763

---

---
title: TP Modul 8

---

# TP Modul 8
Pembuat : WN

    Nama  : Daffa Hardhan
    NPM   : 2306161763

**JAWABAN TANPA REFERENSI YANG SESUAI DIANGGAP MENDAPATKAN 0 POIN (UNLESS SPECIFIED OTHERWISE)**

## 1. **Jelaskan** mengenai Konsumsi daya pada ESP32, mengapa hal tersebut penting untuk diperhatikan serta faktor apa saja yang dapat mempengaruhi tingkat konsumsi daya! (10 poin).

Konsumsi daya pada ESP32 adalah besarnya arus listrik yang digunakan oleh chip ESP32 dalam berbagai mode operasi. Hal ini penting untuk diperhatikan karena ESP32 sering digunakan dalam aplikasi berbasis baterai (seperti perangkat IoT), di mana efisiensi daya menentukan lama operasi perangkat tanpa pengisian ulang baterai. Dengan mengelola konsumsi daya secara optimal, masa pakai baterai dapat diperpanjang secara signifikan [1][2].

Hal ini penting dikarenakan beberapa faktor:

1. **Penghematan Baterai**
    ESP32 yang beroperasi terus-menerus dalam mode aktif dapat menguras baterai 2000mAh dalam waktu kurang dari 8 jam. Dengan menggunakan mode tidur (sleep), daya dapat dikurangi hingga ribuan kali lipat, sehingga baterai dapat bertahan berbulan-bulan atau bahkan bertahun-tahun [1].

2. **Efisiensi Energi untuk Aplikasi Khusus**
    Pada sensor lingkungan atau perangkat yang hanya perlu mengirim data secara berkala, menonaktifkan komponen yang tidak diperlukan (seperti WiFi atau CPU) sangat krusial untuk meminimalkan pemborosan energi [2].

3. **Optimasi Performa vs Daya**
    Pengguna dapat memilih mode operasi sesuai kebutuhan aplikasi, seperti mempertahankan koneksi WiFi sambil tetap menghemat daya melalui modem-sleep, atau mematikan sebagian besar fungsi chip dalam deep-sleep [1][2].
    
Faktor yang memengaruhi tingkat konsumsi daya, diantaranya berdasarkan:

1. **Mode Daya yang Dipilih**
    - **Active Mode:** Konsumsi tertinggi (95–260 mA), CPU, WiFi, dan Bluetooth aktif penuh. Daya tergantung clock CPU dan mode RF (WiFi TX hingga 240 mA) [2].
    - **Modem-Sleep:** WiFi/Bluetooth off, CPU tetap berjalan. Daya 3–50 mA tergantung kecepatan clock (2–240 MHz) [1][2].
    - **Light-Sleep:** CPU dijeda, memori tetap, daya ~0.8 mA. Cocok untuk wake-up cepat (<1 ms) [1][2][3].
    - **Deep-Sleep:** Hanya RTC, ULP coprocessor, dan memori RTC aktif. Daya 10–150 µA (ULP aktif: 150 µA) [1][2][3].
    - **Hibernation:** Hanya RTC timer aktif, daya 5 µA, memori tidak dipertahankan [1][2].

2. **Konfigurasi Perangkat Keras**
    - **Komponen Eksternal:** Board seperti ESP32 dev kit konsumsi lebih besar karena LED/resistor tambahan. Untuk low-power, bisa menggunakan PCB minimalis [2].
    - **Isolasi GPIO:** GPIO tidak diisolasi bisa bocor daya saat deep-sleep, solusinya menggunakan `rtc_gpio_isolate()` [3].

3. **Sumber Wake-up dan Pengelolaan Peripheral**
    - **Wake-up Sources:** Timer, touchpad, GPIO, ULP, UART dapat membangunkan chip. Tiap sumber memengaruhi domain daya yang aktif (misalnya ext0 butuh RTC peripheral menyala) [3].
    - **Manajemen WiFi/Bluetooth:** Matikan radio atau gunakan modem-sleep dengan DTIM beacon agar tetap terkoneksi dan hemat daya [2][3].
    - **Pengaturan Clock CPU:** Menurunkan clock CPU di active/modem-sleep menurunkan konsumsi daya [1][2].

4. **Konfigurasi Software dan Power-Down Options:**
    - **Power-Down Domains:** Dapat mematikan domain daya tertentu (RTC peripheral/memori) lewat `esp_sleep_pd_config()` [3].
    - **Flash dan PSRAM:** Mematikan flash saat sleep menurunkan daya, namun berisiko stabilitas. Gunakan opsi seperti `CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND` [3].


Konsumsi daya ESP32 sangat bergantung pada mode operasi, konfigurasi hardware, dan manajemen software. Pemilihan mode sleep yang tepat, optimasi sumber wake-up, serta isolasi komponen menjadi kunci efisiensi daya maksimal pada aplikasi berbasis baterai [1][2][3].

## Referensi:

- [1] Xavier Decuyper, “Deep Sleep & Other Power Modes,” simplyexplained.com. https://simplyexplained.com/courses/programming-esp32-with-arduino/esp32-power-modes-deep-sleep-explained/ (accessed Nov. 03, 2025).
- [2] K. Magdy, “ESP32 Sleep Modes & Power Consumption in Each Mode,” DeepBlue, Mar. 14, 2023. https://deepbluembedded.com/esp32-sleep-modes-power-consumption/ (accessed Nov. 03, 2025).
- [3] espressif, “Sleep Modes - ESP32 -  — ESP-IDF Programming Guide v5.5.1 documentation,” Translate.goog, 2016. https://docs-espressif-com.translate.goog/projects/esp-idf/en/stable/esp32/api-reference/system/sleep_modes.html?_x_tr_sl=en&_x_tr_tl=id&_x_tr_hl=id&_x_tr_pto=sge (accessed Nov. 03, 2025).

---

## 2. **Jelaskan** secara singkat cara pengaruh CPU frequency pada penggunaan daya serta cara menggantinya pada ESP32! (10 poin)

Perubahan **CPU frequency** pada ESP32 berpengaruh langsung terhadap **tingkat konsumsi daya dan performa sistem**. Semakin tinggi frekuensi CPU, semakin cepat prosesor bekerja, namun konsumsi daya juga meningkat secara signifikan karena meningkatnya jumlah transisi logika dalam satuan waktu serta arus dinamis yang diperlukan untuk mengisi dan mengosongkan kapasitansi internal transistor [1]. Sebaliknya, penurunan frekuensi CPU dapat menghemat energi karena mengurangi jumlah siklus switching dan arus puncak yang terjadi selama proses switching transistor [1]. Oleh karena itu, penyesuaian frekuensi CPU dapat digunakan untuk mencapai **keseimbangan antara kinerja dan efisiensi daya**, tergantung kebutuhan aplikasi [2][3].

Pada ESP32, perubahan CPU frequency dapat dilakukan untuk mengoptimalkan performa atau efisiensi daya. Pengguna dapat mengatur nilai frekuensi melalui **fungsi bawaan dalam library `esp32-hal-cpu.h`** pada lingkungan Arduino atau konfigurasi sistem di ESP-IDF. Fungsi utama yang digunakan adalah `setCpuFrequencyMhz(uint32_t cpu_freq_mhz);`, yang menerima beberapa nilai valid seperti 240, 160, atau 80 MHz untuk semua jenis kristal XTAL, serta nilai lebih rendah seperti 40, 20, dan 10 MHz untuk kristal 40 MHz [2][3]. Selain itu, frekuensi kristal (XTAL) dapat diperiksa menggunakan fungsi `getXtalFrequencyMhz()`, sedangkan nilai frekuensi CPU dan bus APB dapat diverifikasi dengan `getCpuFrequencyMhz()` dan `getApbFrequency()` [1][2][3].

Contoh kode:[2]
```cpp
void setup() {
  Serial.begin(115200);

  // Set the CPU frequency to 80 MHz for consumption optimization
  setCpuFrequencyMhz(80);

  // Print the XTAL crystal frequency
  Serial.print("XTAL Crystal Frequency: ");
  Serial.print(getXtalFrequencyMhz());
  Serial.println(" MHz");

  // Print the CPU frequency
  Serial.print("CPU Frequency: ");
  Serial.print(getCpuFrequencyMhz());
  Serial.println(" MHz");

  // Print the APB bus frequency
  Serial.print("APB Bus Frequency: ");
  Serial.print(getApbFrequency());
  Serial.println(" Hz");
}

void loop() {
  // in this example nothing here
}
```
Penyesuaian ini memungkinkan pengguna untuk menurunkan frekuensi CPU ketika perangkat tidak memerlukan kinerja tinggi, sehingga menghemat daya secara signifikan, terutama untuk aplikasi berbasis baterai. Namun, perubahan ini juga dapat memengaruhi akurasi fungsi waktu seperti millis() atau delay(), sehingga perlu dilakukan dengan hati-hati [2][3].

Dengan demikian, CPU frequency pada ESP32 secara langsung memengaruhi konsumsi daya, dan dapat diubah dengan mudah menggunakan fungsi setCpuFrequencyMhz() sesuai kebutuhan sistem untuk mencapai efisiensi daya dan performa yang optimal [1][2][3].

## Referensi:
- [1] Khaled Magdy, “ESP32 Change CPU Speed (Clock Frequency) – DeepBlue,” DeepBlue, Apr. 26, 2021. https://deepbluembedded.com/esp32-change-cpu-speed-clock-frequency/ (accessed Nov. 03, 2025).
- [2] L. Llamas, “How to Change CPU Frequency on ESP32,” Luis Llamas, Sep. 22, 2023. https://www.luisllamas.es/en/change-processor-frequency-on-esp32/ (accessed Nov. 03, 2025).
- [3] Hasanain Shuja, “How to Change CPU Frequency or Speed for ESP32 Modules via Arduino IDE,” YouTube, Jun. 03, 2020. https://www.youtube.com/watch?v=gdX_7EP8kLM (accessed Nov. 03, 2025).

---

## 3. **Jelaskan** mengenai Operating Mode yang didukung oleh ESP32, baik dari fitur / komponen yang bisa atau tidak bisa digunakan serta pengaruhnya pada konsumsi daya! (20 poin)

ESP32 mendukung lima mode operasi yang dapat dikonfigurasi untuk menyeimbangkan antara kinerja dan konsumsi daya. Setiap mode mengaktifkan atau menonaktifkan komponen tertentu guna mengoptimalkan penggunaan energi, terutama penting untuk aplikasi berbasis baterai [2][3].

1. **Active Mode**
    Dalam Active Mode, seluruh komponen ESP32 beroperasi secara penuh termasuk CPU dual-core, WiFi, Bluetooth, RAM, dan semua peripheral digital. Chip mampu melakukan transmisi data, menerima sinyal, atau berada dalam keadaan listening. Konsumsi daya pada mode ini merupakan yang tertinggi dengan kisaran 180-260 mA untuk WiFi TX dan 95-100 mA untuk WiFi/BT RX, sementara CPU yang berjalan pada kecepatan maksimal 240 MHz mengonsumsi 30-50 mA. Mode ini sangat tidak efisien untuk penggunaan baterai jangka panjang, meskipun penghematan parsial dapat dicapai dengan menurunkan kecepatan clock CPU atau mematikan modul radio ketika tidak digunakan [2][3].

2. **Modem Sleep Mode**
    Modem Sleep Mode mempertahankan operasi CPU, RAM, dan peripheral digital namun menonaktifkan WiFi, Bluetooth, serta modul radio. Kecepatan clock CPU dapat dikonfigurasi dari 2 MHz hingga 240 MHz dengan konsumsi daya yang proporsional: 2-4 mA pada 2 MHz, 20-25 mA pada 80 MHz, dan 30-50 mA pada 240 MHz. Mode ini memungkinkan ESP32 mempertahankan koneksi jaringan menggunakan mekanisme DTIM (Delivery Traffic Indication Message) dimana chip secara periodik berpindah antara Active dan Modem Sleep untuk menerima beacon dari access point. Terdapat dua varian turunan yaitu Minimum Modem Sleep yang membangunkan chip setiap DTIM tanpa kehilangan data broadcast, dan Maximum Modem Sleep yang memiliki interval bangun lebih lama untuk penghematan daya lebih besar namun berisiko kehilangan data broadcast [2].

3. **Light Sleep Mode**
    Light Sleep Mode menghentikan sementara operasi CPU melalui teknik clock-gating serta mematikan sebagian besar RAM dan peripheral digital dengan mengurangi tegangan supply, sementara tetap mempertahankan konteks operasi dalam RAM. Konsumsi daya mode ini sekitar 0.8 mA dengan latency wake-up kurang dari 1 ms, membuatnya cocok untuk aplikasi yang memerlukan respons cepat. Sebelum masuk ke mode ini, WiFi dan Bluetooth harus dinonaktifkan secara manual kecuali ketika menggunakan fitur automatic Light-sleep yang mempertahankan koneksi nirkabel secara otomatis [2][3].

4. **Deep Sleep Mode**
    Deep Sleep Mode mematikan CPU, sebagian besar RAM, dan semua peripheral digital, dengan hanya menyisakan RTC controller, ULP coprocessor, RTC memories, dan RTC peripherals yang tetap aktif. ULP coprocessor dapat melakukan tugas sederhana seperti membaca sensor atau memantau GPIO RTC untuk membangunkan chip. Konsumsi daya bervariasi dari 150 µA dengan ULP aktif hingga 10 µA ketika hanya RTC timer dan memory yang beroperasi. Pada mode ini, konteks CPU hilang sehingga program akan dieksekusi ulang dari awal setelah wake-up, dan data penting harus disimpan di RTC memory menggunakan atribut RTC_DATA_ATTR. Sumber wake-up yang didukung termasuk timer, touchpad, GPIO eksternal, dan ULP coprocessor [2][3].

5. **Hibernation Mode**
    Hibernation Mode merupakan mode paling hemat daya dengan mematikan semua komponen termasuk osilator internal, ULP coprocessor, dan RTC memories, hanya menyisakan satu RTC timer dan beberapa GPIO RTC tertentu yang aktif untuk fungsi wake-up. Konsumsi daya mode ini hanya sekitar 5 µA namun tidak mempertahankan data apapun termasuk yang tersimpan di RTC memory. Mode ini ideal untuk aplikasi yang hanya perlu bangun secara berkala tanpa perlu menyimpan state sebelumnya, dengan latency wake-up kurang dari 1 ms [2][3].

6. **Power OFF**
    Power OFF sebenarnya bukan mode operasi yang dapat dicapai melalui software karena memerlukan pengaturan pin CHIP_PU ke LOW secara hardware. Konsumsi daya pada keadaan ini mencapai 0.1 µA namun tidak memungkinkan wake-up tanpa intervensi eksternal. Pada dev board standar, implementasi mode ini memerlukan modifikasi hardware sehingga jarang digunakan dalam aplikasi praktis [2].

Tabel Operasi Konsumsi Daya:

|Mode Operasi|Komponen Aktif|Komponen Non-Aktif|Konsumsi Daya|
|------------|-------------|-----------------|------------|
|Active Mode|CPU dual-core, WiFi, Bluetooth, RAM, peripheral digital|-|95–260 mA (tergantung penggunaan RF & clock CPU)|
|Modem Sleep|CPU, RAM, peripheral digital|WiFi, Bluetooth, radio|2–50 mA (tergantung clock CPU: 2–240 MHz)|
|Light Sleep|RTC controller, konteks RAM dipertahankan|CPU (dijeda), sebagian RAM & peripheral digital (clock-gated)|~0.8 mA|
|Deep Sleep|RTC controller, ULP coprocessor, RTC memories, RTC peripherals|CPU, sebagian besar RAM, peripheral digital|10–150 μA (tergantung fitur aktif)|
|Hibernation|Satu RTC timer, beberapa GPIO RTC|Semua komponen lain termasuk osilator, ULP, RTC memories|~5 μA|
|Power OFF|-|Seluruh chip|0.1 μA (hanya leakage current)|


Urutan efisiensi daya dari tertinggi ke terendah adalah Active Mode, Modem Sleep, Light Sleep, Deep Sleep, dan Hibernation. Pemilihan mode yang tepat sangat bergantung pada kebutuhan aplikasi: Modem Sleep dengan DTIM atau automatic Light-sleep untuk aplikasi yang mempertahankan koneksi nirkabel, Deep Sleep dengan ULP untuk sensor periodik, serta Hibernation untuk aplikasi dengan wake-up berkala tanpa perlu penyimpanan data. Perlu diperhatikan bahwa konsumsi daya aktual pada dev board komersial biasanya lebih tinggi daripada nilai spesifikasi chip karena adanya komponen tambahan seperti LED dan resistor, sehingga untuk aplikasi low-power yang kritis disarankan untuk mendesain PCB khusus dengan komponen minimal [2][3].

## Referensi:
- [1] Xavier Decuyper, “Deep Sleep & Other Power Modes,” simplyexplained.com. https://simplyexplained.com/courses/programming-esp32-with-arduino/esp32-power-modes-deep-sleep-explained/ (accessed Nov. 03, 2025).
- [2] K. Magdy, “ESP32 Sleep Modes & Power Consumption in Each Mode,” DeepBlue, Mar. 14, 2023. https://deepbluembedded.com/esp32-sleep-modes-power-consumption/ (accessed Nov. 03, 2025).
- [3]yan agus, “Wawasan Tentang Sleep Mode ESP32 & Konsumsi Dayanya - Nusabot,” Nusabot, Nov. 22, 2024. https://nusabot.id/blog/wawasan-tentang-mode-tidur-esp32-konsumsi-dayanya/ (accessed Nov. 03, 2025).

---

## 4. *Jelaskan* apa itu wake up source pada sleep mode ESP32 (20 poin)

Wake Up Source (sumber bangun) adalah peristiwa atau kondisi yang digunakan untuk membangunkan ESP32 dari mode tidur (sleep mode) ke mode aktif normal [1]. Ketika ESP32 memasuki mode tidur untuk menghemat energi, kita perlu menentukan cara bagaimana perangkat akan bangun kembali untuk melanjutkan operasinya.

ESP32 memiliki beberapa jenis wake up source. Pertama, **Timer Wakeup** memungkinkan ESP32 dibangunkan setelah jangka waktu tertentu yang telah ditentukan sebelumnya [1][2]. Fungsi `esp_sleep_enable_timer_wakeup()` digunakan untuk mengaktifkan fitur ini [1]. Kedua, **External Wakeup (Ext0 dan Ext1)** membangunkan ESP32 dengan mengubah nilai sinyal pada GPIO. **Ext0** menggunakan satu pin GPIO RTC tertentu untuk membangunkan ESP32, dengan level trigger (HIGH atau LOW) yang dapat dikonfigurasi menggunakan `esp_sleep_enable_ext0_wakeup()` [1][3]. Sedangkan **Ext1** menggunakan beberapa pin GPIO RTC sekaligus dan dapat dikonfigurasi dengan `esp_sleep_enable_ext1_wakeup()` menggunakan mode `ESP_EXT1_WAKEUP_ALL_LOW` (bangun ketika semua GPIO rendah) atau `ESP_EXT1_WAKEUP_ANY_HIGH` (bangun ketika salah satu GPIO tinggi) [1][3]. Ketiga, **Touchpad Wakeup** membangunkan ESP32 dengan sentuhan pada touchpad dan diaktifkan dengan `esp_sleep_enable_touchpad_wakeup()` [1]. Keempat, **ULP Coprocessor Wakeup** memungkinkan coprocessor ULP terus berjalan selama mode tidur dan membangunkan chip ketika mendeteksi event tertentu, diaktifkan dengan `esp_sleep_enable_ulp_wakeup()` [1][2].

Beberapa wake up source hanya tersedia untuk mode Light Sleep [1]. Ini termasuk **GPIO Wakeup**, di mana setiap pin GPIO dapat dikonfigurasi untuk memicu bangun pada level HIGH atau LOW. **UART Wakeup**, yang membangunkan ESP32 ketika menerima sejumlah edge positif pada pin RX [1][2]. Dan **WiFi Wakeup**, yang diaktifkan dengan `esp_sleep_enable_wifi_wakeup()` [1].

Setelah bangun dari sleep, kita dapat memeriksa penyebab bangun menggunakan `esp_sleep_get_wakeup_cause()` [1]. Untuk sumber eksternal, pin spesifik yang memicu bangun juga dapat diidentifikasi: touchpad menggunakan `esp_sleep_get_touchpad_wakeup_status()`, sedangkan Ext1 menggunakan `esp_sleep_get_ext1_wakeup_status()` [1].

Wake up source harus dikonfigurasi sebelum memasuki mode tidur [1][3]. Sumber bangun tidak otomatis dinonaktifkan setelah bangun dan dapat dinonaktifkan manual dengan `esp_sleep_disable_wakeup_source()` jika tidak diperlukan lagi [1][2]. Beberapa wake up source dapat dikombinasikan sehingga chip akan bangun ketika salah satu sumber terpicu [2].

Sebelum memasuki sleep mode, radio (WiFi dan Bluetooth) harus dinonaktifkan secara eksplisit menggunakan fungsi yang sesuai seperti `esp_wifi_stop()` dan `esp_bt_controller_disable()` [1]. Dengan memahami dan mengkonfigurasi wake up source yang tepat, kita dapat mengoptimalkan konsumsi energi ESP32 sambil memastikan perangkat dapat bangun sesuai dengan kebutuhan aplikasi [1][3].

## Referensi:

- [1] L. Llamas, “What are sleep modes in ESP32,” Luis Llamas, Sep. 22, 2023. https://www.luisllamas.es/en/esp32-sleep-modes/ (accessed Nov. 04, 2025).
- [2] espressif, “Sleep Modes - ESP32-C6 -  — ESP-IDF Programming Guide v5.5.1 documentation,” Espressif.com, 2016. https://docs.espressif.com/projects/esp-idf/en/stable/esp32c6/api-reference/system/sleep_modes.html (accessed Nov. 04, 2025).
- [3] S. Santos, “ESP32 External Wake Up from Deep Sleep | Random Nerd Tutorials,” Random Nerd Tutorials, Oct. 08, 2024. https://randomnerdtutorials.com/esp32-external-wake-up-deep-sleep/ (accessed Nov. 04, 2025).

---

## 5. Modifikasilah kode sederhana berikut sehingga bekerja dalam mode light sleep mode! (40 poin)

```cpp
#include <Arduino.h>
#include "esp_sleep.h"

TaskHandle_t counterTaskHandle = NULL;
int counter = 0;

void counterTask(void *parameter) {
  while (true) {
    counter++;
    Serial.printf("Count: %d\n", counter);
    vTaskDelay(1000 / portTICK_PERIOD_MS);
  }
}

void setup() {
  Serial.begin(115200);
  delay(5000);;

  xTaskCreate(
    counterTask,
    "Counter Task",
    2048,
    NULL,
    1,
    &counterTaskHandle
  );
  
  // Set timer wake-up 2 detik (2.000.000 mikrodetik)
  esp_err_t result = esp_sleep_enable_timer_wakeup(2 * 1000000);

  if (result == ESP_OK) {
      Serial.println("Timer Wake-Up set successfully as wake-up source.");
    } else {
      Serial.println("Failed to set Timer Wake-Up as wake-up source.");
  }
}

void loop() {
  // Masuk light sleep
  esp_light_sleep_start();
  Serial.println("Woke up from light sleep!");
}
```

Hasil Running:
![image](https://hackmd.io/_uploads/SyAZ4kP1We.png)

