fbpixel
Étiquettes :

Lorsque un microcontrôleur possède une connexion à distance, il est intéressant qu’il puisse communiquer avec l’extérieur et, notamment, envoyer des informations sous forme de mail. Nous allons voir dans ce tutoriel comment envoyer un mail à l’aide d’un Arduino muni d’une connexion Wifi et d’un script JavaScript.

Ce tutoriel peut être appliqué pour tout microcontrôleur muni d’une connexion Wifi. Il suffit pour cela d’adapter la partie du code relatif à la connexion au réseau. Le seul inconvénient est que l’interface Web doit être ouverte dans un navigateur internet pour que le mail puissent être envoyé.

Matériel

  • Arduino
  • Module Wifi ou Ethernet
  • Compte Gmail

Pour rappel, quelques exemples de modules avec connexion Wifi:

Principe de fonctionnement

Pour envoyer un mail avec Arduino, nous allons utiliser le protocole SMTP (Simple Mail Transfer Protocol), nous allons donc passer par un serveur qui gère l’envoi de mail. Comme le serveur smtp de Gmail. Pour pouvoir utiliser ce serveur, il faut un compte Gmail (création gratuite) et il faut activer la validation en deux étapes.

Configuration du compte Gmail

Sur la page de gestion du compte, aller dans l’onglet « Sécurité », puis cherchez l’encart « Connexion à Google ».

Ajouter la validation en deux étapes.

connexion-a-google Envoyez un mail avec Arduino et une interface Web

Générer un mot de passe d’accès au compte pour une application donnée

generate-application-password Envoyez un mail avec Arduino et une interface Web

Il vous suffit de recopier dans le code JavaScript ci-dessous, l’identifiant utilisateur (l’adresse Gmail) et le mot de passe délivré par Google (encart jaune ci-dessus).

Code JavaScript pour envoyer un mail

Le code qui va nous permettre d’envoyer des mails est le code JavaScript présent dans le code HTML de l’interface Web. Avant de créer la fonction d’envoi de mail, nous allons importer la librairies smtp.js

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

Puis nous pouvons ajouter la définition de la fonction 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>

Cette fonction est volontairement simplifier pour montrer l’envoie de mail mais il est possible de la modifier afin d’envoyer des sujet, corps de message et informations différentes.

Code complet avec l’Ethernet Shield W5100

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

//Parameters
String request ;
String nom = "Arduino";
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 Arduino" + 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);
}

Résultat

Vous pouvez ouvrir l’interface web, dans un navigateur, à l’aide de l’adresse IP qui s’affiche dans le moniteur série. La page suivante devrait s’afficher.

arduino-webinterface-mail Envoyez un mail avec Arduino et une interface Web

Lorsqu’on presse sur le bouton « Send Email », un email est envoyé en accord avec l’adresse et le texte écrits dans la fonction JavaScript décrite plus haut.

arduino-webinterface-mail-result Envoyez un mail avec Arduino et une interface Web

Si vous allez chercher dans votre boite Gmail, vous devriez tomber sur un message similaire.

webui-send-email-success Envoyez un mail avec Arduino et une interface Web

Sources