Arduino + ESP8266-01 enviando dados para io.adafruit.com
Nesse exemplo vamos construir um dispositivo capaz de enviar dados pela internet para o site Adafruit IO, que se trata de uma plataforma na nuvem para dispositivos de internet das coisas, com o objetivo de receber dados e permitir sua análise através de gráficos. Como pretendemos utilizar um simples Arduino UNO que não possui conectividade com interfaces de rede (cabo ou wifi), vamos utilizar o módulo ESP8266-01 como interface de rede wifi. A comunicação entre o Arduino Uno e o ESP8266-01 se dará através do protoloco RS232, utilizando no ESP o firmware que suporta comandos AT. A lista completa de comandos deste firmware pode ser encontrada neste arquivo: https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf
IMPORTANTE: o ESP8266-01 precisa estar configurado para comunicar através do protocolo RS232 (serial) a uma velocidade de 9600 bps, devido a uma restrição da biblioteca de comunicação que será utilizada no Arduino. Por padrão o ESP8266 trabalha a uma taxa de transmissão de 115200bps, para reduzir a velocidade é necessário seguir o post contido neste link: http://www.faltoupontoevirgula.com.br/index.php/2018/03/20/atualizando-firmware-de-comandos-seriais-at-no-esp8266/
Lista de dispositivos necessários:
- Arduino UNO
- ESP8266-01
- 2 resistores de 220ohms
- protoboard
- jumpers
Esquema elétrico:
Conforme a figura abaixo o módulo ESP8266 e alimentado pela porta de 3.3v do Arduino UNO, pois essa é sua tensão de trabalho. A porta CH_PD do ESP8266-01 deve ser conectada diretamente à tensão 3.3v, para habilitar o funcionamento do microprocessador. A porta GND do ESP8266-01 é conectada diretamente a porta GND do Arduino, da mesma forma a porta TX do ESP8266-01 (jumper roxo) pode ser conectada diretamente à porta digital 02 do Arduino UNO, já a porta RX do ESP8266-01 que receberá os pulsos de informação do Arduino UNO deve ter sua tensão reduzida através do circuito de divisão de tensão aplicado no esquema abaixo, utilizando dois resistores de 220Ohms, parte da tensão da porta digital 3 do Arduino Uno é enviada para o ESP8266-01 por um resistor e a outra metade da tensão é enviada para o GND.
Agora vamos analisar o código fonte necessário para fazer a comunicação entre o Arduino e o ESP8266-01.
[cc lang=”c” tab_size=”4″]
/*
* Baseado no código de envio de dados da Filipeflop.com
* Ligação elétrica
* – Fio vermelho 3.3v
* – Fio preto – GND
* – Fio Verde – Porta digital 2
* – Fio Azul – Porta digita 3
*/
#include
const String ADAFRUIIO_APIKEY = “CHAVE_DE_SEGURANCA_FORNECIDA_ADAFRUIT”;
const String ADAFRUIIO_GROUP = “GRUPO_DADOS_FORNECIDO_ADAFRUIT”;
const String WIFI = “NOME_REDE_WIFI”;
const String WIFI_PASSWORD = “SENHA_REDE_WIFI”;
const String HOST = “io.adafruit.com”;
const String PORT = “80”;
//RX pino 2, TX pino 3
SoftwareSerial esp8266(2, 3);
#define DEBUG true
void setup()
{
Serial.begin(9600);
esp8266.begin(9600);
sendData(“AT+RST\r\n”, 2000, DEBUG);
delay(1000);
Serial.println(“Versao de firmware”);
delay(3000);
sendData(“AT+GMR\r\n”, 2000, DEBUG); // rst
delay(3000);
sendData(“AT+CWQAP\r\n”, 2000, DEBUG); // rst
delay(3000);
sendData(“AT+CWAUTOCONN=1\r\n”, 2000, DEBUG); // rst
delay(3000);
sendData(“AT+CWMODE=1\r\n”, 2000, DEBUG); // rst
delay(3000);
sendData(“AT+CWJAP=\”” + WIFI +”\”,\”” + WIFI_PASSWORD + “\”\r\n”, 4000, DEBUG);
delay(4000);
sendData(“AT+CIFSR\r\n”, 2000, DEBUG);
Serial.println(“** Final **”);
}
void loop() {
sendData(“AT+CIPSTART=\”TCP\”,\”” + HOST + “\”,” + PORT + “\r\n”, 5000, DEBUG);
delay(5000);
sendData(“AT+CIPSEND=160\r\n”, 5000, DEBUG);
delay(5000);
int t = random(0, 99);
sendData(“GET /api/v1/groups/” + ADAFRUIIO_GROUP + “/send.json?x-aio-key=” + ADAFRUIIO_APIKEY + “;temp=” + String(t) + “;humidity=12;wind=45 HTTP/1.1\r\nHost: ” + HOST + “\r\n\r\n\r\n”, 5000, DEBUG);
delay(5000);
sendData(“AT+CIPCLOSE\r\n”, 5000, DEBUG);
delay(5000);
}
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;
}
[/cc]
Este código precisa ser modificado, para informar a chave de segurança fornecida pela Adafruit, o nome do grupo de dados criado no site da Adafruit, o nome da rede WIFI e a senha.
Acesse o site io.adafruit.com, e crie sua conta caso não possua.
Ao acessar o site com sua conta, clique no link View AIO Key, para obter a chave de segurança que deve ser colocada no código fonte.
Então clique no link Feeds, e utilize o botão Actions para criar um novo grupo, o nome do grupo criado deverá ser informado no código fonte do Arduino.
Os parâmetros são enviados na linha 51 deste código, observe que o código realiza uma chamada GET utilizando o protocolo HTTP, onde a URL é composta da seguinte maneira:
/api/v1/groups/” + ADAFRUIIO_GROUP + “/send.json?x-aio-key=” + ADAFRUIIO_APIKEY + “;temp=” + String(t) + “;humidity=12;wind=45 HTTP/1.1\r\nHost: ” + HOST + “\r\n\r\n\r\n”
Os parâmetros são passados após a chave de segurança da API, separados por ponto e vírgula, neste exemplo a temperatura é calculada por uma função randômica, e a umidade e velocidade do vento são sempre contantes.