I. Configuration matérielle▲
Matériel nécessaire |
|
|
|
Comme vous pouvez le constater d'après la liste de matériels requis, ce projet utilise une photorésistance connectée au port GPIO du Raspberry Pi grâce aux deux fils femelle-femelle.
II. Détection de l'obscurité▲
Contrairement à l'Arduino, par exemple, le Raspberry Pi ne possède pas d'entrées analogiques pour mesurer des tensions. Par contre, il possède des entrées numériques. Si la tension à une entrée numérique dépasse les 1,65 V environ (la moitié de 3,3 V), l'entrée sera lue et considérée par le Raspberry Pi à l'état logique haut (HIGH), sinon à l'état logique bas (LOW). Bien qu'on ne puisse pas utiliser la photorésistance avec un Raspberry Pi pour mesurer le niveau de luminosité (pas sans composants supplémentaires en tout cas, comme un convertisseur analogique-numérique (NDLR)), on peut toujours l'utiliser pour évaluer s'il fait jour ou s'il fait nuit.
L'entrée numérique de la broche (GPIO n° 18) a une résistance pull-up interne qui peut être activée. Tandis que la résistance pull-up tend à « tirer » la broche n° 18 vers le niveau logique haut (HIGH), la photorésistance au contraire tend à la « tirer » vers le niveau logique bas (LOW). Il se produit alors une lutte acharnée entre les deux résistances et si la résistance pull-up gagne, l'entrée sera au niveau logique haut (HIGH) alors que si c'est la photorésistance qui gagne, elle sera au niveau logique bas (LOW).
Plus la luminosité détectée par la photorésistance est élevée, et plus sa résistance diminue et la broche 18 est alors « tirée » à la référence électrique 0 V. Typiquement, une photorésistance a une résistance de quelques centaines à quelques milliers d'ohms quand elle est éclairée. Dans l'obscurité (celle d'un réfrigérateur fermé dans notre cas), sa résistance monte à plusieurs mégaohms (millions d'ohms). À ce niveau, la résistance pull-up interne du Pi (50 à 100 kiloohms) l'emportera facilement et l'entrée sera au niveau logique haut (HIGH).
III. If This Then That (IFTTT)▲
NDT : « If This Then That » ou IFTTT, que l'on peut traduire par « Si ceci, alors fais cela ». Autrement dit, chaque condition (If this) génère une action (then that).
IFTTT est un service Web qui permet de configurer des déclencheurs (triggers) qui génèrent des actions. Par exemple, vous pouvez créer un recipe IFTTT (NDT : un recipe ou une « recette » met en relation une condition et une action entre différents outils web et réseaux sociaux) qui vous envoie un e-mail (action) quand quelqu'un vous mentionne sur Twitter (trigger). Prévu pour gérer les actions et les triggers à partir de n'importe quels médias sociaux ou services e-mail, IFTTT peut être également configuré pour agir en réaction à des événements physiques, comme l'ouverture de la porte du réfrigérateur qui va nous concerner ici.
Le principe consiste à faire envoyer une requête Web par le Raspberry Pi au service IFTTT, requête Web qui agira comme un déclencheur (trigger). IFTTT réagira alors selon l'action que vous lui avez spécifiée, c'est-à-dire envoyer un e-mail dans notre cas précis.
Les différentes chaînes (channels) disponibles sur IFTTT requièrent leur propre identifiant et IFTTT, de temps en temps, vous demandera d'entrer un identifiant et un mot de passe pour accéder aux chaînes.
Préparation du montage |
|
|
Étape 1 : branchez la photorésistance |
|
Étape 2 : créez un nouveau recipe IFTTT |
|
Étape 3 : créez un trigger dans la chaîne Maker |
|
Étape 4 : choisissez une action |
|
Étape 5 : complétez les champs de l'action |
|
Étape 6 : validez le recipe |
|
Étape 7 : récupérez la clé secrète |
Maintenant que le matériel est prêt et IFTTT configuré, on doit se préoccuper du programme Python qui enverra la requête Web de déclenchement du service IFTTT.
Téléchargez le programme Python de ce projet en utilisant les commandes suivantes :
cd /home/pi
git clone https://github.com/simonmonk/pi_magazine.git
En fait, cette dernière commande va télécharger le code de tous les projets de la série publiés par l'auteur dans le magazine TheMagPi. Si vous avez déjà tapé cette commande pour un précédent projet, allez dans le répertoire pi_magazine et tapez la commande suivante pour mettre le répertoire à jour avec ce nouveau projet (07_fridge_monitor) :
git pull
IV. Comment le code fonctionne-t-il ?▲
Le code Python de ce projet de surveillance de réfrigérateur est assez simple. Si vous êtes intéressés par le fonctionnement du code, le mieux est de l'ouvrir dans un éditeur pendant que nous le parcourons.
# Download : Github.com/simonmonk/pi_magazine/tree/master/07_fridge_monitor
import
time
import
RPi.GPIO as
GPIO
import
urllib2
LIGHT_PIN =
18
# photoresistor pin
EVENT =
'fridge_alert'
BASE_URL =
'https://maker.ifttt.com/trigger/'
KEY =
'cyR3vPNFlP9K32W4NZB9cd'
# Configure the GPIO pin
GPIO.setmode
(
GPIO.BCM)
GPIO.setup
(
LIGHT_PIN, GPIO.IN, pull_up_down =
GPIO.PUD_UP)
def
send_event
(
):
response =
urllib2.urlopen
(
BASE_URL +
EVENT +
'/with/key/'
+
KEY)
print
(
response.read
(
))
try
:
while
True
:
if
GPIO.input(
LIGHT_PIN) ==
0
:
# Its light (door open)
send_event
(
)
# Do nothing until the door is closed again
while
GPIO.input(
LIGHT_PIN) ==
0
:
time.sleep
(
0.1
)
# Do nothing for a further minute anyway
print
(
"Wait a minute"
)
time.sleep
(
60
)
print
(
"Monitoring again"
)
finally
:
print
(
'Cleaning up GPIO'
)
GPIO.cleanup
(
)
Dans la première partie du code, on importe les bibliothèques dont on a besoin. Cela comprend la bibliothèque RPi.GPIO, nécessaire pour faire l'interface avec la photorésistance, puis la bibliothèque urllib2 qui sera utilisée pour envoyer une requête Web au service IFTTT.
Le code qui suit comprend la déclaration de variables de configuration. La variable EVENT doit correspondre au texte que vous avez saisi dans le champ Event Name quand vous avez créé le déclencheur sur le site d'IFTTT. Il faut remplacer la valeur de la clé de la variable KEY avec celle créée lors de l'étape 7 vue précédemment.
La fonction send_event sera appelée à partir du corps du programme principal, quand IFTTT doit être notifié. La réponse à la requête Web est affichée à l'écran, seulement à titre d'information pendant la mise au point du projet.
La boucle du programme principal est à l'intérieur d'un bloc try
/finally
, de façon à ce que le port GPIO soit libéré et mis en sécurité quand le programme est interrompu. La boucle principale while
True
: exécute le programme jusqu'à ce qu'il soit interrompu avec un CTRL+C.
Dans la boucle principale, on interroge l'état de l'entrée de la broche LIGHT_PIN et si elle est à zéro, cela signifie que la porte du réfrigérateur a été ouverte. Afin d'éviter l'envoi d'une série rapprochée de mails à chaque fois que la porte du réfrigérateur est détectée comme étant ouverte, deux précautions sont prises. Premièrement, quand une ouverture de porte est détectée, on maintient le programme dans une boucle while
tant que la porte reste ouverte, ceci afin d'éviter une série de déclenchements à chaque interrogation de la broche reliée à la photorésistance dans la boucle principale. Deuxièmement, quand la porte est finalement refermée, le programme temporise pendant une minute, là aussi pour éviter des déclenchements trop rapprochés dans le temps.
V. Mettre en œuvre son système de surveillance▲
Si vous voulez mettre le système en œuvre en condition réelle de fonctionnement, vous pouvez coller la photorésistance sur la paroi intérieure du réfrigérateur, plutôt que de la laisser suspendue comme nous l'avons fait.
Avant d'exécuter le programme Python, on peut tester son recipe en ligne de commande avec l'utilitaire wget. Tapez la commande suivante dans un terminal LXTerminal en remplaçant la clé par celle que vous avez obtenue.
curl https://maker.ifttt.com/trigger/fridge_alert/with/key/cyR3vPNFlP9K32W4NZB9cd
Vous devriez voir apparaître le message, « Congratulations! You've fired the fridge_alert event ».
Consultez votre boîte mail et vous devriez avoir un nouvel e-mail provenant d'IFTTT. Si quelque chose a mal tourné, vous devriez avoir un message d'erreur à la place des félicitations. Vous pouvez alors consulter les logs de votre recipe sur le site d'IFTTT en sélectionnant le recipe puis en cliquant sur l'icône avec une série de points.
Démarrez l'exécution du programme de surveillance avec la commande suivante :
sudo python fridge_monitor.py
IFTTT est un service très puissant, et vous voudriez sans doute expérimenter ses possibilités en éditant le recipe puis en changeant l'action déclenchée de façon à tweeter ou encore changer son statut Facebook plutôt que d'envoyer un e-mail.
Avoir un clavier, une souris et un écran connecté au Pi de votre réfrigérateur est certainement très utile pendant la phase de mise au point (NDLR : une connexion SSH à partir d'un poste distant connecté peut aussi très bien dépanner), mais il serait bien plus pratique d'avoir le Pi autonome et qui démarre automatiquement son programme à chaque mise sous tension. Pour cela, tapez la commande suivante pour rendre le fichier exécutable :
sudo chmod +x fridge_monitor.py
Puis éditez le fichier /etc/rc.local avec la commande suivante :
sudo nano /etc/rc.local
NDLR : le script /etc/rc.local, utilisé par les administrateurs système, est exécuté en dernier après le démarrage des autres services. On peut donc l'utiliser pour démarrer des services personnalisés.
Ajoutez la ligne suivante après le premier bloc de commentaires commençant par # :
sudo /home/pi/pi_magazine/07_fridge_monitor/fridge_monitor.py &
Redémarrez votre Raspberry Pi et cette fois, votre programme de surveillance devrait démarrer automatiquement.
VI. Notes de la Rédaction de Developpez.com▲
Cet article est une traduction de l'article écrit par Simon Monk et paru dans le n° 37 du magazine TheMagPi, sous le titre Fridge monitor.
Retrouvez les projets de l'auteur publiés dans le magazine TheMagPi sur la plateforme GitHub.
Nous remercions les membres de la Rédaction de Developpez pour le travail de traduction et de relecture qu'ils ont effectué, en particulier :
Merci également à Claude Leloup pour sa relecture orthographique.