Caméra Wi-Fi ESP32-CAM avec Arduino

Envoi d’un e-mail avec l’adresse du futur serveur internet

Dans cette troisième étape, nous allons compléter notre programme par l’ajout d’une fonction d’envoi de l’adresse internet de la caméra Wi-Fi par e-mail.

Pourquoi créer un compte e-mail pour notre projet ?

Pour envoyer un e-mail, il est indispensable d’utiliser un compte de messagerie internet. A cette fin, je vous invite à utiliser un compte e-mail dédié à vos projet domotique pour les raisons suivantes:

  • Afin de faciliter son utilisation depuis le microcontrôleur ESP32, nous allons abaisser le niveau de sécurité de ce compte: il sera donc plus facilement piratable.
  • Du fait de son utilisation lors de la mise au point de notre projet, ce compte de messagerie internet peut-être identifié à tort comme « SPAM » et être suspendu. En effet, nous ne sommes pas à l’abri d’une erreur de programmation pouvant conduire à l’envoi d’un nombre d’e-mails très important ou bien à l’envoi d’e-mails ne respectant pas les standards internet.

Création du compte gmail et diminution de la sécurité

Le choix de l’hébergeur de messagerie internet n’a pas d’importance pour ce projet. Dans cet article, la messagerie gmail sera utilisée.

Pour créer votre compte gmail, utilisez le lien suivant: https://accounts.google.com/signup.

Créer un compte de messagerie gmail

Une fois le compte gmail créé, il est nécessaire d’abaisser la sécurité du compte. Pour cela, rendez-vous sure la page des paramètres puis choisissez le menu « sécurité »

Menu "Sécurité" des paramètres du compte gmail

Dans le paragraphe « Accès moins sécurisé des applications » localisé en bas de la nouvelle page web affichée, cliquer sur « Activer l’accès (déconseillé) »:

Autoriser l'accès moins sécurisé à la messagerie gmail

Il ne vous reste plus qu’à faire glisser le bouton « Autoriser les applications moins sécurisées » sur la nouvelle page qui s’ouvre:

Autoriser l'accès moins sécurisé à la messagerie gmail (suite)

Voilà c’est fait ! Votre compte gmail est prêt à être utilisé pour votre projet.

La bibliothèque d’envoi d’e-mails

Pour l’envoi d’e-mail, j’ai choisi la bibliothèque Arduino ESP32 Mail Client nommée « ESP32 Mail Client by Mobizt ». Je vous invite à l’installer avant de poursuivre.

Si vous souhaitez connaitre la procédure d’installation d’une bibliothèque sous Arduino, je vous invite à vous reporter au chapitre « Installation d’une bibliothèque pour l’écran OLED » de l’article « Température et humidité avec Arduino ».

La déclaration de cette bibliothèque s’effectue à l’aide de l’instruction suivante :

#include <ESP32_MailClient.h>

Écriture de la fonction d’envoi d’e-mails

Pour avoir une meilleur lisibilité du code, nous allons créer une fonction dédiée « EnvoyerEmail » prenant pour paramètres l’objet et le contenu de l’e-mail :

void EnvoyerEmail(const char *pObjet_P, const char *pMessage_P)
{
}

Le reste des caractéristiques de l’e-mail sont écrites en dur dans le corps de la fonction:

  • L’adresse et le mot de passe de la messagerie du compte e-mail que vous venez de créer (Attention à bien renseigner vos propres identifiants):
const char* ADRESSE_EMAIL_EMISSION_L = "votremaildetest@gmail.com";
const char* MOT_DE_PASSE_EMAIL_EMISSION_L = "12345MoteDePasseMail";
  • Les caractéristiques de l’hébergeur de messagerie internet que vous utilisez pour l’envoi d’e-mail. Pour gmail ce sont:
const char* ADRESSE_SERVEUR_SMTP_L = "smtp.gmail.com";
int PORT_SERVEUR_SMTP_L = 465; // Port SSL utilisé
  • L’adresse de messagerie sur laquelle vous souhaitez recevoir les e-mails envoyés par votre caméra:
const char* ADRESSE_EMAIL_DESTINATAIRE_L = "votremail@gmail.com";

La bibliothèque Arduino ESP32 Mail Client fournie l’objet « MailClient » pour la lecture ou l’envoi d’e-mail. En particulier, l’envoi d’e-mail s’effectue à l’aide de la méthode « sendMail » qui prend pour unique paramètre un objet de type « SMTPData » contenant toutes les caractéristiques de l’e-mail à envoyer.

Nous commençons par déclarer cet objet:

// Variables locales de la fonction
SMTPData DonneesEmail_L;  // Données de l'e-mail à envoyer

Puis nous renseignons cet objet avec les caractéristiques de messagerie que nous avons précédemment déclarées:

// Les caractéristique de l'e-mail sont renseignées
DonneesEmail_L.setLogin(ADRESSE_SERVEUR_SMTP_L, PORT_SERVEUR_SMTP_L, ADRESSE_EMAIL_EMISSION_L, MOT_DE_PASSE_EMAIL_EMISSION_L); // Identifiants de connexion au serveur SMTP
DonneesEmail_L.setSender("Camera Wi-Fi", ADRESSE_EMAIL_EMISSION_L); // Nom et adresse email de l'emetteur
DonneesEmail_L.setPriority("Normal"); // Niveau d'importance du mail
DonneesEmail_L.setSubject(pObjet_P);  // Objet du mail
DonneesEmail_L.setMessage(pMessage_P, true); // Contenu du message au format HTML
DonneesEmail_L.addRecipient(ADRESSE_EMAIL_DESTINATAIRE_L);  // Adresse du destinataire

Il ne reste plus qu’à terminer la fonction « EnvoyerEmail » par justement l’émission de cet e-mail:

//Emission de l'e-mail
    if (!MailClient.sendMail(DonneesEmail_L))
    {
      Serial.println("Erreur lors de l'envoi d'e-mail:" + MailClient.smtpErrorReason());
    }

Et le nettoyage des variables utilisées:

    DonneesEmail_L.empty(); // Nettoyage des données d'envoi d'e-mail 

Appels de la fonction d’envoi d’e-mails

Le projet décrit dans cet article envoie un e-mail pour fournir à l’utilisateur le lien internet à utiliser pour accéder aux images de sa caméra. L’envoi de cet e-mail est nécessaire dans 2 cas:

  • Au démarrage de l’ESP32-CAM, lorsque le module Wi-Fi vient de récupérer son adresse IP.
  • Lorsque le module Wi-Fi change d’adresse IP (perte puis retour du réseau Wi-Fi par exemple).

Pour détecter un changement d’adresse IP, il nous est nécessaire d’utiliser une variable globale pour la mémoriser:

 // Déclaration globales
IPAddress AdresseIpLocale_G; // Permet de mémoriser l'adresse IP de la carte ESP32-CAM

Nous pouvons maintenant compléter la fonction « setup »:

  • Pour mémoriser l’adresse IP obtenue
AdresseIpLocale_G = WiFi.localIP(); // Mémorisation de l'adresse actuelle
  • Envoyer un e-mail informant l’utilisateur du démarrage de la caméra et du lien internet à utiliser:
sprintf(Buffer_L,"<p><strong>La caméra a démarré avec succès !</strong></p><p>Cliquez sur le lien \"http://%u.%u.%u.%u\" pour vous connecter.</p>", AdresseIpLocale_G[0], AdresseIpLocale_G[1], AdresseIpLocale_G[2], AdresseIpLocale_G[3]);
EnvoyerEmail("Démarrage de la caméra Wi-Fi", Buffer_L);
  • Sans oublier la création de la variable tampon utilisée pour la construction du message de l’e-mail:
char Buffer_L[200];

De la même manière, nous complétons la fonction « loop »:

  • Pour détecter un éventuel changement d’adresse IP:
if (WiFi.localIP()!=AdresseIpLocale_G)
{
}
  • Et dans ce cas, pour mémoriser la nouvelle Adresse IP et informer l’utilisateur du nouveau lien internet à utiliser pour accéder à la caméra:
// L'ESP32-CAM vient d'obtenir une nouvelle adresse IP
AdresseIpLocale_G = WiFi.localIP(); // Mémorisation de l'adresse actuelle
sprintf(Buffer_L,"<p><strong>La caméra a changé d'adresse IP</strong></p><p>Cliquez sur le lien \"http://%u.%u.%u.%u\" pour vous connecter.</p>", AdresseIpLocale_G[0], AdresseIpLocale_G[1], AdresseIpLocale_G[2], AdresseIpLocale_G[3]);
EnvoyerEmail("Changement d'adresse IP de la caméra Wi-Fi", Buffer_L);
  • Sans oublier non plus la création de la variable tampon utilisée pour la construction du message de l’e-mail:
// Variables de la fonction
char Buffer_L[200];

Essai de notre programme

Nous avons terminé l’ajout de l’envoi de l’adresse internet de la caméra Wi-Fi par e-mail. Voici l’état du programme à la fin de cette étape:

// Déclaration des bibliothèques utilisées
#include <WiFi.h>
#include <ESP32_MailClient.h>

// Définition des constantes globales
#define PORT_LED_FLASH      4   // Numéro de port auquel est branchée la LED servant de flash.
 
// Déclaration globales
IPAddress AdresseIpLocale_G; // Permet de mémoriser l'adresse IP de la carte ESP32-CAM

// Fonction de démarrage, s'exécute une seule fois:
void setup()
{
    // Constantes de la fonction
    const char* SSID_L = "LiveBox_1324"; // Nom du réseau Wi-Fi
    const char* MOT_DE_PASSE_L = "12345?ABCDE"; // Mot De Passe du réseau

    // Variables de la fonction
    wl_status_t StatutConnexion_L; // Pour mémoriser l'état de la connexion

    // Variables de la fonction
    char Buffer_L[200];

    pinMode(PORT_LED_FLASH, OUTPUT); // Initialisation en "sortie" de la broche d'E/S connectée au flash
    WiFi.begin(SSID_L, MOT_DE_PASSE_L); // Tentative de connexion au point d'accès Wi-Fi
    StatutConnexion_L = WiFi.status(); // Lecture de l'état de la connexion et mémorisation dans la variable "StatutConnexion_L"
    while ((StatutConnexion_L != WL_NO_SSID_AVAIL)&&(StatutConnexion_L != WL_CONNECTED)&&(StatutConnexion_L != WL_CONNECT_FAILED))
    {
        digitalWrite(PORT_LED_FLASH, HIGH);
        delay(100);
        digitalWrite(PORT_LED_FLASH, LOW);
        delay(500);
        StatutConnexion_L = WiFi.status(); // Lecture de l'état de la connexion et mémorisation dans la variable "StatutConnexion_L"
    }

    Serial.begin(115200); // Ouverture du port série à 115200 bauds

    // Affichage du résultat de la tentative de connexion
    if (StatutConnexion_L == WL_CONNECTED)
    {
        Serial.println("Connection OK");
        AdresseIpLocale_G = WiFi.localIP(); // Mémorisation de l'adresse actuelle
        sprintf(Buffer_L,"<p><strong>La caméra a démarré avec succès !</strong></p><p>Cliquez sur le lien \"http://%u.%u.%u.%u\" pour vous connecter.</p>", AdresseIpLocale_G[0], AdresseIpLocale_G[1], AdresseIpLocale_G[2], AdresseIpLocale_G[3]);
        EnvoyerEmail("Démarrage de la caméra Wi-Fi", Buffer_L);
    }
    else if (StatutConnexion_L == WL_NO_SSID_AVAIL)
    {
        Serial.println("SSID introuvable");
    }
    else if (StatutConnexion_L == WL_CONNECT_FAILED)
    {
        Serial.println("Mot de passe KO");
    }
    else
    {
        Serial.println("Autre erreur");
    }
}

// Fonction principale du programme, s'exécute en boucle:
void loop()
{
    // Variables de la fonction
    char Buffer_L[200];

    if(WiFi.status()==WL_CONNECTED)
    {  
        // Internet est disponible
        if (WiFi.localIP()!=AdresseIpLocale_G)
        {
            // L'ESP32-CAM vient d'obtenir une nouvelle adresse IP
            AdresseIpLocale_G = WiFi.localIP(); // Mémorisation de l'adresse actuelle
            sprintf(Buffer_L,"<p><strong>La caméra a changé d'adresse IP</strong></p><p>Cliquez sur le lien \"http://%u.%u.%u.%u\" pour vous connecter.</p>", AdresseIpLocale_G[0], AdresseIpLocale_G[1], AdresseIpLocale_G[2], AdresseIpLocale_G[3]);
            EnvoyerEmail("Changement d'adresse IP de la caméra Wi-Fi", Buffer_L);
        }
    }
    else
    {
        // Pas de connexion internet
        digitalWrite(PORT_LED_FLASH, HIGH);
        delay(100);
        digitalWrite(PORT_LED_FLASH, LOW);
        delay(500);
    }
}

void EnvoyerEmail(const char *pObjet_P, const char *pMessage_P)
{
    const char* ADRESSE_EMAIL_EMISSION_L = "votremaildetest@gmail.com";
    const char* MOT_DE_PASSE_EMAIL_EMISSION_L = "12345MoteDePasseMail";
    const char* ADRESSE_SERVEUR_SMTP_L = "smtp.gmail.com";
    int PORT_SERVEUR_SMTP_L = 465; // Port SSL utilisé
    const char* ADRESSE_EMAIL_DESTINATAIRE_L = "votremail@gmail.com";

    // Variables locales de la fonction
    SMTPData DonneesEmail_L;  // Données de l'e-mail à envoyer
    
    // Les caractéristique de l'e-mail sont renseignées
    DonneesEmail_L.setLogin(ADRESSE_SERVEUR_SMTP_L, PORT_SERVEUR_SMTP_L, ADRESSE_EMAIL_EMISSION_L, MOT_DE_PASSE_EMAIL_EMISSION_L); // Identifiants de connexion au serveur SMTP
    DonneesEmail_L.setSender("Camera Wi-Fi", ADRESSE_EMAIL_EMISSION_L); // Nom et adresse email de l'emetteur
    DonneesEmail_L.setPriority("Normal"); // Niveau d'importance du mail
    DonneesEmail_L.setSubject(pObjet_P);  // Objet du mail
    DonneesEmail_L.setMessage(pMessage_P, true); // Contenu du message au format HTML
    DonneesEmail_L.addRecipient(ADRESSE_EMAIL_DESTINATAIRE_L);  // Adresse du destinataire
    
    //Emission de l'e-mail
    if (!MailClient.sendMail(DonneesEmail_L))
    {
      Serial.println("Erreur lors de l'envoi d'e-mail:" + MailClient.smtpErrorReason());
    }
    DonneesEmail_L.empty(); // Nettoyage des données d'envoi d'e-mail
}

Après avoir compilé puis transféré ce programme Arduino de caméra Wi-Fi dans le module ESP32-CAM, vous allez recevoir le mail suivant:

Mail envoyé par le module ESP32-CAM pour informer l'utilisateur du lien internet à utiliser

Si vous cliquez sur le lien de l’e-mail vous verrez un message d’erreur vous indiquant que le site internet est inaccessible. Il nous reste en effet à créer le site internet pour diffuser la vidéo. Avant cela, nous allons nous intéresser à la configuration de la caméra OV2640 (page suivante).

Ce contenu a été publié dans Arduino, ESP32-CAM. Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Caméra Wi-Fi ESP32-CAM avec Arduino

  1. bariod dit :

    Bonjour et félicitations pour ce tuto.
    Pourrait-il être utilisé pour détecter la sortie de pelouse (plus de vert) par un robot tondeuse ?
    Merci d’avance si vous me répondez.

    • Nico dit :

      Bonjour,
      Merci pour ce retour

      Effectivement, en disposant la caméra verticalement à quelques centimètres du sol, l’image sera plus ou moins remplie de vert en fonction de la hauteur de pousse de l’herbe.
      Une solution de programme de « détection de sortie de tondeuse » réalisé avec l’ESP32-CAM est d’effectuer les actions suivantes :
      • Prendre 1 photo par jour
      • Analyser la quantité de pixels verts de l’image à partir d’un algorithme
      • Déclencher le robot tondeuse au-delà d’un certain niveau de « verdure » de la photo
      Et voilà 😉

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *