Pour le matériel, vous aurez besoin des éléments suivants :
- Un module ESP8266
- Un capteur DHT11 ou DHT22 (le DHT22 est recommandé pour sa précision et doit être monté sur un circuit imprimé)
- Un hébergement web avec support PHP et MySQL
En ce qui concerne le câblage, il est assez simple. Connectez le fil positif du capteur au 3,3V, le fil négatif au GND et le fil de données à la broche D4 de l'ESP8266.
Si vous n'avez pas déjà effectué cette étape dans votre logiciel Arduino, suivez ces étapes :
- Accédez aux Préférences.
- Ajoutez l'URL suivante dans le Gestionnaire de cartes supplémentaires : http://arduino.esp8266.com/stable/package_esp8266com_index.json
- Ensuite, allez dans Outils > Type de carte > Gestionnaire de cartes.
- Recherchez "ESP8266" et installez le package.
- Lors du téléversement du code, assurez-vous de sélectionner la carte ESP8266 appropriée pour transférer le code correctement.
Pour créer le code, nous avons utilisé l'aide de ChatGPT via
https://chat.openai.com/chat. Il nous a été d'une grande aide, même s'il a modifié le nom de certaines de nos variables, ce qui nous a fait perdre du temps.
Passons maintenant à la partie du code concernant le microcontrôleur ESP. Voici les fonctionnalités prévues :
- Se connecter à un point d'accès WiFi.
- Récupérer la date et l'heure françaises à partir d'un serveur.
- Collecter les mesures du capteur et les stocker.
- Envoyer les données vers un serveur.
Nous utilisons différentes bibliothèques dans notre programme, notamment :
- NTPClient de Fabrice Weinberg.
- Arduino-timer de Michael Contreras.
- ESP8266WiFi de AMD16 (pour le capteur DHT, la bibliothèque DHT.h est utilisée).
- Les autres bibliothèques nécessaires sont incluses dans le package ESP8266. Si elles sont manquantes, vous pouvez les trouver facilement en effectuant une recherche sur Google.
Passons maintenant rapidement au code pour comprendre son fonctionnement.
La partie NTP permet de récupérer la date et l'heure en fonction des paramètres que nous avons définis dans les variables ntpServer, gmtOffset_sec et DaylightOffset_sec. Dans notre cas, ces paramètres sont configurés pour l'heure de la France (Paris).
Le capteur DHT11 est connecté à la broche 4.
Nous avons également une section qui gère le timer et crée un timer automatique.
La fonction "miseAJourTimeWeb" est utilisée pour interroger un serveur et récupérer la date et l'heure exactes à partir d'un site web.
Nous avons également une fonction "resetESP8266" qui réinitialise la carte tous les 4 jours.
Passons maintenant à la partie "setup". Nous initialisons la communication série (Serial) pour la communication, puis nous appelons "WiFi.begin" avec le SSID (nom du réseau WiFi) et le PASSWORD (mot de passe WiFi). Assurez-vous de remplir le fichier de configuration "config.h" avec les bonnes informations de connexion WiFi pour que cela fonctionne.
Ensuite, nous configurons le capteur DHT (dht.begin) et initialisons timeClient (timeClient.begin) pour récupérer la date et l'heure à partir du serveur.
Nous appelons la fonction "miseAJourTimeWeb" pour récupérer la date et l'heure à partir du serveur.
Ensuite, nous créons plusieurs timers :
- Le premier timer.every(3600000, miseAJourTimeWeb) s'exécute toutes les heures pour récupérer la date et l'heure à partir du serveur. Vous pouvez ajuster la fréquence selon vos besoins. (3600000 millisecondes = 1 heure).
- Le deuxième timer.every(300000, mesuresCapteur) s'exécute toutes les 5 minutes et appelle la fonction "mesuresCapteur" pour effectuer les mesures.
- Le troisième timer.every(301000, envoieServeur) s'exécute toutes les 5 minutes et 1 seconde et appelle la fonction "envoieServeur" pour envoyer les données au serveur.
Maintenant, expliquons le fonctionnement de la fonction "mesuresCapteur". Nous récupérons les valeurs du capteur DHT et les stockons dans des variables. Vous pouvez modifier cette partie si vous utilisez un autre capteur que le DHT.
La boucle "while" permet simplement de vérifier si les données du capteur DHT ont été récupérées correctement. Si une erreur se produit ou si les deux valeurs sont à zéro, la boucle est relancée.
Ensuite, nous enregistrons les données dans un tableau à l'aide de la fonction "recordSensorData(1, h)". Ici, la mesure de l'humidité (h) est enregistrée pour le capteur numéro 1. Vous devez modifier ce numéro si vous avez plusieurs capteurs. Par exemple, si vous avez deux ESP8266 avec chacun un capteur DHT mesurant des données à deux endroits différents, vous pouvez utiliser les configurations suivantes :
- Pour le premier ESP8266 : recordSensorData(1, h); recordSensorData(2, t);
- Pour le second ESP8266 : recordSensorData(5, h); recordSensorData(6, t); Dans cet exemple, les données sont envoyées pour les capteurs 1, 2, 5 et 6. Vous devez choisir le bon numéro de capteur en fonction de vos besoins (nous aborderons la création de capteurs dans la partie Web du tutoriel).
Nous avons maintenant terminé avec cette fonction. À noter que le "return true" permet au timer de reboucler.
Passons maintenant à la fonction "sendData", qui se charge simplement d'appeler l'URL fournie en paramètre.
Elle ne s'occupe que de cette tâche, se reconnecte si nécessaire, appelle l'URL et renvoie "true" si tout s'est bien passé, sinon elle renverra "false".
Nous ne nous attarderons pas sur cette fonction.
Ensuite, nous avons la structure de données "SensorData" qui contient l'ID du capteur, la donnée (un nombre décimal ici) et la date-heure.
Nous définissons ensuite "sensorData" comme une structure "SensorData" avec un tableau de données de taille 100 (SensorData sensorData[100]).
Passons à la fonction "recordSensorData", qui sert à enregistrer temporairement les données du capteur dans un tableau. Elle enregistre les données fournies en paramètre et ajoute la date et l'heure actuelles à l'aide de "dateNow()". Vous n'avez rien à modifier ici.
La fonction "dateNow()" récupère l'heure locale et renvoie la date au format demandé, par exemple : "2023-02-25_14:55:42".
Revenons ensuite à la boucle "loop" où nous appelons simplement "timer.tick()" pour faire avancer les timers et les exécuter au bon moment.
Enfin, nous avons la fonction "envoieServeur" dont le but est d'envoyer les données du tableau de données enregistrées par les capteurs. Nous parcourons le tableau de données avec une boucle "for".
Ensuite, nous créons l'URL à appeler. "HOST" est une variable définie dans "config.h" et doit être paramétrée avec l'adresse de votre site web qui hébergera la page "reception.php" que j'ai créée.
Si le nom de la page est modifié, vous devrez également modifier son nom ici.
Ensuite, nous appelons la fonction "sendData" en lui fournissant l'URL que nous avons créée précédemment. L'URL contient l'ID du capteur, la donnée du capteur et la date.
Nous parcourons tous les enregistrements et retirons les données du tableau si l'envoi réussit.
Voici le contenu du fichier "config.h" que nous utilisons dans le programme :
// fichier config.h
#define SSID "NomDeMonWifi"
#define PASSWORD "MotDePasseWifi"
#define KEY "Cle_Url_Php"
#define HOST "monsiteweb.fr"
Pour l'installation de la partie site web, vous devez disposer d'un hébergement web PHP MySQL, que ce soit en local ou sur le web. Envoyez le contenu du répertoire (à l'exception du dossier "Arduino" qui contient le code ESP8266 ) sur votre serveur via FTP. Utilisez FileZilla ou WinSCP pour transférer vos fichiers en utilisant les informations de connexion.
Pour la configuration, modifiez les informations de connexion dans le fichier "config.php" comme suit :
define('DB_HOST', 'adresseDeLaBaseDeDonnee'); // l'adresse de l'hôte de la base de données
define('DB_USER', 'nomUtilisateurBasededonnee'); // le nom d'utilisateur pour se connecter à la base de données
define('DB_PASS', 'MotDepasseBaseDeDonnee'); // le mot de passe pour se connecter à la base de données
define('DB_NAME', 'nombasededonnee'); // le nom de la base de données
define('KEY', 'CleDonneeEsp'); // clé données ESP, doit être la même sur l'ESP
define('ADMIN_PASS', 'motdepasseadminbackoffice'); // mot de passe admin
Connectez-vous avec le mot de passe du fichier "config.php" (ADMIN_PASS).
Créez votre capteur, puis éditez-le en choisissant son nom, sa zone et sa couleur. Modifiez les paramètres selon vos besoins.
Votre capteur est désormais ajouté et possède un identifiant.
Revenons à l'ESP.
Dans la fonction "bool mesuresCapteur(void *)", vous trouverez l'instruction à modifier : "recordSensorData(1, h);".
Ici, le "1" représente l'identifiant du capteur.
Vous devez le remplacer par le vôtre et l'adapter à votre capteur dans cette fonction.
Si vous souhaitez uniquement récupérer la valeur de luminosité avec un capteur dédié, par exemple, vous devez récupérer la valeur de luminosité et l'insérer dans "recordSensorData(8, luminosite);".
Vous n'aurez qu'un seul "recordSensorData" dans la fonction car vous n'avez qu'un seul capteur.
Si votre Arduino est correctement connecté à votre réseau Wi-Fi et pointe vers votre site web, vous devriez commencer à voir des données sur la page "
https://lenomdemonsite.fr/view.php".