Différences entre versions de « Spark-Core-TMP36 »
(8 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
{{Spark-Core-Hacking-NAV}} | {{Spark-Core-Hacking-NAV}} | ||
− | |||
− | |||
== 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 | + | {{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 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| | + | 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 110 : | Ligne 108 : | ||
== Le code == | == Le code == | ||
− | Voici le code proposé par | + | 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 | + | // Enregistrer la variable sur Particle Cloud |
Spark.variable("temperature", &temperature, DOUBLE); | Spark.variable("temperature", &temperature, DOUBLE); | ||
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 179 : | Ligne 178 : | ||
}</nowiki> | }</nowiki> | ||
− | == Les petits curieux == | + | === Appel d'API avec navigateur === |
− | Soyons un peu plus curieux et | + | 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 === | ||
− | Le code ci-dessous déclare toutes les variables utilisées par le programme... variables que je publie sur l'API | + | Le code ci-dessous déclare toutes les variables utilisées par le programme... variables que je publie sur l'API Particle Cloud. |
<nowiki>// ----------------- | <nowiki>// ----------------- | ||
Ligne 200 : | Ligne 218 : | ||
void setup() | void setup() | ||
{ | { | ||
− | // Enregistrer la variable sur | + | // Enregistrer la variable sur Particle Cloud |
Spark.variable("temperature", &temperature, DOUBLE); | Spark.variable("temperature", &temperature, DOUBLE); | ||
Spark.variable("voltage", &voltage, DOUBLE ); | Spark.variable("voltage", &voltage, DOUBLE ); | ||
Ligne 254 : | Ligne 272 : | ||
=== Désobéissons: énumérer l'API === | === Désobéissons: énumérer l'API === | ||
− | Vous vous doutez certainement que votre programme Spark publie les éléments de votre interface sur | + | 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)}}. | 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> | + | <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. | Ce qui produit un résultat contenant une énumération de l'interface disponible sur votre Core. | ||
Ligne 278 : | Ligne 296 : | ||
* '''id''': Identification de votre Core. Superflux à la base mais peut grandement faciliter l'écriture de votre code. | * '''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 | * '''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 | + | * '''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> | * '''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> | * '''functions''': contient les entrées correspondant aux {{underline|fonctions}} d'API déclarées dans votre programme avec <code>Spark.function()</code> |
Version actuelle datée du 24 octobre 2015 à 13:15
Mesurer la température
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?
Dans cet exemple, nous allons brancher un senseur de température TMP36sur le Core et lire des valeurs via Internet (avec un navigateur Internet).
Contrairement à l'envoi de commande, la valeur sera lisible en utilisant une simple requête WEB (de type GET).
Introduction au TMP36
Un senseur de température Analogique est vraiment facile à expliquer, c'est une puce qui vous informe sur la température ambiante actuelle!
Crédit: AdaFruit Industries www.adafruit.com
Ces senseur utilisent la technologie des états solides (wikipédia) pour déterminer la température. Donc, il n'utilise pas de mercure (comme les vieux thermomètres), bilames (comme certains thermomètres ou thermomètre pour four), ni de thermistance (résistance qui varie avec la température). A la place, il utilise la caractéristique qui dit que "la tension aux bornes d'une diode augmente dans des proportions connues lorsque la température augmente". Techniquement, il s'agit de la chute de tnsion entre la base et l'émetteur - le Vbe - d'un transistor.
En amplifiant cette tension avec grande précision, il est facile de générer un signal analogique qui est directement proportionnel à la température. Il y a bien eu quelques améliorations sur la technique utilisée mais c'est essentiellement la technique utilisée pour mesurer la température.
Crédit: AdaFruit Industries www.adafruit.com
Parce qu'ils ne contiennent pas de "parties mécaniques", ces senseurs sont précis, ne s'usent pas, n'ont pas besoin d'être calibrés, fonctionne dans de nombreuses conditions environnementales, et restent cohérent entre la "partie senseur" et l'interface de lecture.
Le meilleur reste pour la fin, ils sont abordables et très faciles à utiliser.
Quelques informations
Ces données concernent le senseur de température disponible sur le WebShop de MCHobby, le senseur analogique TMP36 (-40 to 150C).
Il est très semblable au LM35/TMP35 (sortie en degrés Celsius) et LM34/TMP34 (sortie en degrés Farenheit). La raison pour laquelle nous utilisons des TMP36 au lieu des 35 ou 34, c'est parce que les TMP36 dispose d'une très large plage de mesure et qu'il ne nécessite pas d'alimentation négative pour lire les températures inférieures à 0.
Sinon, les fonctionnalités reste principalement les mêmes.
- Taille: boitier TO-92 à 3 broches (similaire à un transistor)
- Prix: ~2.50 eur disponible chez MCHobby
- Gamme de température: -40°C a 150°C / -40°F a 302°F
- Tension de sortie: 0.1V (-40°C) à 2.0V (150°C) mais la précision diminue après 125°C
- Tension d'alimentation: 2.7V a 5.5V
- Courant de charge: 0.05 mA
- Fiche technique
Comment mesurer la température
Comment calculer la température Il faut donc convertir la tension analogique en degré. Comme le TMP36 permet de mesurer des température négatives, le 0 degré Celsius est placé à une offset de 500 milliVolts. Ainsi, toute mesure inférieur à 500 mv correspondra à une température négative.
Crédit: AdaFruit Industries www.adafruit.com
La formule est la suivante pour le TMP36:
Temp en °C = ( Tension_de_sortie_en_milliVolts - 500) / 10
Donc, si la tension de sortie est de 1 Volts, la température correspondante est de
(1000 - 500)/10
Soit 50 degrés Celcius.
si vous utilisez un LM35 ou similaire, la température se calcule comme suit (utiliser la ligne 'a' sur le graphique):
Temp en °C = ( Tension_de_sortie_en_millivolts) / 10
Tester le senseur
Tester le senseur est vraiment simple mais vous aurez besoin d'un bloc de piles (ou d'une alimentation).
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).
Si vous avez un TMP36 et que la température de la pièce avoisine 25°C, la tension lue devrait être environ 0.75 volts. Notez que si vous utilisez un LM35, la tension devrait être de 0.25V
Crédit: AdaFruit Industries www.adafruit.com
Le senseur indique que la température est de 26.3°C (ou 79.3°F)
Vous pouvez modifier la tension de sortie en pressant la partir en plastique du senseur entre vos doigts, vous allez constater que la tension monte en même temps que la température.
Crédit: AdaFruit Industries www.adafruit.com
Avec mes doigts sur le senseur, pour le chauffer un peu, la température lue est maintenant de 29.7°C (85.5°F)
Vous pouvez aussi toucher le senseur avec un cube de glace, de préférence sur la partie en plastique pour ne pas mettre d'eau dans le circuit électrique. Vous allez constater que la tension diminue en même temps que la température chute.
Crédit: AdaFruit Industries www.adafruit.com
J'ai pressé un cube de glace contre le senseur pour faire descendre la température jusqu'à 18.6°C (65.5°F)
Montage
Montage typique
Nous recommandons vivement l'utilisation du montage avec filtrage (voir ci-dessous). Dans notre cas, nous sommes passé d'une température de -20°C à la vrai température de la pièce 21°C. |
Crédit: Particle.IO www.particle.io
Le 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 Particle Core Maker Kit!
Vous pouvez télécharger la fiche technique ici.
Montage avec Filtrage
Crédit: Particle.IO www.particle.io
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 inconsistantes (ou paraissent parasitées), ajoutez une 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 code
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).
// ----------------- // Lecture de la température // ----------------- // Créer une variable qui pour stocker la valeur // de la température double temperature = 0.0; void setup() { // Enregistrer la variable sur Particle Cloud Spark.variable("temperature", &temperature, DOUBLE); // Active la broche A0 comme entrée (broche // sur laquelle le senseur de température est connecté) pinMode(A0, INPUT); } void loop() { int reading = 0; double voltage = 0.0; // Lire continuellement la valeur du senseur. De sorte que // lorsque nous faisons 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; }
Faire un appel API
L'appel d'API ressemble à ceci
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.
Notre tuto sur la LED internet explique comment identifier votre CORE_ID et votre ACCESS TOKEN.
curl -G https://api.spark.io/v1/devices/0123456789abcdef/temperature -d access_token=123412341234
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:
{ "cmd": "VarReturn", "name": "temperature", "result": 23.413919413919405, "coreInfo": { "last_app": "", "last_heard": "2014-12-08T11:55:38.292Z", "connected": true, "deviceID": "0123456789abcdef" } }
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:
https://api.spark.io/v1/devices/54fyyyyyyyyyyyyyyyyyyy67/temperature?access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8
Cet exemple ci utilise le Particle Core de MCHobby... raison pour laquelle le CORE ID et l'ACCESS TOKEN sont différents
Crédit: Particle.IO www.particle.io
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.
Note:
Depuis la première rédaction de cet article, nous avons également traduit 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.
// ----------------- // 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; }
Lecture des valeurs
Pour lire les différentes valeurs, nous pouvons utiliser les trois requêtes CURL suivantes:
curl -G https://api.spark.io/v1/devices/54yyyyyyyyyyyyyyyyyyy67/temperature -d access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8
Ce qui offre le résultat suivant:
{ "cmd": "VarReturn", "name": "temperature", "result": 23.413919413919405, "coreInfo": { "last_app": "", "last_heard": "2014-12-08T11:55:38.292Z", "connected": true, "deviceID": "54yyyyyyyyyyyyyyyyyyy67" } }
Il est également possible de lire les autres variables avec les requêtes CURL suivantes:
curl -G https://api.spark.io/v1/devices/54yyyyyyyyyyyyyyyyyyy67/voltage -d access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8
curl -G https://api.spark.io/v1/devices/54yyyyyyyyyyyyyyyyyyy67/reading -d access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8
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 requête CURL sur le Core (sans préciser l'API).
curl -G https://api.spark.io/v1/devices/54yyyyyyyyyyyyyyyyyyy67 -d access_token=1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf8
Ce qui produit un résultat contenant une énumération de l'interface disponible sur votre Core.
{ "id": "54yyyyyyyyyyyyyyyyyyy67", "name": "mch-demo", "connected": true, "variables": { "temperature": "double", "voltage": "double", "reading": "int32" }, "functions": [], "cc3000_patch_version": "1.29"
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 variables d'API déclarées dans notre programme avec
Spark.variable()
- functions: contient les entrées correspondant aux fonctions d'API déclarées dans votre programme avec
Spark.function()
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.