Fazendo uma requisição HTTP através de comandos AT no Arduino com ESP8266

Atualizado em

No meu mais recente projeto na faculdade me deparei com a necessidade de a utilização de um módulo ESP8266 para conectar meu protótipo à internet. Geralmente faz-se uso do módulo ESP8266 como servidor web, mas decidi tomar a contramão e usar o módulo como uma fonte de dados.

No meu caso, como usei diversas portas lógicas, não pude utilizar apenas o módulo ESP8266, precisei usar também um Arduino UNO R3 e para isso encontrei nenhuma outra forma senão o uso de comandos AT para conectar o Arduino ao Wifi e posteriormente fazer uma requisição HTTP.

Imagino que pelo fato de os comandos AT terem aí por volta dos seus 40 anos de idade, tenha sido muito difícil pra mim encontrar material na internet claro o suficiente com informações em como fazer uma requisição HTTP. Dado isso, veremos em seguida como facilmente conectar o seu Arduino ao wifi usando um módulo ESP8266 e em seguida veremos como fazer a requisição HTTP.

Ligando o ESP8266

Vamos ligar respectivamente o TX e o RX do ESP8266 nas portas 10 e 11 do Arduino, também aproveitamos para importar a biblioteca que vamos usar:

#include <Arduino.h>
#include <SoftwareSerial.h>

#define TX 10
#define RX 11

SoftwareSerial SerialESP8266(TX, RX);

Conectando ao Wifi

Vamos inicialmente declarar nossas variáveis sendo SSID o nome da rede wifi e password a senha.

String ssid = "SSID";
String password = "SENHA";

Vamos a seguir criar o nosso método connect que será responsável por fazer a conexão ao wifi:

void connect()
{
  delay(5000);
  SerialESP8266.setTimeout(5000);

  // Verificando a resposta do ESP8266
  SerialESP8266.println("AT");

  if (SerialESP8266.find("OK")) {
    Serial.println("AT OK");
  } else {
    Serial.println("Erro no ESP8266");
  }

  // ESP8266 em modo STA
  SerialESP8266.println("AT+CWMODE=1");

  if (SerialESP8266.find("OK"))
    Serial.println("ESP8266 em modo STATION...");

  // Conecta ao Wifi
  SerialESP8266.println("AT+CWJAP=\"" + ssid + "\",\"" + password + "\"");
  Serial.println("Conectando a " + ssid);
  SerialESP8266.setTimeout(10000); // aguarda a conexão

  if (SerialESP8266.find("OK")) {
    Serial.println("WIFI OK");
  } else {
    Serial.println("Não é possível conectar");
  }

  SerialESP8266.setTimeout(2000);

  // Desabilita múltiplas conexões
  SerialESP8266.println("AT+CIPMUX=0");
  if (SerialESP8266.find("OK"))
    Serial.println("Múltiplas conexões estão desabilitadas");
}

Vamos agora adicionar o método connect ao nosso setup assim também como iniciar os monitores seriais.

void setup()
{
  Serial.begin(9600);
  SerialESP8266.begin(9600);

  connect();
}

Uma vez conectado ao Wifi o Arduino permanecerá conectado contanto que não haja problemas. É possível criar uma verificação para reconexão caso seja necessário mas não abordaremos isso neste post. Com a conexão feita vamos partir para a requisição HTTP.

Criando uma requisição HTTP com comandos AT

Nosso código para requisição HTTP é um pouco mais longo. Como pode-se ver, o código abaixo faz um request GET para o endereço meusite.com/busca/ e fecha a conexão sob três condições:

  • A resposta atinge o tamanho máximo
  • A requisição chega ao tempo limite
  • O body contenha a palavra CLOSED ou um status 200 OK
void request(String reqLevel)
{ 
  String server = "meusite.com"
  String body = "";
  boolean request_end = false;

  SerialESP8266.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");

  // Abre a conexão com o servidor
  if (!SerialESP8266.find("OK"))
    return Serial.println("Impossível achar o servidor....");

  // Cabeçalhos
  String httpRequest = "GET /busca/"; // Path da requisição
  httpRequest = httpRequest + " HTTP/1.1\r\n";
  httpRequest = httpRequest + "Host: " + server + "\r\n\r\n";
  httpRequest = httpRequest + "Host: localhost\r\n\r\n";

  // Envia o tamanho da requisição
  SerialESP8266.print("AT+CIPSEND=");
  SerialESP8266.println(httpRequest.length());

  // Aguardando por ">" para enviar a requisição HTTP
  if (!SerialESP8266.find(">"))
    return;

  Serial.println("Enviando requisição HTTP. . .");
  SerialESP8266.println(httpRequest);

  if (!SerialESP8266.find("SEND OK"))
    return Serial.println("erro na requisição HTTP.....");

  Serial.println("Requisição HTTP enviada...:");

  long start_time = millis();

  while (request_end == false)
  {
    body = store_and_print(body);

    if(body.length() > 0)
      Serial.println(body);

    // Fecha a conexão caso o  "body" tenha tamanho maior que 3500
    if (body.length() > 3500)
    {
      SerialESP8266.println("AT+CIPCLOSE");
      request_end = true;

      Serial.println("A requisição chegou ao tamanho máximo...");
      if (SerialESP8266.find("OK"))
        Serial.println("Connection fechada...");
    }

    // Fecha a conexão se exceder o tempo limite
    if ((millis() - start_time) > 2000)
    {
      SerialESP8266.println("AT+CIPCLOSE");
      request_end = true;

      Serial.println("Tempo de conexão esgotado...");
      if (SerialESP8266.find("OK"))
        Serial.println("Conexão fechada");
    }

    if (body.indexOf("CLOSED") > 0 || body.indexOf("200 OK") > 0)
    {
      Serial.println("String OK, conexão fechada");
      request_end = true;
    }
  }
}

Com isso deve ser mais que possível conectar o seu Arduino à internet e fazer requisições HTTP. Ficou com alguma dúvida? Manda um tweet no @sergiopvilar lá no twitter