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
- Arduino
- Módulo Wifi ou Ethernet
- Conta Gmail
Para relembrar, veja alguns exemplos de módulos com conexão Wifi:
- Ethernet Shield VM04
- Ethernet Shield W5100
- WiFi Shield
- ESP-01
- NodeMCU ESP8266 ou ESP32
- Raspberry Pi
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.