Soucis avec LM35

Bonjour le Arduinautes

Tout d'abord j'ai fait une recherche sur mon problème, et j'ai bien trouvé un topic d'une personne (masterbalby) qui a eu le même soucis que moi, à savoir des écarts impressionnant de T°, chez moi ça saute de +/- 20°. J'ai essayé ce qui était proposé, voici le fil en question :
http://forum.arduino.cc/index.php?topic=33707.0

Le problème semble avoir été résolu puisque la personne n'a plus répondu (ou a laissé tombé).

Donc je relance le débat. J'utilise donc un LM35D en SO8 sur trois simple fil non blindé. Quand je mesure au voltmètre, la tension est très stable mais sur mon LCD c'est la grosse panique ! J'utilise le même code (tout en float, SensorVoltage = 5v) :

SensorValue = analogRead(SensorPin); // lit la valeur du LM35
CalcTemp = (SensorValue * SensorVoltage) / 1024.0; // convertir en T°
CurrentTemp = CalcTemp * 100;
delay(300);

// Affichage des données du capteur
byte current = CurrentTemp; // convertion de float -> byte
lcd.print(current); // affiche la valeur lue

Une idée ? J'ai l'impression que l'ADC perds les pédales, un soucis d'impédence ou autre ?
Mettre les autres entrée analogique à la masse ??

Si vous avez des idées je suis preneur !

Merci à vous !

Jean

A mon avis c'est plus un problème de cast que d'ADC. Quand je lis :

  // Affichage des données du capteur
  byte current = CurrentTemp; // convertion de float -> byte
  lcd.print(current); // affiche la valeur lue

Je me dis que ce genre de problème n'a pas était pris en compte xD il faut utiliser la fonction byte() pour faire une réelle conversion.

Il faut toujours prendre en compte le typage des variables, et ce, même à l’intérieur d'un calcul (valeur "temporaire" pas plus grand que le type de variable.

lcd.print(CurrentTemp) donne quoi ?

lcd.print(CurrentTemp) donne quoi ?

Je viens d'essayer, c'est pareil, sauf que j'ai une virgule bien entendu

lgjean:

lcd.print(CurrentTemp) donne quoi ?

Je viens d'essayer, c'est pareil, sauf que j'ai une virgule bien entendu

bonjour
tu a lu ça ?
http://forum.arduino.cc/index.php?topic=168391.msg1253279#msg1253279

Artouste:

lgjean:

lcd.print(CurrentTemp) donne quoi ?

Je viens d'essayer, c'est pareil, sauf que j'ai une virgule bien entendu

bonjour
tu a lu ça ?
Lecture valeur analogique différente si affichage sur LCD ... - #2 by 68tjs - Français - Arduino Forum

Très instructif ! J'ai donc mis la masse de mon LCD directement sur la masse de l'alimentation (l'arrivée 9v) et la masse de mon capteur au plus près des entrée de l'ADC (tout seul donc). C'est pareil. J'ai essayé aussi de mettre la masse du capteur sur l'alimentation (masse en étoile ?) toujours pareil.

Sur le fil le gars écrit :
"La mesure peut aussi être perturbée par l'activité du micro-contoleur -> voir la datasheet Atmel du micro, c'est largement expliqué. Un micro-controleur universel, comme ceux qui équipent les cartes Arduino, ne peut pas donner la même précision qu'un circuit spécialisé qui ne fait qu'une chose mais la fait bien."

Ca veut dire qu'on arrive à la limite de précision de la carte ? J'ai vraiment besoin d'une précision au degré près et surtout très stable.
J'ai des MAX192 (que j'ai déjà utilisé avec succès sur uC 8051) je vais devoir passer par là ?
Je suppose qu'il n'y a pas de LIB sur la communication SPI, je sent qu' il va falloir que je ressorte mes vielles bibliothèques C =(

lgjean:
Très instructif ! J'ai donc mis la masse de mon LCD directement sur la masse de l'alimentation (l'arrivée 9v) et la masse de mon capteur au plus près des entrée de l'ADC (tout seul donc). C'est pareil. J'ai essayé aussi de mettre la masse du capteur sur l'alimentation (masse en étoile ?) toujours pareil.

Sur le fil le gars écrit :
"La mesure peut aussi être perturbée par l'activité du micro-contoleur -> voir la datasheet Atmel du micro, c'est largement expliqué. Un micro-controleur universel, comme ceux qui équipent les cartes Arduino, ne peut pas donner la même précision qu'un circuit spécialisé qui ne fait qu'une chose mais la fait bien."

Ca veut dire qu'on arrive à la limite de précision de la carte ? J'ai vraiment besoin d'une précision au degré près et surtout très stable.
J'ai des MAX192 (que j'ai déjà utilisé avec succès sur uC 8051) je vais devoir passer par là ?
Je suppose qu'il n'y a pas de LIB sur la communication SPI, je sent qu' il va falloir que je ressorte mes vielles bibliothèques C =(

il y a une lib spi arduino

mais sauf si tu a du stock c'est peut etre plus simple de passer par un capteur de T° "numerique" , il en existe en 1Wire,spi,I2c

Sur le fil le gars écrit :

Le "gars" répond :grin:

Remarque préalable :
Des utilisateurs arrivent a faire des mesures correctes donc c'est possible : il faut être précautionneux.
Les limites dont j'ai parlé c'est dans le cas où on veut faire un instrument de laboratoire.
Bien que je défende ce pauvre circuit affublé de tous les maux, il est vrai que sa mise en œuvre supporte mal les long fils qu'un DS18B20 supporte beaucoup mieux.

Commentaires :
Il y a des "choses" a connaître et ces "choses" ne se trouvent que dans la datasheet.

  1. Dans le micro-controleur il n'y a QU'UN SEUL convertisseur analogique digital.
    Ce convertisseur est précédé d'un multiplexeur 11 entrées : oui 11 pas 8 ni 6.
    On trouve les 6 entrées analogiques disponibles sur une UNO avec un boîtier DIP , les 2 entrées supplémentaires qui ne sont sorties que dans le boîtier CMS (carte miniPro). On trouve aussi l'accès à un capteur de température interne à la puce, la masse : ben oui la masse, et ce qu'on appelle le "BandGap" qui sert à construire la référence interne. (page 251 de la spec de l'ATMega328). Donc cela fait du monde et il faut faire attention de ne pas perturber.
    C'est "légèrement" plus complexe que ce que l'on trouve sur le site Arduino.

  2. Les entrées analogiques peuvent aussi être dirigées vers un port numérique et deux des entrées analogiques sont de plus raccordées à l'électronique interne qui gère le port I2C. (page 5)

Donc quand on sait cela :
Pendant qu'on fait une conversion analogique/numérique on évite d'utiliser une ou plusieurs entrées comprises entre A0 à A5 en entrées numériques . Si on y est obligé on utilise A4 ou A5 qui "par construction dans la puce" sont mieux isolées.

Câblage : utiliser des fils de masse de diamètre suffisant et souder les connections. Les "breadboard" en fakir -1 et les fils à connectique Dupont associés ne font pas des contacts sûrs et qui dit mauvais contact dit chute de tension de quelques mV soit au hasard quelques degrés

Le danger des bibliothèques toutes faites c'est que même pour des applications aussi triviales on perd le contact avec le matériel.
Un analogRead(Ax) renvoi un nombre compris entre 0 et 1024.
La valeur de la tension est obtenu en faisant une règle de trois :
Imaginons que le chiffre renvoyé soir 324
Vmesurée = (Vref/1024) * 324
Ce n'est pas plus compliqué que cela.

Tout de suite se pose la question du choix de Vref et du pas de mesure.
Par défaut Vref est égal à Vcc donc le pas de mesure est de 5mV soit 0,5 °C.
Il existe deux possibilités de changer cette référence : soit appliquer une tension sur la broche Aref soit utiliser la référence interne de 1,1 V.
A 100°C le LM35 délivre 1V donc la ref interne peut être utilisée.
La tension interne 1,1V peut être sélectionnée avec analogReference(INTERNAL) -> voir site arduino
Ce qui donne un pas d'environ 1 mV soit 0,1 °C c'est déjà mieux.
Attention cette tension selon le lot de fabrication peut varier de +/-0,1V. Il est facile d'étalonner le micro dont tu dispose : quand Vref est activée on retrouve cette tension sur la broche Aref, par exemple sur ma carte j'ai mesuré 1,08V.
Tu peux alors calibrer : Vmesure = (1,08V/1024) * mesure.
Attention de chez Attention quand Vref interne est activée il ne faut surtout pas appliquer de tension sur Aref sinon le micro est mort.

Es que ton lm35 est monté seul de chez seul ou bien avec d'autres composants?

pouic13:
Es que ton lm35 est monté seul de chez seul ou bien avec d'autres composants?

Le LM35 est sur A0, rien sur les autres entrées. Sinon il y a un afficheur LCD sur les PIN 2,3,4,5,11,12
Absolument rien d'autre.

Je viens de tout relire et je crois que j'ai sauté des étapes indispensables :

Reprenons depuis le début :

  • la mesure au voltmètre est stable
  • l'affichage sur le LCD est incohérent

ET entre les deux ?
Ca vient de l'acquisition ou du "système LCD" ?
As-tu vérifié que l'acquisition est correcte ?

Un moyen simple:

  1. tu vire la bibliothèque
  2. Tu fais des acquisitions à intervalle régulier par exemple 1s -> mesure=analogRead(A0);
  3. Tu affiche dans le Serial Monitor le résultat des acquisitions. -> Serial.println(mesure);

Ce n'est même pas utile de convertir la mesure en degrés, un simple affichage du résultat renvoyé par analogRead(A0) suffit pour vérifier si la mesure est stable.

Une fois que tu as fais cela on avise selon les résultats trouvés.

Alors j'ai tout viré dans le programme et sur la platine (hormis le capteur), reste plus que ça dans le programme :

// capteur LM35
unsigned int SensorPin = A0; // On déclare la pin du LM35 sur la broche A0
float mesure;

void setup()
{
Serial.begin(9600);
}

void loop()
{
mesure=analogRead(A0);
delay(1000);
Serial.println(mesure);

}

Résultat :

20.00
58.00
31.00
45.00
46.00
47.00
46.00
52.00
47.00
47.00
44.00
44.00
45.00
19.00
77.00
33.00
44.00
44.00
47.00
47.00
46.00
50.00
44.00
43.00
78.00
51.00
60.00
47.00
47.00
47.00
51.00
51.00
42.00
49.00
20.00
4.00
46.00
47.00
47.00
40.00
45.00
48.00
45.00
48.00
45.00
47.00
47.00

Au voltmètre j'ai 246,5 mV très stable pratiquement aucune variation, juste rarement un chiffre après la virgule

as-tu essayé de rajouter une résistance de pull down de 10K entre t'as pin A0 et t'as masse?

Avec la 10k :
49.00
49.00
50.00
49.00
49.00
50.00
50.00
50.00
50.00
48.00
43.00
48.00
49.00
48.00
49.00
49.00
50.00
49.00
51.00
47.00
48.00
50.00
48.00
48.00
48.00
47.00
51.00
47.00
48.00
49.00
42.00
0.00
47.00
45.00
44.00
47.00
47.00
47.00
49.00
38.00
38.00

on dirait que t'as un problème de connectique.

C'est un module que tu as acheté ou c'est toi qui as soudé ton composant?

Regarde aussi que tu es les mêmes valeurs sur les autres pin analogique.

C'est un SO8 que j'ai soudé et enduit au pistolet à colle. De ce coté ça ne bouge pas.

J'ai un poil de jeu sur mes SIL coté Arduino, je vais voir ça.

Sinon je vais appliquer une faible tension sur une entrée pour voir.

Merci pour ces pistes en tout cas !

On avance le problème est localisé dans l'acquisition.
Reste à savoir si c'est le LM35, le câblage où le micro.

D'accord

  • avec Pouic13 si tu as un fer à souder refais les soudures du LM35 et du connecteur de sortie de la carte.
    Fait des connections fiables : les fils qui bagotent ce n'est pas bon pour les mV.
  • avec ta proposition d'appliquer une tension connue à la place du LM35. Par principe ne te contente pas d'un seul point de mesure mais fait des mesures pour 3 ou 4 tensions différentes et trace la courbe, cela réduit les erreurs de mesures.

Si ta vérif est bonne et que tu as un deuxième LM35 sous la main il serait bon de faire un câblage volant -> avec du SO8 ce n'est pas facile mais du moment que cela tiens le temps de la vérif c'est tout ce qu'on demande

Hello

Je reprends les hostilités XD

Alors pour commencer j'ai allumé la carte avec RIEN de connecté dessus, et voici ce qu'elle me lis sur A0 :

396.00
352.00
331.00
320.00
314.00
309.00
304.00
299.00
292.00
285.00
279.00
273.00
268.00
269.00
266.00
269.00
272.00
278.00
283.00
289.00
295.00
299.00

C'est normal tous ces écarts ??

Ensuite j'ai mis une 10k entre A0 et GND. J'obtiens 0,00 ok

Pui j'ai mis ma 10k entre A0 et le 3,3v :

396.00
352.00
331.00
320.00
314.00
309.00
304.00
299.00
292.00
285.00
279.00
273.00
268.00
269.00
266.00
269.00
272.00
278.00
283.00
289.00
295.00
299.00

Pareil mais en 5v :
1023.00
1023.00
1022.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00
1023.00

Là c'est impec !

Qu'en pensez vous les amis ?
A vide c'est farfelu, ainsi qu'à 3,3v !?

Merci

RECTIFICATIF !

Sur le 3,3v j'obtient finalement
661.00
660.00
661.00
660.00
661.00
661.00
660.00
661.00
661.00
661.00
660.00
660.00
661.00
663.00
660.00
660.00
660.00
660.00

Donc c'est ok, je sais pas ce que j'ai br.... tout à l'heure. Je revois ma connectique du LM35 et je vous tient au jus.

Bonjour

Voilà j'ai tout refait, j'ai pris du fil blindé de bonne qualité, des SIL "or" et j'ai pris un nouveau LM35 et tout ressoudé propre, séparer la masse du LCD. Résultat : marche nickel !
Précis, stable, fiable. Que du bonheur !

Merci à tous pour votre coup de main, sympa !

Jean

Hello,

perhaps you have a swing problem on your wires from the lm35. I had the same once. You can look at my blog post how to solve this problem:

Elektrix