Code erroné : PT-100 avec transmetteur 4-20mA

Bonjour,

J'ai un souci d'ajustement de paramétrage avec mes affichages de température.

Voici le matériel utilisé : - 1x DHT22 (Température Serre) - 1x sondes PT-100 range -50 à +300 degrés C (1x température extérieur) - 1x transmetteurs de courant. Alim 24v, range -50 à +100 degrés C - 1x résistance 250 ohms - Arduino mega 2560 - 1x Laptop pour l'acquisition/diffusion des données et la prog sur place

Lorsque je préparais mon montage à l'intérieur, l'affichage m'indiquait la température ambiante correctement malgré une erreur d'environs 1 à 1.5 degrés C.

Hier je suis allé installé mon boitier de contrôle dans la serre. Voici les températures réelles prises avec un autre instrument que ceux de mon montage (oublions les lectures du DHT22 car elles sont correctes) : - Extérieur : -19.6 C Température affichée au moniteur série : - Extérieur : 1.2 C

Voici mes paramètres mesurés au multimètre à la sonde et au transmetteur: 1.770 volts = -19.6 Celsius = 92.4 ohms 2.647 volts = 9.2 Celsius = 103.6 ohms

J'ai essayé divers paramètres mais sans succès. Avez-vous une idée?

int LectureCapteurs (){
  delay(300);                                             // La lecture du capteur prend 250ms
  h = dht.readHumidity();                                 //on lit l'hygrometrie
  float t = dht.readTemperature();                        //on lit la temperature en celsius (par defaut)
  float f = dht.readTemperature(true);                    // pour lire en farenheit, il faut le paramère (isFahrenheit = true)
  if (isnan(h) || isnan(t) || isnan(f))  {    return;  }  //On verifie si la lecture a echoue, si oui on quitte la boucle pour recommencer.
  float hif = dht.computeHeatIndex(f, h);                 // Calcul de l'indice de temperature en Farenheit
  float hic = dht.computeHeatIndex(t, h, false);          // Calcul de l'indice de temperature en Celsius
 
  /*
   * Affichages :  
   * Humidite: h
   * Temperature: t celcius  
   * Temperature: f faraneith  
   * Indice de temperature: hic celcius  
   * Indice de temperature: hif faraneith
   */
  sensorTemp[0] = analogRead(A8);                         // Lire température Extérieure
  sensorTemp[1] = analogRead(A9);                         // Lire température poulaillier                    
  Temp[0] = map(sensorTemp[0],102,512,-50,300);
  Temp[1] = map(sensorTemp[1],102,512,-50,300);
  
  t2 = t;       // A partir du DHT22
  t1 = Temp[0]; // Float conversion
  t3 = Temp[1]; // Float conversion
  t1 = t1/10;
  t3 = t3/10;

  return t1;
  return t2;
  return t3;
  return h;
}

Bonjour

Un lien vers le transmetteur de courant 4-20mA ? Quelle relation établit-t-il entre la résistance de la PT100 et le courant de sortie ou entre la température et le courant de sortie ? 4mA pour -50°C et 20mA pour +100°C ou une autre relation ?

Voici mes paramètres mesurés au multimètre à la sonde et au transmetteur: 1.770 volts = -19.6 Celsius = 92.4 ohms 2.647 volts = 9.2 Celsius = 103.6 ohms

Les valeurs de résistances sont cohérentes avec lea tables des PT100 La tension est-elle mesurée aux bornes de la résistance de 250 Ohm réalisant la conversion courant->tension ?

Bonjour,

Voici le transmetteur :

Voici la sonde :

Merci

Je suis retourné prendre des mesures :

Température : -13 degrés C
Résistance : 96,7 ohms
Tension : 2.010 volts (aux bornes de la 250ohms)

Merci

deux mesures permettent de trouver l'équation de la droite qui représente la relation entre température et tension aux bornes de la résistance de 250 Ohm

La mise à l’échelle n’est pas bonne pour la conversion du signal 4-20mA. La plage du transmetteur va de -50 à +100°C et dans ton code tu inscris -50 à +300°C

Mettre une résistance en de 250ohms en série sur un signal 4-20mA donne une variation de tension de 1 à 5 volts. Pourquoi mappé de 102 a 512?

Bonjour

Je comprends maintenant que la plage de température doit être -50 à 100.

Mais pour les 2 autres valeurs J’y suis allé avec ce que j’ai été en mesure de trouver sur le web sans trop savoir quoi mettre.

1 volt = -50
5 volts = +100

Alors devrais-je mettre ces paramètre?

map(sensorTemp[1],1,5,-50,100);

Presque! En « entrée » de la fonction map faut parler en « point » puisque la résolution du convertisseur est de 1024 point et donc va de 0 à 1023 et non directement en tension. Ici 0v = 0 et 5v = 1023

Donc dans ton cas, pour commencer à 1v: map(sensorTemp[1],204,1023,-50,100);

Par contre map(); fonctionne que sur des entiers, tu auras donc en sortie que des chiffres entiers (sans chiffre après la virgule donc).

Bonjour,

Connais-tu un autre moyen d'utiliser les signaux 4-20mA? Autre que la fonction "map"?

Merci!

Non, les cartes arduino ne savent pas mesurer autre chose qu’une tension. Mais le shunt de 250 ohms est parfait pour ça.

La fonction map ne fait qu’un simple produit en croix.

Jambe: Non, les cartes arduino ne savent pas mesurer autre chose qu’une tension. Mais le shunt de 250 ohms est parfait pour ça.

La fonction map ne fait qu’un simple produit en croix.

J'ai habilement contourné le problème! Dès qu'on sais comment utiliser les paramètres, on peut les utiliser à bon escient :P Merci pour votre aide! Alors j'ai mappé la sortie x10. Ce qui m'a permit ensuite de diviser en float par 10 et ainsi conserve le 0,x degré de température pour plus de précision! Ceci dit, pour un procédé requérant plus de précision, mapper la sortie x 100 et ensuite diviser par 100 en float permettrait d'avoir encore plus de précision! .tant sur une base 0-1023 nous pourrions nous permettre un step de plus afin d'avoir 3 digits. Ce qui n'est pas rien.

--> Évidemment, cela prendrait des instruments plus précis que ce que j'ai en main :confused:

Merci de m'avoir permis de bien comprendre le mapping. Prochaine étape : je vais contrôler les paramètres de ma serre en incluant des fonctions intégrales et dérivées!!! PID!!!

Bon OK.... ne paniquez pas! Je sais qu'une serre ne requière pas un contrôle de température/humidité assez précis pour utiliser un schéma de contrôle PID mais que voulez-vous, ce défi "m'allume" !!!

Bonjour,

Comme le dit Jambe «La fonction map ne fait qu'un simple produit en croix». Tu peux le faire en flottant

float mapFloat(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}