quinta-feira, 15 de janeiro de 2015

Automação residencial com Arduino e Ethernet

Fala pessoal!

Depois de muito tempo sem novidades, vamos começar um projeto novo!!!

A ideia desse projeto é automatizar um pequeno apartamento, nele vamos focar em itens básicos, para num futuro agregar mais funcionalidades.

Basicamente vamos utilizar no inicio do desenvolvimento:

O Arduino ficara conectado ao Ethernet Shield, tudo conectado na rede do apartamento via porta RJ-45 do roteador WIFI, podendo ser acessado por smartphones/tablets e PCs em geral.

Feito isso, as funcionalidades iniciais serão:

  1. Controlar todas luzes e tomadas.
  2. Acendimento de luzes automática a noite.
  3. Gerar sequencia de acendimento aleatória da luzes.
  4. Acionar ar condicionado a distancia (via infra-vermelho).
  5. Abrir portão da garagem a distancia (necessário controle remoto).
  6. Abrir portão social a distancia.
  7. Verificar temperatura/umidade
  8. Verificar consumo kw.
Para controlar os dispositivos a distancia sem fios, vamos utilizar um transmissor de radiofrequência, cada objeto terá um receptor. A parte do controle vamos deixar para depois. Inicialmente vamos focar na pagina WEB que o usuário acessa para dar comandos ao microcontrolador.

Essa é a cara de nossa pagina:



Simples, mas funcional, ao apertar os botões o microcontrolador ira enviar um código RF, os receptores de RF vão receber esse código e analisar se tem que tomar alguma ação ou não, controlando assim os dispositivos.

Nesse post não vamos tratar da configuração de rede entre o modulo ethernet (IP/MAC) verifique os códigos de exemplo e a pagina do arduino.

Para construir a pagina acima utilize o seguinte código:

  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3. #include <TextFinder.h>
  4. byte mac[] = { 0xDE0xAD0xBE0xEF0xFE0xED };
  5. byte ip[] = { 192,168,0,75 };
  6. EthernetServer server(80);
  7. String leituraString;
  8. char flag_a;
  9. char flag_b;
  10. char flag_c;
  11. char flag_d;
  12. void setup()
  13. {
  14.   pinMode(5, OUTPUT);
  15.   pinMode(6, OUTPUT);
  16.   pinMode(7, OUTPUT);
  17.   pinMode(8, OUTPUT);
  18.   Serial.begin(9600);
  19.   Ethernet.begin(mac, ip);
  20.   server.begin();
  21.   Serial.print("Meu IP:");
  22.   Serial.println(Ethernet.localIP());
  23. }
  24. void loop()
  25. {
  26.   EthernetClient client = server.available();
  27.   if (client)
  28.     {
  29.      while (client.connected())
  30.       {    
  31.       if (client.available())
  32.         {
  33.         char c = client.read();
  34.         if (leituraString.length() < 100)
  35.           {
  36.           leituraString += c;
  37.           //Serial.print(c);
  38.           }
  39.         if (== '\n')
  40.           {
  41.           Serial.println(leituraString);
  42.           client.println("HTTP/1.1 200 OK");
  43.           client.println("Content-Type: text/html");
  44.           client.println();
  45.           client.println("<HTML>");
  46.           client.println("<HEAD>");
  47.           client.println("<TITLE>Nosso AP</TITLE>");
  48.           client.println("</HEAD>");
  49.           client.println("<BODY>");
  50.           client.println("<center>");
  51.           client.println("<H1>Nosso AP - Controle Remoto </H1>");
  52.           client.println("</center>");
  53.             client.println("Tempo de funcionamento:");
  54.             long tempo=((millis()/1000)/60);
  55.             if(tempo<=1)
  56.               {
  57.                client.println(tempo);
  58.                client.print(" minuto");
  59.               }
  60.             if(tempo>=2)
  61.               {
  62.                client.println(tempo);
  63.                client.print(" minutos");
  64.               }
  65.             client.print("<br>");
  66.            
  67.             client.println("Controle T:");
  68.             client.print("&nbsp;<input type=submit value='ALL ON' style=width:100px;height:45px onClick=location.href='/?on2468'>");
  69.             client.print("&nbsp;<input type=submit value='ALL OFF' style=width:100px;height:45px onClick=location.href='/?off3579'>");
  70.            
  71.             client.print("<br><br>");
  72.            
  73.             client.println("Controle A:");
  74.             client.print("<input type=submit value=ON style=width:100px;height:45px onClick=location.href='/?on2'>");
  75.             client.print("<input type=submit value=OFF style=width:100px;height:45px onClick=location.href='/?off3'>");
  76.            
  77.             client.print("<br><br>");
  78.            
  79.             client.println("Controle B:");
  80.             client.print("<input type=submit value=ON style=width:100px;height:45px onClick=location.href='/?on4'>");
  81.             client.print("<input type=submit value=OFF style=width:100px;height:45px onClick=location.href='/?off5'>");
  82.            
  83.             client.print("<br><br>");
  84.            
  85.             client.println("Controle C:");
  86.             client.print("<input type=submit value=ON style=width:100px;height:45px onClick=location.href='/?on6'>");
  87.             client.print("<input type=submit value=OFF style=width:100px;height:45px onClick=location.href='/?off7'>");
  88.            
  89.             client.print("<br><br>");
  90.            
  91.             client.println("Controle D:");
  92.             client.print("<input type=submit value=ON style=width:100px;height:45px onClick=location.href='/?on8'>");
  93.             client.print("<input type=submit value=OFF style=width:100px;height:45px onClick=location.href='/?off9'>");
  94.             client.println("<center>");
  95.             client.println("<H1>Status Atual </H1>");
  96.             client.println("</center>");    
  97.            
  98.             client.println("Controle A:");
  99.               if(leituraString.indexOf('2') >0)
  100.                 {
  101.                   flag_a=1;
  102.                 }
  103.               if(leituraString.indexOf('3') >0)
  104.                 {
  105.                   flag_a=0;
  106.                 }
  107.               if(flag_a==1)
  108.                 {
  109.                   client.print("Ligado");
  110.                 }
  111.               if(flag_a==0)
  112.                 {
  113.                   client.print("Desligado");
  114.                 }
  115.                  
  116.             client.print("<br>");
  117.                  
  118.             client.println("Controle B:");
  119.               if(leituraString.indexOf('4') >0)
  120.                 {
  121.                   flag_b=1;
  122.                 }
  123.               if(leituraString.indexOf('5') >0)
  124.                 {
  125.                   flag_b=0;
  126.                 }
  127.               if(flag_b==1)
  128.                 {
  129.                   client.print("Ligado");
  130.                 }
  131.               if(flag_b==0)
  132.                 {
  133.                   client.print("Desligado");
  134.                 }
  135.                  
  136.             client.print("<br>");
  137.            
  138.             client.println("Controle C:");
  139.               if(leituraString.indexOf('6') >0)
  140.                 {
  141.                   flag_c=1;
  142.                 }
  143.               if(leituraString.indexOf('7') >0)
  144.                 {
  145.                   flag_c=0;  
  146.                 }
  147.                 if(flag_c==1)
  148.                 {
  149.                   client.print("Ligado");
  150.                 }
  151.               if(flag_c==0)
  152.                 {
  153.                   client.print("Desligado");
  154.                 }
  155.                                    
  156.              client.print("<br>");
  157.              
  158.              client.println("Controle D:");
  159.               if(leituraString.indexOf('8') >0)
  160.                 {
  161.                   flag_d=1;
  162.                 }
  163.               if(leituraString.indexOf('9') >0)
  164.                 {
  165.                   flag_d=0;
  166.                 }
  167.               if(flag_d==1)
  168.                 {
  169.                   client.print("Ligado");
  170.                 }
  171.               if(flag_d==0)
  172.                 {
  173.                   client.print("Desligado");
  174.                 }
  175.           // adiciona uma meta de refrescamento, o browser vai pegar dados a cada 5 segundos:
  176.           client.println("<meta http-equiv=\"refresh\" content=\"5\">");
  177.           client.println("</BODY>");
  178.           client.println("</HTML>");
  179.           delay(1);
  180.           client.stop();
  181.           if(leituraString.indexOf('2') >0)//checa por 2
  182.           {
  183.             digitalWrite(5, HIGH);    // pino 5 alto
  184.             Serial.println("Computador a Ligado");
  185.           }
  186.           if(leituraString.indexOf('3') >0)
  187.           {
  188.             digitalWrite(5, LOW);  
  189.             Serial.println("Computador a Desligado");
  190.           }
  191.          
  192.           if(leituraString.indexOf('4') >0)
  193.           {
  194.             digitalWrite(6, HIGH);    
  195.             Serial.println("Computador b Ligado");
  196.           }
  197.           if(leituraString.indexOf('5') >0)
  198.           {
  199.             digitalWrite(6, LOW);  
  200.             Serial.println("Computador b Desligado");
  201.           }
  202.          
  203.            if(leituraString.indexOf('6') >0)
  204.           {
  205.             digitalWrite(7, HIGH);  
  206.             Serial.println("Computador c Ligado");
  207.           }
  208.           if(leituraString.indexOf('7') >0)
  209.           {
  210.             digitalWrite(7, LOW);  
  211.             Serial.println("Computador c Desligado");
  212.           }    
  213.          
  214.             if(leituraString.indexOf('8') >0)
  215.           {
  216.             digitalWrite(8, HIGH);  
  217.             Serial.println("Computador d Ligado");
  218.           }
  219.           if(leituraString.indexOf('9') >0)
  220.           {
  221.             digitalWrite(8, LOW);    
  222.             Serial.println("Computador d Desligado");
  223.           }        
  224.           leituraString="";
  225.         }
  226.       }
  227.     }
  228.   }
  229. }


Programe seu microcontrolador e entre no IP especificado!

Até a próxima.