Pin touch ESP32: touchRead, soglia, interrupt e slider capacitivo
Pin touch dell'ESP32: tabella T0–T9, valori di touchRead e soglia, pulsante e slider con stagnola, touchAttachInterrupt e risveglio dal deep sleep con un tocco.
I pin touch dell'ESP32 sono GPIO speciali collegati ai sensori tattili capacitivi integrati nel chip. L'ESP32 classico ne ha 10 (T0–T9) e rilevano il tocco su un filo, un pezzo di stagnola o nastro di rame senza alcun modulo aggiuntivo. Basta una sola funzione: touchRead(). Quando il dito si avvicina al pad aggiunge una piccola capacità al circuito, e l'ESP32 ti restituisce questa variazione come numero. Così puoi creare un interruttore touch, un dimmer per luci, uno slider o un pulsante di apertura nascosto senza pulsanti meccanici.
In questa guida vedremo prima quale GPIO corrisponde a quale canale touch e quali è meglio evitare. Poi leggeremo i valori di touchRead, sceglieremo la soglia giusta e scriveremo un pulsante touch affidabile con autocalibrazione e isteresi. Imparerai anche a realizzare pad con stagnola e nastro di rame, a regolare la luminosità di un LED con uno slider a tre pad, a usare gli interrupt con touchAttachInterrupt e a risvegliare l'ESP32 dal deep sleep con un tocco. Le ultime sezioni trattano umidità e disturbi, le differenze dell'ESP32-S3 e un breve esempio in MicroPython.

Come funzionano i pin touch dell'ESP32?
Ogni pin touch è collegato a un circuito di misura dentro il chip. Questo circuito carica e scarica il pin di continuo e conta quanti cicli di carica e scarica si completano in un tempo fisso. Il filo e il pad sul pin si comportano come un piccolo condensatore. Quando avvicini il dito, il tuo corpo aggiunge qualche picofarad a quel condensatore, carica e scarica rallentano e nello stesso tempo si completano meno cicli. Ecco perché sull'ESP32 classico il valore di touchRead scende quando tocchi. Con un filo corto a riposo vedi di solito 40–80; quando lo tocchi con il dito il valore scende a circa 10–25. Questi numeri dipendono da lunghezza del filo, dimensione del pad, scheda e ambiente, quindi non scrivere mai una soglia a memoria: misurala sul tuo montaggio.
| Caratteristica | ESP32 classico | ESP32-S2 / ESP32-S3 |
|---|---|---|
| Numero di canali touch | 10 (T0–T9) | 14 (T1–T14) |
| Valore al tocco | Scende | Sale |
| Valore tipico a riposo | 40–80 | Migliaia o decine di migliaia |
| Tipo restituito da touchRead | uint16_t | uint32_t |
| Soglia dell'interrupt | Valore assoluto, scatta sotto | Aumento rispetto al valore a riposo |
| Risveglio dal deep sleep | Più pad | Un solo pad |
Tabella dei pin touch dell'ESP32 (T0–T9)
I canali touch sono collegati solo a certi GPIO; se usi touchRead su un altro pin non ottieni un valore utile. Il core Arduino definisce costanti pronte come T0 e T1 per questi canali, quindi scrivere touchRead(T0) equivale a touchRead(4). Alcuni di questi pin sono pin di strapping, che decidono come si avvia la scheda; funzionano come touch, ma non dovrebbero essere la tua prima scelta.
| Canale | GPIO | Nota d'uso |
|---|---|---|
| T0 | GPIO 4 | Sicuro, prima scelta |
| T1 | GPIO 0 | Collegato al pulsante BOOT, non disponibile sulle schede a 30 pin; da evitare |
| T2 | GPIO 2 | Collegato al LED della scheda, pin di avvio; i valori possono oscillare |
| T3 | GPIO 15 | Pin di avvio (influisce sui messaggi di boot); usalo con attenzione |
| T4 | GPIO 13 | Sicuro |
| T5 | GPIO 12 | Pin di avvio (tensione della flash); se è alto all'accensione la scheda non parte |
| T6 | GPIO 14 | Sicuro, emette un breve segnale PWM all'avvio |
| T7 | GPIO 27 | Sicuro |
| T8 | GPIO 33 | Sicuro |
| T9 | GPIO 32 | Sicuro |
Realizzare i pad: filo, stagnola e nastro di rame
Qualsiasi superficie conduttiva funziona come pad touch. La più semplice è l'estremità spellata di un cavetto jumper inserito nel pin. Per una superficie più comoda puoi usare un pezzo di stagnola di 2×2 cm o nastro di rame adesivo; il nastro di rame si salda anche, quindi è migliore per i progetti definitivi. Puoi incollare il pad su un cartoncino, all'interno di una scatola di plastica o dietro un pezzo di legno. Il tocco viene rilevato anche attraverso 1–3 mm di plastica, acrilico o vetro; si riduce solo il calo del valore, quindi devi rimisurare la soglia. Tieni corto il filo dal pad all'ESP32: oltre 20–30 cm diventa un'antenna e anche toccare il filo stesso fa scattare il tocco.
| Materiale del pad | Dimensione consigliata | Pro | Attenzione |
|---|---|---|---|
| Estremità di un jumper | Punta del filo | Nessuna preparazione | Bassa sensibilità, per prove |
| Stagnola | Da 2×2 a 3×3 cm | Economica, si trova ovunque | Non si salda, fissa il filo con nastro o una pinza |
| Nastro di rame | Da 1,5×1,5 a 3×3 cm | Si salda, si taglia in modo pulito | Se l'adesivo non è conduttivo, salda il filo sopra |
| Pad su millefori o PCB | 1–2 cm di diametro | Definitivo e ordinato | Un'area di GND intorno riduce i disturbi |
| Oggetto metallico (vite, maniglia) | Secondo l'oggetto | Permette un pulsante nascosto | Un metallo grande abbassa molto il valore a riposo |
Leggere i valori di touchRead e scegliere la soglia
La prima cosa è vedere i numeri reali del tuo montaggio. Lo sketch qui sotto legge otto volte il GPIO 4 (T0) e il GPIO 27 (T7) e stampa la media. Se apri il Plotter seriale dal menu Strumenti dell'IDE Arduino, vedi le due linee in tempo reale e come i valori scendono quando tocchi.
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}Mentre osservi i valori, annota tre situazioni: pad a riposo, dito sul pad e dito a 1–2 cm dal pad. Per esempio, se leggi 62 a riposo, 14 al tocco e 45 avvicinandoti, una soglia sicura è circa il 60 per cento del valore a riposo, quindi intorno a 37. Con una soglia troppo vicina al valore a riposo scatta già all'avvicinarsi del dito; con una troppo bassa perdi i tocchi leggeri.
| Situazione | Valore d'esempio | Commento |
|---|---|---|
| Riposo, filo corto e stagnola 2×2 cm | 55–70 | Valore di riferimento |
| Dito a 1–2 cm | 40–50 | Non deve scattare |
| Tocco con il dito | 10–20 | Tocco netto |
| Tocco attraverso 1 mm di plastica | 25–35 | Alza un po' la soglia |
| Filo lungo e volante | Instabile, 30–70 | Accorcia il filo, fai la media |
Pulsante touch con autocalibrazione
Invece di scrivere un numero fisso come soglia, è molto più affidabile misurare il valore a riposo del pad all'avvio e calcolare la soglia da quello. Lo sketch qui sotto fa la media di 50 letture all'avvio, considera tocco un calo del 40 per cento e cambia lo stato del LED. Considera il pad rilasciato quando il valore torna sopra l'80 per cento del valore a riposo. Usare due soglie separate si chiama isteresi; evita scatti ripetuti quando il valore oscilla proprio sul limite. Se ti interessa la parte meccanica dei pulsanti, leggi l'articolo come collegare un pulsante.
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}| Parte del codice | Compito |
|---|---|
| ortalamaOku() | Fa la media di più letture per smussare i picchi casuali |
| bosDeger | Valore senza tocco misurato all'avvio; riavviare la scheda rinnova la calibrazione se l'ambiente cambia |
| basEsik = 60% | Se il valore scende sotto, conta come nuovo tocco |
| birakEsik = 80% | Se il valore sale sopra, il dito è considerato sollevato |
| Variabile basili | Impedisce che il LED cambi di continuo mentre il dito resta appoggiato |
Interrupt touch con touchAttachInterrupt
Invece di chiamare touchRead di continuo, puoi lasciare che l'hardware touch misuri in background e chiami una funzione quando il valore scende sotto una soglia. È ciò che fa touchAttachInterrupt(pin, funzione, soglia). Sull'ESP32 classico l'interrupt scatta quando il valore misurato scende sotto la soglia e si ripete a ogni ciclo di misura finché il dito resta sul pad. Per questo la funzione di interrupt deve solo impostare un flag, mentre il lavoro vero si fa in loop() con un controllo del tempo. Le regole generali degli interrupt sono spiegate nell'articolo interrupt con Arduino.
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}In questo esempio la soglia è 40; va bene per un pad che legge circa 60 a riposo, altrimenti cambiala in base ai numeri dello sketch di lettura precedente. L'attributo IRAM_ATTR sulla funzione di interrupt la mette nella memoria veloce; sull'ESP32 è consigliato per le funzioni di interrupt. Per disattivare l'interrupt chiama touchDetachInterrupt(pin). Sull'ESP32 classico puoi anche usare touchInterruptSetThresholdDirection(false) perché l'interrupt scatti quando il valore supera la soglia; è utile per cogliere il momento in cui il dito si solleva.
Slider touch a tre pad
Tre pad in fila bastano per trovare la posizione del dito. Quando il dito è tra due pad, entrambi i valori scendono; guardando quanto è sceso ciascun pad calcoli la posizione con una media pesata. Se tagli i pad a zigzag o a punta di freccia incastrati invece che quadrati, il dito tocca almeno due pad in ogni posizione e lo slider diventa molto più fluido. Tre strisce di nastro di rame larghe 1,5 cm con 1–2 mm di distanza sono un buon inizio.
| Parte | Pin ESP32 | Nota |
|---|---|---|
| Pad A (sinistra) | GPIO 13 (T4) | Posizione 0 |
| Pad B (centro) | GPIO 14 (T6) | Posizione 500 |
| Pad C (destra) | GPIO 33 (T8) | Posizione 1000 |
| LED | GPIO 26 | Con resistenza da 220 Ω, gamba corta a GND |
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}All'avvio lo sketch salva il valore a riposo di ogni pad e poi a ogni ciclo calcola i cali. Se il calo totale è abbastanza grande, c'è un dito sullo slider e la posizione risulta tra 0 e 1000. Convertiamo questo valore in 0–255 con map() e lo mandiamo al LED con analogWrite(). analogWrite() funziona sia nella versione 2.x sia nella 3.x del core Arduino per ESP32. Trovi come funziona il PWM nell'articolo cos'è il PWM.
Risveglio dal deep sleep con un tocco
In un progetto a batteria puoi mettere l'ESP32 in deep sleep e svegliarlo solo quando qualcuno tocca il pad. In questa modalità i core sono spenti, ma il circuito di misura touch continua a funzionare a basso consumo. La funzione touchSleepWakeUpEnable(pin, soglia) imposta la soglia e attiva il risveglio touch in un colpo solo. Sull'ESP32 classico puoi usare più pad come sorgente di risveglio; su ESP32-S2 e S3 uno solo. Al risveglio, esp_sleep_get_touchpad_wakeup_status() ti dice quale pad ha svegliato la scheda. Abbiamo spiegato dettagli e consumi del deep sleep nell'articolo deep sleep dell'ESP32.
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}Dopo il risveglio il codice riparte da setup(), perché nel deep sleep la RAM viene cancellata. Per conservare il numero di risvegli abbiamo messo RTC_DATA_ATTR davanti alla variabile; queste variabili stanno nella piccola memoria RTC mantenuta durante il sonno. Poiché la misura touch continua anche nel sonno, il consumo in deep sleep è un po' più alto rispetto al risveglio a timer; tienilo presente quando calcoli l'autonomia della batteria. Il blocco #if nel codice permette allo stesso programma di compilare con la soglia giusta anche su ESP32-S2 e S3.
Pin touch dell'ESP32 con MicroPython
Se hai caricato MicroPython sul tuo ESP32, fai la stessa cosa con la classe TouchPad del modulo machine. Il suo metodo read() restituisce lo stesso valore di touchRead() in Arduino; sull'ESP32 classico scende anche qui al tocco. Per il risveglio si usano esp32.wake_on_touch(True) e il metodo config(soglia) del pad.
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)Il Raspberry Pi Pico non ha un sensore touch capacitivo integrato. Se vuoi un pulsante touch con un Pico o un Arduino Uno, la soluzione più semplice è un modulo TTP223 già pronto; rileva il tocco da solo e ti fornisce un normale segnale digitale.

Umidità, acqua e disturbi
Il rilevamento capacitivo vede l'acqua oltre al dito. Una goccia d'acqua o molta umidità sul pad aumentano la capacità, il valore scende e il pulsante può scattare da solo. Nei progetti per bagno, cucina o esterno, metti il pad dietro una superficie che non trattiene l'acqua, scegli una soglia un po' più bassa e richiedi che il tocco duri almeno 50–100 ms. Anche fili lunghi, relè e motori vicini e un cattivo alimentatore USB fanno oscillare i valori. La tabella riassume i problemi più comuni e le soluzioni.
| Problema | Causa probabile | Soluzione |
|---|---|---|
| Scatta da solo | Soglia troppo vicina al valore a riposo | Abbassa la soglia al 60% del riposo, aggiungi isteresi |
| I valori oscillano di continuo | Filo lungo o volante, alimentazione rumorosa | Accorcia il filo, fai la media di 4–8 letture, usa un buon cavo USB |
| La sensibilità cambia staccando il PC | È cambiato il riferimento di massa | Calibra sul montaggio finale, con batteria o alimentatore |
| Scatta con umidità o una goccia d'acqua | L'acqua aumenta la capacità | Metti il pad dietro una copertura, richiedi una durata minima |
| Un pin non cambia mai | Usato un GPIO non touch | Controlla la tabella; i GPIO 34–39 non sono touch |
| La scheda non si avvia | Pad e filo sul GPIO 12 disturbano l'avvio | Sposta il pad sul GPIO 4, 13, 27, 32 o 33 |
Pin touch su ESP32-S3 e altri modelli
ESP32-S2 ed ESP32-S3 usano un hardware touch di seconda generazione e differiscono dall'ESP32 classico in tre punti importanti. Primo, i canali sono sui GPIO 1–14 e sono 14; T1 è il GPIO 1 e T14 il GPIO 14. Secondo, i valori sono molto più grandi e salgono al tocco; un pad che legge circa 20.000 a riposo può superare 40.000 quando lo tocchi. Terzo, la soglia di touchAttachInterrupt e touchSleepWakeUpEnable non è un valore assoluto ma un aumento rispetto al valore a riposo. Sull'S3 puoi anche sapere con touchInterruptGetLastStatus(pin) se il pad è ancora premuto. ESP32-C3 ed ESP32-C6 non hanno alcun sensore touch. Se scrivi codice per più modelli, separali con CONFIG_IDF_TARGET_ESP32 come nell'esempio del risveglio.
Idee di progetto con i pin touch
- Lampada da scrivania: un interruttore invisibile in nastro di rame incollato dietro un pannello di legno, con tocco lungo per regolare la luminosità.
- Dimmer a slider: cambia luminosità e colore di una striscia di LED WS2812B con uno slider a tre pad.
- Campanello o blocco note a batteria: l'ESP32 aspetta in deep sleep, si sveglia al tocco del pad e invia una notifica via Wi-Fi.
- Pianoforte di frutta: un giocattolo con fili collegati a banane e mele che suona una nota diversa per ogni frutto; il suono può farlo un buzzer.
- Tastierino segreto: una serratura che si apre quando quattro pad nascosti in una scatola vengono toccati nell'ordine giusto.
I pin touch dell'ESP32 danno al tuo progetto un'interfaccia touch con qualche centimetro di stagnola e poche righe di codice. Nell'app BlueGrays trovi progetti come accendere un LED con l'ESP32, controllare un LED con un pulsante, la luminosità di un LED con il PWM e il deep sleep, ognuno con schema e codice passo per passo; sostituisci i pulsanti con i pad touch di questa guida e crea la tua versione.
Domande frequenti
Quanti pin touch ha l'ESP32?
L'ESP32 classico ha 10 canali touch capacitivi: T0–T9, cioè i GPIO 4, 0, 2, 15, 13, 12, 14, 27, 33 e 32. ESP32-S2 ed ESP32-S3 hanno 14 canali sui GPIO 1–14. ESP32-C3 e C6 non hanno sensore touch.
Che valore deve dare touchRead sull'ESP32?
Sull'ESP32 classico con un filo corto si leggono di solito 40–80 a riposo e 10–25 al tocco. Il numero esatto dipende dal filo, dalla dimensione del pad e dall'ambiente. Misurare sul tuo montaggio e usare come soglia circa il 60 per cento del valore a riposo è un buon punto di partenza.
Come si imposta la soglia touch dell'ESP32?
Prima misura con touchRead il valore del pad a riposo e toccato. Sull'ESP32 classico metti la soglia tra i due, di solito al 60 per cento del valore a riposo. Il metodo più affidabile è misurare il riposo all'avvio, calcolare la soglia nel codice e aggiungere l'isteresi.
Un pin touch può risvegliare l'ESP32 dal deep sleep?
Sì. Con touchSleepWakeUpEnable(pin, soglia) il pad diventa una sorgente di risveglio, poi chiami esp_deep_sleep_start(); al tocco del pad la scheda si riavvia. L'ESP32 classico supporta più pad, ESP32-S2 e S3 uno solo.
Perché il pin touch del mio ESP32 scatta da solo?
Di solito la soglia è troppo vicina al valore a riposo, il filo del pad è lungo o c'è umidità. Abbassa la soglia, fai la media di più letture, aggiungi isteresi e accorcia il filo. È importante anche calibrare con l'alimentazione che la scheda userà alla fine.
Perché touchRead aumenta al tocco sull'ESP32-S3?
ESP32-S2 e S3 usano un hardware touch di seconda generazione in cui il valore misurato cresce con la capacità. Per questo sull'S3 il valore sale al tocco e si trova nelle decine di migliaia. Anche la soglia di interrupt e di risveglio è un aumento rispetto al valore a riposo, non un numero assoluto.
Progetti da realizzare dopo questo articolo
Vedi tutti i progetti
LED Lampeggiante con ESP32
Insegna l'uso di base delle uscite GPIO con l'ESP32. Otteniamo un effetto lampeggiante accendendo e spegnendo un LED dal pin digitale. Versione ESP32 del classico progetto blink su Arduino UNO; i comandi di base di blink nell'ambiente Arduino sono gli stessi, ma la disposizione dei pin e i livelli GPIO a 3,3 V dell'ESP32 sono diversi da quelli di Arduino UNO.

Controllo LED ESP32 con pulsante (Toggle)
Ogni volta che si preme il pulsante, lo stato del LED cambia: se è acceso si spegne, se è spento si accende. Classico schema toggle. Con il debounce puliamo il rumore meccanico del pulsante per garantire una singola commutazione con una sola pressione.

Lampeggio del LED interno dell'ESP32
Far lampeggiare il LED blu integrato nell'ESP32 DevKit V1. Non sono necessari componenti esterni! Il primo progetto da provare quando si acquista un ESP32. Il GPIO 2 è collegato al LED interno.

Dissolvenza LED ESP32 con PWM
Modificare la luminosità del LED in modo fluido da 0 a max, da max a 0. Controlliamo il PWM con analogWrite() come in Arduino - la stessa sintassi con ESP32 Arduino Core 3.0+ funziona senza problemi. La definizione del pin + pinMode + analogWrite è sufficiente.

Controllo LED RGB ESP32
Generazione illimitata di colori con un singolo LED RGB invece di 3 LED separati. La transizione arcobaleno avviene impostando i valori R/G/B con analogWrite() come in Arduino. La teoria dei colori (come rosso+verde=giallo) viene vista in pratica.

ESP32 Deep Sleep — Risparmio della batteria (OLED + contatore in RTC RAM)
La modalità Deep Sleep dell'ESP32 riduce il consumo di corrente a circa 10 µA spegnendo la CPU e la maggior parte dei dispositivi periferici ed è di fondamentale importanza per i dispositivi IoT alimentati a batteria. In questo progetto utilizziamo tre diverse fonti di risveglio: il timer (15 secondi), un pin esterno (EXT0 — pulsante GPIO 33) e il sensore tattile (T0/GPIO 4). Le variabili contrassegnate con RTC_DATA_ATTR vengono preservate durante la modalità Deep Sleep: il contatore di avvio,

Lampada con miscelatore di colori ESP32 (3 potenziometri + LED RGB + OLED)
Una lampada mista colori intelligente che, ruotando i 3 potenziometri con l'ESP32, permette di miscelare il colore desiderato! Man mano che si ruotano i potenziometri rosso, verde e blu, il LED RGB a catodo comune cambia colore istantaneamente. Sul display OLED SSD1306 vengono visualizzati in tempo reale i valori compresi tra 0 e 255 per ogni colore, le barre di riempimento visive e il codice colore HEX (#FF8040, ad esempio). Un mini studio di colore professionale: insegna la teoria dei colori R

Illuminazione Intelligente ESP32 (PIR + LDR + Relè + OLED)
Trasforma il tuo corridoio, bagno o dispensa in illuminazione intelligente con ESP32! Utilizzando un sensore di movimento PIR, un sensore di luce LDR e un modulo relè, costruiamo lo scenario classico "la luce si accende quando viene rilevato movimento al buio" — se l'ambiente è già luminoso, il movimento NON attiva la luce, risparmiando energia durante il giorno. La luce rimane accesa per 30 secondi; se il movimento continua, il timer si azzera e la luce rimane accesa più a lungo. Il display OLE
Altri articoli
App BlueGrays
Costruisci questo circuito passo passo sul telefono
Schema, codice ed elenco componenti in un’unica schermata. Oltre 200 progetti Arduino, ESP32 e Pico da realizzare.
Inquadra con il telefono
Punta la fotocamera sul codice: si apre lo store del tuo telefono.
oppure apri lo store

