Tutorial ini menunjukkan cara menempatkan ESP32 ke mode deep sleep dan membangunkannya menggunakan berbagai sumber wake-up dengan firmware MicroPython. Arduino Indonesia akan membahas timer wake-up dan external wake-up.
ESP32 juga dapat dibangunkan dari deep sleep menggunakan pin touch dengan menentukan sebuah ambang batas (threshold). Meskipun fitur ini telah diimplementasikan di MicroPython, ia belum berfungsi dengan baik pada saat artikel ini ditulis. Kami akan memperbarui artikel ini segera setelah fitur tersebut berjalan.
Deep sleep pada ESP8266 bekerja sedikit berbeda dengan ESP32. Oleh karena itu, kami telah membuat artikel khusus untuk deep sleep dengan ESP8266 menggunakan MicroPython.
Memperkenalkan Deep Sleep
Membiarkan ESP32/ESP8266 Anda berjalan pada mode aktif dengan daya baterai bukanlah ide yang ideal, karena daya dari baterai akan habis sangat cepat.
Jika Anda menempatkan ESP32 dalam mode deep sleep, konsumsi daya akan berkurang dan baterai Anda akan bertahan lebih lama. Memasukkan ESP32 ke mode deep sleep berarti menghentikan aktivitas yang mengonsumsi banyak daya saat beroperasi, namun tetap menyisakan aktivitas yang cukup untuk membangunkan prosesor saat sesuatu yang penting terjadi.
Saat beroperasi dalam mode deep sleep, ESP32 memiliki konsumsi arus dalam kisaran μA (microampere). Dengan papan yang dirancang khusus dan hati-hati, Anda dapat mencapai konsumsi minimal hanya 5 μA. Namun, jika Anda menggunakan papan pengembangan ESP32 full-featured dengan pemrogram (programmer) bawaan, LED on-board, dan sebagainya (seperti papan ESP32 DOIT), Anda tidak akan bisa mencapai kondisi daya serendah itu, tetapi Anda masih dapat menghemat daya.
Wake-up Sources
Setelah memasukkan ESP32 ke mode deep sleep, ada beberapa cara untuk membangunkannya:
1. Timer Wake-up: Membangunkan ESP32 setelah periode waktu yang telah ditentukan.
2. External Wake-up: ESP32 dapat bangun saat terjadi perubahan status pada sebuah pin GPIO.
3. Touch Wake-up: Sudah diimplementasikan, tetapi belum berfungsi seperti yang diharapkan pada saat artikel ini ditulis, sehingga kami tidak akan membahasnya untuk saat ini.
4. ULP Co-processor Wake-up: Kami belum menguji fitur ini.
Timer Wake Up
ESP32 dapat masuk ke mode deep sleep, lalu bangun pada periode waktu yang telah ditentukan. Fitur ini sangat berguna untuk proyek yang memerlukan pencatatan waktu (time stamping) atau tugas harian, sambil tetap menjaga konsumsi daya yang rendah.
Untuk memasukkan ESP32 ke mode deep sleep selama jumlah detik tertentu, Anda hanya perlu menggunakan fungsi `deepsleep()` dari modul `machine`. Fungsi ini menerima argumen waktu tidur dalam milidetik, sebagai berikut:
machine.deepsleep(sleep_time_ms)
Mari kita lihat contoh sederhana untuk memahami cara kerjanya. Dalam kode berikut, ESP32 berada dalam mode deep sleep selama 10 detik, kemudian bangun, mengedipkan LED, dan kembali tidur.
from machine import deepsleep
from machine import Pin
from time import sleep
led = Pin (2, Pin.OUT)
#blink LED
led.value(1)
sleep(1)
led.value(0)
sleep(1)
# wait 5 seconds so that you can catch the ESP awake to establish a serial communication later
# you should remove this sleep line in your final script
sleep(5)
print('Im awake, but Im going to sleep')
#sleep for 10 seconds (10000 milliseconds)
deepsleep(10000)
Cara Kerja Kode
Pertama, impor library yang diperlukan:
import machine
from machine import Pin
from time import sleep
Buat objek `Pin` yang merujuk ke GPIO 2 bernama `led`. Ini merujuk ke LED on-board.
led = Pin (2, Pin.OUT)
Perintah berikut membuat LED berkedip.
led.value(1)
sleep(1)
led.value(0)
sleep(1)
Dalam kasus ini, kami mengedipkan LED untuk tujuan demonstrasi, tetapi intinya adalah Anda harus menambahkan kode utama Anda di bagian skrip ini.
Sebelum masuk ke mode tidur, kami menambahkan jeda 5 detik dan mencetak pesan untuk menunjukkan bahwa ESP akan tidur.
sleep(5)
print('Im awake, but Im going to sleep')
Penting untuk menambahkan jeda 5 detik sebelum tidur saat kita sedang mengembangkan skrip. Saat Anda ingin mengunggah kode baru ke papan, papan harus dalam keadaan bangun. Jadi, jika tidak ada jeda, akan sulit untuk menangkapnya dalam keadaan bangun guna mengunggah kode baru nanti. Setelah kode final siap, Anda dapat menghapus jeda tersebut.
Terakhir, masukkan ESP32 ke mode deep sleep selama 10 detik (10.000 milidetik).
machine.deepsleep(10000)
Setelah 10 detik, ESP32 akan bangun dan menjalankan kode dari awal, mirip seperti saat Anda menekan tombol EN/RST.
Demonstrasi
Salin kode yang disediakan ke file `main.py` ESP32 Anda. Unggah kode baru dan tekan tombol EN/RST setelah pengunggahan.
ESP32 akan mengedipkan LED on-board dan mencetak pesan. Kemudian, ia akan tidur. Proses ini diulang terus-menerus.
External Wake Up
ESP32 juga dapat dibangunkan dari tidur ketika terjadi perubahan status pada sebuah pin. Ada dua kemungkinan external wake-up dengan ESP32: ext0 dan ext1.
- Mode ext0 memungkinkan Anda menggunakan satu GPIO sebagai sumber wake-up.
- Mode ext1 memungkinkan Anda menetapkan lebih dari satu GPIO sebagai sumber wake-up secara bersamaan.
Hanya RTC GPIO yang dapat digunakan sebagai sumber wake-up. RTC GPIO disorot dengan kotak persegi panjang berwarna oranye pada diagram berikut.
External wake up – ext0
Untuk mengilustrasikan cara menggunakan external wake-up ext0, kami akan menggunakan satu tombol tekan (pushbutton) sebagai sumber wake-up. ESP32 akan bangun saat Anda menekan tombol tersebut.
Untuk contoh ini, Anda memerlukan komponen berikut:
- ESP32
- Tombol tekan (pushbutton)
- Resistor 10k Ohm
- Papan breadboard
- Kabel jumper
Diagram Skematik
Hubungkan rangkaian dengan mengikuti diagram skematik berikut. Dalam contoh ini, kami menggunakan GPIO14 untuk membangunkan ESP32, tetapi Anda dapat menggunakan RTC GPIO lainnya.
Skrip
Skrip berikut menunjukkan cara kerja ext0: menggunakan satu GPIO sebagai sumber external wake-up.
import esp32
from machine import Pin
from machine import deepsleep
from time import sleep
wake1 = Pin(14, mode = Pin.IN)
#level parameter can be: esp32.WAKEUP_ANY_HIGH or esp32.WAKEUP_ALL_LOW
esp32.wake_on_ext0(pin = wake1, level = esp32.WAKEUP_ANY_HIGH)
#your main code goes here to perform a task
print('Im awake. Going to sleep in 10 seconds')
sleep(10)
print('Going to sleep now')
deepsleep()
Cara Kerja Kode
Pertama, Anda perlu mengimpor modul yang diperlukan. Anda perlu mengimpor modul `esp32` yang berisi metode untuk menetapkan pin sebagai sumber wake-up.
Setelah mengimpor modul yang diperlukan, tentukan pin wake-up. Dalam kasus ini kami menggunakan GPIO14 dan kami menamainya `wake1`. GPIO ini harus diatur sebagai input (`Pin.IN`).
wake1 = Pin(14, mode = Pin.IN)
Kemudian, atur ext0 sebagai sumber wake-up menggunakan metode `wake_on_ext0()` sebagai berikut:
esp32.wake_on_ext0(pin = wake1, level = esp32.WAKEUP_ANY_HIGH)
Metode `wake_on_ext0()` menerima argumen `pin` dan `level`:
- `pin`: sebuah objek bertipe `Pin` (GPIO yang berfungsi sebagai sumber wake-up)
- `level`: mendefinisikan status GPIO yang akan membangunkan ESP32. Level dapat berupa salah satu parameter berikut:
- `esp32.WAKEUP_ANY_HIGH`
- `esp32.WAKEUP_ALL_LOW`
Dalam kasus ini, kami menggunakan metode `esp32.WAKEUP_ANY_HIGH` yang membangunkan ESP32 saat GPIO menjadi HIGH (3.3V).
Kode utama Anda untuk menjalankan tugas harus ditempatkan setelah mendefinisikan sumber wake-up dan sebelum perintah tidur.
Kami menambahkan jeda 10 detik sebelum tidur. Untuk memasukkan ESP32 ke mode deep sleep, Anda hanya perlu menggunakan metode `deepsleep()` sebagai berikut:
machine.deepsleep()
Demonstrasi
Unggah kode ke file `main.py` ESP32. Tekan tombol EN/RESET untuk menjalankan kode. ESP32 akan masuk ke mode tidur.
Sekarang, Anda dapat menekan tombol untuk membangunkannya dari deep sleep.
External wake up – ext1
External wake-up ext1 bekerja sangat mirip dengan ext0, namun memungkinkan Anda menetapkan lebih dari satu GPIO sebagai sumber wake-up. Untuk mendemonstrasikan cara kerjanya, kami akan menggunakan dua tombol tekan yang terhubung ke GPIO yang berbeda. Untuk contoh ini, Anda memerlukan komponen berikut:
- ESP32
- 2x Tombol tekan (pushbutton)
- 2x Resistor 10k Ohm
- Papan breadboard
Kabel jumper
Diagram Skematik
Hubungkan rangkaian dengan mengikuti diagram skematik berikut.
Dalam kasus ini, kami menggunakan GPIO14 dan GPIO12. Anda dapat menggunakan GPIO lain yang sesuai, tetapi pin tersebut harus merupakan RTC GPIO, jika tidak metode ini tidak akan berfungsi.
Skrip
Skrip berikut menunjukkan cara kerja ext1: menggunakan dua GPIO sebagai sumber *external wake-up, tetapi Anda dapat menggunakan lebih banyak jika diinginkan.
import esp32
from machine import deepsleep
from machine import Pin
from time import sleep
wake1 = Pin(14, mode = Pin.IN)
wake2 = Pin(12, mode = Pin.IN)
#level parameter can be: esp32.WAKEUP_ANY_HIGH or esp32.WAKEUP_ALL_LOW
esp32.wake_on_ext1(pins = (wake1, wake2), level = esp32.WAKEUP_ANY_HIGH)
#your main code goes here to perform a task
print('Im awake. Going to sleep in 10 seconds')
sleep(10)
print('Going to sleep now')
deepsleep()
Cara Kerja Kode
Kodenya mirip dengan contoh ext0, tetapi menggunakan metode `wake_on_ext1()` sebagai gantinya.
esp32.wake_on_ext1(pins = (wake1, wake2), level = esp32.WAKEUP_ANY_HIGH)
Metode `wake_on_ext1()` menerima argumen `pins` dan `level`:
`pins`: sebuah tuple atau list yang berisi objek bertipe `Pin` (GPIO-GPIO yang berfungsi sebagai sumber wake-up)
`level`: mendefinisikan status GPIO yang akan membangunkan ESP32. Level dapat berupa salah satu parameter berikut:
- `esp32.WAKEUP_ANY_HIGH`
- `esp32.WAKEUP_ALL_LOW`
Setelah mendefinisikan sumber wake-up, Anda dapat memasukkan ESP32 ke mode deep sleep:
machine.deepsleep()
Siap Untuk Membuat Proyek Impianmu Menjadi Kenyataan?
Klik di sini untuk chat langsung via WhatsApp dan dapatkan dukungan langsung dari tim ahli kami!












0 on: "Panduan Lengkap MicroPython ESP32 - Deep Sleep, Wake-Up Source, dan Manajemen Daya"