Projet IOC
Auteurs
Martin HART
Volodymyr PATUTA
Introduction
Notre projet est constitué de 3 composants:
- Client MQTT esp32
esp
- Client MQTT subscribe (remplissage de la base de donnée)
db_feeder
- Serveur Web + client MQTT publish (contrôle du buzzer et de l'écran OLED)
web
Client esp
Le client MQTT esp
utilise la librairie
PubSubClient pour pouvoir
subscribe/publish sur des topics différents.
Nous avons 5 topics :
-
brightness
Utilisé pour publish la valeur de la photorésistance.
-
OLED
Utilisé pour subscribe et afficher le texte sur l'écran OLED.
-
led
Utilisé pour subscribe et allumer/éteindre la led ou la faire clignoter avec une période.
-
buzzer
Utilisé pour subscribe et jouer une des musiques prédéfinis.
-
button
Utilisé pour publish l'appui du bouton poussoir.
Setup
Dans la fonction setup()
nous initialisons le module WiFi de l'esp32 à l'aide
de la librairie WiFi.h
et nous gênerons le hash SHA256 de l'adresse MAC du module.
Cela nous permet d'avoir un identifiant unique pour chaque esp.
Puis, nous initialisons le client MQTT. Nous connectons l'esp32 à notre broker MQTT et puis souscrivons (subscribe) sur les topics : buzzer, oled et led.
Enfin, nous initialisons chaque composant de l'esp : photorésistance, buzzer, led, bouton et écran OLED.
Loop
Dans la fonction loop, nous appelons nos différentes taches qui fonctionnent de la même manière que cela a été introduit dans le TME4.
Publish
Pour publish nos données issues des composants de l'esp, nous utilisons le format de sérialization JSON, ce qui nous permet de simplifier la tache de réception et de gestion de données.
Pour chaque publish, nous sérialisons l'identifiant unique de l'esp afin de distinguer les esp utilisés.
Dans le cas de la tache de la photorésistance, nous envoyons l'identifiant et la valeur de la photorésistance (converti en pourcentage).
Pour l'appui de bouton poussoir, nous envoyons seulement l'identifiant.
Subscribe
Nous avons défini un callback
pour les topics sur lesquels nous sommes souscrits.
Dans ce callback
, nous désérialisons les données transmit, nous comparons
l'identifiant afin d'assurer que le message est adressé au bon esp.
Puis, nous regardons le topic du message reçu. Si le topic correspond au topic
de l'écran OLED, nous affichons le texte reçu. Si c'est le topic du LED, nous
remplissons la mailbox
de la tache LED. Dans le cas du topic du buzzer, nous
jouons la musique sélectionnée.
Client db_feeder
Le client db_feeder
nous permet de subscribe aux différents topics
relayés par le broker MQTT utilisé dans notre projet : mosquitto
. Ainsi nous
sommes en mesure de stocker de manière permanente, dans une base de donnée
SQLite, les données reçus depuis différents esp. Les données sont stockées
après avoir été désérialisées par la librairie
cJSON.
Pour nous connecter au daemon mosquitto nous faisons usage de la librairie
client mosquitto
. Nous bloquons le thread principal du programme avec un
sémaphore. Le déblocage se fait via le handler du signal SIGINT
, qui nous
permet de quitter le programme avec un CTRL + c.
Le chemin de stockage de la base de donnée peut être spécifié via la variable
d'environnement IOC_DB
. Si la variable d'environnement IOC_DB
n'est pas
initialisée, la base de donnée SQLite porte le nom de data.db
et est située
dans le dossier courant.
Serveur web
Le serveur web est un serveur écrit en python en utilisant le framework Flask.
Le serveur web
interagit avec la base de données et sert les pages HTML et
les fichiers JavaScript. De plus, ce serveur est également un client MQTT pour
publish sur les topics buzzer, oled et led.
Pour chaque topic nous avons une page dédié.
Pour chaque publish, nous pouvons choisir un esp précis.
Sur la page d'accueil nous avons 2 chronogrammes. Un pour afficher les valeurs de la photorésistance au cours de temps et la deuxième pour afficher les appuis sur le bouton poussoir, au cour du temps. Nous affichons aussi le nombre total d'appui de bouton poussoir par esp.
Utilisation
Afin d'utiliser notre projet, il faut :
- Flasher les esp
- Lancer un broker MQTT (
mosquitto
) - Compiler (
make
) et exécuter le clientdb_feeder
- Lancer le serveur web Dans le dossier de projet, exécuter :
$ flask --app web run
- Ouvrir la page
localhost:5000
dans un navigateur