banner

Ir para o Forum

ESP32 com Touch Button Capacitivo

Não sei se vocês já conhecem, mas hoje vou falar do Touch Capacitivo, um recurso muito interessante do ESP32. Usamos o exemplo de uma torneira, que abre e fecha conforme o toque da nossa mão. Mostramos um equipamento importado, mas essa tecnologia já existe no Brasil, inclusive com outros tipos de aparelhos.


Nosso objetivo neste projeto de hoje, portanto, é criar um programa para utilizarmos os sensores de touch capacitivo, que o ESP32 tem suporte nativo. Já temos também hoje em dia suporte para Arduino IDE. Com esse recurso, podemos substituir um botão, por exemplo. Basta apenas um fio ligado ao pino e nosso próprio dedo para ativá-lo.

Introdução

Os sensores capacitivos estão presentes no nosso dia a dia em diversos equipamentos, como, por exemplo, no seu smartphone, no seu tablet, no seu microondas, em algumas TVs, carros, enfim, em inúmeros produtos. Podemos dizer que é uma tendência de que praticamente todos os eletrodomésticos tenham alguma função de toque.
O Touch também favorece o design, pois tira a necessidade de implantação de um botão mecânico, que pode vir a quebrar. Cabe ao projetista resolver se prefere utilizar esse recurso ou não. Veja o vídeo:

Funcionamento

Os sensores capacitivos funcionam baseados na variação da capacitância gerada pelo toque no eletrodo. Essa variação é lida e convertida pelo ADC. Abaixo temos um esquema de como funciona o eletrodo, o substrato, que mostra a localização do ESP32 com a capacitância.

WiFi NodeMCU-32S ESP-WROOM-32

Deixo aqui a pinagem, através da qual você pode perceber que nos PinOuts você tem os pinos que podem ser Touch. São seis do lado esquerdo da imagem e outros três do lado direito.

Montagem

Na nossa montagem temos o ESP32 alimentado pela USB, dois leds e dois jumpers. O primeiro fio, de cor violeta, é responsável por ligar e desligar os leds. O segundo fio, de cor azul, faz os leds piscarem quando acionado.
A montagem é simples e basta você esticar dois fios e colocar dois leds com resistores e é assim que vai funcionar o software.

Código

Como o ESP32 tem suporte nativo ao Touch Capacitivo, nosso ponto chave será a função touchRead(pino), pois ela nos retornará um valor inteiro positivo. E, ao tocarmos o pino referente ao sensor, o valor gerado deve ser o mais próximo de zero.
Lembrando que é importante calibrarmos o sensor antes para termos uma noção do valor que podemos tomar como certeza que houve um toque. Por quê? É que alguns fatores influenciam a função do Touch, como a umidade, por exemplo.

Setup

Aqui, na parte de configuração, vamos ligar os pinos aos leds, bem como os pinos com sensor Touch. Apontamos o valor que nos da a certeza de toque, este identificado através da calibragem, e no código identificado como capacitanciaMaxima. No Setup, programamos os leds.

int pinoVermelho = 16; //pino que ligamos o LED vermelho
int pinoVerde = 17; //pino que ligamos o LED verde
int pinoTouchOn = 4; //pino com sensor touch (pode-se usar a constante nativa T0)
int pinoTouchBlink = 13; //pino com sensor touch (pode-se usar a constante nativa T4)
int capacitanciaMaxima = 20; //valor que nos da a certeza de toque (ache esse valor através da calibragem)

void setup()
{
   Serial.begin(115200);
   delay(1000);
   pinMode(pinoVermelho, OUTPUT);
   pinMode(pinoVerde, OUTPUT);
}

Loop

Nesta parte do código temos as variáveis mediaT0 e mediaT4 porque são os botões que a gente aperta o Touch. Pegamos, então, cem leituras e fazemos uma média. Ato que considero importante.
Quando verifico que a mediaT0 é menor que a capacitância máxima, ou seja, 20, eu acendo os pinos vermelho e verde. Já quando a mediaT4 estiver menor que a capacitância máxima, damos um digitalWrite nestes mesmos pinos para inverter o estado atual dos leds, ou seja, faço eles piscarem.
Ainda aponto aqui que, caso nenhum pino Touch esteja sendo tocado, os pinos permanecem apagados.

void loop()
{
  Serial.println(touchRead(pinoTouchOn));
  Serial.println(touchRead(pinoTouchBlink));
  int mediaT0 = 0;
  int mediaT4 = 0;
  //faz 100 leituras de cada sensor touch e calcula a média do valor lido
  for(int i=0; i< 100; i++)
  {
    mediaT0 += touchRead(pinoTouchOn);
    mediaT4 += touchRead(pinoTouchBlink);
  }
  
  mediaT0 = mediaT0 / 100;
  mediaT4 = mediaT4 / 100;

  //verifica se o valor médio lido no pinoTouchOn é menor que a capacitância máxima definida
  //se verdadeiro, isso caracteriza um toque
  // os LEDs vemelho e verde ficarão acesos
  if(mediaT0 < capacitanciaMaxima)
  {
    digitalWrite(pinoVermelho, HIGH);
    digitalWrite(pinoVerde, HIGH);
  }
  //verifica se o valor médio lido no pinoTouchBlink é menor que a capacitância máxima definida
  //se verdadeiro, isso caracteriza um toque
  // os LEDs vemelho e verde ficarão piscando com um intervalo de 500 ms
  else if(mediaT4 < capacitanciaMaxima)
  {
    digitalWrite(pinoVermelho, !digitalRead(pinoVermelho)); //inverte o estado atual do LED (HIGH/LOW)
    digitalWrite(pinoVerde, !digitalRead(pinoVerde)); //inverte o estado atual do LED (HIGH/LOW)
    delay(500);                   
  }
  //se nenhum dos pinos touch estão sendo tocados, os LEDS ficam apagados
  else{
    digitalWrite(pinoVermelho, LOW);
    digitalWrite(pinoVerde, LOW);
  } 
  delay(10);
}


Faça o download dos arquivos


6 comentários:

  1. Boa noite Professor,
    Rodei o código aqui, no monitor serial ele ate aparece alterações de valores no sensor capacitivo, porem os leds ficam acesos direto, também tentei regular a capacitância mas continua na mesma, somente quando coloco o valor da capacitÂncia em 0 é que os leds desligam, a partir daí não consigo liga-los com o toque.
    Parabéns pela iniciativa e apoio!!!
    Att
    Cristian

    ResponderExcluir
    Respostas
    1. Também gostaria de saber mais, o meu aconteceu a mesma coisa!

      Excluir
  2. Poderia revisar o código? Fazendo um favor.

    ResponderExcluir
    Respostas
    1. Por favor, envie sua dúvida (e seu código) em contato@fernandok.com. Vamos analisa-la.

      Excluir
  3. Olá, pessoal. O código já foi atualizado. Havia um pequeno erro no calculo da média. Agora vai funcionar corretamente. Lembre-se de calibrar o valor da capacitância.
    Peço desculpas pelo erro.
    Abraço e agradeço o alerta!

    ResponderExcluir
  4. Oi. Para uma imagem com mais nitidez do pinout do
    DOIT ESP32 DEVKIT V1
    https://github.com/playelek/pinout-doit-32devkitv1/blob/master/pinoutDOIT32DevkitV1.pdf

    ResponderExcluir

Tecnologia do Blogger.