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()
{
   int mediaT0 = 0;
   int mediaT4 = 0;
   for(int i=0; i< 100; i++) //faz 100 leituras de cada sensor touch e calcula a média do valor lido
   {
      mediaT0 += touchRead(pinoTouchOn)/ 100;
      mediaT4 += touchRead(pinoTouchBlink) / 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); 
   }
   else{//se nenhum dos pinos touch estão sendo tocados, os LEDS ficam apagados
      digitalWrite(pinoVermelho, LOW);
      digitalWrite(pinoVerde, LOW);
   } 
   delay(10);
}



Faça o download dos arquivos


Nenhum comentário:

Tecnologia do Blogger.