Usando o módulo WiFi ESP8266 com Arduino Uno publicando no ThingSpeak

Tempo de leitura: 8 minutes

Eu tenho esse módulo WiFi ESP8266 por aí que nunca usei de verdade. Eu também tenho alguns UNOs do Arduino sentados aqui que não estão sendo usados no momento. Achei que seria um ótimo momento para colocar os dois juntos em um projeto no qual estou trabalhando. Não foi fácil. Havia uma tonelada de conteúdo conflitante e confuso que tornava tudo muito mais difícil. Estou escrevendo isso na esperança de que possa ajudar um pouco o próximo cara.

 

Conteúdo

  • Compreendendo o ESP8266
  • Configurando ThingSpeak
  • Testando o ESP8266 diretamente
  • Acessando ESP8266 do código Arduino Uno
  • Juntando tudo

 

Compreendendo o ESP8266

Em primeiro lugar, uma pesquisa por ESP8266 irá revelar muitas referências a um microcontrolador minúsculo incrível que estava na moda até o lançamento do novo ESP32. No início, você pode pensar que procurou a coisa errada, mas não, não. Este pequeno componente é o original e tecnicamente pode ser programado como seus irmãos maiores. Porém, ele tem apenas dois pinos GPIO e não foi realmente projetado para ser um microcontrolador. Adicionar “Módulo Wifi” às suas pesquisas ajuda a concentrar os resultados

Pesquise por “ESP8266 Módulo WiFI”

Em seguida, temos as conexões Pinout. Dependendo do artigo que você está olhando, as conexões mudarão. É importante entender os pinos e como eles são usados. Em geral, você tem um VCC para alimentação e seu GND comum. Você também tem TX e RX para transmitir e receber. Você tem dois pinos GPIO, um pino de reinicialização e um pino CH_PD. Esta placa é projetada para ser um add-on para outro microcontrolador e oferece um recurso para ser capaz de ligá-lo ou desligá-lo, definindo o pino CH_PD de Alto para Baixo. No meu caso, vou deixá-lo ligado o tempo todo, então estou puxando para cima o tempo todo.

CH_PD é um chip controlado para baixo de energia e precisa puxar alto para funcionar

Falando em voltagem, todos os artigos que eu vi alertam para não dar muita energia, mas o meu parecia precisar de mais do que o Arduino de 3,5 V servido. Em meus testes, o módulo não inicializava corretamente com 3,5v, o que tornava muito difícil a depuração no início. Acabei mudando para o pino 5v e está tudo ótimo.

NOTA: A tensão máxima de trabalho do ESP8266 é 3,6 V.

Ele deveria funcionar com menos, mas o meu não. As respostas mais comuns a este artigo gritam para não usar 5v. Embora tenha funcionado para mim, tenha cuidado.

Se 3,5 V não for suficiente, considere mais

Acessar o módulo WiFi ESP8266 também é confuso. Existem dois conceitos principais aqui. Na primeira opção, você está usando o Módulo como um complemento e escrevendo código no Arduino para conversar com ele. O outro modelo é que você está tentando trabalhar no módulo diretamente para programá-lo ou atualizá-lo. Para nosso projeto final aqui, teremos código no Arduino conversando com o módulo, mas para ter certeza de que tudo está funcionando, estaremos conversando com o módulo diretamente (mais ou menos). Mais sobre isso mais tarde.

Entenda se você está acessando o Arduino Uno ou o módulo ESP8266

 

Configurando ThingSpeak

Vamos criar um ponto de extremidade para o qual possamos enviar alguns dados em nosso teste.

  • Crie uma conta em ThingSpeak https://thingspeak.com/
  • Crie um novo canal com um rótulo de campo
  • Obtenha a chave de API
  • Revise o URL “Atualizar um feed de canal”

ThingSpeak é incrivelmente fácil de usar. Assim que tiver seu canal e chave, você pode simplesmente fazer uma solicitação HTTP para https://api.thingspeak.com/update?api_key=YOUR_KEY_HERE&field1=4 para enviar o valor 4 para o campo1. Experimente em seu navegador e analise os dados na Visualização Privada de seu canal.

Anote a chave de API do canal para usar posteriormente em seu código

Testando o ESP8266 diretamente

OK, agora que temos algo para testar, vamos voltar ao ESP8266. Lembre-se de que deixamos de notar que você pode acessar o módulo WiFi com o Arduino Code ou diretamente. Sou fã de reduzir variáveis e, como não confiei nos exemplos de código que estava encontrando, achei melhor ter certeza de que meu Módulo WiFi estava funcionando sozinho antes de tentar vinculá-lo ao código do Arduino. PROBLEMA você precisa de adaptadores especiais para conectá-lo ao seu computador. Um adaptador USB Serial TTY pode funcionar, mas eu não fiz a fiação certa e quase estraguei o módulo. SOLUÇÃO usar o Arduino Uno como Bridge, contornando tudo no Uno e conversando com o módulo diretamente.

Então, é assim que funciona. Você pode conectar o pino de reinicialização no Uno ao GND para ignorar o bootloader do Arduino. Isso permite que você se conecte ao TX e RX do Uno a partir do módulo. Uma vez que o cabo USB do Uno está devidamente conectado ao TR e RX do Uno, quaisquer sinais colocados nessas linhas passarão direto para o módulo. Aqui está o truque, neste caso, queremos que o TX no Uno se conecte ao TX no módulo e o RX do Uno ao RX no módulo. Perceba que tudo o que estamos fazendo aqui é estender a linha TX para o módulo. O crossover, neste caso, já é gerenciado no adaptador USB. Vamos mudar isso mais tarde. Apenas neste modelo de ponte você tem TX para TX e RX para RX.

Use o Uno como uma ponte para falar diretamente com o módulo. Ignorando o carregador de inicialização Uno conectando RESET ao GND, então conecte TX a TX, RX a RX, GND a GND, VCC e CH_PD a 5v.

 

Ligação

Esp8266 | Arduino 
-----------------
     RX | RX 
     TX | TX 
    GND | GND
    VCC | 5v 
  CH_PD | 5v 
 GPIO 0 | None 
 GPIO 2 | None

Arduino | Arduino
-----------------
  Reset | GND

Depois de fazer a ligação, você poderá usar o Arduino Serial Monitor no Arduino IDE para acessar o módulo. Lembre-se de que você se conectará à porta em que o Arduino está.

Em seguida, certifique-se de escolher “Ambos NL e CL” e ajuste a taxa de transmissão. Meu módulo estava falando em 115200 baud, mas eu ouvi outros modelos em 9600.

Neste ponto, você deve ser capaz de enviar um comando “AT” e obter uma resposta “OK”. WoHoo! você está falando com o módulo.

Vamos brincar mais. Para esta seção, achei mais fácil preparar seus comandos em um editor de texto, em seguida, apenas copiar e colar no Monitor Serial.

Conecte-se ao seu wi-fi enviando

AT+CWJAP=”WIFI_NAME”,”WIFI_PASSWORD”

Certifique-se de inserir seu próprio nome de wifi e senha

Conecte-se ao ThingSpeak

AT+CIPSTART=”TCP”,”api.thingspeak.com”,80
AT+CIPSEND=51
GET /update?key=XXXXXXXXXXXXXXXX&field1=55 \r\n
AT+CIPCLOSE

Nesta última imagem, destaquei a resposta do ThingSpeak. Eles retornam um contador e esta foi minha mensagem de 1761st.

Você deve ter recebido uma resposta após o comando GET. Verifique seu canal ThingSpeak para ver os dados.

Nota: AT + CIPSEND deve ser 2 a mais do que o tamanho de sua linha GET. Acredito que isso esteja relacionado ao Serial Monitor enviando NL e CR.

Nota: Deve haver um espaço após a URL em seu GET e os caracteres da nova linha, que me fez tropeçar.

Acessando ESP8266 do código Arduino Uno

Agora estamos prontos para o fluxo normal. Vamos escrever código para o Arduino para conversar com o módulo. A fiação aqui vai ter o TX do Uno conectado ao RX do módulo e o RX do Uno falando com o TX do módulo, mas não faça isso ainda. PROBLEMA, há apenas um serial no Uno, mas precisamos dele para depuração e também para o módulo. Não podemos usar um serial para ambos. Felizmente, podemos usar algum código chamado SoftwareSerial para fazer uma porta serial virtual no Arduino. Isso significa que, em vez de conectar ao TX/RX, conectaremos a outro conjunto de pinos e fazer com que o SoftwareSerial envie comandos para esses pinos.

Tentar conectar no Serial TX/RX do Uno irá bloquear você de conectar o IDE ao UNO, uma vez que ele funciona no USB Serial nos mesmos pinos.

Use a biblioteca SoftwareSerial para conectar o módulo através dos pinos 10 e 11. Mova os fios do módulo e certifique-se de remover o fio do jumper que estava entre RESET e GND

Esp8266 | Arduino 
 — — — — — — — — -
     RX | 11 
     TX | 10 
    GND | GND (same)
    VCC | 5v (same) 
  CH_PD | 5v (same) 
 GPIO 0 | None (same) 
 GPIO 2 | None (same)

Observe que White TX está no pino 10 e Gray RX está no pino 11

Ok, vamos dar uma olhada em alguns códigos

Primeiro, precisamos configurar o serial virtual para o módulo. Incluiremos a biblioteca e definiremos a variável

#include <SoftwareSerial.h>
#define RX 10
#define TX 11
SoftwareSerial esp8266(RX,TX);

 

Daqui em diante, falaremos com o Módulo por meio de “esp8266” e falaremos com o IDE por meio de “Serial”. Vamos tentar em nossa função de configuração

void setup() {
 Serial.begin(9600);
 esp8266.begin(115200);
 …

Observe que definimos a conexão serial para uma taxa de bauds de 9600 e a conexão esp8266 para uma taxa de bauds de 115200. Certifique-se de definir seu IDE Serial Monitor para a taxa de transmissão correta e definir o valor esp8266 para a taxa de transmissão do módulo que você confirmou anteriormente.

Vamos adicionar mais e ver se está funcionando, passando os mesmos comandos que fizemos antes

void setup() {
 Serial.begin(9600);
 esp8266.begin(115200);
 esp8266.println(command);
 esp8266.println(“AT+CWMODE=1”);
 esp8266.println(“AT+CWJAP=\”WIFI_NAME\”,\”WIFI_PASSWORD\””);
}

Doce, então espero que tenha funcionado. Caso contrário, o comando pode ter expirado ou falhado. Eu encontrei alguns códigos para ajudar a lidar com isso. O resto do exemplo é baseado nessa fonte.

Basicamente, há uma função auxiliar chamada “sendCommand” que recebe um comando, um valor de tempo limite e o resultado esperado como entrada. Também extraí os dados do sensor para sua própria função chamada, surpreendentemente, getSensorData. Isso tem um valor aleatório simples agora, mas será substituído pelos dados reais do sensor na implementação final

 

Juntando tudo

OK, pronto para toda a base de código? Observe que a função de configuração abaixo é diferente da acima, apenas no caso de você estar copiando/colando e não entendeu.

#include <SoftwareSerial.h>#define RX 10
#define TX 11String AP = "WIFI_NAME";       // CHANGE ME
String PASS = "WIFI_PASSWORD"; // CHANGE MEString API = "YOUR_API_KEY";   // CHANGE ME
String HOST = "api.thingspeak.com";
String PORT = "80";
String field = "field1";int countTrueCommand;
int countTimeCommand; 
boolean found = false; 
int valSensor = 1;SoftwareSerial esp8266(RX,TX); 

void setup() {
  Serial.begin(9600);
  esp8266.begin(115200);
  sendCommand("AT",5,"OK");
  sendCommand("AT+CWMODE=1",5,"OK");
  sendCommand("AT+CWJAP=\""+ AP +"\",\""+ PASS +"\"",20,"OK");
}

void loop() {
 valSensor = getSensorData();
 String getData = "GET /update?api_key="+ API +"&"+ field +"="+String(valSensor);sendCommand("AT+CIPMUX=1",5,"OK");
 sendCommand("AT+CIPSTART=0,\"TCP\",\""+ HOST +"\","+ PORT,15,"OK");
 sendCommand("AT+CIPSEND=0," +String(getData.length()+4),4,">");
 esp8266.println(getData);delay(1500);countTrueCommand++;
 sendCommand("AT+CIPCLOSE=0",5,"OK");
}

int getSensorData(){
  return random(1000); // Replace with 
}

void sendCommand(String command, int maxTime, char readReplay[]) {
  Serial.print(countTrueCommand);
  Serial.print(". at command => ");
  Serial.print(command);
  Serial.print(" ");
  while(countTimeCommand < (maxTime*1))
  {
    esp8266.println(command);//at+cipsend
    if(esp8266.find(readReplay))//ok
    {
      found = true;
      break;
    }
  
    countTimeCommand++;
  }
  
  if(found == true)
  {
    Serial.println("OYI");
    countTrueCommand++;
    countTimeCommand = 0;
  }
  
  if(found == false)
  {
    Serial.println("Fail");
    countTrueCommand = 0;
    countTimeCommand = 0;
  }
  
  found = false;
 }

Vá para ThingSpeak para ver seus dados

 

Pronto, você tem WiFi no seu Arduino. Feliz IoT-ing

 

Neste artigo, mostrei como usar um ESP8266 com o Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esse ESP8266. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.