Pinos de toque do ESP32: touchRead, limiar, interrupção e slider
Guia dos pinos de toque do ESP32: tabela dos pinos T0–T9, valores do touchRead e limiares, botões e sliders de papel-alumínio, touchAttachInterrupt e como acordar do deep sleep com um toque.
Os pinos de toque do ESP32 são GPIOs especiais ligados a sensores de toque capacitivos integrados ao chip. O ESP32 clássico tem 10 deles (T0–T9), e eles detectam o toque em um fio, num pedaço de papel-alumínio ou em fita de cobre sem nenhum módulo extra. Uma única função faz o trabalho: touchRead(). Quando seu dedo se aproxima do pad, ele adiciona uma pequena capacitância ao circuito, e o ESP32 entrega essa variação para você como um número. Com isso dá para fazer um interruptor de toque, um dimmer de luz, um slider ou um botão de abertura escondido sem botão mecânico.
Neste guia, primeiro vamos ver qual GPIO está ligado a qual canal de toque e de quais é melhor ficar longe. Depois vamos ler os valores do touchRead, escolher o limiar certo e escrever um botão de toque robusto, com autocalibração e histerese. Você também vai aprender a fazer pads com papel-alumínio e fita de cobre, ajustar o brilho de um LED com um slider de três pads, usar interrupções com touchAttachInterrupt e acordar o ESP32 do deep sleep com um toque. As seções finais tratam de problemas com umidade e ruído, das diferenças do ESP32-S3 e de um exemplo curto em MicroPython.

Como funcionam os pinos de toque do ESP32?
Cada pino de toque está ligado a um circuito de medição dentro do chip. Esse circuito fica carregando e descarregando o pino e conta quantos ciclos de carga e descarga se completam em um tempo fixo. O fio e o pad no pino se comportam como um pequeno capacitor. Quando você aproxima o dedo, seu corpo acrescenta alguns picofarads a esse capacitor, a carga e a descarga ficam mais lentas e menos ciclos se completam no mesmo tempo. Por isso, no ESP32 clássico, o valor do touchRead cai quando você toca. Com um fio curto, normalmente você vê 40–80 em repouso; ao tocar com o dedo, o valor cai para algo em torno de 10–25. Esses números dependem do comprimento do fio, do tamanho do pad, da placa e do ambiente, então nunca escreva um limiar de cabeça no código: meça na sua própria montagem.
| Característica | ESP32 clássico | ESP32-S2 / ESP32-S3 |
|---|---|---|
| Número de canais de toque | 10 (T0–T9) | 14 (T1–T14) |
| Valor ao tocar | Cai | Sobe |
| Valor típico em repouso | 40–80 | Milhares a dezenas de milhares |
| Tipo de retorno do touchRead | uint16_t | uint32_t |
| Limiar da interrupção | Valor absoluto, dispara abaixo dele | Aumento em relação ao valor em repouso |
| Despertar do deep sleep | Vários pads | Um pad |
Tabela dos pinos de toque do ESP32 (T0–T9)
Os canais de toque estão ligados apenas a GPIOs específicos; se você usar o touchRead em qualquer outro pino, não vai obter um valor com sentido. O core do Arduino define constantes prontas como T0 e T1 para esses canais, então escrever touchRead(T0) no código é o mesmo que touchRead(4). Alguns desses pinos são pinos de strapping, que decidem como a placa inicia no boot; eles funcionam como pinos de toque, mas não devem ser sua primeira opção.
| Canal | GPIO | Observação de uso |
|---|---|---|
| T0 | GPIO 4 | Seguro, primeira opção |
| T1 | GPIO 0 | Ligado ao botão BOOT, não sai nos pinos das placas de 30 pinos; evite |
| T2 | GPIO 2 | Ligado ao LED da placa, pino de strapping; os valores podem oscilar |
| T3 | GPIO 15 | Pino de strapping (afeta as mensagens de boot); use com cuidado |
| T4 | GPIO 13 | Seguro |
| T5 | GPIO 12 | Pino de strapping (tensão da flash); a placa não inicia se ele estiver em nível alto na partida |
| T6 | GPIO 14 | Seguro, emite um sinal PWM curto no boot |
| T7 | GPIO 27 | Seguro |
| T8 | GPIO 33 | Seguro |
| T9 | GPIO 32 | Seguro |
Fazendo pads: fio, papel-alumínio e fita de cobre
Qualquer superfície condutora funciona como pad de toque. O mais simples é a ponta desencapada de um jumper espetado no pino. Para uma superfície mais confortável, você pode usar um pedaço de papel-alumínio de 2×2 cm ou fita de cobre autoadesiva; a fita de cobre também aceita solda, então é melhor para projetos permanentes. Dá para colar o pad em papelão, no lado de dentro de uma caixa plástica ou atrás de um pedaço de madeira. O toque também é detectado através de 1–3 mm de plástico, acrílico ou vidro; só que a queda do valor fica menor, então é preciso medir o limiar de novo. Mantenha curto o fio do pad até o ESP32: fios com mais de 20–30 cm viram antenas, e tocar no próprio fio também dispara.
| Material do pad | Tamanho sugerido | Vantagens | Atenção |
|---|---|---|---|
| Ponta de jumper | Ponta do fio | Não exige preparo | Baixa sensibilidade, para testes |
| Papel-alumínio | 2×2 a 3×3 cm | Barato, encontrado em qualquer lugar | Não aceita solda, prenda o fio com fita ou clipe |
| Fita de cobre | 1,5×1,5 a 3×3 cm | Aceita solda, corta com acabamento limpo | Se o adesivo não for condutor, solde o fio na face de cima |
| Pad de placa perfurada ou PCB | 1–2 cm de diâmetro | Permanente e caprichado | Uma área de GND em volta reduz o ruído |
| Objeto metálico (parafuso, maçaneta) | Depende do objeto | Permite fazer um botão escondido | Metal grande baixa muito o valor em repouso |
Lendo os valores do touchRead e definindo um limiar
O primeiro passo é ver os números reais na sua montagem. O sketch abaixo lê o GPIO 4 (T0) e o GPIO 27 (T7) oito vezes cada um e mostra a média. Se você abrir o Plotter Serial no menu Ferramentas da Arduino IDE, pode acompanhar as duas linhas ao vivo e ver como os valores caem quando você toca.
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}Enquanto observa os valores, anote três situações: o pad em repouso, o dedo sobre o pad e o dedo a 1–2 cm acima do pad. Por exemplo, se você lê 62 em repouso, 14 ao tocar e 45 ao aproximar, um limiar seguro fica em cerca de 60 por cento do valor em repouso, ou seja, por volta de 37. Coloque o limiar muito perto do valor em repouso e ele dispara só com o dedo se aproximando; coloque baixo demais e você vai perder toques leves.
| Situação | Valor de exemplo | Comentário |
|---|---|---|
| Em repouso, fio curto e papel-alumínio de 2×2 cm | 55–70 | Valor de referência |
| Dedo a 1–2 cm | 40–50 | Não deve disparar |
| Dedo tocando | 10–20 | Toque certo |
| Toque através de 1 mm de plástico | 25–35 | Suba um pouco o limiar |
| Fio longo e solto | Instável, 30–70 | Encurte o fio, faça a média das leituras |
Botão de toque com autocalibração
Em vez de escrever um limiar fixo no código, é bem mais confiável medir o valor em repouso do pad quando a placa liga e calcular o limiar a partir dele. O sketch abaixo faz a média de 50 leituras na inicialização, considera uma queda de 40 por cento como toque e alterna o LED. Ele considera o pad solto quando o valor volta a ficar acima de 80 por cento do valor em repouso. Usar dois limiares separados se chama histerese; isso evita disparos repetidos quando o valor fica oscilando bem no limite. Se você tem curiosidade sobre o lado mecânico dos botões, veja o artigo como ligar um botão.
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 do código | Função |
|---|---|
| ortalamaOku() (média das leituras) | Faz a média de várias leituras para suavizar picos aleatórios |
| bosDeger (valor em repouso) | O valor sem toque medido na inicialização; reiniciar a placa renova a calibração quando as condições mudam |
| basEsik = 60% | Um novo toque é contado quando o valor cai abaixo disso |
| birakEsik = 80% | O dedo é considerado retirado quando o valor sobe acima disso |
| variável basili | Impede que o LED fique alternando sem parar enquanto o dedo continua no pad |
Interrupções de toque com touchAttachInterrupt
Em vez de chamar touchRead o tempo todo, você pode deixar o hardware de toque medir em segundo plano e chamar uma função quando o valor cair abaixo de um limiar. É isso que touchAttachInterrupt(pino, função, limiar) faz. No ESP32 clássico, a interrupção dispara quando o valor medido fica abaixo do limiar e continua disparando a cada ciclo de medição enquanto o dedo estiver no pad. Por isso, a função de interrupção deve só levantar uma flag, e o trabalho de verdade deve acontecer no loop(), com uma verificação de tempo. Falamos das regras gerais de interrupções no artigo interrupções no 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}Neste exemplo o limiar é 40; ele serve para um pad que lê por volta de 60 em repouso; caso contrário, ajuste de acordo com os números do sketch de leitura anterior. O atributo IRAM_ATTR na função de interrupção a coloca na memória rápida; isso é recomendado para funções de interrupção no ESP32. Para desligar a interrupção, chame touchDetachInterrupt(pino). No ESP32 clássico, você também pode chamar touchInterruptSetThresholdDirection(false) para que a interrupção dispare quando o valor subir acima do limiar; isso é útil para capturar o momento em que o dedo sai.
Slider de toque com três pads
Três pads em fila bastam para descobrir onde está o seu dedo. Quando o dedo fica entre dois pads, os dois valores caem; olhando quanto cada pad caiu, você calcula a posição com uma média ponderada. Se você cortar os pads em formatos de zigue-zague ou de ponta de flecha que se encaixam, em vez de quadrados simples, o dedo toca pelo menos dois pads em qualquer posição e o slider fica bem mais suave. Três tiras de fita de cobre de 1,5 cm de largura, com 1–2 mm de espaço entre elas, são um bom começo.
| Componente | Pino do ESP32 | Observação |
|---|---|---|
| Pad A (esquerda) | GPIO 13 (T4) | Posição 0 |
| Pad B (meio) | GPIO 14 (T6) | Posição 500 |
| Pad C (direita) | GPIO 33 (T8) | Posição 1000 |
| LED | GPIO 26 | Com resistor de 220 Ω, perna curta no 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}Na inicialização, o sketch salva o valor em repouso de cada pad e, a cada ciclo, calcula as quedas. Se a queda total for grande o bastante, há um dedo no slider e a posição é calculada entre 0 e 1000. Convertemos esse valor para 0–255 com map() e o enviamos ao LED com analogWrite(). O analogWrite() funciona tanto na versão 2.x quanto na 3.x do core Arduino do ESP32. Você encontra como o PWM funciona no artigo o que é PWM.
Acordando do deep sleep com um toque
Em um projeto a bateria, você pode colocar o ESP32 em deep sleep e acordá-lo só quando alguém tocar no pad. Nesse modo os núcleos ficam desligados, mas o circuito de medição de toque continua funcionando com baixo consumo. A função touchSleepWakeUpEnable(pino, limiar) define o limiar e ativa o despertar por toque de uma vez só. No ESP32 clássico você pode usar vários pads como fonte de despertar; no ESP32-S2 e no S3, só um pad é permitido. Depois de acordar, esp_sleep_get_touchpad_wakeup_status() informa qual pad acordou a placa. Falamos dos detalhes do deep sleep e dos valores de corrente no artigo ESP32 deep sleep.
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}Depois de acordar, o código começa de novo pelo setup(), porque a RAM é apagada no deep sleep. Para manter a contagem de despertares, colocamos RTC_DATA_ATTR na frente da variável; essas variáveis ficam na pequena memória RTC, que é preservada durante o sono. Como a medição de toque continua durante o sono, a corrente em deep sleep fica um pouco maior do que com despertar por timer; leve isso em conta ao estimar a autonomia da bateria. O bloco #if no código permite que o mesmo programa compile com o limiar certo também no ESP32-S2 e no S3.
Pinos de toque do ESP32 com MicroPython
Se você gravou o MicroPython no seu ESP32, faz a mesma coisa com a classe TouchPad do módulo machine. O método read() retorna o mesmo valor que o touchRead() no Arduino; no ESP32 clássico, ele também cai ao tocar. Para despertar, usa-se esp32.wake_on_touch(True) e o método config(limiar) do 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)O Raspberry Pi Pico não tem sensor de toque capacitivo integrado. Se você quer um botão de toque com um Pico ou um Arduino Uno, a solução mais fácil é um módulo TTP223 pronto; ele detecta o toque sozinho e entrega um sinal digital comum.

Problemas com umidade, água e ruído
A detecção capacitiva detecta água além de dedos. Uma gota de água ou muita umidade sobre o pad aumenta a capacitância, o valor cai e o botão pode disparar sozinho. Em projetos para banheiro, cozinha ou área externa, coloque o pad atrás de uma superfície que não retenha água, escolha um limiar um pouco mais baixo e exija que o toque dure pelo menos 50–100 ms. Fios longos, relés e motores por perto e uma fonte USB ruim também fazem os valores oscilarem. A tabela abaixo resume os problemas mais comuns e suas soluções.
| Problema | Causa provável | Solução |
|---|---|---|
| Dispara sozinho | Limiar muito perto do valor em repouso | Baixe o limiar para 60% do valor em repouso, adicione histerese |
| Os valores ficam oscilando | Fio longo ou solto, alimentação ruidosa | Encurte o fio, faça a média de 4–8 leituras, use um bom cabo USB |
| A sensibilidade mudou ao desconectar do computador | A referência de terra mudou | Calibre na montagem final, com a bateria ou a fonte |
| Dispara com umidade ou com uma gota de água | A água aumenta a capacitância | Coloque o pad atrás de uma cobertura, exija um tempo mínimo de toque |
| Um pino nunca muda | Foi usado um GPIO que não é de toque | Confira a tabela de pinos; os GPIO 34–39 não são pinos de toque |
| A placa não inicia | O pad e o fio no GPIO 12 atrapalham o boot | Mude o pad para o GPIO 4, 13, 27, 32 ou 33 |
Pinos de toque no ESP32-S3 e em outros modelos
O ESP32-S2 e o ESP32-S3 usam hardware de toque de segunda geração e diferem do ESP32 clássico em três pontos importantes. Primeiro, os canais ficam nos GPIO 1–14 e são 14; T1 é o GPIO 1 e T14 é o GPIO 14. Segundo, os valores são bem maiores e sobem ao tocar; um pad que lê cerca de 20.000 em repouso pode passar de 40.000 ao ser tocado. Terceiro, o limiar em touchAttachInterrupt e touchSleepWakeUpEnable não é um valor absoluto, mas um aumento em relação ao valor em repouso. No S3 você também pode usar touchInterruptGetLastStatus(pino) para saber se o pad ainda está pressionado. O ESP32-C3 e o ESP32-C6 não têm sensor de toque. Se você escreve código para mais de um modelo, separe-os com CONFIG_IDF_TARGET_ESP32, como no exemplo de despertar.
Ideias de projetos com pinos de toque
- Luminária de mesa: um interruptor liga/desliga invisível feito de fita de cobre colada atrás de uma tampa de madeira, com toque longo para ajustar o brilho.
- Dimmer com slider: mude o brilho e a cor de uma fita de LED WS2812B com um slider de três pads.
- Campainha ou dispositivo de recados a bateria: o ESP32 espera em deep sleep, acorda quando o pad é tocado e envia uma notificação por Wi-Fi.
- Piano de frutas: um brinquedo com fios ligados a bananas e maçãs que toca uma nota diferente para cada fruta; um buzzer pode fazer o som.
- Painel de senha escondido: uma fechadura que abre quando quatro pads escondidos dentro de uma caixa são tocados na ordem certa.
Os pinos de toque do ESP32 dão ao seu projeto uma interface de toque com alguns centímetros de papel-alumínio e poucas linhas de código. No app BlueGrays você encontra projetos como LED piscando com ESP32, controle de LED com botão, brilho de LED com PWM e deep sleep, cada um com esquema do circuito e código passo a passo; troque os botões pelos pads de toque deste guia e monte a sua própria versão.
Perguntas frequentes
Quantos pinos de toque o ESP32 tem?
O ESP32 clássico tem 10 canais de toque capacitivos: T0–T9, que são os GPIO 4, 0, 2, 15, 13, 12, 14, 27, 33 e 32. O ESP32-S2 e o ESP32-S3 têm 14 canais nos GPIO 1–14. O ESP32-C3 e o C6 não têm sensor de toque.
Qual deve ser o valor do touchRead no ESP32?
No ESP32 clássico, com um fio curto, normalmente você lê 40–80 em repouso e 10–25 ao tocar. O número exato depende do fio, do tamanho do pad e do ambiente. Medir na sua própria montagem e escolher cerca de 60 por cento do valor em repouso como limiar é um bom começo.
Como definir o limiar de toque do ESP32?
Primeiro meça com o touchRead os valores do pad em repouso e tocado. No ESP32 clássico, coloque o limiar entre os dois, geralmente em 60 por cento do valor em repouso. O método mais robusto é medir o valor em repouso na inicialização, calcular o limiar no código e adicionar histerese.
Um pino de toque pode acordar o ESP32 do deep sleep?
Sim. Use touchSleepWakeUpEnable(pino, limiar) para tornar o pad uma fonte de despertar e depois chame esp_deep_sleep_start(); a placa reinicia quando o pad é tocado. O ESP32 clássico aceita vários pads; o ESP32-S2 e o S3 aceitam um.
Por que o pino de toque do meu ESP32 dispara sozinho?
Normalmente o limiar está muito perto do valor em repouso, o fio do pad é longo ou há umidade. Baixe o limiar, faça a média de várias leituras, adicione histerese e encurte o fio. Também é importante calibrar com a fonte de alimentação que a placa vai usar no final.
Por que o touchRead do ESP32-S3 aumenta ao tocar?
O ESP32-S2 e o S3 usam hardware de toque de segunda geração, no qual o valor medido sobe com a capacitância. Por isso, no S3 o valor aumenta ao tocar e fica na casa das dezenas de milhares. O limiar de interrupção e de despertar também é um aumento em relação ao valor em repouso, não um número absoluto.
Projetos para montar depois desta leitura
Ver todos os projetos
LED piscando com ESP32
Ensina o uso básico de uma saída GPIO no ESP32. Fazemos um LED piscar ligando e desligando um pino digital. É a versão para ESP32 do clássico projeto blink do Arduino UNO: os comandos básicos de blink no ambiente Arduino são os mesmos, mas a disposição dos pinos e os níveis de 3,3 V dos GPIOs do ESP32 diferem dos do Arduino UNO.

Controle de LED com botão no ESP32 (alternância)
Cada vez que o botão é pressionado, o estado do LED muda: se estiver aceso, apaga; se estiver apagado, acende. É o padrão clássico de alternância. Com debounce, eliminamos o ruído mecânico dos contatos do botão para garantir uma única mudança a cada pressionamento.

LED integrado do ESP32 piscando
Faça o LED azul integrado do ESP32 DevKit V1 piscar. Nenhum componente externo é necessário! O primeiro projeto para experimentar ao comprar um ESP32. GPIO 2 está conectado ao LED integrado.

Variação gradual do brilho do LED com PWM no ESP32
Varie suavemente o brilho do LED de 0 ao máximo e do máximo a 0. Controlamos o PWM com analogWrite(), como no Arduino. A mesma sintaxe funciona sem problemas com ESP32 Arduino Core 3.0+. Basta definir o pino e usar pinMode e analogWrite.

Controle de LED RGB com ESP32
Gere inúmeras cores com um único LED RGB em vez de 3 LEDs separados. Como no Arduino, ajustamos os valores R/G/B com analogWrite() para criar uma transição de arco-íris. Você vê a teoria das cores na prática, como vermelho + verde = amarelo.

ESP32 em sono profundo — Economia de bateria (OLED + contador na RAM RTC)
O modo de sono profundo do ESP32 reduz o consumo de corrente para ~10 µA ao desligar a CPU e a maioria dos periféricos, sendo essencial para dispositivos IoT alimentados por bateria. Neste projeto, usamos três fontes de despertar: um temporizador (15 segundos), um pino externo (EXT0 — botão no GPIO 33) e toque (T0/GPIO 4). As variáveis marcadas com RTC_DATA_ATTR são preservadas durante o sono profundo, mantendo os contadores de inicializações e de despertares por temporizador e botão.

Luminária com mistura de cores e ESP32 (3 potenciômetros + LED RGB + OLED)
Uma luminária inteligente que permite misturar a cor que você quiser girando três potenciômetros com o ESP32! Ao girar os potenciômetros de vermelho, verde e azul, o LED RGB de cátodo comum muda de cor em tempo real. O display OLED SSD1306 mostra os valores de cada cor na faixa de 0–255, barras de preenchimento e o código HEX da cor para a web, como #FF8040.

Iluminação inteligente com ESP32 (PIR + LDR + relé + OLED)
Transforme a iluminação do corredor, banheiro ou despensa em iluminação inteligente com ESP32! Com um sensor de movimento PIR, um sensor de luz LDR e um módulo relé, montamos o cenário clássico de "acender a luz ao detectar movimento no escuro" — se o ambiente já estiver claro, o movimento NÃO aciona a luz, economizando energia durante o dia. A luz fica acesa por 30 segundos; se o movimento continuar, o temporizador reinicia e a luz permanece acesa por mais tempo.
Mais artigos
- Sensor de toque TTP223 com Arduino: modos, ligação e uma luminária de toque
- ESP32 deep sleep: fontes de despertar, consumo de corrente e autonomia da bateria
- Interrupções no Arduino: attachInterrupt, regras da ISR e debounce
- O que é ESP32? Características, configuração na Arduino IDE e seu primeiro projeto com Wi-Fi
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

