segunda-feira, 24 de abril de 2017

Arduino & W5100 Led on/off com refresh da página

Já postamos o comando via web usando o ajax no post:


Neste post abordaremos um script mais simples onde o comando ocorre com um refresh da página.

O set para este teste é bastante simples como pode ser visto na figura abaixo:


Trata-se do Arduino Mega 2560 com o Shield W5100 e um Led com um resistor de 220 Ohms em série entre o pino 6 e o GND.

A página apresentará 02 links  como visto abaixo:



Um link é para ligar o Led e o outro obviamente é para desligar.

O script que rodará no arduino será um servidor desta simples página e tratará as requisições dos links para ligar ou desligar o led.

Na monitoração serial podemos acompanhar o funcionamento do script como segue:


Logo na inicialização temos as informações da abertura da porta serial bem como o IP obtido pelo DHCP.
Após esta etapa podemos abrir o navegador usando o IP informado pela monitoração serial.

Clicando-se no link Ligar o led temos as seguintes informação na serial monitor:


Podemos ver que foi passado o parâmetro ?ledon.
O servidor ao receber este parâmetro sobe a tensão no pino 6 para 5 volts, o led ascende.

Clicando-se no link  Desligar o Led  temos as seguintes informações na serial monitor:


Podemos ver que foi passado o parãmetro ?ledoff.
O servidor ao receber este parâmetro desce a Zero a tensão do pino 06, o led apaga.

Observamos que quando o navegador faz a primeira requisição no servidor não é passado nenhum parâmetro  e portando só a página é enviada.

O script é bem tranquilo e está todo separado em funções para maior clareza:

#include <SPI.h>
#include <Ethernet.h>
  
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 13 };//Se nao carregar o DHCP usa este IP
     
EthernetServer server(80);
EthernetClient client;
  
String readString;
int Pin = 6;

//=====Configuracoes iniciais==========================  
void setup(){
  
  pinMode(Pin, OUTPUT);
  digitalWrite(Pin, LOW);//Inicia pino em Low
  Serial.begin(9600);

  Serial.println("Porta serial Ok");
  
  Serial.println("Iniciando a Ethernet...");
  Ethernet.begin(mac, ip);
  
  
  if(Ethernet.begin(mac) == 0)// Para usar o DHCP
  {
    Serial.println("Falha em carregar o DHCP");
    Serial.println("Usando o IP fixo");
    Serial.println(Ethernet.localIP());
  }
   else
  {
    Serial.println("DHCP carregado com Sucesso"); 
    Serial.println(Ethernet.localIP());
  } 
  
  
  
  server.begin();  
}

//================Envia pagina HTM ao Navegador====================
void enviaPaginaHTML()
{
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println();
           
    client.println("<HTML>");
    client.println("<BODY>");
    client.println("<H1>Comanda o Led </H1>");
    client.println("<hr />");
    client.println("<br />");
           
    client.println("<a href=\"/?ledon\">Ligar o led</a>");
    client.println("<a href=\"/?ledoff\">Desligar o led</a><br />");   
           
    client.println("</BODY>");
    client.println("</HTML>");
           
    delay(1);
    client.stop();
}

//======================Trata a String recebida do Navegador===============

void trataString()
{
  
  if(readString.indexOf("?ledon") > 0)//Verifica se tem "?ledon" na String enviada pelo navegador
  {
    digitalWrite(Pin, HIGH);
    Serial.println("Ligado");
   }
  
   if(readString.indexOf("?ledoff") > 0)//Verifica se tem "?ledoff" na String enviada pelo navegador
   {
     digitalWrite(Pin, LOW);
     Serial.println("Desligado");
   }  
      
}
//=======================Loop principal====================================  
void loop()
{
  client = server.available();
  if (client)
  {
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
  
        if (readString.length() < 100)
        {
          readString += c;//Forma a String com o recebimento do navegador             
        }
        if (c == '\n')//Recebeu o "New Line" Final da requisicao feita pelo navegador
        {
          enviaPaginaHTML();//Envia pagina HTML para o Navegador
          trataString();//Verifica parametros da requisicao do Navegador
          Serial.println(readString);
          readString="";//Apaga String para receber nova requisicao    
        }
      }//Fim do if (client.available())
    }//Fim do while (client.connected())
  }
  
}//Fim do Loop


Temos:

As inclusões das bibliotecas
O setup para ajustes iniciais
A função que envia a página para o cliente ( navegador)  enviaPaginaHTML()
A função que analisa a requisição enviada pelo navegador trataString()
E o loop()

A Serial é usada para monitorar o funcionamento do script.


Este script é para um "jogo rápido"a melhor opção é usar o ajax para não haver refresh na página com o flicker.

Boa diversão...


Nenhum comentário:

Postar um comentário