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.