quarta-feira, 6 de agosto de 2014

Controle de leds pela rede

    Neste tutorial (adaptado daqui) teremos como resultado um servidor web que permitirá o acionamento de leds ligados à Galileo a partir de qualquer web browser cuja máquina esteja ligada na mesma rede que a placa.
            Utilizaremos 3 leds coloridos e 3 resistores de  220Ω, que deverão ser ligados como na Figura 1 abaixo.

Figura 1. Ligação do circuito para o webservice
           
            O código abaixo deverá ser colocado na Galileo, sempre lembrando-se dos procedimentos básicos: ligar a Galileo na energia antes de liga-la na USB do computador.


#include <Ethernet.h>
#include <SPI.h>

boolean reading = false;
String readString; 

// um http request termina com uma linha em branco
boolean currentLineIsBlank = true;
boolean sentHeader = false;


////////////////////////////////////////////////////////////////////////
//CONFIGURACAO
////////////////////////////////////////////////////////////////////////
  //byte ip[] = { 192, 168, 0, 199 };   //Para setup manual
  //byte gateway[] = { 192, 168, 0, 1 }; //Para setup manual
  //byte subnet[] = { 255, 255, 255, 0 }; //Para setup manual

  // Caso precise alterar o MAC address
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  
  EthernetServer server = EthernetServer(80); //port 80
////////////////////////////////////////////////////////////////////////

void setup(){
  Serial.begin(9600);

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(13, OUTPUT);

  Ethernet.begin(mac);

  server.begin();
  Serial.println(Ethernet.localIP());
  
}

void loop(){

  // escuta chegada de clientes e requests
  checkForClient();


}

void printPage(EthernetClient client){

  client.println("<!DOCTYPE html>");
    client.println("<h1>Galileo na web!</h1>");
    client.println("<p>Página web para acender os leds da Galileo.</p>");
    client.println("<p>Selecione o led que deseja acender:</p>");
    client.println("<input type=button value=LED1 onmousedown=location.href='/?LED1;'>");
    client.println("<input type=button value=LED2 onmousedown=location.href='/?LED2;'>");
    client.println("<input type=button value=LED3 onmousedown=location.href='/?LED3;'>");
    client.println("<input type=button value=LED13 onmousedown=location.href='/?LED4;'>");
    client.println("</body>");
    client.println("</html>");
    client.println();

}
void sendHeader(EthernetClient client, char *title)
{
  // envia o http response header padrao
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html ; charset=UTF-8");
  client.println ("Connection: close");
  client.println();
  client.print("<html><head><title>");
  client.print(title);
  client.println("</title><body>");
}

void checkForClient(){
  EthernetClient client = server.available();
  int pin = 0;
  if (client) {

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        //read char by char HTTP request
        while (readString.length() < 100) {
          char c = client.read();
          //store characters to string 
          readString += c; 
          //Serial.print(c);
          if(c == '\n' )
            break;
        } 

      
                     
          if(!sentHeader) {
               sendHeader(client,"Web Page Galileo");
               printPage(client);
               sentHeader = true;  
           }
           
           
           //controle no led 1  (pino 2)
          if(readString.indexOf("LED1") >= 0 ){
            digitalWrite(2, HIGH);    
            Serial.println("Led 1 On");
            delay(3000);
            digitalWrite(2, LOW); 
            readString = "";
          }
          
          //controle no led 2  (pino 3)
          if(readString.indexOf("LED2") >= 0 ){
            digitalWrite(3, HIGH);    
            Serial.println("Led 2 On");
            delay(3000);
            digitalWrite(3, LOW); 
            readString = "";
          }
          
          //controle no led 3  (pino 4)
          if(readString.indexOf("LED3") >= 0 ){
            digitalWrite(4, HIGH);    
            Serial.println("Led 3 On");
            delay(3000);
            digitalWrite(4, LOW); 
            readString = "";
          }
          
          //controle no led 13  (pino 13)
          if(readString.indexOf("LED4") >= 0 ){
            digitalWrite(13, HIGH);    
            Serial.println("Led 13 On");
            delay(3000);
            digitalWrite(13, LOW);
            readString = ""; 
          }
          
          
        
        if (c == '\n' && currentLineIsBlank)  
          break;

        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
     
      }
      
    }
    
    readString="";
    sentHeader = false;
    delay(1); // tempo para o browser receber os dados
    client.stop(); // fecha a conexão
    
    digitalWrite(13, LOW); 
    
  } 

}


            Abra o Serial Monitor assim que o upload for feito para que você possa saber em qual ip o a Galileo estará servindo a pagina de controle de leds.
            De posse do ip apresentado, digite-o na barra de endereços do seu browser e aperte “Enter”. A seguinte janela será exibida :

Figura 2. Tela da página de controle de leds

            Ainda com o Serial Monitor aberto verifique que ao pressionar um dos botões da interface o respectivo led é aceso na placa e também é mostrada uma mensagem no monitor que este led foi aceso.

 Figura 3. Teste do webservice

Um comentário: