Vamos controlar um interruptor com o Arduino?

62 Comentários

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

Partilhar:
Tags:

Comentários

62

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de José Luís
    José Luís

    Obrigado!

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

    1. Avatar de S Pimenta

      Para quem quiser um projeto semelhante a este: http://www.youtube.com/watch?v=TATpGpE7ocU

      O “click” que se ouve é o relé a fazer contacto.

  2. Avatar de nuno
    nuno

    porreiro, era mesmo disto que precisava

  3. Avatar de daniel
    daniel

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

    1. Avatar de Filipe Caetano
      Filipe Caetano

      Daniel, o que pede já é possivel com recurso a por exemplo a comunicação XBEE.
      Sendo necessário adicionar um XBEE ao Android (pouco cómodo digo eu) e outro ao Arduino.

    2. Avatar de efe
      efe

      Existe uma versão do Arduino com bluetooth.

      http://loja.lusorobotica.com/118-arduino-bluetooth.html

      Agora a nivel de software para o iphone/android … não sei como é …

  4. Avatar de Tiago Andre
    Tiago Andre

    Agora junta php nisso, e controlas o interruptor via web, 😛 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

    1. Avatar de Filipe Caetano
      Filipe Caetano

      Tiago, é uma possibilidade, ou ainda adicionar um modulo GPRS e pode controlar-se o interruptor por SMS.

    2. Avatar de Alex
      Alex

      Ou a arder =P

      Abraço

  5. Avatar de daniel
    daniel

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

    1. Avatar de Filipe Caetano
      Filipe Caetano

      Apenas sei que funciona em Androide, no entanto também poderá ser possivel em iphone, mas desconheço.

      1. Avatar de António Ferreira
        António Ferreira

        Podes sempre fazer umas páginas web no arduino e acede-las através de um browser.

        A.F.

  6. Avatar de Paulo
    Paulo

    Belo artigo muitos parabéns vou já experimentar

  7. Avatar de Tiago Ferreira
    Tiago Ferreira

    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.

    1. Avatar de lmx
      lmx

      Boas..
      Placas da Velleman…Existem toneladas de kits ai pela net fora de toda a forma e feitio…eu ca gosto mais dos europeus, pois sou europeu, no entanto existem alguns que não são opensource e a nivel de licenciamento são perigosos…
      alguns sites:
      http://www.beagleboard.org…opensoruce
      http://www.luminarymicro.com/products/evaluation_kits.html/…não conheço a licença

      http://www.stm32circle.com/hom/index.php …ainda não ha licença, o SO que corre é o circleOS, mas que ainda não esta licenciado…o triste é que é europeu e feito com chips europeus da STMicroElectrónics…enfim

      cmps

  8. Avatar de Interessado
    Interessado

    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???

    1. Avatar de Jago

      Olá.
      Normalmente solda-se o pino da resistência ao pino do transístor.

      Também podes usar uma placa de testes, e aí não tens de soldar nada.

    2. Avatar de Nimboos
      Nimboos

      Outra solução:

      Usar uma breadboard (http://en.wikipedia.org/wiki/Breadboard).

      Torna-se mais simples ligar os componentes e reutilizar os mesmos em novos projectos.

  9. Avatar de Interessado
    Interessado

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

    1. Avatar de Jago

      Os relés são comprados em lojas de electrónica.
      Segue este link e vê algumas lojas online em Portugal:

      http://zigtek.blogspot.com/2011/02/lojas-de-electronica-portugal.html

      Cumprimentos

      1. Avatar de Duarte
        Duarte

        vai ao site da leiritrónica..e compras online a um preço relativamente baixo

  10. Avatar de tiago vieira
    tiago vieira

    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.

    1. Avatar de raul
      raul

      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 😛

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

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

    2. Avatar de Hugo Cura

      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).

      1. Avatar de lmx
        lmx

        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

        1. Avatar de Hugo Cura

          É ó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. Avatar de NeMewSys
    NeMewSys

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

    1. Avatar de Jago

      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. Avatar de José Fonseca
    José Fonseca

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

    1. Avatar de S Pimenta

      Sim que continue! que eu tenho o arduino e uma das coisas que eu gostava de fazer era controlar as luzes de minha casa!

      Fico à espera de mais artigos!

  13. Avatar de bigkax
    bigkax

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

    1. Avatar de Nuno Gonçalves
      Nuno Gonçalves

      boolean é um int por isso é igual.

      1. Avatar de bigkax
        bigkax

        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.

        1. Avatar de lmx
          lmx

          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. Avatar de Álvaro Neves
    Álvaro Neves

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

  15. Avatar de Tiago Frontoura
    Tiago Frontoura

    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

    1. Avatar de Filipe Caetano
      Filipe Caetano

      Tiago, sugiro que compre nas varias lojas que existem on-line. Eu pessoalmente costumo comprar na espanhola cooking-hacks (www.cooking-hacks.com/) no entanto existem varias empresas de venda on-line no nosso país, deixo dois link’s:
      http://www.ptrobotics.com
      http://www.lusorobotica.com

      1. Avatar de Tiago Frontoura
        Tiago Frontoura

        Obrigado pela atenção Filipe.
        Um abraço a todos, a partir dos Açores.
        🙂

  16. Avatar de naoliveira
    naoliveira

    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.

    1. Avatar de Filipe Caetano
      Filipe Caetano

      É 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.

    2. Avatar de ApacheDraco
      ApacheDraco

      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. Avatar de famont
    famont

    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.

    1. Avatar de famont
    2. Avatar de Julio Freitas
      Julio Freitas

      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 :-/

    3. Avatar de Nimboos
      Nimboos

      Outra sugestão:

      Ligar o Arduino via rede.

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

      1. Avatar de famont
        famont

        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….

        1. Avatar de Nimboos
          Nimboos

          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. 😀

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

          Bons projetos,
          Nimboos

          1. Avatar de famont
            famont

            Obrigado pela ajuda, vou investigar melhor.

  18. Avatar de Vítor Cunha
    Vítor Cunha

    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. Avatar de Nimboos
    Nimboos

    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. Avatar de José Antunes
    José Antunes

    Alguém pode partilhar novamente os ficheiros para download?

    1. Avatar de Filipe Caetano
      Filipe Caetano

      Boa tarde José,

      pode fazer dowload do ficheiro .rar onde pode encontrar logo na raiz o ficheiro do código para o Arduino, e uma pasta referente ao projecto do Visial Studio.

      link:http://www.sal.ipg.pt/user/7142/interruptor.rar

      1. Avatar de José Antunes
        José Antunes

        Muito obrigado Filipe

  21. Avatar de José Antunes
    José Antunes

    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. Avatar de alan
    alan

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

  23. Avatar de Anderson
    Anderson

    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. Avatar de Anderson
    Anderson

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

  25. Avatar de johan pedro
    johan pedro

    Qual outro transistor posso utilizar?

    1. Avatar de johan pedro
      johan pedro

      Obrigado desde já

      Cumprimentos

  26. Avatar de marco
    marco

    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.