Sommaire
Projet réalisé par Judith Caroff, Jeanne Leclercq, Luc Fermaut, Pierre Hourdé, Jean-Baptiste Lavoine et Victorien Renault.
Introduction
Étudiants en 3ème année à l’ISEN-Lille, nous avons eu l’idée de développer une boîte aux lettres connectée en utilisant la plateforme Constellation.
En réalisant ce projet, nous voulions proposer une solution de boîte aux lettres connectée à un prix raisonnable et possédant une interface fluide pour améliorer l’expérience de l’utilisateur. Pour cela, nous avons acheté des composants peu coûteux à placer sur notre boîte aux lettres, et développé une application Ionic.
Notre boîte aux lettres est connectée à la plateforme Constellation par le biais d’un ESP8266, vous pouvez le connecter facilement à votre Constellation en suivant cette documentation sur le site Constellation.
Nous détectons ensuite la présence de courriers à l’aide de capteurs à ultrasons.
Avec un lecteur de cartes NFC, nous contrôlons l’accès à notre boîte aux lettres. Celui-ci nous permet de savoir qui a ouvert la boîte aux lettres et donc d’envoyer les bonnes informations à notre Constellation. Le lecteur NFC nous permet également de vérifier qu’une carte ou qu’un badge a les autorisations nécessaires afin de commander l’ouverture via un servo-moteur.
L’application, développée avec le framework ionic nous permet d’offrir une interface utilisateur ergonomique. En la connectant à Constellation, l’utilisateur a accès à toutes les informations nécessaires très facilement.
La boîte aux lettres connectée
Prérequis : Avoir connecté l’ESP8266 à Constellation.
Composants utilisés
Pour connecter notre boîte aux lettres à Constellation, nous avons utilisé :
- Un ESP8266 D1 Mini (8€ sur Amazon)
- Des capteurs à ultrasons HC SR04 (3€ sur Amazon)
- Un lecteur de cartes NFC (8€ sur Amazon)
- Un servo-moteur (6€ sur eBay)
Voici la correspondance pour définir les différents pins avec cet ESP :
D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | RX | TX |
16 | 5 | 4 | 0 | 2 | 14 | 12 | 13 | 15 | 3 | 1 |
Etape 1 : Détecter la présence d’une lettre grâce à un capteur ultrason
Nos capteurs fonctionnent avec une alimentation de 5V
Les capteurs à ultrasons nous permettent de mesurer une distance en créant une impulsion sur une des broches. Grâce à cette mesure, nous pouvons détecter une variation de la distance lorsqu’un courrier et inséré dans la boîte aux lettres. Nous envoyons alors l’information à Constellation grâce à un MessageCallback.
Relier le capteur à notre ESP est assez simple, notre capteur à ultrasons possède 4 branches, chacune branchée sur un pin de notre ESP.
Ci-dessous, les correspondances entre les branches du capteur à ultrasons et les pins de l’ESP8266 :
Branche du capteur à ultrasons |
Pin de l’ESP8266 |
VCC | 5V |
GND | GND |
TRIG | D4 |
ECHO | D3 |
Dans notre code, nous configurons les pins dans le setup afin de préparer l’impulsion.
1 2 3 4 5 6 |
void setup() { pinMode(TRIGGER, OUTPUT); digitalWrite(TRIGGER, LOW); //La broche TRIGGER doit être à LOW au repos pinMode(ECHO, INPUT); Serial.begin(9600); } |
Nous envoyons ensuite de façon continue des impulsions pour savoir si un obstacle est présent puis, s’il y en a un, nous envoyons un Message Callback.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void loop() { /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10 µs sur la broche TRIGGER */ digitalWrite(TRIGGER, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER, LOW); /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonore et son écho (s'il existe) */ long measure = pulseIn(ECHO, HIGH); /* 3. Calcul la distance à partir du temps mesuré */ long distanceMeasured = measure *vitesse ; /* 4. Envoie d'un MessageCallback à Constellation si on rentre dans le if */ if(distanceMeasured < defaultValue){ constellation.sendMessage(Package, "Brain", "message"); } } |
Etape 2 : Gérer les accès à la boîte aux lettres grâce à un lecteur de carte NFC
Dans cette partie, nous allons envoyer un Message Callback à Constellation grâce à l’ID du badge NFC détecté par notre lecteur de cartes.
Cela nous permettra par la suite de gérer les autorisations d’accès à la boîte aux lettres, de contrôler l’ouverture par notre servo-moteur, et d’avertir l’utilisateur qu’un colis a été livré ou que le courrier a été récupéré. Nous devrons donc enregistrer les différents utilisateurs en renseignant leur ID de badge et leur statut (facteur ou utilisateur).
Voici le câblage réalisé pour cette partie entre le NFC et l’ESP :
Branche du NFC | Pin de l’ESP8266 |
RST | D1 |
SDA(SS) | D2 |
MOSI | D7 |
MISO | D6 |
SCK | D5 |
GND | GND |
3.3 V | 3.3 V |
Il faut commencer par télécharger la bibliothèque suivante :
Voici ensuite la fonction nécessaire à l’envoi d’un Message Callback lorsque nous captons un nouveau badge.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void NFC() { // Regarde s'il y a une nouvelle carte, s'il n'y en a pas on quitte la fonction if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // S'il n'arrive pas à lire la carte on quitte la fonction if ( ! mfrc522.PICC_ReadCardSerial()) { return; } char sochar[256]; // 256 correspond à un octet String UID= dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); /* Permet de transformer un tableau de bit en String */ UID.toCharArray(sochar, 256); constellation.sendMessage(Package, "Brain", "Authorisation", sochar); /* envoie un message Callback du package Brain appelé Authorisation*/ } |
Etape 3 : Ouvrir et fermer la porte grâce à un servo-moteur
Le servomoteur va nous servir à commander notre verrou. Ce dernier va donc s’abonner à un State Object nous donnant l’état de la porte (verrouillée ou déverrouillée). Ainsi, lorsque notre lecteur NFC captera un ID autorisé, notre State Object changera, ainsi que l’état de verrouillage de la porte.
Voici les branchements qui relient notre moteur à l’ESP :
PIN DU MOTEUR | Pin de l’ESP8266 |
5 V (câble orange) | 5 V |
GND (câble marron) | GND |
Commande (câble jaune) | D8 |
Avant d’utiliser le code ci-dessous, il faut vérifier que vous avez bien installé les bibliothèques suivantes :
Dans le Setup ci-dessous, nous nous abonnons à un StateObject qui nous permet d’ouvrir et de fermer la porte lorsqu’il change d’état.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void setup() { monServo.attach(15); // Définit le moteur au D8 monServo.write(0); // ServoMoteur à sa position initiale constellation.registerStateObjectLink("*", "Brain", "Porte_ouverte", [](JsonObject& so) { delay(100); // délai afin d'attendre la connexion à Constellation if (so["Value"]== true){ monServo.write(90); // Position de la porte ouverte } if (so["Value"]== false){ monServo.write(0); // Position de la porte fermée } delay(3000); // attendre au minimum 3 secs avant que la porte ne change d'état. }); } |
Etape 4 : Synchroniser toutes nos parties avec un package Constellation
Vous pouvez retrouver notre code complet pour la boîte aux lettres sur GitHub pour plus de précision (https://github.com/Sqyluck/Boite-aux-lettres-connectee).
Il est ensuite nécessaire de créer un package Constellation, qui va nous permettre de traiter toutes les données de nos différents éléments.
→ Voici les différents Message Callbacks créent dans le package afin de répondre à nos besoins.
→ Voici la liste des State Objects générés par le package pour permettre l’affichage de nos données dans l’application et l’envoi d’ordre au servomoteur via l’ESP8266.
Etape 5 : Fabrication de la boîte aux lettres
Nous avons utilisé des planches en bois afin de réaliser notre boîte aux lettres. Nous avons vissé les planches entre elles, puis nous avons fixé nos éléments sous le toit de la boîte.
L’interface utilisateur
Prérequis : disposer de Node.js et de npm
Etape 1 : Créer une application avec ionic
Afin de réaliser notre interface utilisateur, nous avons décidé dans un premier temps de développer notre application avec Ionic 2 dans Visual Studio. Mais avec cette méthode nous étions obligé de développer notre application en langage typescript ce qui était plus compliqué pour connecter l’application à la plateforme Constellation. Nous avons donc décidé d’utiliser Ionic 1 afin de développer notre application en javascript et de la connecter plus facilement.
Avant de commencer, il faut lancer l’installation de Ionic 1 depuis l’invite de commande :
1 |
npm install – g cordova ionic |
(Attention : cette commande ne fonctionnera pas si vous ne disposez pas auparavant de node.js et de npm)
Une fois que nous nous sommes placé dans le dossier dans lequel nous souhaitons développer notre application, nous pouvons utiliser la commande suivante pour lancer la création d’un nouveau projet.
1 |
ionic start myApp tabs --type ionic1 |
(Nous venons ici de créer un nouveau projet ionic 1 de type tabs intitulé myApp)
Dans l’invite de commande, placez-vous dans le dossier de l’application (en utilisant la commande cd).
La commande ionic serve permet d’exécuter l’application dans un navigateur.
Lorsque le projet est créé, vous devez éditer vos différentes pages (par ex. sur Notepad++). Les fichiers à modifier se trouvent dans le dossier « www » :
- Le fichier index.html
- Les fichiers .html appartenant au dossier “templates” → C’est ici que vous pouvez modifier le contenu de chaque page de votre application.
- Le fichier app.js dans le dossier “js” → Vous devez définir votre constellation à cet endroit.
- Le fichier controllers.js dans le dossier “js” → Chaque controller est associé à une page html. Vous pouvez utiliser les variables et les fonctions définies dans ces pages grâce aux “Scopes”.
Etape 2 : Visualiser notre application sur un smartphone
Si vous souhaitez utiliser votre application sur votre smartphone, vous pouvez utiliser l’application “ionic view” disponible sur l’App Store et Google Play. Cette application vous permettra de visualiser directement l’application que vous êtes en train de développer sur votre smartphone.
Une fois l’application installée, vous devez ensuite vous rendre sur ce site, créer un compte, puis cliquez sur “New App”. Il ne vous reste plus qu’à faire le lien avec votre application et l’envoyer sur votre appareil. Pour cela, dans le dossier de votre application, utilisez les deux commandes suivantes dans votre invite de commande
1 2 |
ionic link ionic upload |
Ouvrez ensuite ionic view et visualisez votre application.
Vous pouvez également, après avoir branché votre téléphone et avoir activé le mode debug, utiliser la commande cordova run android afin de simuler directement votre application sur votre téléphone android.
Etape 3 : Connecter notre application à constellation
Afin de connecter notre application à la plateforme constellation, nous allons modifier le fichier app.js ainsi que le index.html.
Pour cela, nous allons importer les bibliothèques suivantes dans le fichier index.html :
- jquery-2.2.4.min.js
- jquery.signalr-2.2.1.min.js
- Constellation-1.8.1.min.js
- ngConstellation-1.8.1.min.js
Les librairies sont disponibles sur cette page. Nous vous conseillons de créer un dossier intitulé constellation dans le dossier « lib » et d’y enregistrer ces différentes bibliothèques.
Il ne vous restera plus qu’à ajouter les lignes de code suivantes dans le fichier index.html :
1 2 3 4 |
<script type="text/javascript" src="lib/constellation/jquery-2.2.4.min.js"></script> <script type="text/javascript" src="lib/constellation/jquery.signalr-2.2.1.min.js"></script> <script type="text/javascript" src="lib/constellation/Constellation-1.8.1.min.js"></script> <script type="text/javascript" src="lib/constellation/ngConstellation-1.8.1.min.js"></script> |
Puis nous allons ajouter le code suivant à notre fichier app.js :
1. Modifier la ligne angular.module, y ajouter ‘ngConstellation’ comme ci-dessous :
1 |
angular.module('starter', ['ionic', 'starter.controllers', 'ngConstellation']) |
2. Modifier la fonction .run, y ajouter $rootScope et constellationConsumer :
1 |
.run(function($ionicPlatform, $rootScope, constellationConsumer) |
3. Ajouter le code suivant dans la fonction .run :
1 2 3 4 5 6 7 8 9 |
constellationConsumer.initializeClient("http://192.168.43.171:8088", "123456789", "Application Ionic"); constellationConsumer.onConnectionStateChanged(function (change) { if (change.newState === $.signalR.connectionState.connected) { console.log("Connecté à constellation"); $rootScope.isConnected = true; } }); constellationConsumer.connect(); $rootScope.constellation = constellationConsumer; |
Vous pouvez maintenant vérifier que vous êtes bien connecté à votre constellation en regardant dans votre console (f12 dans votre navigateur).
Etape 4 : Connecter notre application à la boîte aux lettres
Un certain nombre de State Objects et de Message Callbacks ont été réalisés dans notre package constellation afin de traiter nos différentes informations (ce package est disponible sur gitHub).
Le rôle de notre application ici est simplement de s’abonner aux State Objects et d’envoyer des messages Callbacks à notre constellation.
→ Exemple de récupération d’un State Object :
Les StateObjects se récupèrent dans le fichier app.js, à l’endroit où nous avons défini notre constellation. Voici un exemple de code correspondant à notre State Object « Users » :
1 2 3 4 5 |
//State Object Utilisateurs constellationConsumer.registerStateObjectLink("*", "Brain", "Users", "*", function(so) { $rootScope.Users = so.Value; $rootScope.$apply(); }); |
Pour afficher nos utlisateurs, il nous suffit maintenant, dans notre page html d’utiliser le code suivant :
1 2 3 4 |
<ion-item ng-repeat="user in Users"> <h2>{{user.firstName}} {{user.name}}</h2> <p>{{user.client ? "client":"facteur"}}</p> </ion-item> |
→ Exemple d’envoi d’un message Callback :
Les messages Callbacks s’envoient dans le fichier controllers.js. Voici l’exemple de code pour le Message Callback « DeleteUser » :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Message CallBack DeleteUser $scope.name = $stateParams.name $scope.firstName = $stateParams.firstName; $scope.deleteUser = function() { var deleteUser = $ionicPopup.confirm({ title: 'Supprimer cet utilisateur', template: 'Etes vous sur de vouloir supprimer cet utilisateur ?' }); deleteUser.then(function(res) { if(res) { $rootScope.constellation.sendMessage({ Scope: 'Package', Args: ['Brain'] }, 'DeleteUser', [$scope.firstName, $scope.name ]); $state.go('tab.utilisateurs'); console.log('deleted'); } else { console.log('do nothing'); } }); }; |
Dans notre page html, on appelle maintenant la fonction créée dans notre controller.js dans un bouton par exemple :
1 |
<button ng-click="deleteUser()">Supprimer cet utilisateur</button> |
En vous servant de cette base, vous pouvez réaliser une application vous permettant de recevoir un message sur votre application lorsque vous recevez un courrier ou un colis mais aussi d’ajouter ou de supprimer des accès à la boite aux lettres.
Il est également possible de réutiliser des packages existants, par exemple, nous nous sommes servis du package PushBullet afin de recevoir des notifications sur notre smartphone.
Voici un aperçu de notre application ionic :
Démarrez la discussion sur le forum Constellation