Vamos controlar um interruptor com o Arduino?

Por Filipe Caetano | MagicKey para o PPLWARE
Na sequência dos artigos que temos apresentado para a plataforma Arduino, hoje demonstrar como controlar um interruptor. Este interruptor “partilhado” permitirá que a luz seja controlada através de um normal interruptor ou ainda a partir do computador.

Neste artigo vamos disponibilizar o código fonte, para que seja possível controlar uma saída digital, de acordo com as leituras feitas no interruptor ligado a uma porta digital de entrada e de acordo com os dados recebidos do computador via porta série.

arduino_01

Tal como no anterior artigo acerca do Arduino (ver aqui) partimos de um exemplo para construir o nosso código, no entanto desta vez foi necessário realizar consideráveis alterações.

Visto que iremos ter que ter uma entrada digital, onde vamos ligar o botão do interruptor, o exemplo escolhido foi Digital->Button.

Na comunicação do Arduino com o computador nos dados trocados entre eles definiu-se

  • zero significaria a luz desligada
  • e um valor diferente de zero que a luz ligada.

O código desenvolvido para o Arduino foi o seguinte:

const int buttonPin = 2; // the number of the pushbutton pin
 
const int ledPin = 13; // the number of the LED pin
 
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
int buttonStatemem = 0;
int luzon = 0;
 
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
 
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
 
//inicialização da porta a velocidade de 9600
Serial.begin(9600);
}
void loop(){
 
//verifica se existem dados na porta serie para leitura
if (Serial.available())
{
if(Serial.read()==48) //0 em ascii é 48
{
luzon = 0;
}
else
{
luzon=1;
}
}
 
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
 
// Verifica se o botão se encontra primido e se ainda não foi tratado
if(buttonState==HIGH && buttonStatemem==LOW)
{ 
if(luzon == 0)
{
luzon = 1;
}
else
{
luzon = 0;
}
buttonStatemem=HIGH;
}
else if(buttonState==LOW)
{
buttonStatemem=LOW;
}
 
//Liga ou desliga a o Led (luz)
if(luzon == 0)
{
digitalWrite(ledPin, LOW);
}
else
{
digitalWrite(ledPin, HIGH);
}
 
// Envia o estado da luz
Serial.println(luzon);
delay(500);
}

A imagem seguinte mostra a montagem muito simples feita no Arduino.

arduino_00

Pode ver-se que o botão (B) liga aos 5 volts e ao pino 2 tal como definimos no código. È conveniente adicionar uma resistência de 10Kohm (chamada resistência de Pull-Down) ligada ao pino 2 e ao GND, isto para que quando o botão não está premido estejam 0volts no pino 2, quando esta resistência não é colocada pode acontecer que mesmo que o botão não esteja premido a porta esteja a 1. A saída para controlar uma lâmpada é feita no pino 13, o Arduino tem ligado a este pino o Led assinalado na imagem que vamos usar como saída.

A parte de ligação a lâmpada é feita com recurso a um transístor (T) C547B e um rele 5v/220v. basta então ligar o pino 13 a base do transístor passando antes por uma resistência de 10Kohm. O emissor deste deve ser ligado ao GND e o colector a um dos terminais de controlo do rele. O outro terminal de controlo do rele deve então ser ligado aos 5volts, de forma há que quando o pino 13 esteja no nível alto (5volts) o transístor entre em condução e haja uma correte a circular na bobine do rele e este faça com que haja condução na parte de potencia (220 volts).

Nota: A montagem apresentada destina-se a marca e modelos das componentes utilizadas, caso se opte por outras componentes deve ter-se em atenção antes da montagem os seus datasheet.

Para o computador desenvolveu-se uma simples aplicação em c# que enviava comando para o Arduino Ligar ou Desligar a luz, e recebia ainda informação se a luz estava ligada ou desligada.

Para isso bastou apenas criar uma normal Windows aplication, e incluir o namespace System.IO.Ports para assim podermos utilizar a porta série.

Criou-se então a porta série através do comando, SerialPort porta = new SerialPort();

Foi adicionado um botão ligar, onde foi colocado o seguinte codigo:

porta.BaudRate = 9600; //velocidade que definimos no código do Arduino
porta.PortName = “Com4”; // porta serie de comunicação com o Arduino
porta.ReadTimeout = 200; // timeout de espera para que a aplicação não fique presa na leitura dos dados da porta serie. 
porta.Open(); // abertura da porta serie.

Para a leitura e tratamento dos dados vindos do Arduino adicionou-se um timer a aplicação. Este continha o seguinte codigo:

 
try
{
string recebido = porta.ReadLine();
if (recebido == "0\r")
{
Textbox1.Text = “Luz Desligada”;
}
else
{
Textbox1.Text = “Luz Ligada”;
}
}
catch
{}

Faltava então adicionar dois botões, um para ligar e outro para desligar a luz, no evento do clique do botão de ligar a luz colocou-se o seguinte código:

porta.Write("1");

no de desligar a luz foi o seguinte:

porta.Write("0");

image

Na secção de download disponibiliza-se esta aplicação para download, mas com algumas melhorias gráficas.

Artigos relacionados

Download: Projecto da aplicação do PC (source code)
Download: Executável – aplicação para PC
Download: Código do Arduino:interruptor
Homepage: Magick Key



  •   
  •   
  •  
  • Pin It  
  • Imprima este artigo
  • Post2PDF


62 Comentários

  1. Obrigado!

    Com esta historia estou a começar a ficar com o bichinho do Arduino.

  2. porreiro, era mesmo disto que precisava

  3. muito bom este artigo, gostava que alguem disponibiliza se como e que se pode controlar por wireless um arduino atraves de iphone/android :)

  4. Agora junta php nisso, e controlas o interruptor via web, :P sais da faculdade ligas o interruptor q por sua vez ta ligado a um aquecedor e quando chegares a casa ja tens a casa quentinha

  5. hum e que nao tenho conhecimento disso mesmo :/ e para iphone tambem ha?

  6. Belo artigo muitos parabéns vou já experimentar

  7. Tem-se falado muito do Arduino, mas existe também umas placas da Velleman (K8055) com ligação USB e que permite também o controlo de, por exemplo, abrir ou fechar um portão ou ligar e desligar um alarme.

    Penso que também seja um bom produto para ser discutido aqui no pplware.

  8. Uma pergunta de quem esta interessado mas percebe pouco de electrónica:
    Como e que faço a ligação da resistência ao transístor???

  9. E onde posso arranjar o rele referido? É que comprei um kit arduino mas nao trazia esse componente….

  10. Vocês são os maiores. Não percebo nada disto mas começo a ficar com um enorme entusiasmo. Vou mesmo comprar um ferro de soldar este fim de semana.

    • têm calma rapaz! informa-te melhor sobre electrónica, pois dou-te um exemplo, soldar componentes electrónicos com um ferro de soldar de 80W não é aconselhável, derretes tudo :P

      Inscreve-te num fórum de electrónica que o pessoal ai te recomende e expõe la as tuas duvidas :P

      Para começar aconselho-te uma placa de testes, evita as soldas, que são um dos principais problemas ao iniciar na electrónica…

    • Está à venda no LIDL, desde o início desta semana, uma mini estação de soldar bastante boa. Com um pouco de sorte encontras aindanos LIDLs mais remotos, ou sempre podes fazer o pedido.

      A potência de 48W pode parecer pouca… mas não é, é mais que suficiente para este tipo de trabalhos. Nesta caso, um ferro de 60 ou 80W só iria influenciar no tempo que o ferro demora a atingir a temperatura pretendida (o mais potente é, obviamente, mais rápido).

      • boas..
        48W é ja demasiado, no entanto podes contornar isso diminuindo o tempo da soldadura o idela anda entre os 35 e os 45 w…

        cmps

        • É óbvio que estamos a falar de aparelhos com temperatura regulável.

          Uma estação de soldar de 80W é óptima! Assim que se liga, atinge a temperatura pretendida em alguns segundos. Já a de 48W demora uns 2 minutos. Compreendes agora onde quis chegar com o que escrevi no último comentário?

  11. Que lampada usas-te? LED ou incandescente (etc…)? Se usaste a ultima, que relé escolheste?

    • Olá.

      Podes usar um LED ou uma lâmpada normal incandescente. O que realmente importa é a tensão de activação do relé, que é 5 Volts. Um relé pode ser dividido em duas partes: a bobine de activação (5V) e a parte de alta tensão (220V).
      Quando aplicas 5 Volts na bobine de activação é estabelecido o contacto na parte de alta tensão e, claro a lâmpada acende.
      No caso de pretenderes acender um LED, que não faz muito sentido, não podes usar os 220V na parte de alta tensão, mas sim usar uma fonte de 5V com uma resistência 1K em série com o LED.

      Ficam aqui dois relés que costumamos usar:

      RTB74005
      V23092

      Cumprimentos

  12. Filipe, espero que continues a criar posts como este.
    Parabéns!

  13. Não seria mais correto usar :
    boolean luzOn = false;
    em vez de:
    int luzon = 0;

    • boolean é um int por isso é igual.

      • Igual não é, podias dizer equivalente mas mesmo assim estavas errado, int ocupa 2 bytes, gostava de te ver a ligar/desligar um interruptor com 65536 posições diferentes no mundo real. Já variáveis de tipo boolean são para este tipo de coisa on/off ocupando 1 byte(metade da memoria). A ocupar 1 byte temos também variáveis de tipo byte com 256 possibilidades mas continuas a ser preferível usar boolean tendo outra regalias oferecidas pelo tipo. Neste caso especifico nunca experimentei mas em algumas linguagem em vez de escrever if(luzon == 0)pode se escrever if(luzOn) ou if(!luzOn).
        Não estou a dizer que esta errado, funciona à mesma, mas é mais indicado usar recursos específicos para a tarefa em mão.

        • boas..
          o int por si só ocupa 4 bytes o char é que ocupa 1 bytes…não sei como esta definido e varia de linguagem para linguagem, mas o booblean como o nome diz tudo só deveria ocupar 1 bite, mas talvez ocupe 1 byte não sei.
          No entanto devido aos 32 bites d endereçamento….um char=4byte=1 int…possivelmente 1 boolean=4bytes…no entanto existem opções de compilação que obrigam o compilador a fazer as coisas correctamente…embora depois os acessos as vars demorem mais tempo, mas ocupam menos mem…não se pode ter tudo…

          cmps

  14. Boas, zéquinha, continua.. lol. Aquele Abraço

  15. Boas tardes.
    Sou de S.Miguel, Açores.
    Tenho curiosidade em experimentar o Arduino, mas pelas minhas pesquisas, não vendem cá.
    Pode indicar-me onde comprar em Lisboa o Arduino?
    Obrigado

  16. Vou deixar aqui uma ideia para um artigo futuro, um projecto para contagem de pessoas, numa porta um sensor para contar quem entra, noutra para contar sem sai. Podendo dar estatísticas tipo, a que horas se encontra mais gente no local, média de pessoas no local, etc.

    • É perfeitamente exequível aquilo que sugere, basta usar o Arduino, com um foto-transístor e um emissor led.
      Na aplicação do PC para registar a entrada deve guardar a hora a que recebeu o pacote do Arduino.

    • Estou a pensar desenvolver um projecto deste calibre com acesso aos dados via Web para controlar uma porta entradas/ saídas, alguém tem mais Ideias/dicas de material, esquemas, software, etc?
      Cumprimentos,
      ApacheDraco

  17. Alguém sabe se esta técnica pode ser utilizada para ligar um PC através de um a chama para um determinado numero de telefone?

    Por exemplo, utilizar uma das linhas Voip dos routers da meo para ligar um PC a distancia.

    Podia dar um artigo interessante aqui no pplware.

    • Penso que sera possivel ligar qualquer coisa com uma chamada telefonica se o Arduino possuir um Shield GPRS.

      Ficaria algo como:

      [telefone/SMS]->[[sh.GPRS]->[Arduino]]->[Relé]->[PC]

      Com VOIP e com os routers da Meo… não faço ideia :-/

    • Outra sugestão:

      Ligar o Arduino via rede.

      Arduino Ethernet Shield – http://arduino.cc/en/Main/ArduinoEthernetShield

      • Obrigado pela dica,

        mas tinha pensado numa coisa mais artesanal, do tipo utilizar um telefone antigo.

        ligar para um numero que só o próprio sabe, é accionada a campainha do telefone (ligar os fios da campainha no arduino), este era accionado, ou estar ligado ao botão power do pc fazia a passagem de crente ligando assim o PC.

        Não sei e se funciona….

        • Olá famont,

          funcionar funciona, mas não aconselho a efectuar ligações directas com o Arduino. É preciso verificar que tensões e correntes é que estão envolvidas nas ligações (poderá ser necessário ligar componentes extra entre as ligações campainha Arduino, Arduino PC). É um bom projecto para quem está iniciar a utilização no Arduino, e quer algo útil. :p
          Na realidade, essa ideia é possível sem usar o Arduino. Basta usar um relé (http://pt.wikipedia.org/wiki/Rel%C3%A9). Mas mais uma vez é preciso verificar as tensões e correntes envolvidas, para arranjar um relé adaptado à situação.

          Outra ideia (mais arrojada) é ligar o Arduino à linha telefónica. Toda a gestão da chamada e sinais envolvidos seria processado pelo Arduino.

          E ligar ou desligar o pc fazendo uso de DTMF (http://pt.wikipedia.org/wiki/DTMF), ou por sms ou qualquer outra ideia. :D

          Uma ideia que acrescento, neste caso para ligar o pc, é fazer uso de Wake-on-Lan.

          Bons projetos,
          Nimboos

  18. Bem Filipe, o que tu sabes… Uau. Esta tecnologia do Arduíno é fantástica e tem inúmeras aplicações. Muito bem. Abraço desde há um bocado. Agora vou ver o teste do Huawei.

  19. Excelente artigo!

    Deixo uma sugestão de software para criar melhores ilustrações para os próximos artigos:

    Fritzing – http://fritzing.org/

    Abraço,
    Nimboos

  20. Alguém pode partilhar novamente os ficheiros para download?

  21. olá Filipe,

    estou a desenvolver uma aplicação em WPF e preciso de colocar um botão a ter o mesmo comportamento que tu tens, ou seja quando se carrega sobre o botão ele muda de imagem e quando se volta a carregar ele muda para a inicial. Sabes como posso fazer isto em WPF ?

    Desde já obrigado.

  22. Amigo, teria como atualizar os links, estão OFF. Obrigado e Parabéns…

  23. Procurei bastante isso, ou quase isso, eu quero controlar pela internet, nem sempre estou em casa, tenho um nano e não achei nada que dê pra fazer com ele, é tão inútil assim? Mas tenho um UNO R3, um ETHERNET também, entre outros… me ajudem por favor com alguma idéia. Obrigado!

  24. Os links para downloads estão com erro… tem como consertá-los?

  25. Qual outro transistor posso utilizar?

  26. sou novo nesta area e ja adequiri um
    arduino uno para tentar fazer algums
    projetos.entretanto encontrei esta
    aplicação para poder ligar uma lampada
    pela computador e achei ela muito interesante
    ja a realizei e funciona muito bem.
    mas preciso saber se e possivel usar mais
    k um botao para acender outras lampadas?
    e como fazer?obrigado,cumprs para todos.

Deixe o seu comentário

Aviso: Todo e qualquer texto publicado na internet através deste sistema não reflete, necessariamente, a opinião deste site ou do(s) seu(s) autor(es). Os comentários publicados através deste sistema são de exclusiva e integral responsabilidade e autoria dos leitores que dele fizerem uso. O autor deste site reserva-se, desde já, o direito de excluir comentários e textos que julgar ofensivos, difamatórios, caluniosos, preconceituosos ou de alguma forma prejudiciais a terceiros. Textos de caráter promocional ou inseridos no sistema sem a devida identificação do seu autor (nome completo e endereço válido de email) também poderão ser excluídos.