Pessoal, minha idéia aqui é 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.

A primeira configuração que testarei, será o ES8266 funcionando como um servidor web local, conectado a um Arduino UNO. 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. A função do ESP8266 será receber essas informações dos GPIOs do Arduino e gerar uma página HTML  simples, publicando os resultados em tempo real na web! Cool!!!!!!!!

O circuito:

Montei 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 Arduino. O pot controlará o nível de tensão na entrada analógica A0,  a qual variará de "0V a 5V". O Arduino lerá a tensão no pino AO e seu ADC interno (Analogic Digital Converter), convertirá a mesma para um valor que variará respectivamente de "0 a 1023".

O Código:

As definições iniciais:

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

#define speed8266 9600 
#define CH_PD 4
#define DEBUG true

void setup()
{
    esp8266.begin (speed8266);
    Serial.begin(9600);
    reset8266(); // Pin CH_PD vai a zero por um breve momento e depois fica em HIGH
    InitWifiModule();
}

O que farei aqui, será ressaltar os principais módulos do código, mas não se preocupem que no final deixo o link para o código completo:

Depois das definições e set up geral é 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" é encontrada, o que 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 por exemplo, 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

(Ignore o cabeçalho onde diz Arduino Mega, os dados apresentados no monitor serial são os mesmos independente do microprocessador.

Ao entrar com o IP acima, em um browser (de preferencia o CHROME. Tive problemas com o Safari), o ESP montará a pagina HTML que foi programada e começará a enviar as informações capturadas nas entradas do UNO:


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

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

Link para o vídeo do WebServer (UNO + ESP8266)

Bom, é isso aí. Ainda não vimos os LEDs piscarem! Mas isso fica para a próxima parte desse tutorial. Faça o download do programa completo abaixo, mão na massa e boa sorte!

Link para o codigo completodo Arduino


Abaixo o link de meu Blog (vale deixar uns "like" por lá ;-)

MJRoBot "Um andarilho no mundo da eletrônica"


Exibições: 3386

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço