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 ??
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.
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
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.
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.
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.
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:
tu vire la bibliothèque
Tu fais des acquisitions à intervalle régulier par exemple 1s -> mesure=analogRead(A0);
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.
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
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 !