<
*

Ivanov

  • Allahu Akbar
  • *****
  • 60
  • 2
  • Zhokhov
    • Ver perfil
O ESP8266 parte 2 – Web Server
« Online: Dezembro 08, 2017, 09:23:35 am »
O ESP8266 parte 2 – Web Server



Neste tutorial vamos ver o 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”. 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
", 2000, DEBUG); // reset
  sendData("AT+CWJAP="Your network ID","password"
", 2000, DEBUG);
  delay(3000);
  sendData("AT+CWMODE=1
", 1000, DEBUG);
  sendData("AT+CIFSR
", 1000, DEBUG); // Show IP Adress
  sendData("AT+CIPMUX=1
", 1000, DEBUG); // Multiple conexions
  sendData("AT+CIPSERVER=1,80
", 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 = "

MJRoBot WebServer ESP8266


Ardin: “; webpage += “D8 status ==> “; int a = digitalRead(8); webpage += a; webpage += “


Arduino Pin: D9 status ==> “; int b = digitalRead(9); webpage += b; webpage += “


Arduino Pin: A0 data ===> “; int c = analogRead(0); webpage += c; webpage += “


“; String cipSend = “AT+CIPSEND=”; cipSend += connectionId; cipSend += “,”; cipSend += webpage.length(); cipSend += “
”; sendData(cipSend, 1000, DEBUG); sendData(webpage, 1000, DEBUG); String closeCommand = “AT+CIPCLOSE=”; closeCommand += connectionId; // append connection id closeCommand += “
”; 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.2Serial - 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 poderá observar o WebServer a funcionar:


  • 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