O ESP8266 parte 2 – Web Server

19 19UTC janeiro 19UTC 2016 — 2 Comentários

Em meu post anterior procurei descrever o que é, como ligar, testar e configurar o ESP8266 (vamos chamar-lo ESP para simplificar). Aqui vamos dar uma pincelada no que se deve fazer com o ESP para interagir com os GPIOs do Arduino remotamente via web .

Alguém disse uma vez “If you can blink a LED you can do anything”. No mundo dos sistemas embebidos (“Embebed systems”), esse dizer é uma verdade verdadeira ululante! Quando você faz com que um LED acenda a partir de um sinal gerado em uma das portas do Arduino, ou que ele possa ler o status de uma chave ou sensor, o que está realmente acontecendo é a interação do mundo da eletrônica com o mundo físico! Conseguir essa interação via uma página da internet é de fato toda a essência do IoT.

image

A primeira configuracão que testarei, será o ES8266 funcionando como um servidor web local, conectado a um Arduino MEGA. Vamos instalar botões em dois GPIOs digitais do Arduino (Pinos 8 e 9) simulando o estado de algum sensor e um potenciômetro na porta analógica A0, simulando os dados fornecidos por um sensor analógico, como por exemplo temperatura (os “inputs” do diagram acima). A função do ESP8266 será ler esses sinais, gerar uma página HTML  simples, publicando os resultados em tempo real na web! Cool!!!!!!!!

O circuito:

Webserver circuit

Observe que  o circuito é basicamente o mesmo que o do post anterior, apenas adicionei dois botões (normalmente abertos) conectados entre as entradas do Arduino  e o VCC (via um resistor de 10K para não gerar um curto-circuito, claro). Ao pressionar o botão, o que estamos fazendo é colocar um sinal HIGH na entrada digital do Arduino. O potenciômetro (também de 10K) será montado entre VCC (5V) e Terra, com seu pino central conectado a entrada analógica A0 do MEGA. O pot controlará o nível de tensão na entrada analógica A0,  a qual variará de “0V a 5V”. O MEGA lerá a tensão no pino AO e seu ADC interno (Analogic Digital Converter), convertendo a mesma para um valor que variará respectivamente de “0 a 1023”.

O Código:

O que farei aqui, será ressaltar as principais diferenças da sketch anterior ( O ESP8266 Serial Wifi Module), mas não se preocupem que no final, deixo o link para o código completo:

  • Antes de mais nada, depois das definições e set up geral como já foi visto anteiormente, é importante iniciar o ESP como um servidor. Para isso, a função InitWifiModule()
void InitWifiModule()
{
  sendData("AT+RST\r\n", 2000, DEBUG); // reset
  sendData("AT+CWJAP=\"Your network ID\",\"password\"\r\n", 2000, DEBUG); 
  delay(3000);
  sendData("AT+CWMODE=1\r\n", 1000, DEBUG);
  sendData("AT+CIFSR\r\n", 1000, DEBUG); // Show IP Adress
  sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); // Multiple conexions
  sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); // start comm port 80
}
  • No loop principal, se espera para ver se o ESP está enviando algo e se o string  “+IPD” é encontrado significa que a pagina foi identificada (veja a cópia do monitor serial mais abaixo).
  • Esperamos 300 milisegundos para garantir que o buffer serial tenha lido todos os dados.
  • Como a função read() retorna ASCII, é importante que ao se carregar o connection ID, seja subtraído o valor “48” do dado lido. 48 é o código do primeiro caracter decimal “0”. Assim se o dado 49 (codigo ASCII para  “1”) é recebido, ao subtrair 48, o resultado será um digito puro (“1”).
  • Em verde, está o código HTML que será enviada ao Browser para a construção da página (Note que mesmo que você não seja familiar com a linguagem HTML, em vermelho está o que aparecerá escrito na página, fique livre para customizer-la a seu gosto).
  • Em azul, as informações são enviadas (Comando CPISEND) e em laranja se fecha a conexão (comando CPICLOSE).
void loop()
{
   if (esp8266.available()) // check if 8266 is sending data
   {
      if (esp8266.find("+IPD,"))
      {
         delay(300);
         int connectionId = esp8266.read() - 48;
 
         String webpage = "<head><meta http-equiv=""refresh"" content=""3";
         webpage += "</head><h1>MJRoBot WebServer ESP8266</h1><h2>Ardin: ";
         webpage += "D8 status ==> ";
         int a = digitalRead(8);
         webpage += a;
         webpage += "<h2>Arduino Pin: D9 status ==> ";
         int b = digitalRead(9);
         webpage += b;
         webpage += "<h2>Arduino Pin: A0 data ===> ";
         int c = analogRead(0);
         webpage += c;
         webpage += "</h2>";
 
        String cipSend = "AT+CIPSEND=";
        cipSend += connectionId;
        cipSend += ",";
        cipSend += webpage.length();
        cipSend += "\r\n";
       sendData(cipSend, 1000, DEBUG);
       sendData(webpage, 1000, DEBUG);
 
      String closeCommand = "AT+CIPCLOSE=";
      closeCommand += connectionId; // append connection id
      closeCommand += "\r\n";
      sendData(closeCommand, 3000, DEBUG);
     }
  }
}
  • A função “sendData()” enviará os comandos AT para o ESP
  • Quando o esp8266.available é TRUE, significa que existem dados disponíveis , portanto a resposta “c” é montada
String sendData(String command, const int timeout, boolean debug)
{
  String response = "";
  esp8266.print(command);
  long int time = millis();
  while ( (time + timeout) > millis())
      {
        while (esp8266.available())
            {
              char c = esp8266.read(); // read the next character.
              response += c;
            }
      }
      if (debug)
        {
          Serial.print(response);
        }
      return response;
}
  • Durante a conexão o monitor serial apresenta os dados abaixo:
  • Muito importante é o segundo IP address que aparece no monitor: 10.0.1.2

Serial - Conxion

 

  • Ao entrar com o IP acima, em um browser, o ESP montará a pagina HTML que foi programada e começará a enviar as informações capturadas nas entradas do MEGA:

Webserver page

  • No monitor Serial, se observará os dados que são continuamente atualizados:

Serial Ongoing comm

  • No vídeo abaixo se poderá observar o WebServer funcionando:

 

Link para a sketch do Arduino MEGA e do diagrama eletrônico

Tudo o que foi visto aqui para o Arduino MEGA poderia ser executado com um Arduino UNO, ou qualquer outro da família.

A diferença básica será a utilização de outros GPIOs como port serial. Como o UNO só tem 1 port, usaremos a biblioteca softwareSerial () para definir os pinos 2 e 3 como RX e TX respectivamente (note que isso só funciona para velocidades mais baixas que 19.600bauds)

As definições iniciais no código devem ser alteradas para:

#include <SoftwareSerial.h> 
SoftwareSerial esp8266(2,3);  //Rx ==> Pin 2; TX ==> Pin3

#define speed8266 9600 

O restante do código para o UNO funcionará da mesma maneira que para o MEGA.

O novo circuito:

ESP8266_WebServer_UNO

O vídeo abaixa, mostra o UNO como um WebServer executando o mesmo código anterior:

Link para o vídeo do WebServer funcionando com o UNO

Conclusão

Bom, é isso aí. Como havia dito, essa menina não é fácil! e ainda não vimos os LEDs piscarem! Mas isso fica para um próximo post. Façam o download do programa completo abaixo, mão na massa e boa sorte!

Como sempre, espero que este projeto ajude outras pessoas a encontrar seu caminho no apaixonante mundo da eletrônica e do IoT!

Não deixe de visitar e seguir minha página: MJRoBot.org no Facebook

“Saludos desde el sur del mundo!” 😉

Um abraço e até o próximo post!

Obrigado

Marcelo

 

 

 

 

 

Anúncios

Trackbacks e Pingbacks:

  1. ArduFarmBot: Part 2 – “Estação Remota” – IoT – MJRoBot.org - setembro 21, 2016

    […] O ESP8266 parte 2 – Web Server […]

    Curtir

  2. O ESP8266 parte 3 – Acionando LEDs remotamente | MJRoBot - janeiro 21, 2016

    […] O ESP8266 parte 2 – Web Server […]

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s