Modifications

Sauter à la navigation Sauter à la recherche
8 600 octets ajoutés ,  10 février 2015 à 20:39
Page créée avec « {{Spark-Core-Hacking-NAV}} == Switch Magnétique == Aussi appelé contact magnétique, {{pl|60|disponible ici}}, ce contact utilise un [http://fr.wikipedia.org/wiki/Interru... »
{{Spark-Core-Hacking-NAV}}

== Switch Magnétique ==

Aussi appelé contact magnétique, {{pl|60|disponible ici}}, ce contact utilise un [http://fr.wikipedia.org/wiki/Interrupteur_reed interrupteur reed] <small>(''Wikipédia'')</small> et un aimant pour activer un contact.

Un contact magnétique est constitué de deux parties.
# Un aimant
# Le contact magnétique (aussi appelé Reed switch).

[[Fichier:ReedSwitch.jpg]]

Ces contacts,faciles à mettre en oeuvre, servent généralement à détecter l'ouverture d'une porte ou d'une fenêtre.
Si vous disposez d'un système d'alarme à la maison vous avez probablement noté ces petits boitiers blancs à proximité des fenêtres.

Les contacts magnétiques sont généralement ouvert au repos (c'est a dire "non sollicité par un aimant").<br />
Lorsque l'on place l'aimant à proximité, le contact se ferme. En étant attentif, il est parfois même possible d'entendre le contact se fermer.

Le principe physique d'un contact reed est identique à celui d'un bouton poussoir... c'est un contact!.

Par conséquent, nous vous recommandons fortement [[Spark-Core-Bouton|la lecture de notre tutoriel sur le bouton poussoir]] et la section décrivant la protection d'une entrée digitale et le déparasitage logiciel.

== Logique inversée ==
Le principe de lecture d'un bouton poussoir et d'un contact magnétique est identique.

Il y a cependant une différence de logique:
* Lorsque la porte est fermée, l'aimant active l'interrupteur reed et le contact est fermé.
* Lorsque la porte est ouverte, l'aimant s'éloigne de l'interrupteur reed et le contact s'ouvre.

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 ==
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).

[[fichier:SPARK-MAGNETIC-SWITCH_bb.jpg|640px]]

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 Spark 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 Spark 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 Spark Cloud
Spark.variable("counter", &counter, INT );
// Publie l'état du contact dans la variable "close" sur Spark Cloud
Spark.variable("close", &contactState, INT );

// Enregistrer la fonction "reset compteur" sur Spark 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 Spark 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 Spark 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 Spark 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 Spark... mais le compteur sera bien à zéro!

{{Spark-Core-Hacking-TRAILER}}
29 918

modifications

Menu de navigation