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
- Arduino
- Módulo Wifi o Ethernet
- Cuenta de Gmail
A modo de recordatorio, he aquí algunos ejemplos de módulos con conexión Wifi:
- Ethernet Shield VM04
- Ethernet Shield W5100
- WiFi Shield
- ESP-01
- NodeMCU ESP8266 ou ESP32
- Raspberry Pi
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.