Création du serveur de flux vidéo
Dans cette partie nous avons 2 éléments à gérer:
- La création du serveur internet
- La génération du flux vidéo
La création du serveur internet
Pour la création du serveur internet, nous choisissons d’utiliser la bibliothèque “WebServer” déjà incluse par défaut avec les librairies par défaut de l’ESP32 et qui est très simple à manipuler. Cette librairie se déclare par l’instruction suivante:
#include <WebServer.h>
Nous déclarons ensuite l’objet ServeurFluxVideo de classe “WebServer” en écoute sur le port 80. Nous utiliserons par la suite les méthodes de cet objet “ServeurFluxVideo” pour configurer notre serveur Web de flux vidéo.
WebServer ServeurFluxVideo_G(80); // Serveur Web sur le port 80
Dans cet article Arduino, j’ai choisi de vous présenter l’utilisation d’une caméra Wi-Fi ESP32-CAM de façon très simple. L’objectif est que vous puissiez comprendre son fonctionnement. Aussi, le serveur Web réalisé n’a qu’une page principale qui renvoie vers la fonction de traitement baptisée “FluxVideo”. L’instruction qui réalise cette association entre la page web principale et la fonction de traitement est la suivante:
ServeurFluxVideo_G.on("/", HTTP_GET, FluxVideo); // La racine du site Web est associée à la fonction "FluxVideo"
Nous déclarons également le corps de notre fonction de traitement:
void FluxVideo() { }
La méthode “handleClient” demande au serveur Web de traiter les requêtes HTML émises par les navigateurs clients :
ServeurFluxVideo_G.handleClient(); // Traitement des requêtes des clients du serveur Web
Il ne reste plus qu’à démarrer notre serveur par l’instruction:
ServeurFluxVideo_G.begin(); // Démarrage du serveur
Nous pouvons maintenant passer à la génération du flux vidéo.
La génération du flux vidéo
Pour la diffusion du flux vidéo vers le navigateur consommateur, nous allons utiliser la technique “HTTP server push” disponible depuis la version 2 du protocole HTTP. Cette technique permet à un serveur Web de transmettre non pas une seule trame de réponse à la requête HTTP d’un navigateur Web client, mais plusieurs trames de réponse de façon régulière sans que le navigateur Web client n’ait besoin d’envoyer de nouvelles requêtes HTTP.
Concrètement en réponse à la requête du navigateur internet, la fonction FluxVideo de notre programme va d’abord envoyer la trame d’entête initiale suivante :
HTTP/1.1 200 OK Content-Type: multipart/x-mixed-replace; boundary=FinDeLaSection
Puis l’entête HTML intermédiaire …
--FinDeLaSection Content-Type: image/jpeg
… ensuite la première image au format JPEG:
Puis l’entête HTML intermédiaire …
--FinDeLaSection Content-Type: image/jpeg
… ensuite la deuxième image au format JPEG.
Et ainsi de suite.
Maintenant que le principe est expliqué, il est temps de compléter notre fonction FluxVideo.
Nous commençons par définir nos trames d’entête HTML:
String EnteteHtmlInitiale_L = "HTTP/1.1 200 OK\r\n" \ "Access-Control-Allow-Origin: *\r\n"; \ "Content-Type: multipart/x-mixed-replace; boundary=FinDeLaSection\r\n\r\n;"; String EnteteHtmlIntermediaire_L = "--FinDeLaSection\r\n" \ "Content-Type: image/jpeg\r\n\r\n";
La méthode “sendContent” de notre objet ServeurFluxVideo permet d’envoyer un contenu HTTP de type “texte” ou “image”. Nous l’utilisons pour envoyer la trame d’entête initiale :
ServeurFluxVideo_G.sendContent(EnteteHtmlInitiale_L);
Ensuite on utilise la propriété “client” de notre objet ServeurFluxVideo pour accéder aux propriétés et méthodes relatives au navigateur Web actuellement connecté à notre serveur:
WiFiClient Client_L; Client_L = ServeurFluxVideo_G.client();
Tant que le navigateur Web client est connecté, on lui envoie la trame d’entête intermédiaire :
while (Client_L.connected()) { // Le navigateur Web client est toujours connecté ServeurFluxVideo_G.sendContent(EnteteHtmlIntermediaire_L); }
Concernant les images de la caméra, nous commençons par créer une variable tampon permettant de les stocker avant leur envoi.
camera_fb_t *TamponVideo_L = NULL;
L’acquisition des images de la caméra s’effectue en utilisant la fonction esp_camera_fb_get() :
TamponVideo_L = esp_camera_fb_get(); // Récupère une image depuis la caméra
et leur transmission en utilisant la méthode “write” de notre objet Client_L. Cette méthode permet en effet d’envoyer des données binaires:
Client_L.write((char *)TamponVideo_L->buf, TamponVideo_L->len);
Pour compléter cet envoi intermédiaire, il est nécessaire d’envoyer des retours à la ligne:
ServeurFluxVideo_G.sendContent("\r\n");
Concernant la variable tampon permettent de stocker les images vidéo, il est nécessaire de la réamorcer avant de pouvoir la réutiliser. Ceci s’effectue à l’aide des instructions suivantes:
// Réamorcage du tampon video, indispensable pour sa réutilisation if (TamponVideo_L) { esp_camera_fb_return(TamponVideo_L); TamponVideo_L = NULL; }
Voilà ! C’était la dernière ligne de code !
Le programme complet:
// Déclaration des bibliothèques utilisées #include <WiFi.h> #include <ESP32_MailClient.h> #include <esp_camera.h> #include <WebServer.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 WebServer ServeurFluxVideo_G(80); // Serveur Web sur le port 80 // 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 esp_err_t Retour_L; // 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 Retour_L = InitialiserCamera(); if(Retour_L == ESP_OK) { 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]); } else { sprintf(Buffer_L,"<p><strong>Erreur d'initialisation de la caméra !</strong></p><p>L'erreur 0x%x a été rencontrée.</p>", Retour_L); } EnvoyerEmail("Démarrage de la caméra Wi-Fi", Buffer_L); ServeurFluxVideo_G.on("/", HTTP_GET, FluxVideo); // La racine du site Web est associée à la fonction "FluxVideo" ServeurFluxVideo_G.begin(); // Démarrage du serveur } 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); } ServeurFluxVideo_G.handleClient(); // Traitement des requêtes des clients du serveur Web } 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_APPLICATION_L = "12345MoteDePasseApplication"; 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_APPLICATION_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 } esp_err_t InitialiserCamera() { // Variables locales de la fonction esp_err_t Retour_L; camera_config_t ConfigurationCamera_L; // Cablage de la caméra sur l'ESP32-CAM du fabricant AI-Thinker ConfigurationCamera_L.pin_d0 = 5; ConfigurationCamera_L.pin_d1 = 18; ConfigurationCamera_L.pin_d2 = 19; ConfigurationCamera_L.pin_d3 = 21; ConfigurationCamera_L.pin_d4 = 36; ConfigurationCamera_L.pin_d5 = 39; ConfigurationCamera_L.pin_d6 = 34; ConfigurationCamera_L.pin_d7 = 35; ConfigurationCamera_L.pin_xclk = 0; ConfigurationCamera_L.pin_pclk = 22; ConfigurationCamera_L.pin_vsync = 25; ConfigurationCamera_L.pin_href = 23; ConfigurationCamera_L.pin_sscb_sda = 26; ConfigurationCamera_L.pin_sscb_scl = 27; ConfigurationCamera_L.pin_pwdn = 32; ConfigurationCamera_L.pin_reset = -1; // La génération du signal d'horloge ConfigurationCamera_L.ledc_channel = LEDC_CHANNEL_0; ConfigurationCamera_L.ledc_timer = LEDC_TIMER_0; ConfigurationCamera_L.xclk_freq_hz = 20000000; // Compression jpeg ConfigurationCamera_L.pixel_format = PIXFORMAT_JPEG; ConfigurationCamera_L.fb_count = 2; ConfigurationCamera_L.jpeg_quality = 10; // Résolution de l'image ConfigurationCamera_L.frame_size = FRAMESIZE_SVGA; // Lancement de l'initialisation de la caméra Retour_L=esp_camera_init(&ConfigurationCamera_L); if (Retour_L == ESP_OK) { Serial.printf("La camera est initialisee\n"); } else { Serial.printf("Erreur 0x%x lors de l'initialisation de la camera\n", Retour_L); } return(Retour_L); } void FluxVideo() { // Variables locales de la fonction String EnteteHtmlInitiale_L = "HTTP/1.1 200 OK\r\n" \ "Access-Control-Allow-Origin: *\r\n" \ "Content-Type: multipart/x-mixed-replace; boundary=FinDeLaSection\r\n\r\n;"; String EnteteHtmlIntermediaire_L = "--FinDeLaSection\r\n" \ "Content-Type: image/jpeg\r\n\r\n"; WiFiClient Client_L; camera_fb_t *TamponVideo_L = NULL; ServeurFluxVideo_G.sendContent(EnteteHtmlInitiale_L); Client_L = ServeurFluxVideo_G.client(); while (Client_L.connected()) { // Le navigateur Web client est toujours connecté TamponVideo_L = esp_camera_fb_get(); // Récupère une image depuis la caméra ServeurFluxVideo_G.sendContent(EnteteHtmlIntermediaire_L); Client_L.write((char *)TamponVideo_L->buf, TamponVideo_L->len); ServeurFluxVideo_G.sendContent("\r\n"); // Réamorcage du tampon video, indispensable pour sa réutilisation if (TamponVideo_L) { esp_camera_fb_return(TamponVideo_L); TamponVideo_L = NULL; } } }
Compilation et tests:
Pour rappel, dans le code logiciel ci-dessus pensez à remplacer par vos propres identifiants les éléments suivants:
- Nom du réseau Wi-Fi,
- Mot De Passe du réseau,
- les adresses e-mail d’émission et de réception,
- le mot de passe de l’adresse e-mail d’émission.
Maintenant après avoir compilé puis transféré ce programme, vous devez obtenir le comportement suivant lorsque vous remettez ensuite l’ESP32-CAM en mode “exécution de programme”:
- Au démarrage le flash clignote quelques seconde puis s’éteint.
- Un nouvel e-mail apparait dans votre messagerie en vous fournissant le lien internet.
- Une fois cliqué sur ce lien internet, votre navigateur s’ouvre sur l’adresse IP locale du module ESP32-CAM
- Au bout d’un 30aine de seconde vous voyez sur votre navigateur ce que filme votre caméra.
Réalisation d’une alimentation portative:
Maintenant que nous avons vérifié que notre programme fonctionne bien, il est temps de passer à la version portative.
J’ai utilisé:
- 4 piles rechargeable,
- un boitier 4 piles avec connecteur à clip,
- un connecteur à clip,
- une mini carte de prototypage,
- et un gros élastique pour tenir le tout.
J’ai posé la caméra Wi-Fi ESP32-CAM que nous avons programmée en Arduino sur un lieu stratégique pour vérifier les visiteurs non-annoncés.
Voici mon tableau de chasse de l’après-midi:
Un visiteur bien poilu:
et un passage éclair:
J’espère que ce tutoriel de Caméra Wi-Fi ESP32-CAM avec Arduino vous a plus, j’attends avec impatience vos commentaires ou vos questions.
Pour continuer:
Pour continuer avec Arduino, voici deux projets qui pourrait vous intéresser:
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.
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à 😉
un tuto bien complet, mais j ai une question je souhaite accéder a distance a ma esp32cam .si je me trouve a l extérieur
j aimerai votre aide a ce sujet car je galère a trouver la solution et merci d avance .
Bonsoir Arch,
je suis content que ce tuto vous ai plu.
Concernant votre question, je vous invite à regarder un peu plus bas ma réponse du 6 octobre 2020 à Bruno expliquant comment rendre le flux vidéo accessible depuis l’extérieur (internet).
Bonjour Nico,
Waouh, superbe travail!!
Ca va grandement m’aider dans mon projet, terrarium connecté avec capteurs température, hygrométrie, lumière, niveau eau réservoir et camera, le tout sur wifi pour site internet et smartphone…
J’ai fait de la programmation il y a trés trés longtemps et j’ai aucune connaissance en arduino, donc va y avoir du boulot…..
Et ton travail va me fait gagner du temps à un moment donné!!!
MERCI
Génial ce tuto en plus avec toutes les explications associées. Au top !
Je vais tenter d’adapter tout cela pour faire un timelaspe en mode low energy, même si je sais qu’il va falloir du boulot et surtout la question du stockage des images/gif.
Si certain on des idées je suis preneur.
Bonjour
Merci pour votre tuto.
N’étant pas du tout compétent niveau serveur, je me demandais si le flux de la caméra est disponible en local seulement ou bien en “extérieur” également ?
Pourrais-je voir le flux de ma caméra à la maison sur mon ordinateur au travail par exemple ?
Merci
Bruno
Bonsoir Bruno,
Par défaut le serveur de flux vidéo n’est disponible qu’en local. Cependant il est possible de le rendre accessible depuis l’extérieur (internet) par les 2 opérations suivantes:
– Utilisation d’une IP fixe par l’ESP32-CAM
– Configuration du point d’accès Wi-Fi pour qu’il effectue une redirection de port (port forwarding) entre l’adresse publique du point d’accès et l’adresse privée de l’ESP32-CAM.
Pour l’utilisation d’une adresse IP fixe par l’ESP32-CAM il suffit d’ajouter les lignes de code suivantes en les adaptant aux caractéristiques de votre réseau local avant l’appel à “WiFi.begin(SSID_L, MOT_DE_PASSE_L);” :
IPAddress AdresseIP_L(192, 168, 0, 130); // Définition de l’adresse IP de la caméra
IPAddress Passerelle_L(192, 168, 0, 1); // Passerelle par défaut de votre sous-réseau
IPAddress SousReseau_L(255, 255, 0, 0); // Masque de votre sous-réseau
WiFi.config(AdresseIP_L, Passerelle_L, SousReseau_L) // Configuration de l’adresse IP statique
Bonjour Nico
Votre tuto est un très bon tuto mais comme Bruno j’aimerais pouvoir accéder à la camera quand je suis en déplacement cependant,
je ne sais pas comment déterminer ses
paramètres:
IPAddress AdresseIP_L(192, 168, 0, 130); // Définition de l’adresse IP de la caméra
IPAddress Passerelle_L(192, 168, 0, 1); // Passerelle par défaut de votre sous-réseau
IPAddress SousReseau_L(255, 255, 0, 0); // Masque de votre sous-réseau
et dans tous les cas que j’ai essayé en utilisant le cmd avec la commande ipconfig je ne trouve pas de solution de plus l’envoie de mail ne s’effectue plus comment cela se fait?
Bonjour Khumran,
Concernant l’envoi d’email,
Google n’autorise plus la diminution de sécurité sur les compte gmail depuis 30 mai 2022. Ce tutoriel a été mis à jour avec une nouvelle méthode d’envoi de mails basée sur un “Un mot de passe d’application”.
Concernant les valeurs des paramètres d’IP fixes à renseigner dans votre code Arduino, celle-ci sont déterminées en fonction de la configuration de votre point d’accès Wi-Fi.
@Nikko
Merci pour la suggestion, par contre je me permet une correction car la syntaxe d’après https://www.arduino.cc/en/Reference/WiFiConfig est WiFi.config(ip, dns, gateway); ou WiFi.config(ip, dns, gateway, subnet);
Donc ce serait plutôt, par exemple :
« WiFi.begin(SSID_L, MOT_DE_PASSE_L); » :
IPAddress AdresseIP_L(192, 168, 0, 130); // Définition de l’adresse IP de la caméra
IPAddress ServeurDeNom_L(9, 9, 9, 9); // DNS Quad9
IPAddress Passerelle_L(192, 168, 0, 1); // Passerelle par défaut de votre sous-réseau
IPAddress SousReseau_L(255, 255, 255, 0); // Masque de votre sous-réseau
WiFi.config(AdresseIP_L, ServeurDeNom_L, Passerelle_L, SousReseau_L) // Configuration de l’adresse IP statique
Bonsoir AnTOine,
La bibliothèque Wi-Fi utilisée dans ce projet est celle du fabricant de la carte ESP32. La bibliothèque d’ “Espressif Systems” n’est pas documentée mais très proche de la bibliothèque “WiFi library”. C’est pourquoi je fournis page 2 de cet article un renvoi vers cette dernière.
Cependant la commande “WiFi.begin” diffère entre ces 2 bibliothèques. En examinant le header “ETH.h” situé dans ton répertoire Arduino (“C:\Users\Nico\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WiFi\src\ETH.h” pour moi) tu verras que la syntaxe de la méthode “config” est:
bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000);
Les serveur de noms (optionnels) sont donc bien les derniers arguments.
Merci AnTOine pour ta réaction, cela a permis d’apporter plus de précison.
Bonjour,
Ce tuto est très bien fait, progressif, et surtout explicatif, le logiciel est bien détaillé. En un mot c’est pédagogique …. Bravo
J’ai pu mettre en oeuvre une esp-cam venant de Chine sans notice, sans difficulté et en comprenant ce que je faisais. Merci !
Bonjour Nico,
Superbe tuto, beau boulot.
Je suis enfin arrivé à faire quelque chose avec mon ESP32-CAM
MERCI.
Bravo pour votre Tuto si bien détaillé.
J’ai 2 questions :
1) L’utilisation est en mode local je penses, mais voulez vous dire que c’est en mode AP (point d’accès sans internet)?
C’est ce que je cherche à faire pour mon projet, vous pouvez me confirmer cela svp ?
2) L’antenne de l’ESP32-cam est elle déjà soudée à l’achat, car je ne suis vraiment pas doué en soudure…
Vous pouvez me donner le lien de cet ESP32-cam avec l’antenne SOUDÉE si c’est le cas, svp ?
Merci
Bonjour Gérard,
1) Le terme “local” utilisé dans le commentaire précédent de Bruno désigne le “réseau local” soit le réseau de votre habitation si vous avez connecté votre caméra Wi-Fi à la box de votre fournisseur Internet.
2) L’antenne vendue sur la boutique https://tropratik.fr/produit/esp32-cam-avec-antenne-wifi-externe nécessite simplement d’être clipsée sur la carte. Vous avez également un modèle avec antenne interne https://tropratik.fr/produit/esp32-cam-avec-antenne-wifi-interne.
bonjour et bravo pour votre travail, une question svp :
est-il possible ( et simple ? ) de réaliser cela : adjoindre un capteur PIR détection d’objet sur la carte “caméra” et si la sortie est a 1 => envoyer une photo tous les 15 s ou minute vers notre adresse mail tant cette entrée PIR est à 1.
merci ( cela serait pour une surveillance contre les cambriolages )
si oui, comment faire ?
encore merci
Bonjour roro,
Je pense que l’envoi de photos déclenché par un capteur PIR (comme le HC-SR501 par exemple) est tout à fait réalisable. L’ESP32-CAM permet en effet de prendre des photos et nous avons vu l’envoi de mail dans cet article.
C’est une bonne idée.
Je ne vais pas pouvoir l’expliquer en quelques lignes, aussi je la note comme sujet d’un prochain article !
merci NICO, je suis impatient de vous lire.
Pour le choix du capteur PIR oui, il y en a une multitude, le HC-SR501 fera très bien l’affaire avec ses 2 potentiomètres ( sensibilité et temps d’activation ) ce dernier nous permettant de limiter le nombre d’envoie de photo & mail (surtout ne pas utiliser avec un capteur LDR, qui détecte en plus le jour/nuit). Je pense placer le dispositif sur un endroit de passage avec un temps PIR faible ( 30s) et prise de photos tous les 10 secondes => donc pour chaque “alarme”, cela nous donne donc 3 photos ! je pense que cela est suffisant pour ne pas être inondé de capture non plus.
je pense également, que le gros du travail est déjà fait par vous dans le sujet ci-dessus, mais j’ai beaucoup de mal à comprendre certains passages, mais je cherche . . .
A bientôt, et encore merci pour votre partage.
NOTA : pour” juste cette application”, capteur PIR + envoie d’image sur une adresse mail.
Peut-on se passer du raspberry ? l’ESP camera dispose du wifi, plus la box, donc ? ? ? possible ?
car pour cette application, je n’ai pas l’utilité de la vidéo en live donc aucun flux ( cela doit simplifier des choses )
éventuellement, et cela serait un plus, plus . . . une demande de prise de photo même sans alarme PIR par une commande internet sur une certaine adresse.
je m’excuse d’en demander beaucoup, mais c’est vraiment un sujet qui me tient à cœur et je suppose aussi à d’autres lecteurs.
une autre application “utile” à cette réalisation est de contrôler si mon chat mange bien à sa gamelle lors de mes absences. le dispositif prés de sa patté et clic ! une petite photo ! on aura donc le jour, l’heure que Monsieur le chat vient manger . ( je crois que vous aussi vous avez ce genre d’individus, donc vous me comprenez. )
excusez, il n’y a pas de raspberry ici ( j’ai confondu avec un autre site ) => c’est parfait ! juste esp et une boite mail.
Salut à tous je suis débutant en électronique svp mais du moins j’ai un projet qui me fascine..en effet j’aimerai renvoyer les flux vidéos de plusieurs esp32cam vers un serveur web hébergé en local(sur une Raspberry) et pouvoir les visualisés avec n’importe quel équipement connecté à ce réseau . j’aimerai également à travers chaque esp envoyé un signal analogique(son) vers le serveur web en même temps que le flux vidéo et ensuite connecter un esp32 sur ce réseau afin d’utiliser sa fonction DAC pour restituer le signal et si possible la vidéo(puisqu’il en possède2). je ne sais pas tout cela sera possible. si oui comment puis je le réaliser ? si non quelles sont les fonctionnalités qui ne peuvent pas être réalisée.. toute forme d’aide sera la bienvenue.
bien à vous…
je ne sais pas si cela peux t’aider, mais j’ai ce site également qui traite ce sujet ( celui que j’ai confondu qui utilise un raspberry ) => https://projetsdiy.fr/esp32-cam-aithinker-flash-firmware-test/
avec Home Assistant ou Node Red cela doit répondre à ton projet.
mais ton projet revient je pense à un expert ? cela me parait assez compliquer à réaliser surtout pour un débutant.
( déjà la config d’un raspberry n’est pas simple je trouve ” j’ai mis plusieurs jours à modifier plusieurs fichiers pour le faire fonctionner avec Node red ” node RED utilise le langage particulier (javascript), plus esp32 . . . => bon courage ! ( enfin si tu y arrives ” je l’espère ” fais-en profiter la communauté ) merci
Belle pédagogie !
BONJOUR sil vous plait je ne parviens pas a me connecter il Ya un message d’erreur qui apparaît disant qu’une erreur fatale a été produite
voici le message proprement dit
“A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header”
Bonjour Ludovic,
Je suppose que vous avez réussi les étapes intermédiaires (Connexion au point d’accès Wi-Fi et Envoi d’un e-mail avec l’adresse du futur serveur internet).
Cette erreur peut avoir plusieurs causes… Utilisez-vous bien une eSP32-CAM avec antenne externe ?
Bonjour, juste une question, quelle est la portée de la caméra ?
Bonjour Henri,
c’est une bonne question.
La portée va dépendre du point d’accès et des obstacles que doit traverser le signal Wi-Fi. J’avoue ne pas avoir fait les essais. J’ai simplement constaté que sur 30m avec 2 cloisons épaisses (mur de maison) la caméra Wi-Fi avec antenne externe fonctionne très bien alors que celle avec antenne interne n’arrive pas à communiquer.
Bonjour
Bravo pour le tuto!
Quelle est l’autonomie avec 4 piles rechargeables?
Quel est le type des piles?
Merci d’avance
Bonjour Laurent,
Pour ce tuto j’ai pris des piles rechargeables AA (HR06) qui trainaient au fond d’un tiroir.
Ce sont des piles rechargeables “de base” (de marque Auchan) qui ont un bon rapport qualité/prix. Je n’ai pas fais d’étude sur l’autonomie…
Aussi, je fais un appel à la communauté: quelqu’un a-t-il un retour d’expérience sur le nombres d’heures/de jours que ce montage peut fonctionner ?
Bonjour Nico,
Très beau boulot.
Par contre, j’ai l’erreur ci dessous et je n’arrive pas à la résoudre :
“Erreur lors de l’envoi d’e-mail:could not connect to server”
Merci si vous avez une idée.
Bonjour Pascal,
j’ai également une erreur !
Après quelques recherche je viens de m’apercevoir que c’est dû à Google qui n’autorise plus la diminution de sécurité sur les compte gmail (connexion avec un simple login/password) comme détaillé ici: https://support.google.com/accounts/answer/6010255?hl=fr.
Je cherche la solution puis mets à jour le tutoriel…
Bonjour Pascal,
le tutoriel est à jour avec la nouvelle procédure à suivre pour utiliser gmail avec le module ESP32-CAM.
Merci. Un grand merci. PAM
bonjour , comment -est il possible d’enregistrer le flux vidéo (de petite vidéo bien sur ) ? votre tuto est super !
Bonjour Thierry,
je pense effectivement qu’il est possible d’enregistrer sur la carte SD de petites vidéos. Je ne l’ai jamais réalisé donc je ne vais pas pouvoir vous aider.
Bravo !
En zone isolée et en absence de modem wifi , Mon projet serait d’associer la cam a un transmetteur GSM diffusant sur internet , y a t il des pistes ?
Bonjour Hireche,
C’est peut-être possible en utilisant un routeur 4G avec:
– Utilisation d’une IP fixe par l’ESP32-CAM
– Configuration du routeur 4G pour qu’il effectue une redirection de port (port forwarding) entre l’adresse publique du routeur 4G et l’adresse privée de l’ESP32-CAM.
A essayer…
Merci enormement pour vos eclairages
Je dispose d’une adresse IP Fixe , j’entame et on verra ce que ca donnera
Bonsoir Hireche,
Je ne sais pas si j’ai bien été compréhensible. Vous avez aussi besoin de modifier votre code Arduino en y ajoutant des lignes de code pour avoir une adresse IP fixe sur votre ESP32-CAM.
Vous trouverez les lignes de code correspondantes dans mon commentaire du 6 octobre 2020.
Merci , c’est bien noté
Bonjour ! Est-ce que c’est possible de créer une mise en page pour la page web ?
Nico
Bonjour Nico,
oui c’est possible d’envoyer du code html pour la mise en page.
Comment faire du coup ?
Cela nécessite de re-potasser le HTML, je ne vais pas pouvoir vous donner la réponse immédiatement. Peut-être qu’un lecteur pourra vous aider… Sinon je Je l’ajoute à la liste d’idée de tutoriel !
Merci quand même !
Nico
bonjour,
tu as peut etre une solution ici
https://www.youtube.com/watch?v=DDMQbqPUliY
Merci ! Cela est très utile !
Nico