Allumer une led en fonction d'une température

Bonjour;
Je me présente étudiant en Terminale STI2D et notre projet et de réaliser un stylo 3D (Pour plus d'informations faites une recherche sur : http://www.lestylo3d.com/ c'est vraiment un projet passionnant). Nous sommes dans une phase de recherche de solutions et je suis face à quelques problèmes...
J'avais déjà posté sur le forum pour allumer une led au bout d'un temps donné.

Dans un autre domaine (Pas si différent que celui si en fin de compte) j'aurais une autre question finalement.
Comment faire cette fois allumer DEUX leds pour indiquer la température de chauffe atteinte et celle de sécurité ?
Je m'explique :

  • Pour la première Led notre stylo 3D va chauffer pour faire fondre le fil d'ABS, une fois que nous avons atteint la température pour faire fondre le fil la chauffe va s’arrêter (Ce n'est pas moi qui gère cela) et une led va s'allumer (cette fois c'est moi^^) indiquant à l'utilisateur qu'il peut utiliser le stylo.
  • Une second led elle sera la pour prévenir l'utilisateur si la température du stylo dépasse un seuil qui pourrais occasionné des brûlures.
    La mesure de température ce fera à l'aide d'une Pt100.
    Le principe :
    Les réglages des différents seuil de température ce fera par un potentiomètre.
  • Pour le premier seuil(Lorsque la chauffe de l'ABS est suffisante pour commencer l'utilisation) : Tant que la température est inférieure à 230°, le chauffage fonctionne.
    Passé 230°, le chauffage s’arrête. Et la led s'allume.
  • Pour le second seuil (De sécurité, pour éviter toutes brûlures) : Tant que la température est inférieur au seuil de température de sécurité la led reste éteinte
    Passé ce seuil, la led s'allume.
    Lorsque la température redescend en dessous du seuil, la led s’éteint .

Ensuite dans la pratique (plus compliqué) :
Pour cela on va utiliser un comparateur à hystérésis, il est intéressant car il permet d'avoir 2 seuils: Un pour l'activation l'autre pour la désactivation.
D'autant plus que le schéma est très simple, il suffit d'avoir 2 résistances et 1 AOP(amplificateur opérationnel, il permet d'effectuer des opérations mathématiques.)
l'AOP: Vs = +Vcc lorsque V+ > V- => Tension de Sortie = + Courant continue lorsque V+ > V-
Vs = -Vcc lorsque V+ < V- => Tension de Sortie = - Courant continue lorsque V+ < V-
Il faut donc calculer V+, pour cela on utilise un pont diviseur ( un montage électronique simple qui permet de diviser une tension d'entrée )
On a V+ = (R1Vs + R2 Ve) / (R1 + R2)
Si on pour de l'état de sortie bas, donc Vs = -Vcc
on a V+ = (R1*(-Vcc) + R2* Ve) / (R1 + R2)

Ce ne sont que des recherches je ne suis sur de rien... ni si c'est vraiment la bonne solution.
Merci.

Inutile de faire un trigger de schmitt pour gérer un hysteresis.

Temperature = analogRead(A0);
Seuil = analogRead(A1);

if(Temperature>=Seuil) digitalWrite(LED,HIGH);
if(Temperature<(Seuil+HYSTERESIS)) digitalWrite(LED,LOW);

Je vais bien sûr abstraction des conversions potentiellement nécessaire. Il suffit de définir HYSTERESIS en début de programme

Hé ... Tu me l'as volé le coup du trigger de schmitt, je voulais en parler pour épater la galerie, mais tu m'as coiffé au poteau !
C'est simplement une façon d'écrire pour souligner le fait que le dispositif électronique qui réalise ce traitement est effectivement un trigger de schmitt.
Tu as totalement raison de préciser qu'il est bien plus logique de réaliser un maximum de traitement avec Arduino, et de n'ajouter un composant que si c'est vraiment impératif, ou que ça économise un gros paquet de code.
Triggons, triggons, il en restera forcément quelque chose ... de LED :slight_smile:

Disons que le trigger de schmitt en plus l'hysteresis est fonction et des résistances, et du seuil. Ca complique les choses ... Et en plus c'est parfaitement inutile ici.

Mais j'en utilise justement sur des montages qui pilote des four, mais en sécurité. Dans ce cas la c'est parce que je veux un moyen hardware de sécurité, pas soft. Au moins si y'a un bug dans le programme tu fais pas tout cramé ...

Merci pour vos réponses.

En fait la température arrivera sous forme de "tension" sur un port analogique d'arduino.
Je comprend le programme que vous avez posté mais comment définir ce seuil ?
Merci d'avance.

Bin branche ton potard sur une autre entrée analogique ... C'est dans mon code ! A moins que ton seuil soit fixe bin il suffit juste de donnée une valeur à ta variable !

Bonsoir;

Temperature = analogRead(A0);
Seuil = analogRead(A1);

if(Temperature>=Seuil) digitalWrite(LED,HIGH);
if(Temperature<(Seuil+HYSTERESIS)) digitalWrite(LED,LOW);

Mes deux seuils seront fixent donc je dois donné une valeur à mes variables.
Le potentiomètre dans ce cas n'est pas utile ?

En fait non je faisais erreur. Donc je reprend :

Temperature = analogRead(A0);
Seuil = analogRead(A1);

if(Temperature>=Seuil) digitalWrite(LED,HIGH);
if(Temperature<(Seuil+HYSTERESIS)) digitalWrite(LED,LOW);

Ce bout de code va me permettre de :

  • Température : Récupérer sur une entrée analogique la valeur de la tension(qui correspondra à la température) sur une entrée analogique.
  • Seuil : De fixer le seuil qui permettera lorsqu'il sera dépassé d'allumer une led. Pour régler ce seuil on peut utiliser une potentiomètre numérique ( http://arduino.cc/en/Tutorial/DigitalPotentiometer#.UwkRtvl5OsE ) branché sur une seuil numérique.

Lorsque la température dépasse le seuil, la led s'allume. Si elle est en dessous du seuil elle s'éteint.

Et il n'y a en fait rien de plus, c'est vrai que l'utilisation d'un trigger de schmitt et bien trop compliqué et inutile dans ce domaine..

Par contre le fait d'avoir une hystérésis n'est pas ridicule sinon la LED va clignoter lorsque la température sera proche du seuil.

est-ce vraiment obligatoire ?
Parce que la signifie que je vais devoir mettre en place en trigger de schmit ce qui complique les choses.

SGRmetrage:
est-ce vraiment obligatoire ?

OUI
Tu es dans la vraie vie : le signal parfait n'existe pas, il y aura toujours du bruit superposé qui rendra l'état de la led del instable comme te l'as dit fdunews.

SGRmetrage:
Parce que la signifie que je vais devoir mettre en place en trigger de schmit ce qui complique les choses.

Reprend tes cours, réfléchi au principe de fonctionnement d'un trigger de Schmitt, notamment la modification de la référence pour le changement d'état et tu verras, qu'avec un peu de réflexion avant de se mettre à coder, cette fonction n'est pas vraiment compliquée à écrire en programmation.

J'ai beaucoup travaillé aujourd'hui et j'ai beaucoup avancé. Je vais me documenter sur le trigger de schimt en attendant je poste tout ce que j'ai trouvé.

Dans la pratique :
La température va être mesurée à l'aide d'une thermistance, qui va délivrer une résistance. C'est un composant simple qui est une résistance variable et dont la résistance varie avec la température.
La thermistance a comme seule caractéristique connue sa résistance à 25°C (température ambiante)
Pour pouvoir en déduire une température exprimé sous forme de °C, il faut avoir plus de données, car la réponse des thermistances n'est pas linéaire.

Pour traduire cette résistance en température il faudra passer par cette étape :
Convertir en tension, en utilisant un circuit diviseur de tension

Première étape : Convertir la résistance en tension, en utilisant un circuit diviseur de tension
on sait que les entrées analogiques de l'Arduino mesurent une tension et fournissent donc une valeur numérique entre 0 et 1023 proportionnelle à la tension de référence.
La thermistance fournissant une réponse à la température sous forme de résistance variable, le circuit diviseur de tension va permettre de convertir cette résistance variable en tension variable qui va pourvoir être lu par les entrées analogiques de l'Arduino.
Sur Arduino on n'obtient pas directement une tension comme mesure sur les entrées analogiques mais une valeur comprise entre 0 et 1023 qui est proportionnelle à la tension de référence (Uin). Soit A0 la valeur numérique mesurée sur l'entrée analogique n°0, on a : A0=1024*Uout/Uin-1

Donc avec le diviseur de tension : A0=1024*R1/(R1+R2)-1 .

Seconde étape: Réglage des seuils :
On va utiliser un potentiomètre : Un potentiomètre est un composant mécanique simple qui fait varier la résistance entre ses broches lorsque l'on tourne son axe. En connectant un potentiomètre à une tension et vers une entrée analogique de la carte Arduino; il est possible de mesurer la résistance du potentiomètre en tant que valeur analogique.
Ce qui va donc nous permettre de fixer nos seuils.
Comment çà marche ?
En tournant l'axe du potentiomètre, on modifie la résistance entre la broche médiane et les broches externes du potentiomètre. Ceci a pour effet de modifier la tension sur la broche de sortie du potentiomètre (l'intérieur du potentiomètre réagissant en diviseur de tension) :
quand la résistance entre la broche médiane et la broche externe reliée au 5V est nulle la tension de la broche centrale vaut 5V.
à l'inverse quand la résistance entre la broche médiane et la broche externe reliée au 0V est nulle, la tension de la broche centrale vaut 0V.
en dehors de ces deux position extrêmes, la tension sur la broche de sortie prend des valeurs variable entre le 0V et le 5V en fonction de la position de l'axe.
C'est cette tension analogique qui va être convertie à son entrée en une valeur numérique comprise entre 0 et 1023 (soit une échelle de 10 bits), valeur très précisément proportionnelle à la tension présente à l'entrée.

Pour réaliser ce circuit : Connecter avec 3 fils les broches du potentiomètre (ou résistance variable) à la carte Arduino :

  • le premier connecte une des broches externe à la masse (0V)
  • le second connecte l'autre broche externe au 5V.
  • le troisième relie la broche centrale du potentiomètre à la broche analogique 0 de la carte Arduino.

Le programme :

Ce programme nous permet de communiquer avec l'ordinateur et pouvoir ainsi lire la valeur du potentiomètre pour pouvoir le régler précisément.

Troisième étape: comparer la température aux seuils pour allumer les LEDS

Temperature = analogRead(A0);
Seuil = analogRead(A1);

if(Temperature>=Seuil) digitalWrite(LED,HIGH);
if(Temperature<(Seuil+HYSTERESIS)) digitalWrite(LED,LOW);

Ce bout de code va me permettre:

  • Température : Récupérer sur une entrée analogique la valeur de la tension(qui correspondra à la température).
  • Seuil : De fixer le seuil qui permettra lorsqu'il sera dépassé d'allumer une LED. Pour régler ce seuil on peut utiliser une potentiomètre numérique
    Lorsque la température dépasse le seuil, la LED s'allume. Si elle est en dessous du seuil elle s'éteint.
    La variable hystérésis est utilise, car sinon la LED va clignoter lorsque la température sera proche du seuil.
    Le signal parfait n'existe pas, il y aura toujours du bruit superposé qui rendra l'état de la led instable.

Voila c'est tout résumé, il y a les explications et tout parce que j'ai besoin de faire des explications pour mieux comprendre ^^"
Merci à vous.

SGRmetrage:
La thermistance a comme seule caractéristique connue sa résistance à 25°C (température ambiante)

Faux !
Les fabricants donnent des tables de valeurs en fonction de la température, de plus les thermistances répondent à une loi mathématique dite de "Steinhart". Il existe des formules simplifiées voir document "BetaTherm".
Les fabricants donnent les coefficients nécessaires pour l'utilisation de ces formules --> voir les datasheets.

Quelques lectures :
Murata:
Linéarisation de la thermistance avec une résistance en parrallele plus une en série :
http://www.murata.com/products/design_support/mcnvs/index.html
Catalogue Murata :
http://www.murata.com/products/catalog/pdf/r44e.pdf

Informations générales :

http://www.beta.dk/betathermkatalog/teoridel.pdf
http://forum.arduino.cc/index.php?topic=59621.0
http://josephrinek.com/Arduino%20Pics/steinharteqn.pdf

Conseils :

  • Dans une thermistance le courant doit être très faible sinon on provoque un auto échauffement par effet Joule qui fausse la mesure:
  • Il n'est pas obligatoire de linéariser une thermistance. L'intéret de linéariser une thermistance est que cela permet de limiter l'étendue de la plage de mesure et par voie de conséquence d'améliorer la précision de la mesure.
  • On ne peut pas obtenir une droite parfaite, pour cela il faudrait abandonner la thermistance et utiliser un capteur de température en silicium comme le LM35 ou le LM335. On ne peut obtenir qu'une courbe qui ondule autour de la droite parfaite mais comme la réponse est calculable il est possible d'entrer la formule mathématique dans le programme.
  • Pour linéariser une thermistance un tableur est amplement suffisant : il suffit de rentrer la formule de la thermistance en fonction de la température, de calculer la résistance équivalente de l'ensemble et de faire un graphique. Ensuite il ne reste plus qu'a jouer sur les valeurs des résistances supplémentaires (parallèle sur la thermistance + résistance en série).

Conseil ultime : avec un LM35 ou un LM335 ce serait bien plus simple. :grin:
De toute façon thermistance ou capteur silicium un hystérésis est obligatoire.

68tjs:

  • On ne peut pas obtenir une droite parfaite, pour cela il faudrait abandonner la thermistance et utiliser un capteur de température en silicium comme le LM35 ou le LM335. On ne peut obtenir qu'une courbe qui ondule autour de la droite parfaite mais comme la réponse est calculable il est possible d'entrer la formule mathématique dans le programme.
    Conseil ultime : avec un LM35 ou un LM335 ce serait bien plus simple. :grin:
    De toute façon thermistance ou capteur silicium un hystérésis est obligatoire.

Pour la gamme de température qui l'intéresse le LM35 n'est pas adapté (Température > 200°C).

Concernant ce morceau de code:

if(Temperature>=Seuil) digitalWrite(LED,HIGH);
if(Temperature<(Seuil+HYSTERESIS)) digitalWrite(LED,LOW);

Sauf à avoir une valeur d'HYSTERESIS négative, crois-tu vraiment que cela fonctionne comme tu le désires??

fdufnews:
Concernant ce morceau de code:

if(Temperature>=Seuil) digitalWrite(LED,HIGH);

if(Temperature<(Seuil+HYSTERESIS)) digitalWrite(LED,LOW);



Sauf à avoir une valeur d'HYSTERESIS négative, crois-tu vraiment que cela fonctionne comme tu le désires??

La c'est ma faute puisque c'est le bout de code que j'ai proposé à la va vite et effectivement il est plus "logique" de faire comme ça :

if(Temperature>=Seuil) digitalWrite(LED,HIGH);
if(Temperature<(Seuil-HYSTERESIS)) digitalWrite(LED,LOW);

Même si en rentrant un hysteresis négatif aurait résolu le problème

B@tto:
La c'est ma faute puisque c'est le bout de code que j'ai proposé à la va vite

C'était surtout pour attirer l'attention sur les risques du copié-collé sans réfléchir.

Bonsoir.
Merci pour votre réponse, je tiens à m'excuser pour mon temps de réponse j'était en pleine épreuve de bac blanc.

Je reprends donc :

  • Oui le courant doit être "relativement" faible, sinon il va provoquer un échauffement par effet joule (P=R*I2) qui viendra fausser la mesure.

  • La réponse de la thermistance à la température est sa résistance, qui varie avec la température (de manière inverse). la température monte, plus la résistance diminue. La correspondance température/résistance est régie par la relation de Steinhart-Hart. Sa je l'ai bien compris!
    Cette relation établie une équation qui permet d'obtenir la température (en Kelvin) à partir de la résistance mesurée et de 3 coefficients spécifiques a chaque thermistance : a, b et c.
    Mais après je ne comprends pas trop la formule...
    1/ T = A + B ln(Rt) + C (ln(Rt))^3

  • Rt est la résistance (en ohms) du capteur à la température T cherchée (en kelvins);

  • T est une température où la résistance R_{n} est déjà connue, proche de la température T cherchée ;

  • A, B et C sont les coefficients de Steinhart–Hart (donnés par le constructeur ou obtenus expérimentalement avec trois mesures de référence) qui sont des constantes caractéristiques du composant valides à toute température;
    Mais c'est cette histoire de ABC que je comprends.

A vrai dire je suis désolé je ne comprends pas à quoi tout cela vas nous mener... merci de votre patience.

Effectivement un LM335 ne correspond pas à ma plage de température. Nous allons prendre une Thermistance par exemple Pt100.

PT100 c'est un alliage à base de platine. Bien que le terme de thermistance y soit quelquefois accolé ce n'est pas une thermistance au sens d'une CTN ou d'une CTP. La loi de variation de SteintHart ne lui est pas applicable
C'est un très bon choix et cerise sur le gâteau a variation linéaire.
http://www2.ac-lyon.fr/etab/lycees/lyc-69/descartes/IMG/pdf/Affiche_Pt100v3.pdf

Oui en fin de compte je sais jamais comment appelé ça, thermistance ou pas ^^"
On est pas sur d'utiliser une Pt100 mais vu ce que vous me dites...je vais obligé la personne qui s'en charge de la prendre !! Si elle est linéaire plus de problème.

Linéaire, linéaire ... Oui comparé à une thermistance, mais elle n'est pas totalement linéaire non plus. Enfin après je chipote parce que dans mes utilisation de pt100 je vais de -196°C à +500°C :smiley:

Une excellente note sur le sujet : Create a Customer Service Case  · Support Portal