Icono del sitio AranaCorp

Enviar un correo electrónico con Arduino y una interfaz web

Cuando un microcontrolador tiene una conexión remota, es interesante que pueda comunicarse con el exterior y, en particular, enviar información en forma de correo. Veremos en este tutorial cómo enviar un correo electrónico utilizando un Arduino con conexión Wifi y un script de JavaScript.

Este tutorial se puede aplicar a cualquier microcontrolador con conexión Wifi. Basta con adaptar la parte del código relativa a la conexión a la red. El único inconveniente es que la interfaz web debe estar abierta en un navegador web para que se envíe el correo.

Material

A modo de recordatorio, he aquí algunos ejemplos de módulos con conexión Wifi:

Principio de funcionamiento

Para enviar un correo electrónico con Arduino, utilizaremos el SMTP (Simple Mail Transfer Protocol), pasaremos por un servidor que gestiona el envío de correo. Como el servidor smtp de Gmail. Para utilizar este servidor, necesitas una cuenta de Gmail (creación gratuita) y tienes que activar la validación en dos pasos.

Configuración de la cuenta de Gmail

En la página de gestión de la cuenta, ve a la pestaña «Seguridad» y busca la casilla «Acceder a Google».

Añade la validación en dos pasos.

Generar una contraseña de acceso a la cuenta para una aplicación determinada

Sólo tienes que copiar en el código JavaScript de abajo, el ID de usuario (la dirección de Gmail) y la contraseña emitida por Google (inserto amarillo arriba).

Código JavaScript para enviar un correo

El código que nos permitirá enviar correos electrónicos es el código JavaScript presente en el código HTML de la interfaz web. Antes de crear la función de envío de correo, importaremos la librería smtp.js

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

Luego podemos añadir la definición de la función 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 función se simplifica voluntariamente para mostrar el envío del correo, pero es posible modificarla para enviar un asunto, cuerpo del mensaje e información diferentes.

Código completo con 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

Puede abrir la interfaz web en un navegador utilizando la dirección IP que aparece en el monitor serie. Debería aparecer la siguiente página.

Cuando se pulsa el botón «Enviar correo electrónico», se envía un correo electrónico según la dirección y el texto escritos en la función JavaScript descrita anteriormente.

Si buscas en tu bandeja de entrada de Gmail, deberías encontrarte con un mensaje similar.

Fuentes

Salir de la versión móvil