banner

Arduino Due com ESP8266




Hoje vou apresentar para vocês uma aplicação integrando Arduino DUE e ESP8266 utilizando comunicação UART. Ainda, vou mostrar um exemplo de WebServer com ESP8266, utilizando este DUE como uma espécie de expansor de porta, ou seja, um slave do ESP8266. Essa dupla pode trazer inúmeras vantagens para seu projeto.
Vale lembrar que este projeto que vou mostrar aqui funciona para o ESP-01, o qual é bem mais barato que o Módulo ESP8266 NodeMCU. O código de exemplo usado aqui é simples e acompanha fluxograma para maior entendimento.





RECURSOS USADOS

  • ESP8266 Nodemcu Esp-12e
  • Arduino Due ATmel-SAM3XAE
  • Led
  • Resistor 220 ohm ou 330 ohm
  • Protoboard
  • Jumpers







MONTAGEM









PINOUT

Arduino DUE




ESP8266-12e



ESP-01







MONTAGEM

Tabela


O LED está ligado na porta A11 do DUE.





CÓDIGO

Fluxograma

DUE




ESP8266




Código DUE

Declarações e variáveis

// Serial utilizada para comunicação com o ESP8266 (Tx3 e RX3)
#define ESP8266 Serial3

// Led
const int led = A11;

Setup


void setup() 
{
  // Iniciamos a serial para debug
  Serial.begin(115200);
  // Iniciamos a serial 3 de comunicação com o ESP
  ESP8266.begin(115200);
  // Setamos o pino do led como saída
  pinMode(led, OUTPUT);  
 
  Serial.println("Aguardando mensagens do ESP8266...");
}

Loop


void loop()
{
  //  Se uma nova mensagem foi recebida
  if(ESP8266.available()) // check if the esp is sending a message 
  {
    Serial.println("Recebido:");    

    // Efetua a leitura da mensagem vinda do ESP8266
    String msg = ESP8266.readString();
    Serial.println("'"+msg+"'");

    // Se a mensagem corresponde a "ON" ligamos o led, e vice-versa
    if(msg.substring(0,msg.indexOf("\n")-1).equalsIgnoreCase("ON"))
      digitalWrite(led, HIGH);
    else
    if(msg.substring(0,msg.indexOf("\n")-1).equalsIgnoreCase("OFF"))
      digitalWrite(led, LOW);  
  }
  delay(1);  
}



Código ESP

Declarações e variáveis

// Bibliotecas wifi
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

// SSID e senha da rede WiFi que o ESP utilizará (Access Point)
const char* ssid = "SSID";
const char* password = "SENHA";

// Objeto referente ao WebServer
ESP8266WebServer server(80);

// IP fixo
const IPAddress IP = IPAddress(192, 168, 3, 120); // IP fixo que o ESP utilizará
const IPAddress GATEWAY = IPAddress(192, 168, 3, 1); // Gateway
const IPAddress SUBNET = IPAddress(255, 255, 255, 0); // Máscara

// Nomeamos a serial como DUE
#define DUE Serial


Setup


void setup()
{
  // Iniciamos a Serial
  DUE.begin(115200);
  // Aguardamos 1 segundo
  delay(1000);
  // Setamos o pino do led interno como saida
  // Esse led piscará indicando que o wifi está sendo configurado/iniciado 
  pinMode(LED_BUILTIN, OUTPUT);
  
  // Iniciamos o WiFi
  WiFi.begin(ssid, password);

  // Conectamos o wifi e piscamos o led enquanto isso
  digitalWrite(LED_BUILTIN, LOW);  
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }


  // Configuramos o WiFi com o IP definido anteriormente 
  if (!WiFi.config(IP, GATEWAY, SUBNET)) 
  {
    DUE.println("Erro ao configurar IP");
    delay(5000);
    ESP.restart();
  }
  digitalWrite(LED_BUILTIN, HIGH);
  
  // Enviamos para o arduino due os dados de rede (debug)
  DUE.print("Connected to ");
  DUE.println(ssid);
  DUE.print("IP address: ");
  DUE.println(WiFi.localIP());  
  // Enviamos para o arduino due a String "Ready" que indica sucesso na inicialização do ESP
  DUE.println("Ready");
  
  // Definimos a página raiz (root)
  server.on("/", handleRoot);



  // Definimos a página responsável por ligar o led
  server.on("/on", []()
  { 
    server.send(200, "text/html", "<form action='/off'>"
                      "Status: ON<br/>"
                      "<button type='submit'>SET LED OFF</button>"
                      "</form>");
    DUE.println("ON");   
  });
  
  // Definimos a página responsável por desligar o led
  server.on("/off", []()
  { 
    server.send(200, "text/html", "<form action='/on'>"
                      "Status: OFF<br/>"
                      "<button type='submit'>SET LED ON</button>"
                      "</form>");
    DUE.println("OFF");       
  });

  // Definimos a página de erro
  server.onNotFound(handleNotFound);
  
  // Iniciamos o servidor
  server.begin();
  delay(1000);
}


Loop


void loop()
{
  // Executamos os eventos dos client conectados no servidor do ESP
  server.handleClient();

  // Se o WiFi se desconectou, tentamos reconectar
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    WiFi.reconnect();
  }
  digitalWrite(LED_BUILTIN, LOW);
}


handleRoot


// Página raiz
void handleRoot() 
{
  //server.send(200, "text/plain",  );
  server.send(200, "text/html", "<form action='/on'>"
                      "<b>ESP8266's Page!</b><br/>"
                      "<button type='submit'>SET LED ON</button>"
                      "</form>");
}


handleNotFound


// Página de erros (not found)
void handleNotFound()
{
  // Exibimos na página "File Not Found"
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++)
  {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}



FAÇA O DOWNLOAD DOS ARQUIVOS:

PDF

INO






2 comentários:

  1. Parabéns por mais este conteúdo Fernando!! Enviei um e-mail para 'contato@fernandok.com', se possível entrar em contato comigo.
    Agradeço (31) 99901-3284

    ResponderExcluir
  2. Professor, boa tarde!
    Estou tentando fazer a expansão das portas do ESP32 Heltec Lora com um arduino mega, porém até o momento só tive insucesso. Tentei por SPI e UART, como no exemplo acima, porém simplemente não abre a porta serial do Heltec Lora.

    ResponderExcluir

Tecnologia do Blogger.