O ESP8266 parte 2 – Web Server

19 19-03:00 janeiro 19-03:00 2016 — 9 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 (GitHub)

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

 

 

 

 

 

9 Respostas para O ESP8266 parte 2 – Web Server

  1. 

    Olá Marcelo,

    Primeiramente parabéns pelo blog, excelente!

    Porém estou com uma dúvida, você usou qual biblioteca? No meu está dando erro ao compilar.

    Obrigado, abraço!

    Curtir

  2. 

    Boa tarde, otimo post!!
    Eu tentei conectar o esp-01 atravez do arduino uno, mas no serial apareceram as seguintes informações:

    Ai-Thinker Tec

    ready
    WIFI DISCOGNECT
    AT+AWeAP=”ROVAI TRSQ⸮P%bj⸮⸮ݢ⸮⸮j
    AT+CWMODE=1

    busy p…
    AT+CIFSR
    busy p…
    AT+CIPMUX=1

    busx p…
    AT+CIPSERVES=1,80

    busx x…

    O senhor saberia me informar oq pode estar causando isso?

    Obrigado.

    Curtir

  3. 

    Hello!

    Great project! Works great!

    Only one thing I did not manage yet and although to include a button in the program.
    It would be great if you could still control the outputs in addition to Alexa and mobile phone with a button.
    Can you help me?

    Curtir

  4. 

    O link da dropbox não está funcionando.

    Curtir

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