Bonjour à tous
Je débute en Arduino et je souhaiterais faire un montage qui mesure la température avec un LM35, qui la compare à une température de consigne afin d'alimenter ou non un câble chauffant pour chauffer une mini-serre.
J'ai connecté mon LM35 avec un condensateur de découplage (comme expliquer ici : https://www.carnetdumaker.net/articles/mesurer-une-temperature-avec-un-capteur-lm35-et-une-carte-arduino-genuino/) et j'affiche la température sur un afficheur LCD ou sur le port série. Là, tout va bien !
Pour programmer la température de consigne, j'utilise un potentiomètre que je connecte sur une autre borne analogique de l'Arduino (les deux autres pattes du potentiomètre étant à +5V et à la masse). Et là, patatras ! ma mesure de température s'affole et indique n'importe quoi. J'ai essayé de remplacer le potentiomètre par une résistance et même résultat.
J'ai essayé avec trois cartes Arduino différentes et c'est pareil...
Ma question est donc : une mesure sur une entrée analogique peut-elle en influencer une autre sur un autre entrée ? Et, si oui, comment y pallier ?
D'avance un grand merci à ceux qui prendront le temps de partager leurs connaissances !
Bonjour,
Lorsque tu passes d'une entrée analogique à l'autre, il est recommandé de faire une lecture pour rien puis de faire la lecture qui sera exploitée.
Bonsoir
Ca serait mieux de poster un schéma et le code en entier.
Cordialement,
bidouilleelec
Le piège classique du LM35 : connecter un autre produit en relai sur le fil de masse du LM35.
Je ne sais pas si c'est ce que tu a fait mais si c'est le cas modifie immédiatement le câblage.
Absolument rien ne doit être raccordé sur la connexion de masse du LM35.
Il faut un fil de masse rien que pour le LM35 et un autre indépendant pour le potentiomètre.
Le seul point commun entre ces deux fils de masse doit être au niveau de la masse de la carte arduino.
bidouilleelec:
Ca serait mieux de poster un schéma et le code en entier.
C'est indispensable et c'est parce que c'est indispensable que c'est demandé dans le message épinglé "Règles du forum francophone" qu'il faut lire.
Au fait c'est quelles cartes Arduino ?
Merci pour vos réponses.
Voilà le code :
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
display.clearDisplay();
// Améliore la précision de la mesure en réduisant la plage de mesure
analogReference(INTERNAL); // Pour Arduino UNO
}
void loop() {
// Mesure la tension sur la broche A0 du capteur de température
int valeur_brute = analogRead(A0);
//mesure de la tension sur A1 du potentiomètre pour température de consigne
int valeur_consigne = analogRead(A3);
//conversion temperature de consigne en celcius
float temperature_consigne = valeur_consigne * (51.1 / 1023.0 * 100.0);
// Transforme la mesure (nombre entier) en température via un produit en croix
float temperature_celcius = valeur_brute * (1.1 / 1023.0 * 100.0);
Serial.print(valeur_consigne);
Serial.print(" ----- ");
Serial.print(temperature_consigne);
Serial.print(" ----- ");
Serial.println(temperature_celcius);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Temp. mes. Temp. csg");
display.setTextSize(2);
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.print(temperature_celcius);
display.setTextColor(WHITE, BLACK);
display.print(" ");
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.println(temperature_consigne);
display.display();
delay(1000);
}
et le schéma ici:
https://framapic.org/SQ7Ha7ktFzFo/SaivWeobCLta.png
Encore merci
Je vais tester les masses séparées.
Salut
Le conseil de kamill n'a pas été suivi. Voir commentaires
// Mesure la tension sur la broche A0 du capteur de température
analogRead(A0); // ##### lecture pour rien
int valeur_brute = analogRead(A0);
//mesure de la tension sur A1 du potentiomètre pour température de consigne
analogRead(A3); // ##### lecture pour rien
int valeur_consigne = analogRead(A3);
//conversion temperature de consigne en celcius
float temperature_consigne = valeur_consigne * (51.1 / 1023.0 * 100.0); // 51.1 : c'est voulu ?
// Transforme la mesure (nombre entier) en température via un produit en croix
float temperature_celcius = valeur_brute * (1.1 / 1023.0 * 100.0);
@+
@ hbachetti
Non, c'est 1.1, j'ai corrigé trop vite la version pour le forum.
J'avais placé des commentaires // ##### lecture pour rien
Ils n'étaient pas vraiment vivibles. Trop à droite. C'est corrigé.
Tu les as vus ?
Tu utilises la référence interne pour lire le potentiomètre or ton potentiomètre est connecté entre 0 et 5V. Donc tu vas dépasser la valeur mesurable sur les 4/5eme de la course du potentiomètre.
De toute façon pour un potentiomètre, il vaut beaucoup mieux utiliser la référence AVcc (valeur par défaut), c'est beaucoup plus précis et ne dépend pas de la valeur de l'alimentation car tu liras toujours 0 à une extrémité du potentiomètre et 1023 à l'autre.
Bonjour kamill
kamill:
Bonjour,Lorsque tu passes d'une entrée analogique à l'autre, il est recommandé de faire une lecture pour rien puis de faire la lecture qui sera exploitée.
Recommandé où?
J'ai un programme de test avec
A0 connecté par pont diviseur sur 5.1 v externe (avec impédance < 1k ) à 4.2V
A2 connecté par pont diviseur sur 5.1 v externe (avec impédance < 1k ) à 0.9V
A1, A3, A4 connecté, au choix , à 0 ou 5.1V externe
A5 flottant
en boucle :
analogRead(A4);
analogRead(A5);
valeurLue0 = analogRead(pin_potar0); //A0
analogRead(A1);
valeurLue2 = analogRead(pin_potar2); //A2
analogRead(A3);
Je n'ai jamais ( et rarement) d'erreur de plus de deux quantum , même en plusieurs heures.
Cordialement,
bidouilleelec
hbachetti:
J'avais placé des commentaires // ##### lecture pour rien
Ils n'étaient pas vraiment vivibles. Trop à droite. C'est corrigé.
Tu les as vus ?
Oui, merci.
Je regarde ça dès que je peux.
Merci beaucoup !
bidouilleelec:
Recommandé où?
Bonjour bidouilleelec,
Recommandé par les bonnes pratiques.
C'est facile à comprendre: l'entrée analogique présente une certaine capacité parasite, il faut lui laisser le temps de se charger avant de faire la mesure, il faut donc positionner le multiplexeur, attendre un petit temps puis faire la mesure. La manière la plus simple est donc de faire une mesure pour rien.
La capacité d'entrée étant que quelques dizaines de picofarad, plus l'impédance de la source sera important.
Il est bien évident qu'avec une impédance de source <1k, la variation de mesure ne sera pas mesurable.
Fais l'essai avec un entrée au GND et une autre entrée reliée par une résistance de 220k au +5V. Tu verras la différence entre les valeurs lues sans ou avec une lecture pour rien avant la lecture effective.
kamill:
Fais l'essai avec un entrée au GND et une autre entrée reliée par une résistance de 220k au +5V. Tu verras la différence entre les valeurs lues sans ou avec une lecture pour rien avant la lecture effective.
Evidemment si on fait n'importe quoi (220k Ohms), on mesure n'importe quoi.
Mais re-testé :
Cela n'a strictement aucune influence sur l'autre lecture, quelque soit l'ordre des lectures.
"il faut donc positionner le multiplexeur, attendre un petit temps"
Je ne pense pas . (en fait je ne pense jamais).
Voir le datasheet
28.5. Changing Channel or Reference Selection
Cordialement,
bidouilleelec
220k c'est pour mettre franchement en évidence le phénomène. Comme je l'ai dit le problème est d'autant plus visible que l'impédance de la source est grande.
Je ne vois rien dans le paragraphe que tu cites qui contredise le fait qu'il faut prendre en compte la constante de temps induite pas la capacité de l'entrée analogique.
Par contre on trouve cette mise en garde dans les notes d'application des convertisseurs analogique numérique, en particulier dans la note Atmel.
Il est clairement dit que: "A minimum time (in clock cycles) is required to ensure the proper conversion of the value between two ADC channel switching"
kamill:
Par contre on trouve cette mise en garde dans les notes d'application des convertisseurs analogique numérique, en particulier dans la note Atmel.
Il est clairement dit que: "A minimum time (in clock cycles) is required to ensure the proper conversion of the value between two ADC channel switching"
C'est géré par l'ATMEGA328 (avec les paramètres de analogRead ).
"220k c'est pour mettre franchement en évidence le phénomène. Comme je l'ai dit le problème est d'autant plus visible que l'impédance de la source est grande."
C'est outrageusement hors spécification , donc non significatif.
Cordialement,
bidouilleelec
kamill:
220k c'est pour mettre franchement en évidence le phénomène. Comme je l'ai dit le problème est d'autant plus visible que l'impédance de la source est grande.
Mais , encore un fois , même si les mesures de l'entrée connectée par 220K sont inutilisables, cela n'a pas d'influence ( ici ) sur l'autre entrée de mon montage.
Cordialement,
bidouilleelec
bidouilleelec:
C'est géré par l'ATMEGA328 (avec les paramètres de analogRead ).
Je n'ai rien compris à ça.
kamill:
Je n'ai rien compris à ça.
Datasheet : 28.5. Changing Channel or Reference Selection
sauf mauvaise compréhension de ma part.
Mais enfin mon montage de test le confirme (à mon humble avis).
Cordialement,
bidouilleelec
Bon je viens de faire un essai avec un lm35 sur A0 et un potentiomètre sur A1. Le potentiomètre est tourné à fond à droite.
Le programme
void setup() {
Serial.begin(115200);
}
void loop() {
analogRead(A0);
int valeurBrute = analogRead(A0);
analogRead(A1);
int potar=analogRead(A1);
float temperature = valeurBrute * (5.0 / 1023.0 * 100.0);
Serial.print("Pot:"); Serial.print(potar);
Serial.print(" brut:"); Serial.print(valeurBrute);
Serial.print(" T:"); Serial.println(temperature);
delay(250);
}
Le résultat:
A gauche avec le programme tel quel, à droite en commentant les analogRead() supplémentaires.
edit: je dois ajouter que je m'attendais à ce qu'il y ait une différence, mais pas si importante que ça et surtout cette instabilité.
Je viens de voir ton schéma ton dessin de câblage : un seul fil de masse pour tout : impossible que cela fonctionne avec une bonne précision de mesure.
Le Lm35 donne 10 mV par degrés : c'est tout petit et tous les autres composant polluent le fil de masse soit en injectant des parasites soit tout simplement en tirant du courant.
L'arduino ne sait pas faire la différence : il mesure ce qu'il voit entre SA masse et l'entrée analogique.
Les breadboards et les fiches dupont sont de très mauvaise qualité et sont faiblement résistives.
Avec des signaux 0V / +5V cela ne se voit pas mais avec des sensibilités de 10 mV par degrés cela se voit.
Fonctionnement de l'ADC et doubles mesures.
L'ADC est unique, pour bénéficier de 6 entrées avec le micro en boîtier DIP (carte UNO) ou 8 avec le micro en boîtier CMS (Nano, mini-pro) il faut lui ajouter un multiplexeur analogique en entrée.
C'est un système complexe et le fabricant Atmel explique le tout en détail dans la datasheet du micro.
S'il y a un point à retenir : dès qu'il y a un changement dans l'organisation du "système ADC" il faut rejeter la première mesure.
Par contre si la config est stable il n'est plus obligatoire de rejeter la première mesure. Mais vu le temps que prend une mesure autant ne pas prendre de risque et donc rejeter systématiquement la première mesure.
Un changement peut être un changement de référence de tension (Vcc,externe, interne), un changement d'entrée, etc
Choix des références de tension : Vcc ou reférence externe ou référence interne.
Dans tous les cas "le système ADC" découpe la valeur de la référence en 1024 morceaux : on parle de "pas de mesure".
Si on parle précision on a intérêt à utiliser une référence juste supérieure à la valeur max à mesurer.
Mais ce n'est pas tout : la précision dépend de la précision de la référence de tension.
Référence au AVcc :
Sur les cartes arduino le AVcc est relié directement au Vcc général de la carte. (AVcc = Vcc de la partie analogique qui dans le micro est séparé du Vcc digital)
Si la carte est alimentée par l'USB cette tension sera comprise entre 4,75 V et 5,25V (USB = 5V +/- 5%)
Si la carte est alimenté par le jack et le régulateur interne la précision sur le 5V dépendra de celle du régulateur interne.
Référence externe par la pin Aref.
La précision dépendra de celle de la tension appliquée sur Aref
Référence interne 1,1 V
Dans la datasheet du micro Atmel, indique que cette référence est comprise entre 1V et 1,2 V soit 1,1 V +/- 10% selon le lot de fabrication.
Important (double important)
- quand la ref interne est sélectionnée cette tension est présente sur la pin Aref on peut donc la mesurer précisément
- puisque cette tension est présente sur Aref il est interdit d'appliquer une autre tension sur cette pin sinon le micro est détruit.
En résumé dans la même application on peut commuter entre :
- la référence au Vcc et la référence interne
- la référence au Vcc et la référence externe
mais jamais entre la référence externe et la référence interne.
Ton application :
Tu ne peux pas mesurer la tension en sortie du potentiomètre avec la référence interne car tu n'as rien pour alimenter le potentiomètre sous 1,2V
Par contre si tu respectes le rejet de la première mesure tu peux commuter entre référence au Vcc et référence interne à 1,1 V
Remarque :
Si tu veux de la précision il faudra mesurer les tensions qui servent de référence.
- soit tu fais un programme dédié à un exemplaire de carte donné, il faudra entrer ces valeurs dans le code
- soit tu utilise l'Eeprom pour stocker ces valeur.
Ce qui pratiquement veut dire que pour une carte donnée
- tu mesures les valeurs (Vcc et Vref_1,1)
- tu écrit un programme pour placer les valeurs en Eeprom
Par la suite tes programmes iront lire ces valeurs, le code sera donc le même quelque soit la carte utilisée.
Dernier point que je signale :
Il existe aussi le LM335 qui donne des valeurs en kelvin au lieu des degrés Celsius.
Les kelvin sont des degrés absolus il sont décalés de -273 degrés par rapport au Celsius.
0°C = + 273 K.
et 1°C = 1K soit +10 °C = + 283 K
Le LM335 peut aussi être calibré pour rattraper des dispersions de fabrication ce que le LM35 ne peut pas faire.
Le Lm335 délivre aussi 10 mV mais par kelvin.
Ce qui veut dire qu'à 20°C (293 K) il délivre 2,93V et qu'il peut très facilement mesurer des températures négatives (en °C) alors qu'avec le LM35 il faut se livrer à des acrobaties de schéma.