137 lines
4.5 KiB
Markdown
137 lines
4.5 KiB
Markdown
# Projet IOC
|
|
|
|
## Auteurs
|
|
|
|
Martin HART
|
|
|
|
Volodymyr PATUTA
|
|
|
|
## Introduction
|
|
|
|
Notre projet est constitué de 3 composants:
|
|
|
|
1. Client MQTT esp32 `esp`
|
|
2. Client MQTT subscribe (remplissage de la base de donnée) `db_feeder`
|
|
3. 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](https://github.com/knolleary/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](https://github.com/DaveGamble/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 client `db_feeder`
|
|
- Lancer le serveur web
|
|
Dans le dossier de projet, exécuter :
|
|
|
|
```sh
|
|
$ flask --app web run
|
|
```
|
|
|
|
- Ouvrir la page `localhost:5000` dans un navigateur
|