Modul 3 – Menjelajahi Deep Sleep ESP32 (3/4)

Touch Wake Up

Membangunkan ESP32 dari Deep Sleep dengan Sentuhan

Anda dapat membangunkan ESP32 dari mode tidur dalam (deep sleep) menggunakan pin sentuh (touch pins). Unit ini menunjukkan cara melakukannya menggunakan Arduino IDE.

Pin sentuh ESP32 memungkinkan interaksi pengguna dengan perangkat bahkan saat ESP32 berada dalam mode hemat daya, menjadikannya pilihan yang sangat baik untuk perangkat berbasis baterai yang membutuhkan interaksi pengguna.

1
Mengaktifkan Touch Wake Up

Fungsi Touch Wake Up

Mengaktifkan ESP32 untuk bangun menggunakan pin sentuh sangatlah mudah. Di Arduino IDE, Anda perlu menggunakan fungsi berikut:

touchSleepWakeUpEnable(TOUCH_PIN, THRESHOLD);

Parameter fungsi tersebut adalah:

  • TOUCH_PIN: Pin sentuh yang akan digunakan (T0 hingga T9 pada ESP32 standar)
  • THRESHOLD: Nilai ambang batas yang menentukan kapan ESP32 akan bangun

Catatan Penting: Sebelum melanjutkan, kami merekomendasikan untuk membaca Unit “ESP32 Touch Sensor” di Modul “Exploring the ESP32 GPIOs” jika Anda belum melakukannya, untuk mempelajari lebih lanjut tentang pin sentuh.

2
Menganalisis Kode Contoh

Contoh Kode Touch Wake Up

Mari kita lihat cara kerjanya menggunakan contoh dari library. Buka Arduino IDE, lalu pergi ke File → Examples → ESP32 → Deep Sleep, dan buka sketsa TouchWakeUp.

Berikut adalah bagian awal kode yang menunjukkan deskripsi dan definisi dasar:

/*
 * Deep Sleep dengan Touch Wake Up
 * =====================================
 * Kode ini menampilkan cara menggunakan deep sleep dengan
 * sentuhan sebagai sumber bangun dan cara menyimpan data di
 * memori RTC untuk digunakan selama reboot
 * 
 * ESP32 dapat mengaktifkan beberapa touch pad sebagai sumber bangun
 * ESP32-S2 dan ESP32-S3 hanya mendukung 1 touch pad sebagai sumber bangun
 * 
 * Kode ini berada di bawah Lisensi Domain Publik.
 *
 * Penulis:
 * Pranav Cherukupalli <cherukupallip@gmail.com>
 */

#if CONFIG_IDF_TARGET_ESP32
#define THRESHOLD 40 /* Semakin besar nilai, semakin tinggi sensitivitas */
#else //ESP32-S2 dan ESP32-S3 + default untuk chip lain (harus disesuaikan) */
#define THRESHOLD 5000 /* Semakin kecil nilai, semakin tinggi sensitivitas */
#endif

RTC_DATA_ATTR int bootCount = 0;
touch_pad_t touchPin;

Mengatur Nilai Ambang Batas (Threshold)

Hal pertama yang perlu Anda lakukan adalah mengatur nilai ambang batas untuk pin sentuh.

#define THRESHOLD 40 /* Semakin besar nilai, semakin tinggi sensitivitas */

Nilai yang dibaca oleh pin sentuh akan menurun ketika Anda menyentuhnya. Nilai ambang batas berarti bahwa ESP32 akan bangun ketika nilai yang dibaca pada pin sentuh berada di bawah 40. Anda dapat menyesuaikan nilai tersebut tergantung pada sensitivitas yang diinginkan.

Namun, jika Anda menggunakan model ESP32-S2 atau ESP32-S3, cara kerjanya sedikit berbeda. Itulah mengapa ada bagian berbeda dalam kode yang mendefinisikan ambang batas yang berbeda untuk board tersebut. Dalam kasus ini, semakin kecil nilainya, semakin tinggi sensitivitasnya.

#else //ESP32-S2 dan ESP32-S3 + default untuk chip lain (harus disesuaikan) */
#define THRESHOLD 5000 /* Semakin kecil nilai, semakin tinggi sensitivitas */
#endif

Tip Praktis: Untuk menemukan ambang batas yang tepat untuk aplikasi Anda, Anda dapat membuat sketsa sederhana yang membaca dan mencetak nilai-nilai pin sentuh untuk menentukan kisaran nilai saat pin disentuh dan tidak disentuh, kemudian pilih ambang batas yang tepat di antara keduanya.

3
Fungsi untuk Memantau Bangun

Mendeteksi Penyebab dan Lokasi Sentuhan

Kode contoh berisi dua fungsi penting untuk mendiagnosis proses bangun:

1. Fungsi print_wakeup_reason()

Fungsi ini mencetak alasan mengapa ESP32 telah bangun dari tidur.

void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  
  switch(wakeup_reason){
    case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Bangun disebabkan oleh sinyal eksternal menggunakan RTC_IO"); break;
    case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Bangun disebabkan oleh sinyal eksternal menggunakan RTC_CNTL"); break;
    case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Bangun disebabkan oleh timer"); break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Bangun disebabkan oleh touchpad"); break;
    case ESP_SLEEP_WAKEUP_ULP : Serial.println("Bangun disebabkan oleh program ULP"); break;
    default : Serial.printf("Bangun bukan disebabkan oleh deep sleep: %d\n", wakeup_reason); break;
  }
}

2. Fungsi print_wakeup_touchpad()

Fungsi ini mencetak pin touchpad mana yang menyebabkan ESP32 bangun dari tidur.

void print_wakeup_touchpad(){
  touchPin = esp_sleep_get_touchpad_wakeup_status();
  
#if CONFIG_IDF_TARGET_ESP32
  switch(touchPin){
    case 0 : Serial.println("Sentuhan terdeteksi pada GPIO 4"); break;
    case 1 : Serial.println("Sentuhan terdeteksi pada GPIO 0"); break;
    case 2 : Serial.println("Sentuhan terdeteksi pada GPIO 2"); break;
    case 3 : Serial.println("Sentuhan terdeteksi pada GPIO 15"); break;
    case 4 : Serial.println("Sentuhan terdeteksi pada GPIO 13"); break;
    case 5 : Serial.println("Sentuhan terdeteksi pada GPIO 12"); break;
    case 6 : Serial.println("Sentuhan terdeteksi pada GPIO 14"); break;
    case 7 : Serial.println("Sentuhan terdeteksi pada GPIO 27"); break;
    case 8 : Serial.println("Sentuhan terdeteksi pada GPIO 33"); break;
    case 9 : Serial.println("Sentuhan terdeteksi pada GPIO 32"); break;
    default : Serial.println("Bangun bukan disebabkan touchpad"); break;
  }
#else
  if(touchPin < TOUCH_PAD_MAX){
    Serial.printf("Sentuhan terdeteksi pada GPIO %d\n", touchPin);
  }
  else {
    Serial.println("Bangun bukan disebabkan touchpad");
  }
#endif
}

Fungsi ini menggunakan pemetaan antara nomor touch pad dan GPIO fisik untuk memberitahu Anda di pin mana tepatnya sentuhan terdeteksi. Ini sangat berguna untuk debugging.

Catatan Penting: Perhatikan bahwa pemetaan pada kode di atas adalah untuk ESP32 standar. Jika Anda menggunakan varian lain seperti ESP32-S2 atau ESP32-S3, pemetaan pin touch pad dengan GPIO mungkin berbeda. Selalu periksa datasheet spesifik untuk board yang Anda gunakan.

4
Mengatur Pin Sentuh sebagai Sumber Bangun

Konfigurasi Sumber Bangun

Untuk mengatur pin sentuh sebagai sumber bangun, Anda dapat menggunakan fungsi touchSleepWakeUpEnable() yang menerima argumen pin sentuh dan nilai ambang batas yang akan membangunkan board.

Dalam contoh ini, kode mengatur GPIO 15 (T3) dan GPIO 27 (T7) sebagai sumber bangun dengan nilai ambang batas yang sama:

#if CONFIG_IDF_TARGET_ESP32
//Siapkan sleep wakeup pada Touch Pad 3 + 7 (GPIO15 + GPIO 27)
touchSleepWakeUpEnable(T3, THRESHOLD);
touchSleepWakeUpEnable(T7, THRESHOLD);
#else //ESP32-S2 + ESP32-S3
//Siapkan sleep wakeup pada Touch Pad 3 (GPIO3)
touchSleepWakeUpEnable(T3, THRESHOLD);
#endif

Jika Anda menggunakan model ESP32-S2 atau S3, contoh tersebut hanya mendefinisikan bangun pada GPIO 3 (T3), karena model-model tersebut hanya mendukung satu pad sentuh sebagai sumber bangun.

Perhatikan bahwa penomoran pin sentuh mungkin berbeda tergantung pada model board yang Anda gunakan. Selalu periksa dokumentasi untuk board spesifik Anda.

Setelah mengonfigurasi sumber bangun, fungsi esp_deep_sleep_start() dipanggil untuk menempatkan ESP32 dalam mode deep sleep:

esp_deep_sleep_start();

Fungsi setup()

Ketika ESP32 bangun dari tidur, kode akan dijalankan dari awal hingga menemukan fungsi esp_deep_sleep_start().

void setup(){
  Serial.begin(115200);
  delay(1000); // Beri waktu untuk membuka Serial Monitor
  
  // Tambahkan bootCount dan cetak nilainya setiap kali boot
  ++bootCount;
  Serial.println("Jumlah boot: " + String(bootCount));
  
  // Cetak alasan bangun untuk ESP32 dan touchpad juga
  print_wakeup_reason();
  print_wakeup_touchpad();
  
#if CONFIG_IDF_TARGET_ESP32
  // Siapkan sleep wakeup pada Touch Pad 3 + 7 (GPIO15 + GPIO 27) 
  touchSleepWakeUpEnable(T3, THRESHOLD);
  touchSleepWakeUpEnable(T7, THRESHOLD);
#else // ESP32-S2 + ESP32-S3
  // Siapkan sleep wakeup pada Touch Pad 3 (GPIO3) 
  touchSleepWakeUpEnable(T3, THRESHOLD);
#endif
  
  // Tidur sekarang
  Serial.println("Tidur sekarang");
  esp_deep_sleep_start();
  Serial.println("Ini tidak akan pernah dicetak");
}

void loop(){
  // Ini tidak akan pernah dicapai
}

Dalam contoh ini, kami memiliki variabel kontrol bernama bootCount yang akan bertambah pada setiap siklus tidur sehingga kita memiliki gambaran berapa kali ESP32 telah bangun.

Kita juga memanggil fungsi print_wakeup_reason() dan print_wakeup_touchpad() yang didefinisikan sebelumnya dalam kode untuk mencetak alasan bangun dan pin yang menyebabkan bangun.

Tip Pengembangan: Saat membuat aplikasi yang menggunakan touch wake-up, Anda mungkin ingin melakukan tugas berbeda tergantung pada pin mana yang disentuh. Anda dapat menggunakan pengecekan touchPin untuk menentukan tugas apa yang akan dilakukan setelah ESP32 bangun.

5
Skema Rangkaian dan Pengujian

Rangkaian Pengujian

Untuk menguji contoh ini, hubungkan kabel jumper ke GPIO 15 dan/atau GPIO 27, seperti yang ditunjukkan pada skema di bawah ini.

Skema Touch Wake Up ESP32

Skema rangkaian untuk ESP32 Touch Wake Up (Sumber: RandomNerdTutorials.com)

Catatan Penting: Skema ini menggunakan modul ESP32 DEVKIT V1 versi dengan 30 GPIO – jika Anda menggunakan model lain, silakan periksa pinout untuk board yang Anda gunakan. Jika Anda menggunakan model ESP32-S2 atau ESP32-S3, silakan periksa lokasi pin sentuh Anda.

Menguji Contoh

Unggah kode ke ESP32 Anda, dan buka Serial Monitor pada baud rate 115200.

ESP32 akan masuk ke mode deep sleep. Anda dapat membangunkannya dengan menyentuh kabel yang terhubung ke Touch Pin 3 (GPIO 15) atau Touch Pin 7 (GPIO 27) jika Anda menggunakan ESP32 standar. Jika Anda menggunakan ESP32-S2 atau S3, Anda hanya dapat menggunakan Touch Pin 3.

Menguji ESP32 Touch Wake Up

Menguji bangun dengan sentuhan pada ESP32

Ketika Anda menyentuh pin, ESP32 akan menampilkan yang berikut pada Serial Monitor: nomor boot, penyebab bangun, dan di GPIO mana sentuhan terdeteksi.

Output Serial ESP32 Touch Wake Up

Output Serial Monitor menunjukkan bangun yang disebabkan oleh sentuhan pada GPIO 15

Tip Pengujian: Jika Anda mengalami kesulitan dengan sensitivitas, coba sesuaikan nilai THRESHOLD dalam kode. Juga, pastikan koneksi kabel yang baik dan, jika memungkinkan, gunakan kabel pendek untuk mengurangi interferensi.

6
Kesimpulan

Unit ini menunjukkan kepada Anda cara membangunkan ESP32 menggunakan pin sentuh. Secara ringkas:

  • Pertama, tentukan sumber bangun dengan memanggil touchSleepWakeUpEnable() dan meneruskan pin sentuh dan nilai ambang batas sebagai argumen.
  • Kemudian, gunakan fungsi esp_deep_sleep_start() untuk menempatkan ESP32 dalam mode deep sleep.
  • Ketika pin sentuh yang dikonfigurasi disentuh, ESP32 akan bangun dan mulai menjalankan kode dari awal.

Penggunaan touch wake-up sangat berguna untuk berbagai aplikasi, seperti:

  • Tombol sentuh hemat energi untuk perangkat berbasis baterai
  • Antarmuka pengguna sederhana yang dapat berinteraksi tanpa membangunkan seluruh sistem
  • Sistem keamanan yang hanya aktif ketika disentuh
  • Perangkat wearable yang hanya aktif saat disentuh pengguna

Dengan menggabungkan touch wake-up dengan fitur ESP32 lainnya seperti Bluetooth atau Wi-Fi, Anda dapat membuat perangkat interaktif hemat energi yang sangat menarik.

Selanjutnya

Pada unit berikutnya, kita akan mempelajari cara membangunkan ESP32 dari deep sleep menggunakan sinyal eksternal. Ini memungkinkan ESP32 Anda merespons peristiwa dari sensor dan perangkat eksternal bahkan saat berada dalam mode hemat daya.

Lanjut ke Unit 4: Deep Sleep – External Wake Up →

👥

Komunitas & Dukungan

Jika Anda memiliki pertanyaan atau ingin berbagi proyek yang telah Anda buat dengan menggunakan touch wake-up ESP32, silakan bergabung dengan grup telegram https://t.me/kodingindonesia. Komunitas akan senang melihat kreasi Anda dan membantu jika Anda menghadapi tantangan!

 

Anton Prafanto

Konten developer kodingindonesia.com & staf pengajar tetap di Universitas Mulawarman Samarinda

all author posts