Modifications

Sauter à la navigation Sauter à la recherche
6 357 octets ajoutés ,  24 octobre 2015 à 13:16
aucun résumé de modification
Ligne 29 : Ligne 29 :     
Dans le cas ci-présent, il ne faut pas détecter la fermeture d'un contact (comme le bouton poussoir) '''mais l'ouverture d'un contact'''.
 
Dans le cas ci-présent, il ne faut pas détecter la fermeture d'un contact (comme le bouton poussoir) '''mais l'ouverture d'un contact'''.
+
 
 
== Montage ==
 
== Montage ==
 
Comme pour le bouton poussoir, le montage est élémentaire et utilise une résistance pull-down de 10 KOhms (brun, noir, orange) et une résistance de protection de 100 Ohms (brun, noir, brun).
 
Comme pour le bouton poussoir, le montage est élémentaire et utilise une résistance pull-down de 10 KOhms (brun, noir, orange) et une résistance de protection de 100 Ohms (brun, noir, brun).
Ligne 36 : Ligne 36 :     
Lorsque le contact est fermé (la porte fermée), 3.3V est appliqué sur la broche D4... lorsque la porte est ouverte, le contact reed s'ouvre et la broche D4 est ramenée à la masse par la résistance pull-down.
 
Lorsque le contact est fermé (la porte fermée), 3.3V est appliqué sur la broche D4... lorsque la porte est ouverte, le contact reed s'ouvre et la broche D4 est ramenée à la masse par la résistance pull-down.
 +
 +
== Code ==
 +
Voici le petit bout de code pour votre Core
 +
 +
<nowiki>// -------------------------------------------------
 +
// Internet Magnetic - Détection d'ouverture de contact Reed
 +
// -------------------------------------------------
 +
//
 +
// Exemple didactique dont le but est:
 +
// 1) De détecter l'ouverture de contact reed (switch magnetic) avec
 +
//    avec déparasitage logiciel.
 +
// 2) Reporte cette information dans une variable "counter" sur Particle Cloud
 +
//    (le nombre d'ouverture) permettant à un autre logiciel comme
 +
//    un SmartPhone de détecter l'événement.
 +
// 3) Reporte le statut actuel du senseur dans la variable "close".
 +
//    Permet de savoir si le contact/porte est fermé.
 +
//    Pratique par exemple pour la cabane de jardin, chambre froide,
 +
//    box du cheval (s'il est de sortie... donc porte ouverte), etc
 +
// 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 "open"
 +
//
 +
// Voyez le tutoriel MCHobby
 +
//  http://wiki.mchobby.be/index.php?title=Spark-Core-Switch-Magnetic
 +
// Produit disponible chez MCHobby:
 +
//  http://shop.mchobby.be/product.php?id_product=60
 +
//
 +
// contact magnétique/contact reed branché sur la broche D4
 +
#define btnPin 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 contactState; // etat du bouton
 +
 +
/* 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("close", &contactState, INT );
 +
 
 +
  // Enregistrer la fonction "reset compteur" sur Particle Cloud
 +
  Spark.function("reset", resetCounter );
 +
 
 +
  // Active la broche D4 comme entrée
 +
  pinMode(btnPin, INPUT);
 +
  // lecture de l'état initial
 +
  contactState = digitalRead( btnPin );
 +
}
 +
 +
/* 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( btnPin );
 +
  delay( 10 ); // delai de 10ms pour déparasitage logiciel
 +
  val2 = digitalRead( btnPin );
 +
 
 +
  // 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 != contactState ){
 +
         
 +
          // Si le contact est ouvert
 +
          if( val == LOW ){
 +
             
 +
              counter = counter +1; // incrémenter le compteur
 +
          }
 +
         
 +
          // Se souvenir du nouvel état de l'entrée
 +
          contactState = 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 open.
 +
int resetCounter( String command ){
 +
    counter = 0;
 +
   
 +
    // relecture de l'entrée
 +
    contactState = digitalRead( btnPin );
 +
    delay( 10 ); // déparasitage logiciel
 +
    contactState = digitalRead( btnPin );
 +
   
 +
    return 1; // retour de valeur pour l'API
 +
}</nowiki>
 +
 +
== 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 contact magnétique à été ouvert.
 +
* '''close''' (variable) - permet de savoir si le contact magnétic est fermé (close=1).
 +
* '''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 [[Spark-Core-NetLED#Faire_une_requ.C3.AAte_sur_l.27API|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).
 +
 +
<nowiki>curl -G https://api.spark.io/v1/devices/0123456789abcdef/counter -d access_token=123412341234</nowiki>
 +
 +
Ce qui produit le résultat ci-dessous, où vous pouvez constater que nous avons ouvert 5 fois le contact:
 +
 +
<nowiki>{
 +
  "cmd": "VarReturn",
 +
  "name": "counter",
 +
  "result": 5,
 +
  "coreInfo": {
 +
    "last_app": "",
 +
    "last_heard": "2014-12-31T15:53:55.238Z",
 +
    "connected": true,
 +
    "deviceID": "0123456789abcdef"
 +
  }
 +
}</nowiki>
 +
 +
=== L'état du contact ===
 +
Pour commencer, nous allons récupérer l'état du contact magnétique en utilisant curl (voyez nos précédents tutoriels concernant CURL).
 +
 +
<nowiki>curl -G https://api.spark.io/v1/devices/0123456789abcdef/close -d access_token=123412341234</nowiki>
 +
 +
Ce qui produit le résultat ci-dessous, où vous pouvez constater que le contact est actuellement ouvert (a priori, la porte est ouverte):
 +
 +
<nowiki>{
 +
  "cmd": "VarReturn",
 +
  "name": "close",
 +
  "result": 1,
 +
  "coreInfo": {
 +
    "last_app": "",
 +
    "last_heard": "2014-12-31T15:53:55.238Z",
 +
    "connected": true,
 +
    "deviceID": "0123456789abcdef"
 +
  }
 +
}</nowiki>
 +
 +
=== 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 que l'on a ouvert le contact (la porte) :-)
 +
 +
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).
 +
 +
<nowiki>curl https://api.spark.io/v1/devices/0123456789abcdef/reset -d access_token=123412341234 -d params=</nowiki>
 +
 +
Ce qui produit le résultat suivant:
 +
 +
<nowiki>{
 +
  "id": "0123456789abcdef",
 +
  "name": "mch-demo",
 +
  "last_app": null,
 +
  "connected": true,
 +
  "return_value": 1
 +
}</nowiki>
    +
La valeur 1 est retournée par l'exécution de la fonction sur le Particle... mais le compteur sera bien à zéro!
    
{{Spark-Core-Hacking-TRAILER}}
 
{{Spark-Core-Hacking-TRAILER}}
29 836

modifications

Menu de navigation