Ligne 1 : |
Ligne 1 : |
| {{Spark-Core-Hacking-NAV}} | | {{Spark-Core-Hacking-NAV}} |
− |
| |
− | {{traduction}}
| |
| | | |
| == Mesurer la température == | | == Mesurer la température == |
− | {{bloc-etroit|text=Jusqu'ici nous avons appris comment envoyer des commandes personnalisée à note Core et comment contrôler la matériel. | + | {{bloc-etroit|text=Jusqu'ici nous avons appris comment envoyer des commandes personnalisée à note Core et comment contrôler le matériel. |
| | | |
| Mais comment lire des données sur notre Core? | | Mais comment lire des données sur notre Core? |
Ligne 65 : |
Ligne 63 : |
| Tester le senseur est vraiment simple mais vous aurez besoin d'un bloc de piles (ou d'une alimentation). | | Tester le senseur est vraiment simple mais vous aurez besoin d'un bloc de piles (ou d'une alimentation). |
| | | |
− | Connectre une alimentation de 2.7 à 5.5V (2-4 piles AA fonctionnent bien) de façon à ce que la masse (GND) soit connecté sur la broche 3 (pin 3, celle de droite), et l'alimentation sur la broche 1 (pin 1, celle de gauche)
| + | Connecter une alimentation de 2.7 à 5.5V (2-4 piles AA fonctionnent bien) de façon à ce que la masse (GND) soit connecté sur la broche 3 (pin 3, celle de droite), et l'alimentation sur la broche 1 (pin 1, celle de gauche) |
| | | |
| Raccordez ensuite un multimètre (en position mesure de tension continue) entre la masse (GND) et la broche 2 restée libre (pin 2, au milieu). | | Raccordez ensuite un multimètre (en position mesure de tension continue) entre la masse (GND) et la broche 2 restée libre (pin 2, au milieu). |
Ligne 95 : |
Ligne 93 : |
| | | |
| Le {{pl|59|TMP36}} est un senseur de température très facile à trouver. | | Le {{pl|59|TMP36}} est un senseur de température très facile à trouver. |
− | Il s'agit d'un périphérique analogique (la tension en sortie du senseur dépend de la température). Ce senseur est également inclus dans le {{pl|519|Spark Core Maker Kit}}! | + | Il s'agit d'un périphérique analogique (la tension en sortie du senseur dépend de la température). Ce senseur est également inclus dans le {{pl|519|Particle Core Maker Kit}}! |
| | | |
| Vous pouvez [http://www.analog.com/en/mems-sensors/digital-temperature-sensors/tmp36/products/product.html télécharger la fiche technique] ici. | | Vous pouvez [http://www.analog.com/en/mems-sensors/digital-temperature-sensors/tmp36/products/product.html télécharger la fiche technique] ici. |
Ligne 105 : |
Ligne 103 : |
| Si vous prêtez attention au plan de montage, vous noterez que le senseur est alimenté à l'aide de la broche 3.3V* à la place de la sortie standard 3.3V. C'est parce que la sortie 3.3V* offre une tension filtrée (via un filtre LC), idéal pour les application analogique comme celle-ci. | | Si vous prêtez attention au plan de montage, vous noterez que le senseur est alimenté à l'aide de la broche 3.3V* à la place de la sortie standard 3.3V. C'est parce que la sortie 3.3V* offre une tension filtrée (via un filtre LC), idéal pour les application analogique comme celle-ci. |
| | | |
− | Si les mesures que vous obtenez sont inconsistante (ou paraissent parasitées), ajoutez une {{pl|456|capacité céramique de 0.01µF}} (10nF) entre l'entrée analogique (A7 dans ce cas) et la masse/GND. | + | Si les mesures que vous obtenez sont inconsistantes (ou paraissent parasitées), ajoutez une {{pl|456|capacité céramique de 0.01µF}} (10nF) entre l'entrée analogique (A7 dans ce cas) et la masse/GND. |
| | | |
| Le senseur devrait idéalement se trouver à une certaine distance du Core afin de ne pas être affecté par les dissipations de chaleur du Core. | | Le senseur devrait idéalement se trouver à une certaine distance du Core afin de ne pas être affecté par les dissipations de chaleur du Core. |
| | | |
| == Le code == | | == Le code == |
− | Voici le code proposé par Spark que nous avons traduit pour faciliter la compréhension. | + | Voici le code proposé par Particle que nous avons traduit pour faciliter la compréhension. |
| | | |
| Notez que ce montage utilise le deuxième schéma de raccordement (lecture sur la broche analogique A7 et filtrage). | | Notez que ce montage utilise le deuxième schéma de raccordement (lecture sur la broche analogique A7 et filtrage). |
Ligne 124 : |
Ligne 122 : |
| void setup() | | void setup() |
| { | | { |
− | // Enregistrer la variable sur Spark Cloud | + | // Enregistrer la variable sur Particle Cloud |
| Spark.variable("temperature", &temperature, DOUBLE); | | Spark.variable("temperature", &temperature, DOUBLE); |
| | | |
− | // Active la broche A7 comme entrée (broche | + | // Active la broche A0 comme entrée (broche |
| // sur laquelle le senseur de température est connecté) | | // sur laquelle le senseur de température est connecté) |
− | pinMode(A7, INPUT); | + | pinMode(A0, INPUT); |
| } | | } |
| | | |
Ligne 138 : |
Ligne 136 : |
| | | |
| // Lire continuellement la valeur du senseur. De sorte que | | // Lire continuellement la valeur du senseur. De sorte que |
− | // lorsque nous faison un appel sur l'API pour lire la valeur | + | // lorsque nous faisons un appel sur l'API pour lire la valeur |
| // nous obtenons la dernière valeur disponible. | | // nous obtenons la dernière valeur disponible. |
− | reading = analogRead(A7); | + | reading = analogRead(A0); |
| | | |
| // La lecture analogique retourne une valeur entre 0 et 4095 | | // La lecture analogique retourne une valeur entre 0 et 4095 |
Ligne 157 : |
Ligne 155 : |
| GET /v1/devices/{DEVICE_ID}/temperature | | GET /v1/devices/{DEVICE_ID}/temperature |
| | | |
| + | === Appel d'API avec CURL === |
| Voici un exemple de requête Curl, Core_ID est 0123456789abcdef et un Access Token 123412341234. | | Voici un exemple de requête Curl, Core_ID est 0123456789abcdef et un Access Token 123412341234. |
| | | |
Ligne 164 : |
Ligne 163 : |
| | | |
| Le -G de la commande curl indique que nous voulons utiliser une requête de type GET. | | Le -G de la commande curl indique que nous voulons utiliser une requête de type GET. |
| + | |
| + | Ce qui produit un résultat comparable à celui-ci: |
| + | |
| + | <nowiki>{ |
| + | "cmd": "VarReturn", |
| + | "name": "temperature", |
| + | "result": 23.413919413919405, |
| + | "coreInfo": { |
| + | "last_app": "", |
| + | "last_heard": "2014-12-08T11:55:38.292Z", |
| + | "connected": true, |
| + | "deviceID": "0123456789abcdef" |
| + | } |
| + | }</nowiki> |
| + | |
| + | === Appel d'API avec navigateur === |
| + | Cette fois-ci, il sera facile d'utiliser votre navigateur favoris pour faire un appel d'API et obtenir le contenu d'une variable. |
| + | |
| + | Dans le cas présent, il s'agit d'une requête de type GET, ce que fait exactement votre navigateur internet lorsque vous visitez un site internet. |
| + | |
| + | Ouvrez donc votre navigateur favori et saisissez: |
| + | |
| + | <nowiki>https://api.spark.io/v1/devices/54fyyyyyyyyyyyyyyyyyyy67/temperature?access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8</nowiki> |
| + | |
| + | Cet exemple ci utilise le Particle Core de MCHobby... raison pour laquelle le CORE ID et l'ACCESS TOKEN sont différents |
| + | |
| + | {{SPARKImage|Spark.IO-Core-TMP36-10.jpg|640px}} |
| + | |
| + | == Les petits curieux : Découvrir l'API de votre Core == |
| + | Soyons un peu plus curieux et désobéissons! En poursuivant nos investigations, '''nous avons découvert comment énumérer l'interface disponible sur un Core'''. |
| + | |
| + | Pour la petite histoire, avant d'opter pour l'utilisation d'un montage avec filtrage (cfr début de ce tutoriel), j'ai essayé de comprendre pourquoi mon Core prétendait qu'il faisait -20°C dans mon salon! |
| + | |
| + | J'ai donc modifié le programme pour publier toutes les variables du programme sur l'API Particle Cloud et c'est là qu'on apprend des choses intéressantes. |
| + | |
| + | {{underline|Note:}} |
| + | |
| + | Depuis la première rédaction de cet article, nous avons également traduit [[Spark.IO-CLI|le tutoriel sur "Particle CLI"]] (Interface en ligne de commande) où l'on apprend comment lister les Cores et leur interface. |
| + | |
| + | === Le code === |
| + | Le code ci-dessous déclare toutes les variables utilisées par le programme... variables que je publie sur l'API Particle Cloud. |
| + | |
| + | <nowiki>// ----------------- |
| + | // Lecture de la température |
| + | // version des petits curieux. |
| + | // ----------------- |
| + | |
| + | // Créer une variable qui pour stocker la valeur |
| + | // de la température |
| + | double temperature = 0.0; |
| + | double voltage = 0.0; |
| + | int reading = 0; |
| + | |
| + | void setup() |
| + | { |
| + | // Enregistrer la variable sur Particle Cloud |
| + | Spark.variable("temperature", &temperature, DOUBLE); |
| + | Spark.variable("voltage", &voltage, DOUBLE ); |
| + | Spark.variable("reading", &reading, INT ); |
| + | // Active la broche A7 comme entrée (broche |
| + | // sur laquelle le senseur de température est connecté) |
| + | pinMode(A0, INPUT); |
| + | } |
| + | |
| + | void loop() |
| + | { |
| + | reading = 0; |
| + | voltage = 0.0; |
| + | |
| + | // Lire continuellement la valeur du senseur. De sorte que |
| + | // lorsque nous faison un appel sur l'API pour lire la valeur |
| + | // nous obtenons la dernière valeur disponible. |
| + | reading = analogRead(A0); |
| + | |
| + | // La lecture analogique retourne une valeur entre 0 et 4095 |
| + | // pour une tension entre 0 et 3.3V. |
| + | // Calculer la tension correspondante |
| + | voltage = (reading * 3.3) / 4095; |
| + | |
| + | // Calculer la valeur de la température (formule pour un TMP36) |
| + | // et stocker la valeur dans notre variable statique 'temperature' |
| + | temperature = (voltage - 0.5) * 100; |
| + | }</nowiki> |
| + | |
| + | === Lecture des valeurs === |
| + | Pour lire les différentes valeurs, nous pouvons utiliser les trois requêtes CURL suivantes: |
| + | |
| + | <nowiki>curl -G https://api.spark.io/v1/devices/54yyyyyyyyyyyyyyyyyyy67/temperature -d access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8</nowiki> |
| + | |
| + | Ce qui offre le résultat suivant: |
| + | <nowiki>{ |
| + | "cmd": "VarReturn", |
| + | "name": "temperature", |
| + | "result": 23.413919413919405, |
| + | "coreInfo": { |
| + | "last_app": "", |
| + | "last_heard": "2014-12-08T11:55:38.292Z", |
| + | "connected": true, |
| + | "deviceID": "54yyyyyyyyyyyyyyyyyyy67" |
| + | } |
| + | }</nowiki> |
| + | |
| + | Il est également possible de lire les autres variables avec les requêtes CURL suivantes: |
| + | |
| + | <nowiki>curl -G https://api.spark.io/v1/devices/54yyyyyyyyyyyyyyyyyyy67/voltage -d access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8</nowiki> |
| + | |
| + | <nowiki>curl -G https://api.spark.io/v1/devices/54yyyyyyyyyyyyyyyyyyy67/reading -d access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8</nowiki> |
| + | |
| + | === Désobéissons: énumérer l'API === |
| + | Vous vous doutez certainement que votre programme Spark publie les éléments de votre interface sur Particle Cloud. |
| + | |
| + | C'est en faisant preuve de curiosité que j'ai remarqué qu'il était possible de consulter l'interface disponible en faisant une {{underline|requête CURL sur le Core (sans préciser l'API)}}. |
| + | |
| + | <nowiki>curl -G https://api.spark.io/v1/devices/54yyyyyyyyyyyyyyyyyyy67 -d access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8</nowiki> |
| + | |
| + | Ce qui produit un résultat contenant une énumération de l'interface disponible sur votre Core. |
| + | |
| + | <nowiki>{ |
| + | "id": "54yyyyyyyyyyyyyyyyyyy67", |
| + | "name": "mch-demo", |
| + | "connected": true, |
| + | "variables": { |
| + | "temperature": "double", |
| + | "voltage": "double", |
| + | "reading": "int32" |
| + | }, |
| + | "functions": [], |
| + | "cc3000_patch_version": "1.29" |
| + | </nowiki> |
| + | |
| + | Comme vous pouvez le contaster, nous obtenons beaucoup d'informations utiles: |
| + | * '''id''': Identification de votre Core. Superflux à la base mais peut grandement faciliter l'écriture de votre code. |
| + | * '''name''': Le nom que vous avez donné à votre Core. En utilisant une nomenclature adéquate, vous pourriez identifier |
| + | * '''connected''': permet de savoir si votre Core est actuellement connecté sur Particle Cloud. |
| + | * '''variables''': contient les entrées (et type) correspondant aux {{underline|variables}} d'API déclarées dans notre programme avec <code>Spark.variable()</code> |
| + | * '''functions''': contient les entrées correspondant aux {{underline|fonctions}} d'API déclarées dans votre programme avec <code>Spark.function()</code> |
| | | |
| {{Spark-Core-Hacking-TRAILER}} | | {{Spark-Core-Hacking-TRAILER}} |
| | | |
| <small>Source: [http://docs.spark.io/examples/#measuring-the-temperature docs.spark.io/examples/#measuring-the-temperature]</small> | | <small>Source: [http://docs.spark.io/examples/#measuring-the-temperature docs.spark.io/examples/#measuring-the-temperature]</small> |