Automação Residencial – Dimmer Touch

A Automação seja ela residencial ou industrial é uma área que vem sendo bastante explorada neste século, sistemas robóticos e outras tecnologias vieram para dar confiabilidade, agilidade e eficácia em todos os processo da industrial.
Nas residências a automação contribui no conforto e no bem-estar diário de quem depõem dessas tecnologias.

Este projeto tem como objetivo criar um circuito DIMMER, capaz de variar a intensidade de luz em um ambiente conforme preferência do usuário através de toques em um sensor touch capacitivo.

Irá funcionar assim:

– 2 toques no sensor desligam os LED’s
– 3 Toques no sensor ligará os LED’s com intensidade máxima.
– Ao manter o dedo no sensor touch, o display mostrará a subida gradativa em porcentagem da luminosidade 0 – 100%.

Montando o projeto

Para o desenvolvimento desse projeto será necessária uma placa Arduino Uno, onde ela será responsável por receber os sinais do Sensor Touch Capacitivo TTP23b e controlar o microcontrolador para variação na saída PWM.
O sinal PWM do Arduino Uno irá controlar a base de um transistor BD135 que com sua variação de corrente controlará a intensidade de luz dos 5 x LED’s de Alto Brilho.
Uma fonte externa será necessária neste projeto, uma fonte +12V que será conectada aos LED’s.

Componentes Utilizados:

Arduino Uno

Sensor Touch Capacitivo TTP23b

Display LCD 16×2 BackLight Azul

Resistor 10k ohm

Resistor 220 ohm

5 x LED’s de Alto Brilho

– Transistor BD135


 

 

 

 

A montagem do protótipo pode ser observada pela figura abaixo:

 

 

OBS: O Plug preto POWER JACK na figura acima representa a fonte externa de +12V

Inicialmente vamos ligar o display LCD aos pinos do Arduino conforme imagem acima, os pinos digitais de 2 ao 7 são de controle do LCD (demonstrados com fios de cor amarela), Alimentação 5V e GND são ligados em comum ao Arduino. O display também necessita de um potenciômetro de 10k para ajuste de contraste conforme acima.
O Sensor Touch tem sua alimentação +5V e a saída de sinais será conectada no pino 8 do Arduino Uno.
Os LEDs serão ligados em paralelo tendo sua corrente limitado por um resistor de 220 ohms com potência de 1W.

Abaixo também temos na prática a visão do protótipo montado:

 

O vídeo demonstrando o funcionamento desse projeto pode ser acessado pela página no Instagram:

Laboratório dos Fundos
https://www.instagram.com/laboratorio_dosfundos/

Desenvolvendo o código

Após montagem do hardware, prosseguimos para o código onde receberá os sinais do sensor touch controlando assim a saída PWM e o display LCD.
O Código como pode ser observado abaixo, será carregado para o microcontrolador ATMEGA328 do Arduino:

#include <LiquidCrystal.h> // inclui a biblioteca LiquidCrystal
#define pwm 9 // define o pino 9 com o nome pwm
#define touch 8 // define o pino 8 com o nome touch
#define tempoMaximoDeUmToque  200 // milisegundos
#define tempoMaximoEntreToques 400 // milisegundos
int count; // cria a variavel count int
int contaToques = 0; // cria a variavel contaToques int
long tempoEspera = 0; // cria a variavel tempoEspera long
long tempoEsperaEntreToques = 0; // cria a variavel tempoEsperaEntreToques long
void executarAcao();
LiquidCrystal lcd ( 7, 6, 5, 4, 3, 2); // define os pinos para comunicação dodisplay lcd

void setup() {
  
  pinMode(pwm, OUTPUT); // define o pino pwm como saída
  pinMode(touch, INPUT); // define o pino touch como entrada 
  lcd.begin(16,2); // inicia a comunicação com o lcd 
  lcd.setCursor(0,0); lcd.print("  DIMMER TOUCH"); // escreve no lcd DIMMER TOUCH
}

void loop() {
  
  int sensortouch = digitalRead(touch); //verifica o estado do sensor touch

  if (sensortouch == HIGH) { //se o sensor detectou toques, executa o codigo abaixo

     //espera um tempo para nao detectar o mesmo toque mais de uma vez 
     if (tempoEspera == 0) {
        tempoEspera = tempoEsperaEntreToques = millis(); 
        contaToques++;} 
     else if ((millis() - tempoEspera) &gt;= tempoMaximoDeUmToque) {
        tempoEspera = 0;}
  }

    //caso exceda o tempo maximo entre toques, zera o contador de toques
  if ( (contaToques != 0) &amp;&amp; ((millis() - tempoEsperaEntreToques) &gt; tempoMaximoEntreToques) ) {
     executarAcao();
     contaToques = 0;
     tempoEsperaEntreToques = millis(); }
     lcd.noBlink(); // desativa o blink no cursor do display

    // se o touch for mantido prescionado, executa o código abaixo
  if(sensortouch == HIGH ){  
     lcd.display(); // liga o display
     lcd.setCursor(0,1); lcd.print("                "); // limpa os caracteres do display
     analogWrite(pwm,count); // escreve no formato pwm a saída do pino 9
     count++; // contador para subir o nivel pwm até 250
     lcd.set<strong><em> </em></strong>Cursor(0,1); lcd.print(count * 0.4); // converte o nivel pwm 250 para porcentagem %
     lcd.setCursor(4,1); lcd.print("%");
     lcd.setCursor(15,1);
     lcd.blink(); // ativa o blink no cursor do display
     delay(30); // delay
   if (count == 250){ // se pwm estiver em 250 ou 100% no display, zera o contador
     count = 0;
     lcd.setCursor(1,1); lcd.print("  "); // limpa caracteres no display
     }}
  }
void executarAcao() {
  
  switch (contaToques) { // verifica a variavel contaToques
    case 2: // caso 2 toques
       lcd.noBlink();
       digitalWrite(pwm, LOW);  // leva nivel baixo para saída 
       lcd.setCursor(0,1); lcd.print("LED OFF "); // escreve  LED OFF no display
       delay(2000); // delay
       lcd.noDisplay(); // desliga display
       break;
    case 3: // caso 3 toques
       lcd.noBlink();
       digitalWrite(pwm, HIGH); // leva nivel alto para saída
       lcd.setCursor(0,1); lcd.print("LED ON  "); // escreve  LED ON no display
       break;
       }
  }

Você pode consultar, baixar, modificar e compartilhar o código deste tutorial em nosso repositório do GitHub! E lá você encontra todos os códigos já publicados aqui no blog! Venha compartilhar conhecimento com toda a comunidade maker!

  

Mergulhando no Projeto

Software

 

Inicialmente iremos incluir a biblioteca LCD <LiquidCrystal.h>.

Logo após, são nomeados os pinos os pinos utilizados neste protótipo e criada variáveis para armazenamento e controle dos comandos.

tempoMaximoDeUmToque e tempoMaximoEntreToques atuam em conjunto e podem ser re-calibrados posteriormente para melhor intervalo de toques no sensor.

Essa série de definições e inclusões terminam com o mapeamento dos pinos utilizados no display LCD  LiquidCrystal lcd ( 7, 6, 5, 4, 3, 2).

 

Função Setup

Na função setup iremos definir as portas onde conectados a base do transistor (PWM) como saída e o sinal do sensor touch como entrada (pinMode(pwm, OUTPUT) e pinMode(touch, INPUT)).

Em lcd.begin(16,2) inicia-se a comunicação com o display LCD e escreve na linha 1 do display a palavra “DIMMER TOUCH” com lcd.print(”  DIMMER TOUCH”).

 

Função Loop

A função loop já inicia criando a variável sensortouch armazenando nela uma possível mudança de estado do sensor touch, caso ele venha a ser pressionado

int sensortouch = digitalRead(touch);.

 

if (tempoEspera == 0) e if ( (contaToques != 0) && ((millis() – tempoEsperaEntreToques) > tempoMaximoEntreToques) ) atuam em conjunto.

Como o loop do programa acontece mais rápido que o toque no sensor touch esses artifícios serão necessários para que o sistema não detecte o mesmo toque mais de uma vez.

Caso o tempoMaximoEntreToques exceda, a contagem dos toques é zerada, o programa já está configurado para o intervalo ENTRE toques de 400 milissegundos e tempoMaximoDeUmToque de 200 milissegundos (tempo que o dedo permanecerá pressionando o touch no momento do toque).

Ainda na função Loop , além das contagens dos toques o código sequente atua quando o dedo é permanecido no touch.

Está parte do código pergunta novamente se if(sensortouch == HIGH ).

Caso for verdade o sistema conclui que o sensor touch continua pressionado e a intensão do usuário não é de apenas toques e inicia uma série de comandos.

Mantendo pressionado o sensor touch o nível da saída PWM pino 9 irá subir até o seu valor máximo de 250 que deixa a intensidade dos LED’s no hardware máxima.

analogWrite(pwm,count);

count++;

if (count == 250)

count = 0;

Ao mesmo tempo o display indica esta intensidade em porcentagem para o usuário através da fórmula lcd.print(count * 0.4);.

Voltando ao comando dos toques eles são contados e armazenados na variável contaToques e definidas as ações na função void executarAcao() como mostrado abaixo:

 

case 2: // caso 2 toques

digitalWrite(pwm, LOW);

lcd.print(“LED OFF “);

 

case 3: // caso 3 toques

digitalWrite(pwm, HIGH);

lcd.print(“LED ON  “);

 

Hardware

 

Sensor Touch Capacitivo TTP23b

Este Sensor Touch capacitivo TTP223B foi baseado no CI TTP223B, um componente capaz de detectar toques. Seu funcionamento é bem simples: ao tocar a região indicada, a saída do sensor é ativada. Sem tocar o sensor, não há atividade na saída. Assim o componente funciona como um sensor de toque.

 

Pinagem:

– SIG: Saída Digital

– VCC: 2,5 – 5V

– GND: GND

 

Display LCD 16×2 BackLight Azul

O Display LCD 16×2 possibilita e interação do programa com o usuário.

As mensagens podem ser enviadas simultaneamente com o processamento no programa possibilitando assim o envio de dados, texto e sinais lidos nas entradas do microprocessador. O LCD possui 16 colunas e 2 linhas com luz de fundo azul e escrita branca.

Pinagem:

Conclusão

Podemos por esse projeto aprender um pouco mais sobre sistemas de automação residenciais, podendo criar um DIMMER. Esta aplicação pode ser implementada com outros sensores e comandos visando até um controle total de uma residência quando visado sua parte elétrica.

Deixem suas sugestões e perguntas, compartilhe conhecimento!

 

Referências

Datasheet Transistor BD135

https://www.onsemi.com/pub/Collateral/BD135-D.PDF

Sobre Pedro Pereira 8 artigos
Engenheiro Eletricista, Técnico em Eletrônica e Entusiasta na área de Sistemas Embarcados. https://www.instagram.com/laboratorio_dosfundos/

2 Comentários

  1. Muito legal para mim tudo novidade é muita vontade de conhecer cada vez mais e parabéns por disponibilizar está informações para todos

Deixe uma resposta

O seu endereço de email não será publicado.


*