Site icon AranaCorp

Enviar um e-mail com o Arduino e uma interface web

Quando um microcontrolador tem conexão remota, é interessante que possa comunicar com o exterior e, em particular, enviar informações por e-mail. Veremos neste tutorial como enviar um e-mail utilizando um Arduino com conexão Wifi e um script JavaScript.

Este tutorial pode ser aplicado a qualquer microcontrolador com conexão Wifi. Basta adaptar a parte do código referente à conexão à rede. A única desvantagem é que a interface web deve ser aberta num navegador para que o e-mail possa ser enviado.

Material

Para relembrar, veja alguns exemplos de módulos com conexão Wifi:

Princípio de funcionamento

Para enviar um e-mail com o Arduino, usaremos o protocolo SMTP (Simple Mail Transfer Protocol). Desse modo, passaremos por um servidor que gerencia o envio do e-mail, como o servidor smtp do Gmail. Para utilizar o servidor, é preciso ter uma conta Gmail (criação gratuita) e ativar a validação em duas etapas.

Configuração de conta Gmail

Na página de gerenciamento de contas, vá para a aba “Segurança” e procure a caixa “Iniciar sessão no Google”.

Ative a validação em duas etapas.

Gere uma senha de acesso à conta para uma aplicação.

Basta copiar o ID do usuário (o endereço Gmail) e a senha gerada pelo Google (retângulo amarelo acima) no código JavaScript abaixo.

Código JavaScript para enviar um e-mail

O código que permitirá enviar e-mails é o código JavaScript presente no código HTML da interface web. Antes de criar a função de envio de e-mails, importamos a biblioteca smtp.js

  <script src='https://smtpjs.com/v3/smtp.js'></script>

Depois, acrescentamos a definição da função sendEmail.

  <script>
  function sendEmail() {
  Email.send({
    Host: 'smtp.gmail.com',
    Username : '*************@gmail.com',
    Password : '**********************',
    To : 'destinataire@gmail.com',
    From : 'emetteur@aranacorp.com',
    Subject : 'Data from "+nom+"',
    Body : 'The sensor value is : "+String(analogRead(A0))+"',
    }).then(
      message => alert('mail sent successfully')
    );
  }
  </script>

Esta função é propositalmente simplificada para mostrar o envio de e-mails, mas é possível modificá-la para enviar diferentes assuntos, corpos de mensagens e informações.

Código completo com o Ethernet Shield W5100

//Libraries
#include <Ethernet.h>//https://github.com/CisecoPlc/Arduino-W5100-W5200/tree/master/Ethernet

//Parameters
String request ;
unsigned long refreshCounter  = 0;
IPAddress ip(192, 168, 1, 179) ;
byte mac [6] = {0x54, 0x34, 0x41, 0x30, 0x30, 0x31};

//Objects
EthernetServer server(80);
EthernetClient client;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init W5100
  Ethernet.begin(mac, ip);
  while (!Ethernet.begin(mac)) {
    Serial.println(F("failed. Retrying in 1 seconds."));
    delay(1000);
    Serial.print(F("Starting W5100..."));
  }
  pinMode(2, OUTPUT);
  server.begin();
  Serial.println(F("W5100 initialized"));
  Serial.print(F("IP Address: "));
  Serial.println(Ethernet.localIP());
}

void loop() {
  client = server.available();
  clientRequest();
  handleRequest();
}

void clientRequest( ) { /* function clientRequest */
  ////Get client request
  if (!client) {
    return;
  }
  // Wait until the client sends some data
  while (!client.available()) {
    delay(1);
  }

  request = client.readStringUntil('\r'); // Read the first line of the request
  Serial.println(request);
  client.flush();
}

void handleRequest( ) { /* function handleRequest */
  ////Handle web client request
  if (request.indexOf("/dig2on") > 0) {
    digitalWrite(2, HIGH);
  }
  if (request.indexOf("/dig2off") > 0) {
    digitalWrite(2, LOW);
  }
  if (request.indexOf("GET") >= 0) {
    webpage(client);
    client.stop();
  }

}

void webpage((EthernetClient client){/* function webpage */ 
////Send wbepage to client
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<head>");
  client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
  client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
  client.println("<script src='https://smtpjs.com/v3/smtp.js'></script>");
  client.println("<script>");
  client.println("function sendEmail() {");
  client.println("Email.send({");
  client.println("  Host: 'smtp.gmail.com',");
  client.println("  Username : '*************@gmail.com',");
  client.println("  Password : '**********************',");
  client.println("  To : 'destinataire@gmail.com',");
  client.println("  From : 'emetteur@aranacorp.com',");
  client.println("  Subject : 'Data from "+nom+"',");
  client.println("  Body : 'The sensor value is : "+String(analogRead(A0))+"',");
  client.println("  }).then(");
  client.println("    message => alert('mail sent successfully')");
  client.println("  );");
  client.println("}");
  client.println("</script>");
  client.println("</head>");
  client.println("<body bgcolor = '#70706F'>"); 
  client.println("<hr/><hr>");
  client.println("<h1 style='color : #3AAA35;'><center> "+nom+" Device Control </center></h1>");
  client.println("<hr/><hr>");
  client.println("<br><br>");
  client.println("<br><br>");
  client.println("<center>");
  client.println("  Pin A0");
  client.println("  <input value="+String(analogRead(A0))+" readonly></input>");
  client.println("  </center>");
  client.println("<center>");
  client.println("Send email");
  client.println("<input type='button' value='Send Email' onclick='sendEmail()'/>");
  client.println("</center>");   
  client.println("<br><br>");
  client.println("<center>");
  client.println("<a style='color : #3AAA35;' href='https://www.aranacorp.com'>www.aranacorp.com</a>");
  client.println("</center>");   
  
  client.println("<br><br>");
   client.println("</body></html>"); 
   client.println();
   delay(1);
}

Resultado

É possível abrir a interface web num navegador utilizando o endereço IP apresentado no monitor serial. A página a seguir deverá aparecer.

Quando clicamos no botão “Enviar e-mail”, um e-mail é enviado conforme o endereço e o texto escritos na função JavaScript descrita acima.

Se pesquisar na sua caixa de entrada do Gmail, deverá encontrar uma mensagem semelhante.

Fontes

Exit mobile version