segunda-feira, abril 09, 2012

Interruptor Touch - Diagrama e código fonte

Depois de muitas perguntas no post anterior (leia o post anterior primeiro), fiz um diagrama do circuito do interruptor touch, estou postando também o código fonte.
Para montar este projeto, você precisa de conhecimentos básicos de Arduino e conhecimento médio em eletrônica, além de muito cuidado com a corrente AC, por isso aqui vai uma aviso inicial:

Atenção: Esse projeto é perigoso, usa corrente AC, qualquer falta de cuidado pode matar. Se você nunca mexeu com corrente AC antes, solicite o acompanhamento de um profissional.

Agora podemos ir a lista de componentes:

- Arduino, pode ser qualquer um, mas se for colocado dentro da tomada, use um Arduino Pro Mini ou outro Arduino pequeno.
- Resistor de 330 ohms
- Resistor de 1k
- Led Branco de alto brilho (ou outra cor que desejar)
- Transistor BC548 ou 2N2222
- Diodo 1N4004
- Relé 5v
- 10 resistores de 1M



Para a montagem não é necessário placa, você pode soldar um componente ao outro e usar termoretrátil para isolar (veja no post anterior).

O relé tem que ser escolhido de acordo com a potência da lâmpada e da voltagem da região onde você mora, na dúvida pergunte a um técnico. Onde diz "fios da lâmpada" são os dois fios anteriormente ligados ao interruptor normal, essa parte foi baseada neste post: Using relays with Arduino - leia antes de continuar.

O pedaço de metal que funciona como sensor pode ser até aquele lacre de lata de nescau/neston. Papel alumínio não funciona muito bem.

O resitor do touch, varia de 1M a 10M por isso coloquei na lista para que se compre 10 de 1M, você vai precisar testar esse valor no seu circuito, ele varia de acordo com o tamanho do metal do sensor, espessura do vidro e outros. Conforme testei, valores acima de 10M tornam o sensor "lento" ele demora a detectar o toque, mas isso pode variar de projeto pra projeto. Mais explicações na página do CapSense


Código fonte:

O código é Arduino 0022, não sei se funciona na IDE nova. A lib está no link CapSense acima.

#include

const int lampada = 8; //circuito do rele
const int led = 10; //led indicador do interruptor
const int cap1 = 4;
const int cap2 = 2;
const int ledL = 1; // valor PWM minimo para o led quando a lampada estiver desligada
const int sensibil = 5000;  //varia de acordo com o resistor e tamanho da superficie capacitiva, mude para testar.

CapSense   cs = CapSense(cap1,cap2);    

bool ligado = 0;

void setup()                   
{
  cs.set_CS_AutocaL_Millis( 0xFFFFFFFF);  

  pinMode(lampada, OUTPUT); 
  pinMode(led, OUTPUT);
  analogWrite(led, ledL);
}

void loop()                   
{
  long cap =  cs.capSense(30); //chama a funcao que le a capacitancia...

  if (cap > sensibil ) //...se for maior que o estipulado, acende ou apaga a luz,
  {
    if (ligado)
    {
      ligado = !ligado;
      digitalWrite(lampada, ligado);
      for (int i = 255; i > ledL; i--)  //laco for para diminuir a luminosidade do led gradativamente. Durante este período (2seg) a cap sense nao eh chamada, o que garante que a lampada nao piscara e apagara novamente. O mesmo vale para o outro for.
      {
        analogWrite(led, i);
        delay(5);
      }
    }
    else
    {
      ligado = !ligado;
      digitalWrite(lampada, ligado);
      for (int i = ledL; i < 255; i++)
      {
        analogWrite(led, i);
        delay(5);
      }
    }
  }       
}

É isso, qualquer pergunta usem os comentários.

36 comentários:

Alex disse...

Olá Saulo! Parabéns pelo projeto! Eu tenho algumas duvidas, se puder fazer a gentileza de me esclarecer eu agradeço! Bom como você fez para alimentar o arduino com os 5v dentro do interruptor? Você alterou a fiação original para isso e colocou 110v pra poder usar uma fonte 5v ou dá pra obter os 5v mantendo a fiação original (ligando a fonte em série). Muito obrigado!

Saulo disse...

Alex,
pensei em várias possibilidades, algumas mais simples, outras mais complexas. Mas no fim puxei um fio a mais até o interruptor, coloquei um carregador de celular para alimentar o arduino e problema resolvido. Não tentei desenvolver muito as outras formas mais complexas, já que era muito mais rápido e prático puxar um fio a mais.

Abraço

bruno disse...

porfavor responda as perguntas do volante obrigado

Saulo disse...

Bruno,

Se tiver dúvidas sobre o joystick de volante, pergunte nos posts dedicados a ele.

Abraço

Samuel disse...

"Esse projeto é perigoso, usa corrente AC", hehe, parece a briga do Tesla e do Thomas Edson.

Peu disse...

Gostei muito do seu blog ha més estol tentando criar um controle Usb usando o controle do SNES para PC sera que vc poderiam fazer um tutorial criando um controle ?

Peu disse...

tem esse video para ajudar vc nao sei qual o componentes que ele usam
http://www.youtube.com/watch?v=Io6m0QyuFCs

Saulo disse...

Pedro,

Não sei como fazer usb, mas talvez com um teclado usb e a idéia deste post sai alguma coisa: http://crepusculotecnologico.blogspot.com.br/2007/02/o-joystick-de-mouse-evoluiu-parte-2.html

ou usa esse adaptador: http://www.livrariasaraiva.com.br/produto/2880714/adaptador-usb-duplo-para-joysticks-ps2-e-ps3-acessorio

Abraço

Jean Lucas disse...

cara só umas perguntas sobre o joystick de volante:

se eu colocar um resistor variavel no lugar do botao da embreagem vai funcionar igual ao acelerador??

se eu fizer o esquema do plugue serial mas nao adaptar no teclado e colocar direto no pc vai funcionar mesmo assim?

Anônimo disse...

Ola amigo,

Gostei muito do projeto, não entendo nada de Arduino mas sou desenvolvedor (15 anos) py, c# e java voltado para web, a minha pergunta é a seguinte:

Este projeto requer muita experiencia para quem esta querendo começar agora ?

abs camarada

Saulo disse...

Jean,

Respondi uma pergunta igual a sua no post do joystick, olhe lá.

Anônimo,

Se você entende java então vai entender o código do Arduino, mas infelizmente eu acho que esse projeto é relativamente complicado se você nunca mexeu com eletrônica antes. Mas ainda assim vale a tentativa, por algum lugar tem que começar.

Carlos disse...

Olá, gostaria de saber teria como fazer o touch sem resistor? sem nada, por exemplo, se eu ligar o fio conectado no metal tem problema sem o resistor? Sou novo nessa área não entendo muita coisa.

Saulo disse...

Carlo,

Acho que sem resistor não vai funcionar, mas vale a tentativa. Mas compre uns resistores, é barato.

Anônimo disse...

Olá

Esta tendo simular este código mas da erro na linha.

CapSense cs = CapSense(cap1,cap2);

mensagem dizendo que o nome e tipo não esta declarado.

Pode me ajudar!!

Obrigado.

Saulo disse...

Anônimo,

Acho que faltou a lib capsense, baixe-a e instale, o link está no post.

Abraço

Renato disse...

Olá, parabéns pelo projeto.

A única dúvida é como você fez para energizar o Arduino, pois não vi nenhuma material.

abs,

Saulo disse...

Renato,

Usei um carregador de celular. Qualquer coisa que ligue o arduino serve.

Abraço

Unknown disse...

Cara, achei teu projeto muito legal, estou pensando em fazer algo parecido porém acredito que usar a fonte de celular fique um pouco complicado.
Estava olhando alguns itens na internet e encontrei conversores para alimentação de leds ( http://dx.com/p/3w-dc-12v-constant-voltage-power-supply-126775 ) vc acha que dá pra usar um destes pra alimentar o arduino?

Anônimo disse...

Saulo, boa noite!
Achei o seu projeto muito interessante, porem na hora que vou simular o código fonte, está dando um erro nas linhas abaixo:

CapacitiveSensor cs_4_2 = CapacitiveSensor(4,2);
CapacitiveSensor cs_4_5 = CapacitiveSensor(4,5);
CapacitiveSensor cs_4_8 = CapacitiveSensor(4,8);

eu fiz os downloads da pagina do arduino playground, descompactei na pasta "arduino-1.0.4\libraries", porem mesmo assim não esta funcionando.

poderia por gentileza me ajudar.

Grato pela sua atenção.

Saulo disse...

Matheus,

Nunca testei um destes, mas acredito que funcione. Mas cuidado, o Arduino Nano é 5v e não 12v, esse ali serve para um Arduino comum.
A fonte de celular não é a melhor opção, mas ainda funciona, e fazem quase 2 anos.


Anonimo,

Copie as pastas CapacitiveSensorDue e CapacitiveSensor para a pasta libraries.

Abraços

Gilberto Galindo disse...

Olá Saulo, boa noite, parabéns pelo projeto.

Estou com um problema, o meu sensor só funciona se houver toque direto nele, colocando abaixo de um vido, por menor que seja a espessura, ele não reconhece, você tem alguma idéia do que pode ser?

Att,

Gilberto Galindo

Saulo disse...

Gilberto,

Este problema pode ser corrigido testando outros valores de resistência, tente também colar o sensor no vidro, sem deixar ar entre as duas peças.

Abraço

Unknown disse...

Bom dia primeira mente parabéns pelo projeto muito bom mesmo.
Porem precisaria de ajuda pois esta dando erro
CapSense cs =CapSense(cap1,cap2);

ja fiz os Dia.b.os e não consigo acertar, ja instalei as bibliotecas e continua o erro. Estou tentando fazer um projeto com interruptores capacitivos e controle infrared a principio. Mas ja não consigo de forma alguma fazer o dito sensor capacitivo, o qual o seu ficou simplesmente perfeito melhor que da loja. Por gentileza vc poderia me auxiliar na realização deste sensor capacitivo. e-mail baratas.cdr@gmail.com

Att: marcelo dos santos
grato

Roberto disse...

Olá,
Recentemente tentei montar um interruptor touch como o seu, porém ao executar o código, aqui disponibilizado , o mesmo fica Acendendo e apagando a luz independente do touch

Saulo disse...

Marcelo,

Cole o erro que acontece. Mas já adianto que se ele ocorre neste linha é a lib que não está certa.


Roberto,

Neste caso, acho que o valor desta variável está muito baixo: const int sensibil = 5000; tente valores mais altos, aumentando de 200 em 200 até achar um que funcione e que tenha uma margem de segurança pra que a lampada não pisque.
Abraço

Roberto disse...

Saulo,

Na verdade estou testando com Leds...

Porém o Led do Rele pisca a cada 5 Segundos... não consigo compreender o porque...


Tu tem algum outro Blog pois vi um post exatamente igual a este...

http://www-mundocaseiro.blogspot.com.br/2011/10/interruptor-touch-com-arduino-pro-mini.html

Saulo disse...

Roberto,

coloque esta linha abaixo de 'long cap = ...":
Serial.println(cap);

Abra o serial monitor da IDE e veja quais valores o sensor está lendo, teste sem toque e com toque.
Baseado nos valores que aparecerem tu pode ajustar a sensibilidade.

Não tenho outro blog, só este, mas não é a primeira vez que copiam textos meus, fazer o que... mas obrigado pelo aviso.

abraço

Mauro disse...

Saulo

Tentei compilar o código, e como o pessoal a cima, encontrei os mesmos erros. Comparando seu código com o exemplo da lib, fiz umas modifcações, ficando assim o codigo:

#include

const int lampada = 8; //circuito do rele
const int led = 10; //led indicador do interruptor
const int cap1 = 4;
const int cap2 = 2;
const int ledL = 1; // valor PWM minimo para o led quando a lampada estiver desligada
const int sensibil = 5000; //varia de acordo com o resistor e tamanho da superficie capacitiva, mude para testar.

CapacitiveSensor cs = CapacitiveSensor(cap1,cap2);

bool ligado = 0;

void setup()
{
cs.set_CS_AutocaL_Millis( 0xFFFFFFFF);

pinMode(lampada, OUTPUT);
pinMode(led, OUTPUT);
analogWrite(led, ledL);
}

void loop()
{
long cap = cs.capacitiveSensor(30); //chama a funcao que le a capacitancia...

if (cap > sensibil ) //...se for maior que o estipulado, acende ou apaga a luz,
{
if (ligado)
{
ligado = !ligado;
digitalWrite(lampada, ligado);
for (int i = 255; i > ledL; i--) //laco for para diminuir a luminosidade do led gradativamente. Durante este período (2seg) a cap sense nao eh chamada, o que garante que a lampada nao piscara e apagara novamente. O mesmo vale para o outro for.
{
analogWrite(led, i);
delay(5);
}
}
else
{
ligado = !ligado;
digitalWrite(lampada, ligado);
for (int i = ledL; i < 255; i++)
{
analogWrite(led, i);
delay(5);
}
}
}
}

Aqui compilou, mas não pude testa-lo no Arduino.

Att. Mauro

Karlos henrique disse...

Por favor é possivel vc fazer a programação do arduino do capsense para mim ligar tres cargas diferentes.. se puder obg é com urgencia... tcc

Saulo disse...

Karlos,

Qual é exatamente a teu problema?

Roberto disse...

Se não fosse pedir muito poderia por gentileza reproduzir o esquema utilizando o Fritzing ? pois não tenho muito conhecimento em eletronica e não consigo identificar o diagrama... e nem sem o que fazer com a 3 perna do bc548

JKL disse...

Esta de parabéns, mas queria saber se poderia substituir o sensor que faz o acionamento da lampada por um Modulo Sensor De Touch Toque Capacitivo Arduino Arm Avr Pic, será que funcionaria bem?

JKL disse...

Agora esta correto.

#include

const int lampada = 8; //circuito do rele
const int led = 10; //led indicador do interruptor
const int cap1 = 4;
const int cap2 = 2;
const int ledL = 1; // valor PWM minimo para o led quando a lampada estiver desligada
const int sensibil = 5000; //varia de acordo com o resistor e tamanho da superficie capacitiva, mude para testar.

CapacitiveSensor cs = CapacitiveSensor(cap1,cap2);

bool ligado = 0;

void setup()
{
cs.set_CS_AutocaL_Millis( 0xFFFFFFFF);

pinMode(lampada, OUTPUT);
pinMode(led, OUTPUT);
analogWrite(led, ledL);
}

void loop()
{
long start = millis();
long cap = cs.capacitiveSensor(30); //chama a funcao que le a capacitancia...

if (cap > sensibil ) //...se for maior que o estipulado, acende ou apaga a luz,
{
if (ligado)
{
ligado = !ligado;
digitalWrite(lampada, ligado);
for (int i = 255; i > ledL; i--) //laco for para diminuir a luminosidade do led gradativamente. Durante este período (2seg) a cap sense nao eh chamada, o que garante que a lampada nao piscara e apagara novamente. O mesmo vale para o outro for.
{
analogWrite(led, i);
delay(5);
}
}
else
{
ligado = !ligado;
digitalWrite(lampada, ligado);
for (int i = ledL; i < 255; i++)
{
analogWrite(led, i);
delay(5);
}
}
}
}

Unknown disse...

ola parabéns pelo projeto,muito bom mesmo!bem eu consegui replicar exatamente o q vc fez ficou muito bom,mas agora gostaria de colocar mais de um botão touch!...porém nao consigo mesmo,sou novo em relação ao Arduíno e n estendo muito da linguagem de programação pode me ajudar?agradeço.

Saulo disse...

Willian, a demo sketch da capSense http://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense explica como usar mais de 1 touch.

di Souza disse...

Olá meu amigo. não consigo fazer o led que ilumina o botão touch trocar a intensidade conforme a lâmpada acende e apaga. Um abraço.