Spark-Core-PIR
Senseur PIR
Savoir lire l'état d'une entrée du port GPIO du Raspberry PI est une action fondamentale en hacking électronique.
Nous l'avions déjà abordé avec la lecture de l'état un bouton.
Dans cet article, nous allons détecter l'activation d'un senseur de proximité PIR à l'aide d'un Raspberry PI.
Voici un exemple qui vous propose de lire l'état du senseur PIR placé sur la broche le D4.
Une Led rouge est placée sur le D1, elle est allumée dans lorsque le senseur PIR détecte un mouvement.
Matériel
- Un breadboard et des fils extra souples
- Un senseur PIR
- 1 x résistance de 1K Ohms (Brun, Noir, Rouge)
- 1 x Led Rouge
- 1 x Spark Core
Montage
La sortie du senseur PIR est une sortie active qui place le potentiel à GND/Masse ou 3.3V en fonction de l'état du senseur PIR.
Cette sortie est donc compatible avec un système 3.3v, même si le senseur a besoin de 5 volts pour fonctionner correctement. En branchant l'alimentation du senseur sur la broche VIN, nous y récupérons une tension de 5V lorsque le Particle Core est alimenté via USB (5V) ou via une source de tension externe 5V branchée directement sur VIN.
Lorsque le senseur PIR détecte une activité, il active sa sortie, ce qui applique 3.3V sur la broche D4. Cette sortie PIR reste active pendant plusieurs secondes... à la suite de quoi le potentiel est ramené la masse (broche D4 est donc à 0 volt).
Code
Voici le petit bout de code pour votre Core
// ------------------------------------------------- // Internet PIR - Détection de mouvement avec senseur PIR // ------------------------------------------------- // // Exemple didactique dont le but est: // 1) De détecter l'activation d'un senseur PIR avec // avec déparasitage logiciel. // 2) Reporte cette information dans une variable "counter" sur Particle Cloud // (le nombre de détection) permettant à un autre logiciel comme // un SmartPhone de détecter l'événement. // 3) Reporte le statut actuel du senseur dans la variable "actif". // Permet de savoir si le senseur est actuellement actif. // Pratique par exemple pour savoir s'il y a de l'activité dans une // pièce (ex: surveiller un stock en pleine nuit). // 3) Offrir une fonction "reset" sur Particle Cloud permettant // a un autre logiciel de remettre le compteur "counter" à zéro. // Force la relecture de l'entrée digital et la mise à jour // de la variable "actif" // // Voyez le tutoriel MCHobby // http://wiki.mchobby.be/index.php?title=Spark-Core-PIR // Produit disponible chez MCHobby: // http://shop.mchobby.be/product.php?id_product=61 // // Sortie du senseur PIR branché sur la broche D4 #define pirPin 4 // Créer une variable qui pour stocker la valeur // du compteur de pression int counter = 0; // Créer les variables internes au programme int pirState; // etat du senseur PIR /* Exécuté une fois au démarrage */ void setup() { // Enregistrer la variable compteur sur Particle Cloud Spark.variable("counter", &counter, INT ); // Publie l'état du contact dans la variable "close" sur Particle Cloud Spark.variable("actif", &pirState, INT ); // Enregistrer la fonction "reset compteur" sur Particle Cloud Spark.function("reset", resetCounter ); // Active la broche D4 comme entrée pinMode(pirPin, INPUT); // lecture de l'état initial pirState = digitalRead( pirPin ); } /* la fonction loop() est executée encore et encore */ void loop() { int val, val2; // variable pour stocker la valeur lue sur la broche D4 val = digitalRead( pirPin ); delay( 10 ); // delai de 10ms pour déparasitage logiciel val2 = digitalRead( pirPin ); // si val = val2 --> lecture de l'entrée est consistante // l'état de l'entrée est définit avec certitude... ce n'est pas // un parasite. if( val == val2 ){ // Si le contact a changé d'état? (passe du HIGH->LOW ou de LOW->HIGH) if( val != pirState ){ // Si le PIR est actif if( val == HIGH ){ counter = counter +1; // incrémenter le compteur } // Se souvenir du nouvel état de l'entrée pirState = val; } } } // Cette fontion est appelée lorqu'il y a un appel correspondant sur l'API // Pas de chaine de commande. // a) Réinitialise le compteur "counter" à zéro. // b) mise-à-jour de la variable actif. int resetCounter( String command ){ counter = 0; // relecture de l'entrée pirState = digitalRead( pirPin ); delay( 10 ); // déparasitage logiciel pirState = digitalRead( pirPin ); return 1; // retour de valeur pour l'API }
Faire un appel d'API avec CURL
Nous allons maintenant tester notre programme... nous allons donc faire des appels d'API sur Particle Cloud.
Pour rappel, nous avons deux API dans notre programme:
- counter (variable) - permet de savoir combien de fois le senseur PIR à été activé.
- actif (variable) - permet de savoir si le le senseur PIR est actif.
- reset (function) - sans paramètre, permet de réinitialiser le compteur à 0 mais aussi de reforcer la lecture de l'entrée :-)
Dans les exemples Curl ci-dessous, le Core_ID est fixé à 0123456789abcdef et l'Access Token fixé à 123412341234, notre tuto sur la LED internet explique comment identifier votre CORE_ID et votre ACCESS TOKEN.
Le compteur
Pour commencer, nous allons récupérer le résultat du compteur en utilisant curl (voyez nos précédents tutoriels concernant CURL).
curl -G https://api.spark.io/v1/devices/0123456789abcdef/counter -d access_token=123412341234
Ce qui produit le résultat ci-dessous, où vous pouvez constater que nous avons activé 5 fois le senseur PIR:
{ "cmd": "VarReturn", "name": "counter", "result": 5, "coreInfo": { "last_app": "", "last_heard": "2014-12-31T15:53:55.238Z", "connected": true, "deviceID": "0123456789abcdef" } }
L'état du senseur
Pour commencer, nous allons récupérer l'état du senseur PIR en utilisant curl (voyez nos précédents tutoriels concernant CURL).
curl -G https://api.spark.io/v1/devices/0123456789abcdef/actif -d access_token=123412341234
Ce qui produit le résultat ci-dessous, où vous pouvez constater que le senseur est actuellement actif (a priori, quelqu'un est passé dans le champs de détection):
{ "cmd": "VarReturn", "name": "actif", "result": 1, "coreInfo": { "last_app": "", "last_heard": "2014-12-31T15:53:55.238Z", "connected": true, "deviceID": "0123456789abcdef" } }
Réinitialiser le compteur
Idéalement votre programme utilisant l'API Particle devrait prendre la valeur du compteur... puis surveiller le changement de cette valeur.
Si le compteur augmente... c'est qu'il détecte des mouvement (des personnes passent par là) :-)
Restons pragmatique... cette façon de faire n'est pas forcement confortable.
En conséquence, nous avons ajouté une fonction reset sur Particle Cloud pour réinitialiser le compteur (ps: j'ai volontairement laissé le paramètre "params", même s'il est vide).
curl https://api.spark.io/v1/devices/0123456789abcdef/reset -d access_token=123412341234 -d params=
Ce qui produit le résultat suivant:
{ "id": "0123456789abcdef", "name": "mch-demo", "last_app": null, "connected": true, "return_value": 1 }
La valeur 1 est retournée par l'exécution de la fonction sur le Particle... mais le compteur sera bien à zéro!
Source: Particle Core Examples créé par Particle.IO.
Traduction (et augmentation de contenu) réalisée par Meurisse D pour MCHobby.be - Translated (and enhanced) by Meurisse D. for MCHobby.be
Traduit avec l'autorisation de Particle.IO - Translated with the permission from Particle.IO - Particle.IO
Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : « Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.
L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.