Panduan · 9 mnt baca

Pin Sentuh ESP32: touchRead, Ambang, Interrupt, dan Slider

Panduan pin sentuh ESP32: tabel pin T0–T9, nilai touchRead dan ambang, tombol dan slider dari foil, touchAttachInterrupt, serta membangunkan ESP32 dari deep sleep dengan sentuhan.

Pin sentuh ESP32 adalah GPIO khusus yang terhubung ke sensor sentuh kapasitif yang sudah ada di dalam chip. ESP32 klasik punya 10 pin seperti ini (T0–T9), dan pin-pin ini bisa mendeteksi sentuhan pada kabel, potongan aluminium foil, atau pita tembaga tanpa modul tambahan. Cukup satu fungsi: touchRead(). Ketika jarimu mendekati pad, jarimu menambahkan sedikit kapasitansi ke rangkaian, lalu ESP32 memberikan perubahan itu kepadamu dalam bentuk angka. Dengan begitu kamu bisa membuat sakelar sentuh, dimmer lampu, slider, atau tombol buka tersembunyi tanpa push button mekanis.

Di panduan ini kita akan melihat dulu GPIO mana yang terhubung ke kanal sentuh mana, dan mana yang sebaiknya dihindari. Lalu kita akan membaca nilai touchRead, memilih ambang yang tepat, dan menulis tombol sentuh yang andal dengan kalibrasi otomatis dan histeresis. Kamu juga akan belajar membuat pad dari foil dan pita tembaga, mengatur kecerahan LED dengan slider tiga pad, memakai interrupt dengan touchAttachInterrupt, dan membangunkan ESP32 dari deep sleep dengan sentuhan. Bagian akhir membahas masalah kelembapan dan derau, perbedaan ESP32-S3, serta contoh singkat MicroPython.

Board pengembangan ESP32
ESP32 klasik punya 10 kanal sentuh kapasitif bernama T0–T9; tidak perlu modul tambahan.

Bagaimana cara kerja pin sentuh ESP32?

Setiap pin sentuh terhubung ke rangkaian pengukur di dalam chip. Rangkaian ini terus mengisi dan mengosongkan pin, lalu menghitung berapa banyak siklus pengisian-pengosongan yang selesai dalam waktu tertentu. Kabel dan pad di pin itu berperilaku seperti kapasitor kecil. Ketika kamu mendekatkan jari, tubuhmu menambahkan beberapa pikofarad ke kapasitor itu, pengisian dan pengosongan jadi lebih lambat, dan siklus yang selesai dalam waktu yang sama jadi lebih sedikit. Itu sebabnya di ESP32 klasik nilai touchRead turun ketika disentuh. Dengan kabel pendek, biasanya kamu akan melihat 40–80 ketika tidak disentuh; ketika disentuh jari, nilainya turun ke sekitar 10–25. Angka-angka ini bergantung pada panjang kabel, ukuran pad, board, dan lingkungan, jadi jangan pernah menulis ambang di kode dari hafalan: ukur di rangkaianmu sendiri.

FiturESP32 klasikESP32-S2 / ESP32-S3
Jumlah kanal sentuh10 (T0–T9)14 (T1–T14)
Nilai ketika disentuhTurunNaik
Nilai diam tipikal40–80Ribuan sampai puluhan ribu
Tipe kembalian touchReaduint16_t (tipe 16-bit)uint32_t (tipe 32-bit)
Ambang interruptNilai absolut, terpicu di bawahnyaKenaikan dari nilai diam
Bangun dari deep sleepBeberapa padSatu pad

Tabel pin sentuh ESP32 (T0–T9)

Kanal sentuh hanya terhubung ke GPIO tertentu; kalau kamu memakai touchRead di pin lain, kamu tidak akan mendapat nilai yang berarti. Core Arduino sudah mendefinisikan konstanta seperti T0 dan T1 untuk kanal-kanal ini, jadi menulis touchRead(T0) di kode sama dengan touchRead(4). Beberapa pin ini adalah pin strapping yang menentukan cara board mulai ketika boot; pin-pin itu tetap bisa dipakai sebagai pin sentuh, tapi sebaiknya bukan pilihan pertamamu.

KanalGPIOCatatan pemakaian
T0GPIO 4Aman, pilihan pertama
T1GPIO 0Terhubung ke tombol BOOT, tidak dikeluarkan di board 30 pin; hindari
T2GPIO 2Terhubung ke LED bawaan board, pin strapping; nilainya bisa naik-turun
T3GPIO 15Pin strapping (memengaruhi pesan boot); pakai dengan hati-hati
T4GPIO 13Aman
T5GPIO 12Pin strapping (tegangan flash); board tidak mau boot kalau pin ini HIGH ketika dinyalakan
T6GPIO 14Aman, mengeluarkan sinyal PWM singkat ketika boot
T7GPIO 27Aman
T8GPIO 33Aman
T9GPIO 32Aman
Perhatikan urutan T8 dan T9: T8 adalah GPIO 33 dan T9 adalah GPIO 32; kelihatannya terbalik, tapi memang begitu. Selain itu, jangan pernah memberi tegangan lebih dari 3,3 V ke pin sentuh, dan jangan memakai pin yang sama sebagai input sentuh sekaligus output digital. Kamu bisa melihat letak pin di board-mu di alat Pinout.

Membuat pad: kabel, aluminium foil, dan pita tembaga

Permukaan konduktif apa pun bisa dipakai sebagai pad sentuh. Yang paling sederhana adalah ujung terbuka kabel jumper yang dicolokkan ke pin. Untuk permukaan yang lebih nyaman, kamu bisa memakai potongan aluminium foil 2×2 cm atau pita tembaga berperekat; pita tembaga juga bisa disolder, jadi lebih cocok untuk proyek permanen. Pad bisa kamu tempel di karton, bagian dalam kotak plastik, atau bagian belakang potongan kayu. Sentuhan juga terdeteksi melalui plastik, akrilik, atau kaca setebal 1–3 mm; hanya saja penurunan nilainya jadi lebih kecil, jadi kamu perlu mengukur ambang lagi. Jaga kabel dari pad ke ESP32 tetap pendek: kabel yang lebih panjang dari 20–30 cm berubah jadi antena, dan menyentuh kabelnya saja juga sudah memicu.

Bahan padUkuran yang disarankanKelebihanPerhatikan
Ujung kabel jumperUjung kabelTidak perlu persiapanSensitivitas rendah, untuk uji coba
Aluminium foil2×2 sampai 3×3 cmMurah, ada di mana-manaTidak bisa disolder, sambungkan kabel dengan selotip atau klip
Pita tembaga1,5×1,5 sampai 3×3 cmBisa disolder, mudah dipotong rapiKalau perekatnya tidak konduktif, solder kabel di sisi atas
Pad PCB lubang (perfboard) atau PCBDiameter 1–2 cmPermanen dan rapiArea GND di sekelilingnya mengurangi derau
Benda logam (sekrup, gagang pintu)Tergantung bendanyaBisa jadi tombol tersembunyiLogam besar sangat menurunkan nilai diam

Membaca nilai touchRead dan menentukan ambang

Langkah pertama adalah melihat angka sebenarnya di rangkaianmu sendiri. Sketch di bawah membaca GPIO 4 (T0) dan GPIO 27 (T7) masing-masing delapan kali lalu mencetak rata-ratanya. Kalau kamu membuka Serial Plotter dari menu Tools di Arduino IDE, kamu bisa melihat kedua garis secara langsung dan memperhatikan bagaimana nilainya turun ketika disentuh.

C++ (Arduino IDE)
1// ESP32 dokunmatik değer okuma / ESP32 touch value reading
2// GPIO 4 = T0, GPIO 27 = T7
3
4void setup() {
5  Serial.begin(115200);
6  delay(500);
7}
8
9void loop() {
10  uint32_t t0 = 0, t7 = 0;
11  for (int i = 0; i < 8; i++) {      // 8 ölçümün ortalaması / average of 8 readings
12    t0 += touchRead(T0);
13    t7 += touchRead(T7);
14  }
15  Serial.print("T0:");
16  Serial.print(t0 / 8);
17  Serial.print(" T7:");
18  Serial.println(t7 / 8);            // Seri Çizici için / for the Serial Plotter
19  delay(100);
20}

Sambil memperhatikan nilainya, catat tiga kondisi: pad tidak disentuh, jari menempel di pad, dan jari 1–2 cm di atas pad. Misalnya, kalau kamu membaca 62 ketika diam, 14 ketika disentuh, dan 45 ketika jari mendekat, ambang yang aman sekitar 60 persen dari nilai diam, jadi sekitar 37. Kalau ambang terlalu dekat dengan nilai diam, sentuhan terpicu begitu jari mendekat; kalau terlalu rendah, sentuhan ringan akan terlewat.

KondisiContoh nilaiKeterangan
Diam, kabel pendek dan foil 2×2 cm55–70Nilai acuan
Jari berjarak 1–2 cm40–50Tidak boleh memicu
Jari menyentuh10–20Sentuhan pasti
Sentuhan melalui plastik 1 mm25–35Naikkan ambang sedikit
Kabel panjang dan menggantungTidak stabil, 30–70Pendekkan kabel, ambil rata-rata pembacaan

Tombol sentuh dengan kalibrasi otomatis

Daripada menulis angka ambang yang tetap, jauh lebih andal kalau nilai diam pad diukur ketika board mulai, lalu ambang dihitung dari nilai itu. Sketch di bawah mengambil rata-rata 50 pembacaan ketika mulai, menganggap penurunan 40 persen sebagai sentuhan, dan membalik kondisi LED. Pad dianggap dilepas ketika nilainya naik lagi di atas 80 persen dari nilai diam. Memakai dua ambang terpisah seperti ini disebut histeresis; cara ini mencegah pemicuan berulang ketika nilainya bergetar tepat di batas. Kalau kamu penasaran dengan sisi mekanis tombol, lihat artikel cara menghubungkan push button.

C++ (Arduino IDE)
1// Otomatik kalibrasyonlu dokunmatik buton / self-calibrating touch button
2// GPIO 4 (T0) dokunma pedi, GPIO 2 kart üstü LED
3// GPIO 4 (T0) touch pad, GPIO 2 onboard LED
4
5const uint8_t DOKUNMA_PIN = T0;   // GPIO 4
6const uint8_t LED_PIN = 2;
7
8uint32_t bosDeger = 0;            // dokunulmamış değer / untouched value
9uint32_t basEsik, birakEsik;      // histerezisli eşikler / thresholds with hysteresis
10bool basili = false;
11bool ledDurum = false;
12
13uint32_t ortalamaOku(uint8_t pin, int adet) {
14  uint32_t toplam = 0;
15  for (int i = 0; i < adet; i++) {
16    toplam += touchRead(pin);
17    delay(2);
18  }
19  return toplam / adet;
20}
21
22void setup() {
23  Serial.begin(115200);
24  pinMode(LED_PIN, OUTPUT);
25  delay(300);                                  // açılışta pede dokunma / do not touch at boot
26  bosDeger = ortalamaOku(DOKUNMA_PIN, 50);
27  basEsik = bosDeger * 60 / 100;               // %40 düşüş = dokunma / 40% drop = touch
28  birakEsik = bosDeger * 80 / 100;             // %20 altına dönünce bırakıldı / released
29  Serial.printf("Bos: %u  Bas: %u  Birak: %u\n", bosDeger, basEsik, birakEsik);
30}
31
32void loop() {
33  uint32_t deger = ortalamaOku(DOKUNMA_PIN, 4);
34
35  if (!basili && deger < basEsik) {            // yeni dokunma / new touch
36    basili = true;
37    ledDurum = !ledDurum;
38    digitalWrite(LED_PIN, ledDurum);
39    Serial.println("Dokunuldu / touched");
40  } else if (basili && deger > birakEsik) {    // parmak çekildi / finger lifted
41    basili = false;
42  }
43  delay(20);
44}
Bagian kodeFungsi
ortalamaOku()Merata-ratakan beberapa pembacaan untuk meredam lonjakan acak
bosDegerNilai tanpa sentuhan yang diukur ketika mulai; me-restart board memperbarui kalibrasi kalau kondisi berubah
basEsik = 60%Sentuhan baru dihitung ketika nilai turun di bawah angka ini
birakEsik = 80%Jari dianggap sudah diangkat ketika nilai naik di atas angka ini
Variabel basiliMencegah LED berganti terus-menerus selama jari masih menempel
Jangan sentuh pad selama kalibrasi ketika board mulai. Kalau board ada di dalam kotak dan ada kemungkinan pad tersentuh ketika daya dinyalakan, kamu bisa menyimpan nilai diam di EEPROM atau Preferences dan mengeceknya setiap boot, atau memakai rata-rata yang mengikuti nilai diam dengan sangat lambat (misalnya diperbarui 1 persen setiap detik).

Interrupt sentuhan dengan touchAttachInterrupt

Daripada terus-menerus memanggil touchRead, kamu bisa membiarkan hardware sentuh mengukur di latar belakang dan memanggil sebuah fungsi ketika nilainya turun di bawah ambang. Itulah tugas touchAttachInterrupt(pin, function, threshold). Di ESP32 klasik, interrupt terpicu ketika nilai yang diukur turun di bawah ambang, dan terus terpicu di setiap siklus pengukuran selama jari masih di pad. Jadi fungsi interrupt sebaiknya hanya mengatur flag (penanda), dan pekerjaan sebenarnya dilakukan di loop() dengan pengecekan waktu. Aturan umum interrupt sudah kami bahas di artikel interrupt Arduino.

C++ (Arduino IDE)
1// touchAttachInterrupt ile dokunma kesmesi / touch interrupt
2// GPIO 27 (T7) pedi; eşik touchRead ile ölçülerek seçilmeli
3// GPIO 27 (T7) pad; pick the threshold from your touchRead values
4
5const uint8_t PED = T7;            // GPIO 27
6const uint16_t ESIK = 40;          // ESP32: değer bunun ALTINA inince tetikler / fires below this
7volatile bool dokunuldu = false;
8
9void IRAM_ATTR dokunmaKesmesi() {
10  dokunuldu = true;                // kesmede yalnız bayrak / only set a flag in the ISR
11}
12
13void setup() {
14  Serial.begin(115200);
15  touchAttachInterrupt(PED, dokunmaKesmesi, ESIK);
16}
17
18void loop() {
19  static unsigned long sonDokunma = 0;
20  if (dokunuldu) {
21    dokunuldu = false;
22    // Parmak durdukça kesme tekrar tekrar gelir; 300 ms'de bir say
23    // The ISR repeats while the finger stays; count once per 300 ms
24    if (millis() - sonDokunma > 300) {
25      sonDokunma = millis();
26      Serial.printf("Dokunma! deger: %u\n", touchRead(PED));
27    }
28  }
29}

Di contoh ini ambangnya 40; nilai ini cocok untuk pad yang membaca sekitar 60 ketika diam, kalau tidak, ubah sesuai angka dari sketch pembacaan sebelumnya. Atribut IRAM_ATTR pada fungsi interrupt menaruh fungsi itu di memori cepat; ini disarankan untuk fungsi interrupt di ESP32. Untuk mematikan interrupt, panggil touchDetachInterrupt(pin). Di ESP32 klasik kamu juga bisa memanggil touchInterruptSetThresholdDirection(false) supaya interrupt terpicu ketika nilai naik di atas ambang; ini berguna untuk menangkap momen jari diangkat.

Slider sentuh tiga pad

Tiga pad yang berjajar sudah cukup untuk mengetahui posisi jarimu. Ketika jari berada di antara dua pad, nilai keduanya turun; dengan melihat seberapa besar penurunan di tiap pad, kamu menghitung posisinya dengan rata-rata berbobot. Kalau pad dipotong berbentuk zigzag atau chevron yang saling mengunci, bukan kotak biasa, jarimu akan menyentuh minimal dua pad di setiap posisi dan slider terasa jauh lebih halus. Tiga potong pita tembaga selebar 1,5 cm dengan celah 1–2 mm di antaranya adalah awal yang bagus.

KomponenPin ESP32Catatan
Pad A (kiri)GPIO 13 (T4)Posisi 0
Pad B (tengah)GPIO 14 (T6)Posisi 500
Pad C (kanan)GPIO 33 (T8)Posisi 1000
LEDGPIO 26Dengan resistor 220 Ω, kaki pendek ke GND
C++ (Arduino IDE)
1// Üç pedli dokunmatik kaydırıcı ile LED parlaklığı / 3-pad touch slider dims an LED
2// Pedler: GPIO 13 (T4), GPIO 14 (T6), GPIO 33 (T8); LED: GPIO 26
3// Pads: GPIO 13 (T4), GPIO 14 (T6), GPIO 33 (T8); LED: GPIO 26
4
5const uint8_t pedler[3] = {T4, T6, T8};
6const uint8_t LED_PIN = 26;
7uint32_t bos[3];                   // her pedin boştaki değeri / idle value of each pad
8int parlaklik = 0;
9
10uint32_t oku(uint8_t pin) {
11  uint32_t t = 0;
12  for (int i = 0; i < 4; i++) t += touchRead(pin);
13  return t / 4;
14}
15
16void setup() {
17  Serial.begin(115200);
18  delay(300);
19  for (int p = 0; p < 3; p++) {
20    uint32_t t = 0;
21    for (int i = 0; i < 32; i++) t += touchRead(pedler[p]);
22    bos[p] = t / 32;
23  }
24}
25
26void loop() {
27  long fark[3];
28  long toplam = 0;
29  for (int p = 0; p < 3; p++) {
30    fark[p] = (long)bos[p] - (long)oku(pedler[p]);   // dokununca değer düşer / value drops on touch
31    if (fark[p] < 0) fark[p] = 0;
32    toplam += fark[p];
33  }
34
35  // Toplam düşüş boştaki değerin %25'ini geçerse parmak var
36  // A finger is present if the total drop exceeds 25% of an idle value
37  if (toplam > (long)bos[1] / 4) {
38    // Ağırlıklı ortalama: ped A = 0, ped B = 500, ped C = 1000
39    // Weighted average: pad A = 0, pad B = 500, pad C = 1000
40    long konum = (fark[1] * 500L + fark[2] * 1000L) / toplam;
41    parlaklik = map(konum, 0, 1000, 0, 255);
42    analogWrite(LED_PIN, parlaklik);
43    Serial.printf("Konum: %ld  Parlaklik: %d\n", konum, parlaklik);
44  }
45  delay(30);
46}

Ketika mulai, sketch menyimpan nilai diam setiap pad, lalu menghitung penurunannya di setiap perulangan. Kalau total penurunannya cukup besar, berarti ada jari di slider dan posisinya ditemukan di antara 0 dan 1000. Nilai itu kita ubah ke 0–255 dengan map() lalu dikirim ke LED dengan analogWrite(). analogWrite() berfungsi di versi 2.x maupun 3.x core Arduino ESP32. Cara kerja PWM bisa kamu baca di artikel Apa Itu PWM?.

Bangun dari deep sleep dengan sentuhan

Di proyek bertenaga baterai, kamu bisa membuat ESP32 masuk deep sleep dan baru membangunkannya ketika ada yang menyentuh pad. Dalam mode ini inti prosesor mati, tapi rangkaian pengukur sentuh tetap berjalan dengan daya rendah. Fungsi touchSleepWakeUpEnable(pin, threshold) mengatur ambang sekaligus mengaktifkan bangun lewat sentuhan. Di ESP32 klasik kamu bisa memakai beberapa pad sebagai sumber bangun (wake-up); di ESP32-S2 dan S3 hanya satu pad yang diizinkan. Setelah bangun, esp_sleep_get_touchpad_wakeup_status() memberi tahu pad mana yang membangunkan board. Detail deep sleep dan angka arusnya sudah kami bahas di artikel deep sleep ESP32.

C++ (Arduino IDE)
1// Dokunarak deep sleep'ten uyanma / wake from deep sleep by touch
2// GPIO 27 (T7) pedi / GPIO 27 (T7) pad
3
4#if CONFIG_IDF_TARGET_ESP32
5  #define ESIK 40      // ESP32: değer bunun altına inerse uyanır / wakes below this value
6#else
7  #define ESIK 5000    // ESP32-S2/S3: boştaki değere göre artış / rise above the baseline
8#endif
9
10RTC_DATA_ATTR int uyanmaSayisi = 0;   // uykuda korunur / kept during deep sleep
11
12void setup() {
13  Serial.begin(115200);
14  delay(500);
15  uyanmaSayisi++;
16
17  if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_TOUCHPAD) {
18    Serial.printf("Dokunmayla uyandi, ped: %d\n", (int)esp_sleep_get_touchpad_wakeup_status());
19  } else {
20    Serial.println("Ilk acilis ya da baska neden / first boot or other cause");
21  }
22  Serial.printf("Uyanma sayisi: %d\n", uyanmaSayisi);
23
24  // Burada ölçüm yap, veri gönder... / take readings, send data here...
25  delay(2000);
26
27  touchSleepWakeUpEnable(T7, ESIK);   // T7 pedini uyandırma kaynağı yap / enable T7 as wake source
28  Serial.println("Uyuyorum / going to sleep");
29  Serial.flush();
30  esp_deep_sleep_start();
31}
32
33void loop() {
34}

Setelah bangun, kode mulai lagi dari setup(), karena RAM dikosongkan selama deep sleep. Untuk menyimpan jumlah bangun, kita menaruh RTC_DATA_ATTR di depan variabel; variabel seperti ini disimpan di memori RTC kecil yang tetap terjaga selama tidur. Karena pengukuran sentuh tetap berjalan selama tidur, arus deep sleep sedikit lebih tinggi dibanding bangun dengan timer; ingat ini ketika memperkirakan umur baterai. Blok #if di kode membuat program yang sama bisa dikompilasi dengan ambang yang benar di ESP32-S2 dan S3 juga.

Pin sentuh ESP32 dengan MicroPython

Kalau ESP32-mu sudah diisi MicroPython, hal yang sama dilakukan dengan class TouchPad di modul machine. Metode read() mengembalikan nilai yang sama dengan touchRead() di Arduino; di ESP32 klasik nilainya tetap turun ketika disentuh. Untuk bangun dari tidur, pakai esp32.wake_on_touch(True) dan metode config(threshold) milik pad.

MicroPython
1# ESP32 MicroPython dokunmatik pin / ESP32 MicroPython touch pin
2from machine import Pin, TouchPad
3import time
4
5ped = TouchPad(Pin(4))       # GPIO 4 = T0
6led = Pin(2, Pin.OUT)        # kart üstü LED / onboard LED
7
8bos = sum(ped.read() for _ in range(20)) // 20   # dokunulmamış değer / idle value
9esik = bos * 6 // 10
10basili = False
11
12while True:
13    deger = ped.read()
14    if not basili and deger < esik:
15        basili = True
16        led.value(not led.value())   # her dokunuşta LED'i değiştir / toggle on every touch
17        print("dokunuldu", deger)
18    elif basili and deger > bos * 8 // 10:
19        basili = False
20    time.sleep_ms(30)

Raspberry Pi Pico tidak punya sensor sentuh kapasitif bawaan. Kalau kamu ingin tombol sentuh dengan Pico atau Arduino Uno, solusi termudah adalah modul TTP223 siap pakai; modul ini mendeteksi sentuhan sendiri dan memberimu sinyal digital biasa.

Modul sensor sentuh TTP223
Di board tanpa pin sentuh bawaan, modul TTP223 mendeteksi sentuhan dan memberi output digital.

Masalah kelembapan, air, dan derau

Sensor kapasitif mendeteksi air sama seperti jari. Setetes air atau kelembapan tinggi di pad menambah kapasitansi, nilainya turun, dan tombol bisa terpicu sendiri. Di proyek kamar mandi, dapur, atau luar ruangan, taruh pad di balik permukaan yang tidak menahan air, pilih ambang yang sedikit lebih rendah, dan syaratkan sentuhan berlangsung minimal 50–100 ms. Kabel panjang, relay dan motor di dekatnya, serta catu daya USB yang jelek juga membuat nilainya naik-turun. Tabel di bawah merangkum masalah yang paling sering muncul beserta solusinya.

MasalahKemungkinan penyebabSolusi
Terpicu sendiriAmbang terlalu dekat dengan nilai diamTurunkan ambang ke 60% dari nilai diam, tambahkan histeresis
Nilai terus naik-turunKabel panjang atau menggantung, daya ber-derauPendekkan kabel, ambil rata-rata 4–8 pembacaan, pakai kabel USB yang bagus
Sensitivitas berubah setelah dicabut dari komputerReferensi ground berubahKalibrasi di rangkaian akhir, dengan baterai atau adaptor
Terpicu ketika lembap atau ada tetesan airAir menambah kapasitansiTaruh pad di balik penutup, syaratkan durasi sentuhan minimal
Salah satu pin tidak pernah berubahYang dipakai GPIO non-sentuhCek tabel pin; GPIO 34–39 bukan pin sentuh
Board tidak mau bootPad dan kabel di GPIO 12 mengganggu bootPindahkan pad ke GPIO 4, 13, 27, 32, atau 33
Di proyek permanen, buat kabel pad tetap pendek dan terpasang mati, beri cincin GND di sekeliling pad dengan celah 2–3 mm, dan ukur lagi ambangnya setelah board masuk ke kotaknya. Tutup kotak, jalur kabel, bahkan posisi tanganmu bisa mengubah nilai diam beberapa angka.

Pin sentuh di ESP32-S3 dan model lain

ESP32-S2 dan ESP32-S3 memakai hardware sentuh generasi kedua dan berbeda dari ESP32 klasik dalam tiga hal penting. Pertama, kanalnya ada di GPIO 1–14 dan jumlahnya 14; T1 adalah GPIO 1 dan T14 adalah GPIO 14. Kedua, nilainya jauh lebih besar dan naik ketika disentuh; pad yang membaca sekitar 20.000 ketika diam bisa naik di atas 40.000 ketika disentuh. Ketiga, ambang di touchAttachInterrupt dan touchSleepWakeUpEnable bukan nilai absolut, melainkan besar kenaikan dari nilai diam. Di S3 kamu juga bisa memakai touchInterruptGetLastStatus(pin) untuk mengetahui apakah pad masih ditekan. ESP32-C3 dan ESP32-C6 sama sekali tidak punya sensor sentuh. Kalau kamu menulis kode untuk lebih dari satu model, pisahkan dengan CONFIG_IDF_TARGET_ESP32 seperti di contoh bangun dari tidur.

Ide proyek dengan pin sentuh

  • Lampu meja: sakelar nyala/mati tak terlihat dari pita tembaga yang ditempel di balik penutup kayu, dengan sentuhan lama untuk mengatur kecerahan.
  • Dimmer slider: ubah kecerahan dan warna LED strip LED WS2812B dengan slider tiga pad.
  • Bel pintu atau perangkat catatan bertenaga baterai: ESP32 menunggu dalam deep sleep, bangun ketika pad disentuh, lalu mengirim notifikasi lewat Wi-Fi.
  • Piano buah: mainan dengan kabel ke pisang dan apel yang memainkan nada berbeda untuk tiap buah; suaranya bisa dari buzzer.
  • Panel kode tersembunyi: kunci yang terbuka ketika empat pad yang tersembunyi di dalam kotak disentuh dengan urutan yang benar.

Pin sentuh ESP32 memberi proyekmu antarmuka sentuh hanya dengan beberapa sentimeter foil dan beberapa baris kode. Di aplikasi BlueGrays kamu akan menemukan proyek seperti LED Berkedip dengan ESP32, kendali LED dengan tombol, kecerahan LED dengan PWM, dan deep sleep, masing-masing lengkap dengan skema rangkaian dan kode langkah demi langkah; ganti tombolnya dengan pad sentuh dari panduan ini untuk membuat versimu sendiri.

Pertanyaan umum

Berapa jumlah pin sentuh di ESP32?

ESP32 klasik punya 10 kanal sentuh kapasitif: T0–T9, yaitu GPIO 4, 0, 2, 15, 13, 12, 14, 27, 33, dan 32. ESP32-S2 dan ESP32-S3 punya 14 kanal di GPIO 1–14. ESP32-C3 dan C6 tidak punya sensor sentuh.

Berapa seharusnya nilai touchRead ESP32?

Di ESP32 klasik dengan kabel pendek, biasanya kamu membaca 40–80 ketika diam dan 10–25 ketika disentuh. Angka pastinya bergantung pada kabel, ukuran pad, dan lingkungan. Mengukur di rangkaianmu sendiri lalu memilih sekitar 60 persen dari nilai diam sebagai ambang adalah awal yang bagus.

Bagaimana cara menentukan ambang sentuh ESP32?

Pertama, ukur nilai pad ketika diam dan ketika disentuh dengan touchRead. Di ESP32 klasik, taruh ambang di antara keduanya, biasanya di 60 persen dari nilai diam. Cara paling andal adalah mengukur nilai diam ketika mulai, menghitung ambang di kode, dan menambahkan histeresis.

Bisakah pin sentuh ESP32 membangunkannya dari deep sleep?

Bisa. Pakai touchSleepWakeUpEnable(pin, threshold) untuk menjadikan pad sebagai sumber bangun, lalu panggil esp_deep_sleep_start(); board akan mulai ulang ketika pad disentuh. ESP32 klasik mendukung beberapa pad, ESP32-S2 dan S3 mendukung satu pad.

Kenapa pin sentuh ESP32-ku terpicu sendiri?

Biasanya ambangnya terlalu dekat dengan nilai diam, kabel pad terlalu panjang, atau udaranya lembap. Turunkan ambang, ambil rata-rata beberapa pembacaan, tambahkan histeresis, dan pendekkan kabel. Kalibrasi dengan catu daya yang nantinya dipakai board juga penting.

Kenapa touchRead ESP32-S3 naik ketika disentuh?

ESP32-S2 dan S3 memakai hardware sentuh generasi kedua yang nilai ukurnya naik seiring kapasitansi. Jadi di S3 nilainya naik ketika disentuh dan berada di kisaran puluhan ribu. Ambang interrupt dan bangun dari tidur juga berupa kenaikan dari nilai diam, bukan angka absolut.

Lihat semua proyek
LED Berkedip dengan ESP32
#103Pemula

LED Berkedip dengan ESP32

Mengajarkan penggunaan output GPIO dasar dengan ESP32. Kita membuat efek berkedip dengan menyalakan dan mematikan LED dari pin digital. Versi ESP32 dari proyek blink klasik di Arduino UNO; perintah blink dasar di lingkungan Arduino sama, tetapi susunan pin ESP32 dan level GPIO 3,3 V-nya berbeda dengan Arduino UNO.

4.7(37)
100
Kendali LED dengan Tombol Tekan ESP32 (Toggle)
#105Pemula

Kendali LED dengan Tombol Tekan ESP32 (Toggle)

Setiap kali tombol ditekan, keadaan LED berubah: jika menyala jadi mati, jika mati jadi menyala. Pola toggle klasik. Dengan debounce, kita membersihkan derau mekanis tombol tekan agar satu tekanan menghasilkan satu kali toggle.

4.6(39)
58
Kedipan LED Bawaan ESP32
#106Pemula

Kedipan LED Bawaan ESP32

Mengedipkan LED biru bawaan di ESP32 DevKit V1. Tidak perlu komponen eksternal! Proyek pertama yang sebaiknya kamu coba ketika membeli ESP32. GPIO 2 tersambung ke LED bawaan.

4.8(29)
53
LED Fade dengan PWM ESP32
#110Pemula

LED Fade dengan PWM ESP32

Mengubah kecerahan LED secara halus dari 0 ke maksimum, dan dari maksimum ke 0. Kita mengendalikan PWM dengan analogWrite() seperti di Arduino; sintaks yang sama bekerja tanpa masalah di ESP32 Arduino Core 3.0+. Definisi pin + pinMode + analogWrite sudah cukup.

4.8(36)
55
Kendali LED RGB ESP32
#111Pemula

Kendali LED RGB ESP32

Menghasilkan warna tanpa batas dengan satu LED RGB alih-alih 3 LED terpisah. Seperti di Arduino, kita membuat transisi pelangi dengan mengatur nilai R/G/B lewat analogWrite(). Teori warna (seperti merah+hijau=kuning) terlihat secara praktis.

4.6(29)
51
Deep Sleep ESP32: Hemat Baterai (OLED + Penghitung RTC RAM)
#135Mahir
Premium

Deep Sleep ESP32: Hemat Baterai (OLED + Penghitung RTC RAM)

Mode Deep Sleep ESP32 menurunkan konsumsi arus hingga ~10 µA dengan mematikan CPU dan sebagian besar periferal, sehingga sangat penting untuk perangkat IoT bertenaga baterai. Di proyek ini, kita memakai tiga sumber bangun yang berbeda: timer (15 detik), pin eksternal (EXT0, tombol GPIO 33), dan sentuhan (T0/GPIO 4). Variabel yang ditandai RTC_DATA_ATTR dipertahankan selama deep sleep; penghitung boot, penghitung bangun karena timer, dan penghitung bangun karena tombol terus dilacak.

4.3(10)
16
Lampu Pencampur Warna ESP32 (3 Potensiometer + LED RGB + OLED)
#138Mahir
Premium

Lampu Pencampur Warna ESP32 (3 Potensiometer + LED RGB + OLED)

Lampu pencampur warna pintar: campur warna apa pun dengan memutar tiga potensiometer di ESP32! Ketika potensiometer merah, hijau, dan biru diputar, LED RGB katoda bersama berubah warna secara real-time. OLED SSD1306 menampilkan nilai setiap warna dalam rentang 0–255, bar pengisi, dan kode warna web HEX (seperti #FF8040). Studio warna mini yang mengajarkan teori warna RGB, pembacaan ADC, pengaturan kecerahan dengan PWM, dan desain layar I2C sekaligus.

4.7(6)
10
Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)
#141Mahir
Premium

Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)

Ubah lorong, kamar mandi, atau gudangmu menjadi lampu pintar dengan ESP32! Dengan sensor gerak PIR, sensor cahaya LDR, dan modul relay, kita membuat skenario klasik "lampu menyala ketika ada gerakan dalam gelap"; jika sudah terang, gerakan TIDAK menyalakan lampu, jadi energi hemat di siang hari. Lampu menyala 30 detik; jika gerakan berlanjut, timer diulang. OLED SSD1306 menampilkan status dengan font besar (NYALA / SIANG / MENUNGGU) dan hitung mundur.

4.3(6)
11