segunda-feira, 18 de fevereiro de 2013

Automação Residencial com Arduino - Ligando lâmpada, portão,...


   Vamos ver um esquema do Arduino utilizando um Ethernet Shield e um Rele Shield para acender uma lâmpada pela internet, controle remoto, Smartphone ou qualquer outro dispositivo com acesso a internet ou rede que os equipamentos estão inseridos.
   No esquema abaixo o usuário dispara o comando através de um celular o comando segue pela internet, podemos ter um servidor para acessar nosso comando de qualquer lugar com internet, depois disso o comando é recebido pelo ethernet shield que é o dispositivo que liga na rede para receber os comandos e faz a comunicação com o Arduino, depois que os dados são transferidos para o Arduino o mesmo envia o pulso elétrico para o rele shield que por sua vez acionara os equipamentos escolhidos.
Esquema de ligação de equipamentos elétricos  - automação
Esquema de ligação de equipamentos elétricos  - automação



Equipamentos necessários:


   Rele shield que conectara nos equipamentos elétricos da rede, nele nos podemos ligar lâmpadas, motores elétricos de portões, ventiladores, ar condicionado, etc. No modelo de shield abaixo podemos ligar 4 equipamentos. 


Rele Shield
   Para ligar nosso equipamentos ligaremos o fio de tensão vermelho 110v ou 220v no primeiro conector do rele que é o de posição 'normalmente aberto' que fica do lado das numerações e fio verde ligaremos no pino do meio que é o 'comum' faremos isso para cada equipamento que quisermos ligar e o equipamento conectar ao neutro da rede elétrica, sempre prestar atenção na hora das tenções de ligação com a capacidade de seu rele shield.
Esquema de ligação do Rele
Esquema de ligação do Rele

Arduino é a placa de controle I/O que serve de controle para diversos sistemas, o Arduino é um projeto  que engloba software e hardware e tem como objetivo fornecer uma forma fácil para prototipar. O arduino é placa que  reune todos os shields ele que faz a comunicação entre eles.




Arduino + Rele Shield
Arduino + Rele Shield 

Código para implementação

Essa primeira linha de código deve ser adicionada ao arduino, lembrando de alterar as linhas em laranja para os dados da sua rede.

1. #include <SPI.h>
2. #include <Ethernet.h>
3.
4. //Configurações do Ethernet Shield
5. byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
6. byte ip[] = { 192,168,2, 22 }; // ip que o arduino assumirá
7. byte gateway[] = { 192,168,2, 1 }; // ip do roteador
8. byte subnet[] = { 255, 255, 0, 0 };
9.
10. // String que representa o estado dos dispositivos
11. char Luz[7] = "0000L#";
12.
13. Server server(8081); // Cria o servidor na porta 8081
14.
15. // String onde é guardada as msgs recebidas
16. char msg[7] = "0000L#";
17.
18. void setup() {
19. Ethernet.begin(mac, ip, gateway, subnet);
20. server.begin();
21. pinMode(A0,OUTPUT);
22. pinMode(A1,OUTPUT);
23. pinMode(A2,OUTPUT);
24. pinMode(A3,OUTPUT);
25. pinMode(A4,OUTPUT);
26. pinMode(A5,OUTPUT);


27. }
28.
29. void loop() {
30. Client client = server.available();
31. // SE receber um caracter...
32. if (client) {
33. // guarda o caracter na string 'msg'
34. msg[1]=msg[2]; msg[2]=msg[3]; msg[3]=msg[4]; msg[4]=msg[5];msg[5]=msg[6];
35. msg[6] = client.read();
36.
37. if (msg[6]=='#') {
38. switch(msg[5]) {
39. case 'R':
40. // Se receber o comando 'R#' envia de volta o status dos
41. // dispositivos. (Que é a string 'Luz')
42. client.write(Luz);
43. break;
44. case 'P':
45. // Caso P#, aciona o pino do portão pequeno por 1s.
46. digitalWrite(A4,HIGH);
47. delay(1000);
48. digitalWrite(A4,LOW);
49. break;
50. case 'G':
51. // Caso G#, aciona o pino do portão pequeno por 1s.
52. digitalWrite(A5,HIGH);
53. delay(1000);
54. digitalWrite(A5,LOW);
55. break;
56. case 'L':
57. // Caso L#, ele copia os 4 bytes anteriores p/ a
58. // string 'Luz' e cada byte representa um
59. // dispositivo, onde '1'=ON e '0'=OFF
60. Luz[0]=msg[1];
61. Luz[1]=msg[2];
62. Luz[2]=msg[3];
63. Luz[3]=msg[4];
64. if (Luz[0]=='1') digitalWrite(A0,HIGH); elsedigitalWrite(A0,LOW);
65. if (Luz[1]=='1') digitalWrite(A1,HIGH); elsedigitalWrite(A1,LOW);
66. if (Luz[2]=='1') digitalWrite(A2,HIGH); elsedigitalWrite(A2,LOW);
67. if (Luz[3]=='1') digitalWrite(A3,HIGH); elsedigitalWrite(A3,LOW);
68. break;
69.
70. }
71. }
72. }
73. }

Bloco PHP, controla o arduino: Esse bloco deve ser hospedado localmente em um servidor ou na web.

1. <html>
2. <head></head>
3. <body>
4.
5. <?php
6. $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
7. // Se conecta ao IP e Porta:
8. socket_connect($sock,"187.15.6.131", 8081);
9.
10. // Executa a ação correspondente ao botão apertado.
11. if(isset($_POST['bits'])) {
12. $msg = $_POST['bits'];
13. if(isset($_POST['Fora' ])){ if($msg[0]=='1') { $msg[0]='0'; } else {$msg[0]='1'; }}
14. if(isset($_POST['Quarto1'])){ if($msg[1]=='1') { $msg[1]='0'; } else {$msg[1]='1'; }}
15. if(isset($_POST['Quarto2'])){ if($msg[2]=='1') { $msg[2]='0'; } else {$msg[2]='1'; }}
16. if(isset($_POST['Sala' ])){ if($msg[3]=='1') { $msg[3]='0'; } else {$msg[3]='1'; }}
17. if(isset($_POST['Pequeno'])){ $msg = 'P#'; }
18. if(isset($_POST['Grande' ])){ $msg = 'G#'; }
19. socket_write($sock,$msg,strlen($msg));
20. }
21.
22. socket_write($sock,'R#',2); //Requisita o status do sistema.
23.
24. // Espera e lê o status e define a cor dos botões de acordo.
25. $status = socket_read($sock,6);
26. if (($status[4]=='L')&&($status[5]=='#')) {
27. if ($status[0]=='0') $cor1 = lightcoral;
28. else $cor1 = lightgreen;
29. if ($status[1]=='0') $cor2 = lightcoral;
30. else $cor2 = lightgreen;


31. if ($status[2]=='0') $cor3 = lightcoral;
32. else $cor3 = lightgreen;
33. if ($status[3]=='0') $cor4 = lightcoral;
34. else $cor4 = lightgreen;
35.
36. echo "<form method =\"post\" action=\"teste.php\">";
37. echo "<input type=\"hidden\" name=\"bits\" value=\"$status\">";
38. echo "<button style=\"width:70; background-color: $cor1 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Fora\">Fora</button></br></br>";
39. echo "<button style=\"width:70; background-color: $cor2 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Quarto1\">Quarto1</button></br></br>";
40. echo "<button style=\"width:70; background-color: $cor3 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Quarto2\">Quarto2</button></br></br>";
41. echo "<button style=\"width:70; background-color: $cor4 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Sala\">Sala</button></br></br></br>";
42. echo "<button style=\"width:90;font: bold 14px Arial\" type = \"Submit\"Name = \"Pequeno\">Portao Pequeno</button></br></br>";
43. echo "<button style=\"width:90;font: bold 14px Arial\" type = \"Submit\"Name = \"Grande\">Portao Grande</button></br></br>";
44. echo "</form>";
45. }
46. // Caso ele não receba o status corretamente, avisa erro.
47. else { echo "Falha ao receber status da casa."; }
48. socket_close($sock);
49. ?>
50.
51. </body>
52. </html>
53. 

Fonte dos códigos: José Luiz – Professor de Microcontrolador

Clique aqui para imprimir o artigo

36 comentários:

  1. socket_connect($sock,"187.15.6.131", 8081);


    como conectar com servidor local???

    ResponderExcluir
    Respostas
    1. Boa noite, ai coloca o ip fixo do servidor ou da sua máquina local, e depois a vírgula é a porta.

      Excluir
  2. Olá Henrique!

    Como coloco o bloco PHP no servido ou nA WEB?
    Edson

    ResponderExcluir
  3. Em qualquer um dos dois é só você ir no bloco de notas colar o bloco e salvar como html, ou você hospeda na sua maquina local (Servidor) ou na web ...

    ResponderExcluir
  4. Esta dando erro nessa linha

    socket_connect($sock,"187.15.6.131", 8081);

    ResponderExcluir
  5. Esta dando erro nessa linha quado acesso no servidor.

    socket_connect($sock,"187.15.6.131", 8081);

    ResponderExcluir
    Respostas
    1. Vc esta usando esse endereço de ip ou você substituiu pelo seu ? Todos os endereços de ip tem que ser compatíveis com a sua rede se no 192.168.2.22 se sua rede for 192.168.1.x coloque 192.168.1.22 por exemplo. Se sua máquina for local coloque 127.0.0.1 que é o localhost.

      Excluir
    2. Vc tem que configurar o APACHE pra utilizar o socket.. tava com o mesmo problema só que meu professor de linguagem WEB resolveu isto pra mim

      Excluir
  6. Fino d+ seu projeto. Consegui aki. Vc teria um tutorial de como vc fez esse projeto para eu ter um ideia mais profunda.

    ResponderExcluir
  7. Eu so desenhei não fiz o da minha casa ainda e o código fonte é do professor José Luiz, tem grandes projetos na área de automação. Quando for fazer o da minha casa posto o passo a passo direitinho.

    ResponderExcluir
  8. Preciso fazer um projeto com jme para conversar com arduino. Parecido com o desse php aki. tem alguma referencia para que eu possa estudar, ou algum site com dias de como conectar um dispositivo móvel ao arduino por rede.

    ResponderExcluir
  9. Boa noite,

    Estou fazendo um projeto de conclusão de curso com o arduino e android. Teria algum site para indicar. Preciso fazer a comunicação dele com o celular para executar os mesmo procedimentos desse post, só que com android e não com php.

    ResponderExcluir
    Respostas
    1. Tem muito material ai na net, achei esse aqui oh dê uma olhadinha para ver se lhe é útil grande abraço, http://www.slideshare.net/turicas/android-e-arduino-automacao-residencial

      Excluir
  10. Não entendi uma parte. Quando coloca o Ethernet Shield no arduino esse ocupa todoas entradas do dispositivo do arduino. Como faz então pra ligar o Reles?

    ResponderExcluir
    Respostas
    1. Bom dia amigo, o Ethernet Shield também tem os bornes igual o Arduino, você pode encaixar outro módulo em cima dele, ou ligar os reles...

      Excluir
  11. Oi, gostaria de saber por que precisa de um servidor entre o usuário e o Arduino. Não é possível acessar o o shield Ethernet do Arduino diretamente por meio do celular ou do note?

    ResponderExcluir
  12. bom dia arthur, preciso sua ajuda, vc tem apostilha pra eu instalar na minha casa. se estiver um link. obrigado

    ResponderExcluir
  13. Fala aew galera..
    So facinado por essas automações residenciais...
    Só que so muito novo nisso e nao sei de praticamente nada...
    Gostaria de saber qual o custo em equipamentos mais ou menos desse tutorial..
    E se alguem me pudesse mandar um link com os equipamentos...
    Muito obrigado.. e parabens pelo post

    ResponderExcluir
  14. Não cheguei a implementar o projeto mais percebi que é um ótimo projeto. Parabéns. Arduino até que apareça algo de fato melhor de ser implementado, ele é e será uma ótima referencia para se praticar automação.

    ResponderExcluir
  15. Respostas
    1. Obrigado, o código é crédito do José Luiz – Professor de Microcontrolador

      Excluir
  16. eu utilizo algum programa no celular pra ligar e desligar os equipamentos? caso sim, qual e como faço isso?

    ResponderExcluir
  17. eu utilizo algum programa no celular pra ligar e desligar os equipamentos? caso sim, qual e como faço isso?

    ResponderExcluir
  18. Olá Arthur, parabéns pelo post, esta muito bem detalhado e otimo diagrama.

    Tenho aqui um problema e gostaria de sua ajuda.

    Estou utilizando exatamente o esquema publicado aqui, porém estou utilizando além do Normalmente aberto do relê, o normalmente Fechado em conjunto com um interruptor paralelo de parede, isso para poder acender ou apagar (por exemplo. uma lampada) através do interruptor na parede.

    Porém não consigo obter o status real da lampada (acesa ou apagada), pois posso ligar e desligar a lampada sem alterar o estado do relê (estando ele na posição NC ou NO).

    Ou seja, mesmo que o rele esteja na posição Normalmente aberto (o que será LAMPADA DESLIGADA) ainda posso ligar a lampada pelo interruptor paralelo fisicamente na parede).

    Sabe como posso fazer para obter o status real no browser ??

    Obrigado, abs.

    ResponderExcluir
  19. Alguém se habilita a me responder por que meu código só funciona quando salvo o arquivo como teste.PHP ??
    Pois quando salvo o arquivo como teste.HTML, ele não funciona, aparece erros... Tipo assim:

    "; echo "

    Lâmpada

    "; echo "
    Rádio

    "; echo "
    Ventilador

    "; echo "
    Sala

    "; echo "
    CONTROLE DO PORTÃO

    "; echo "
    Abrir

    "; echo "
    Fechar
    "; echo ""; } // Caso ele não receba o status corretamente, avisa erro. else { echo "Falha ao receber status da casa."; } socket_close($sock); ?>

    ResponderExcluir
    Respostas
    1. Amigo, o php, assim como asp/aspnet são linguagens de processamento em servidor. quando você salva em html ele vai ignorar o que está relacionado ao processamento do código e vai interpretar apenas a formatação HTML por isso você vê apenas o que a formatação consegue resolver.
      para processar o arquivo .PHP você precisa de um servidor web. vai ter que construir um no seu PC ou contratar algum serviço externo.

      Excluir
    2. Amigo, verifica a linha 36. ;
      Ela aponta para o arquivo "teste.php", basta troca por "teste.html"

      Excluir
  20. Eu posso ligar mais de um rele shield ???
    Como faço isso ???

    ResponderExcluir
  21. Olá, primeiramente parabéns pela iniciativa, mesmo não sendo seu o código só o fato de querer compartilhar conhecimento já merece o parabéns.
    Agora a duvida, conseguir fazer tudo, mas estou com um problema. Quando é pressionado um dos botões das luzes o arduino só executa um comando if, se tiver mais de um ele executa apenas o ultimo. Você ou alguém tem ideia de como resolver isso? Já tirei os switch case e usei apenas if e nada! sei que os comandos estão certos pois coloquei para exibir na pagina da internet o comando enviado e recebido e pq ele executa qqr if se eu comentar os outros.
    Obrigado pela ajuda!

    ResponderExcluir
  22. Olá, primeiramente parabéns pela iniciativa, mesmo não sendo seu o código só o fato de querer compartilhar conhecimento já merece o parabéns.
    Agora a duvida, conseguir fazer tudo, mas estou com um problema. Quando é pressionado um dos botões das luzes o arduino só executa um comando if, se tiver mais de um ele executa apenas o ultimo. Você ou alguém tem ideia de como resolver isso? Já tirei os switch case e usei apenas if e nada! sei que os comandos estão certos pois coloquei para exibir na pagina da internet o comando enviado e recebido e pq ele executa qqr if se eu comentar os outros.
    Obrigado pela ajuda!

    ResponderExcluir
  23. ei alguem pode me explicar essa parte de "Bloco PHP, controla o arduino: Esse bloco deve ser hospedado localmente em um servidor ou na web." porque nao entendi como faz isso?

    ResponderExcluir
  24. Parabéns!

    Um baita de um post, diga-se de passagem!

    ResponderExcluir
  25. Boa noite, fantástico seu post, esta me ajudando bastante. Tenho duas dúvidas amigo. Você teria como me explicar o esquema elétrico para 2 relés ligando ele no arduino? Pois fazendo a ligação do seu esquema, percebo que os dois relés ficam com a luz vermelha da placa acesa, se clico na pagina php, ouço 1 relé funcionar ou outro nao. Ao inverter a ligação, o outro relé da mesma placa funciona e o anterior não. Ou seja o A0 ta conectado, já o A1 não entendi onde ligar. Abç

    ResponderExcluir
  26. Existe alguma norma ABNT que proiba a utilização de relés para acionar lâmpadas?
    Eu posso colocar um circuito desses dentro de uma caixa da própria fiação?

    ResponderExcluir
    Respostas
    1. Não tenho conhecimento João, mas creio que não pois todos os sistemas de automação usam relé para acionar as cargas, controladores de temperatura... Para uma melhor segurança é melhor colocar em uma caixinha separada para os fios não ficarem espremidos evitando futuros curtos.

      Excluir
  27. É possível incluir mais de um rele shield no mesmo arduíno?

    ResponderExcluir

Muito obrigado pelo seu comentário e pela sua visita!

Grande Abraço

Pin It button on image hover