IMA3/IMA4 2020/2022 P11
Sommaire
Présentation générale
Parmi les sujets disponibles, nous avons choisi le projet "Mise en place d'un réseau de capteurs dans les salles de Polytech", qui consiste en la conception d'un réseau de capteurs de température et de qualité de l'air communicants via le réseau LoRa. Notre groupe est constitué de quatre élèves de la filière Systèmes Embarqués: Yanis Lacroix, Florian Vallée, Haitam Blgrim et Abdelillah El Khotri. Lors de la première partie en troisième année, le groupe était aussi aidé par Fidele-M'bouke. Il est encadré par Mr.Thomas Vantroys.
Contexte
La qualité de l'air est une information importante à avoir, surtout étant donné les conditions sanitaires actuelles. La loi impose une contrôle de la qualité de l'air intérieur dans les établissements primaires et secondaires, mais aucune loi n'impose le contrôle dans les établissements d'études supérieures (du moins pas d'ici 2023).
Les seuils réglementaires ne sont pas toujours respectés dans les salles de classe, cela peut nuire à la santé et à l'efficacité des élèves ; il est important d'avoir une vue globale des données, pour pouvoir réagir en conséquence.
Enfin, avoir un historique des données permettrait d'être en mesure de réguler certains problèmes de flux dans l'école.
Description
Le réseau de capteur est un ensemble de capteurs individuels, qui communiquent tous avec une balise LoRa présente dans l'école, qui s'occupe de transmettre les données à un serveur applicatif via IP. Une fois les données recueillies et stockées, elles seront affichées sur une page web.
Objectifs
Offrir la possibilité de contrôler, superviser des données physiques, principalement sur la qualité de l’air, récupérées en temps réel dans les salles de classe de Polytech dans le but d’alerter les utilisateurs de l’école.
Analyse du projet
Premier prototype
Lors de notre 3ème année, nous avions simplifié le cahier des charges. Notre projet est constitué de cinq blocs différents :
- Recueillir et traiter les données
- Transmettre les données
- Traduire les données
- Stocker les données
- Afficher les données
Pour recueillir les données, nous avons utilisé une carte Arduino, servant à recueillir les informations fournies par le capteur de température SHT15. A l'aide de la bibliothèque spécifique au capteur, nous avons pu, à l'aide de deux fonctions, obtenir les valeurs de température et d'humidité.
Pour transmettre les données, nous avons dû nous limiter à la liaison série, principalement pour des raisons matérielles et de temps. Le paramétrage était plutôt simple, en précisant le baudrate sur le code Arduino et en utilisant la fonction "Serial", les données sont envoyées sur le port série.
Pour traduire les données, nous avons utilisé un code Python qui lit sur le port série, ne prend que les bits correspondants aux données de température et d'humidité, et le range dans un tableau. On a ajouté dans ce tableau la date d'acquisition, avant de recopier le tableau dans un fichier CSV qui a servi dans la partie suivante.
Pour stocker les données, nous avons donc utilisé un fichier CSV, qui contenait les valeurs de température, d'humidité et de date d'acquisition.
Pour afficher les données, nous avons choisi d'utiliser du php servant à afficher les valeurs dans le fichier CSV.
Plusieurs problèmes sont à relever dans cette première version du projet : - La carte STM32 était imposée dans le cahier des charges et non au choix de l'équipe de projet; - La liaison série n'est pas le moyen de communication imposé, il s'agit du LoRa - L'utilisation d'une base de données SQL est plus adaptée qu'un fichier CSV
Ainsi, l'objectif du second semestre de projet était de résoudre ces problèmes.
Préparation du projet
Maintenant que le premier prototype a été décrit, nous allons mettre à jour le cahier des charges et rappeler les différents "blocs" du projet.
Cahier des charges
Le projet se découpe en 5 grandes parties :
- Recueillir et traiter les données
- Transmettre les données
- Traduire les données
- Stocker les données
- Afficher les données
Voyons ce que chaque bloc doit être capable de réaliser.
1.Recueillir et traiter les données
Pour recueillir les données, nous avons utilisé deux capteurs de température et d'humidité différents. Pour pouvoir acquérir les informations, les capteurs doivent être reliés à un microcontrôleur, ici la STM32 imposée.
2.Transmettre les données
Pour la transmission, un shield LoRa est connecté à la carte STM32. Le LoRa est un moyen de communication
Les données sont envoyées du module LoRa de la carte vers une balise LoRa (installée au préalable par un ancien groupe de projet), qui elle même communique au serveur applicatif via Ethernet.
3.Traduire les données
Une fois les données reçues sur le serveur applicatif, elles sont traduites par un code Python. En effet, il faut repérer et extraire les données issues de la trame Ethernet, puis extraire les données de la trame LoRa encapsulée. Le code Python, grâce à une bibliothèque, peut lire sur le port Ethernet et ainsi extraire uniquement les informations pertinentes. Le code Python sert aussi à faire le lien avec la partie suivante, qui est le stockage de données : il permet de créer une base de données, et de stocker les valeurs obtenues dedans.
4.Stocker les données
Pour stocker les données, le plus pertinent était de prendre une base de données SQL, et ce pour plusieurs raisons :
- La possibilité de faire des requêtes, ce qui facilite l'affichage
- SQL apporte une couche de sécurité minimale, contrairement à un fichier CSV
Cette base de donnée est créée à partir du fichier Python grâce à la bibliothèque xxxx.
5.Afficher les données
L'affichage se fait sur une page html contenant du code php, qui permet de lire les données dans la base SQL et de les afficher dans des tableaux, des graphiques, et permet aussi d'afficher des messages d'erreur ou des valeurs en couleurs pour signaler tout non respect des normes indiquées.
Choix techniques : matériel et logiciel
Partie S7
Acquisition :
- 2x Carte STM32L152RE
- Capteur de température et d'humidité
- Une Breadboard
- Un PC
Partie S8
- Pack STMicroelectronics Lora LF band sensor and Gateway contenant 2 éléments principaux :
- une carte de développement STM32 Nucleo-L073RZ couplée à une Expansion Board de chez RisingHF composée de 4 capteurs intégrés (humidité, température, pression, magnétomètre) et d’un module d’émission Lora
- une carte STM32 Nucleo-F746ZG couplée à une Gateway Expansion Board Lora (une balise Lora)
Calendrier prévisionnel
Projet S8
Réalisation du Projet
Projet S7
Récupération et transmission des données des capteurs
Nous nous sommes d’abord penché sur une transmission des données via Lora entre deux cartes, et non à la balise LoRa de Polytech. L’objectif de notre travail était que le capteur DHT11 recueille les valeurs de température et d’humidité, les fournisse à la carte émettrice, qui transmettra les données via LoRa. La carte réceptrice recevrait les données, et les transmettrait via la liaison série au PC, grâce au câble d’alimentation USB. Le code implémenté sur les cartes a été développé sur l’IDE STM32Cube.
Le véritable enjeu de ce semestre était la familiarisation avec l’environnement de développement et les cartes. Pour cela, nous nous sommes concentrés sur la compréhension d’un exemple de code existant de "Ping Pong" entre deux cartes via LoRa utilisant un HAL (hardware abstraction layer).
Nous avons modifié le code afin de pouvoir envoyer une trame personnalisée, puis nous avons réalisé une partie pour la carte émettrice, et une partie pour la carte réceptrice, qui envoie ensuite la trame sur la liaison série. Il a donc fallu définir un format de données avant la transmission. Pour cela, nous avons choisi d’utiliser le format suivant, stockée dans une chaîne de caractères: line = {T:xx.x,H:xx.x} sizeof(line) = 15 octets
Cette trame ne contenait pour le moment que des données statiques définies préalablement. Nous avons donc ensuite commencé à nous occuper de l’implémentation d’un code permettant la lecture du capteur DHT11. Pour cela, nous avons utilisé la bibliothèque STM32 dédiée (un autre HAL). Un problème de taille s’est mesuré à nous : faire en sorte qu’il n’y ait pas de conflit entre les configuration du capteur, du shield LoRa, et de la liaison série. Même s’il n’utilise électriquement pas tous les PINS du micro-contrôleur, le shield Lora occupe physiquement toutes les broches de la carte. Nous avons donc commencé par récupérer les données du capteur sans le Shield et les transmettre en série. Cela a fonctionné mais nous avons rencontré 2 problèmes : -les données capteurs (T° et Humidité) ne présentaient aucune précision au-delà de la partie entière (précision au dixième selon le constructeur) -impossible de récupérer les données sur une autre broche analogique autre que A1, malgré les modifications en conséquence du code (définition d’un autre PIN pour la variable DHT_PIN)
Après étude du schematic du Shield Mbed, nous avons remarqué que le shield proposait l’accès à deux broches analogiques de la carte A4 et A5.
Nous n’avons pas réussi à associer l’utilisation du LoRa et l’utilisation du capteur: avec une recherche très approfondie, nous avons pu localiser le problème ; lors de l’initialisation des ports du capteur, un des pins de celui-ci est censé changer d’état seul. Cela fonctionne lorsque le capteur est relié à la broche analogique A1 de la carte, mais pas sur les autres broches, que ce soit en câblant le capteur directement sur la carte ou par l’intermédiaire des deux PINS disponibles sur le Shield. Nous en avons alors déduit que les autres broches devaient êtres initialisées par le HAL Lora, et donc utilisées d’une manière ou d’une autre par le shield. Nous avons en effet pu déterminer que certaines broches étaient utilisées pour la transmission radio ou autre, mais pas les broches A4 et A5 de la carte. Pourtant, nous n’avons pas réussi à faire fonctionner le capteur sur ces broches. Il est primordial que le capteur fonctionne sur une de ces broches puisque ce sont les seules redirigées par le shield LoRa pour l’utilisateur, et donc les seules utilisables par le capteur lorsque nous voulons utiliser le shield LoRa et le capteur en même temps.
Transmission Lora
Nous avons le montage suivant :
Pour permettre l'échange de données, nous avons du modifier le code existant du Ping-Pong en profondeur. Ci-dessous un exemple d’échange de trame entre deux cartes :
Code permettant de transmettre des données en LoRa. La trame est préfaite ici pour réaliser des tests.
Récupération des données du capteur
Voici le format des données reçues par la liaison série de l'ordinateur :
Un script Python a été choisi. Ce code est composé d’une partie qui sert à recevoir les données grâce à la bibliothèque serial. Les données reçues du port série sont ensuite stockées dans une base de données MySQL comme indiqué dans les solutions retenues, afin de rendre notre application plus performante. Pour faire cela on importe la bibliothèque MySQLdb , après on se connecte d’abord à notre base de donnée en cas d’erreur il affiche qu’on a pas réussi à se connecter à la base de donnée. Ensuite le script va nous permettre de stocker chaque donnée reçue dans la base de donnée MySQL , et en cas d’erreur il affiche qu’il n’a pas pu stocker la donnée. On récupère également dans le script python la date et l’heure sous le format : date = ‘20xx-xx-xx’ time = ‘xx:xx’
Affichage des données
Pour afficher les données du capteur, un script PHP est utilisé. Voici le résultat :