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
9 Comentários
Boa noite Professor,
ResponderExcluirRodei 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
Também gostaria de saber mais, o meu aconteceu a mesma coisa!
ExcluirPoderia revisar o código? Fazendo um favor.
ResponderExcluirPor favor, envie sua dúvida (e seu código) em contato@fernandok.com. Vamos analisa-la.
ExcluirOlá, 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.
ResponderExcluirPeço desculpas pelo erro.
Abraço e agradeço o alerta!
Oi. Para uma imagem com mais nitidez do pinout do
ResponderExcluirDOIT ESP32 DEVKIT V1
https://github.com/playelek/pinout-doit-32devkitv1/blob/master/pinoutDOIT32DevkitV1.pdf
Existe alguma forma para ampliar o sinal do toque, estou usando tinta conductiva para captar e a variação é muito grande
ResponderExcluirEu rodei o código e fica piscando o tempo todo os leds.. poderia me ajudar a mantê-los apagas enquanto não há toque em nenhum dos pinos touch?
ResponderExcluirProfessor qual sistema vc usa para sua tv ser touch?
ResponderExcluir