températures incohérentes [ LM35 ] [résolu].

Salut les Arduino,
J'ai passer l'après-midi a essayer de mesurer la température ambiante de ma chambre, et disons que je n'arrive pas a obtenir des valeurs cohérentes sans ajout de facteur(s) arbitraire (voir plus bas).
J'ai utiliser un capteur de température LM35 de mon starter kit dont la doc dit:

  • la valeur maximale est de 50 °C correspondant a:
    -1023 avec un analogRead()
    -0,5 Volt.
    et que un degrés correspond a 10 mV...
    J'ai don essayer de déterminer la conversion de la valeur lu en degrés avec le petit programme C suivant qui prend une valeur analogique en argument de ligne de commande:
#include <stdio.h>
#include <stdlib.h>

/* Case 1:
 * Doc said 0.5 volt == 1023 == 50° Celsius*/
#define UNIT 0.5/1023

/* Case 2:
 * #define UNIT 5.0/1023    */

int main(int argc, char *argv[]) {
  int value = strtod(argv[1],NULL) ;
  float tension = UNIT*value ;
  // Case 1:
  float degrees= UNIT*value*100 ;
  
  // Case 2:
  //float degrees= UNIT*value*10 ;
  
  printf("Analog value..: %i\nTension.......: %.2f V\nDegrees.......: %.2f °C\n",value,tension,degrees) ;
  return 0 ;  
}

Et mon programme de mesure est le suivant:

#define TEMP_IN 14

#define FACTOR 0.5/1023

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

void loop() {
  if (Serial.available()) {
    int choice=Serial.read() ;
    if (choice == '0') {
      int c ;
      float res_temp=0 ;
      for (c=0 ; c < 20 ; c++) {
        Serial.println("computing temperatur...") ;
        float temp_voltage=analogRead(TEMP_IN) ;
        
        res_temp +=  FACTOR*temp_voltage*100 ;  //to adjust 0.5*2.5 == 1.25 or 0.5 * 5 == 2.5
        Serial.print(FACTOR*temp_voltage*100) ; //to adjust 0.5*2.5 == 1.25 or 0.5 * 5 == 2.5
        Serial.println(" C") ;
        
        delay(1500) ;
      }
      res_temp /= 20.0  ;
      Serial.println("--------------------------") ;
      Serial.print("actual temperatur: ") ;
      Serial.print(res_temp) ;
      Serial.println(" C") ;
      Serial.println("--------------------------") ;
    }
  }  
}

Sans multiplier avec les valeurs arbitraire signaler en commentaires j'obtiens des températures bien en dessous des 29 °C annoncer aujourd'hui, dans le sud-est de la France, disons pas plus de 15 °C au pires sous les 10 °C, ma chambre est orienter plein sud.

Alors si vous avez une idée sur ce qui cloche dans mon code, sachant que les branchements sont très simple et que je n'ai pas utiliser de résistance (il faut en placer une pour mesurer des températures négatives avec un LM35), merci de bien vouloir poster.

bonjour
ce capteur est tres chatouilleux :grin:
lire ça
http://forum.arduino.cc/index.php?topic=169442.msg1260659#msg1260659

Oui comme le dit Artouste ce circuit est chatouilleux.
Il faut aussi comprendre comment le micro-controleur travaille.
Tous les renseignements pour faire une bonne mesure se trouvent dans la lecture des datasheets respectives.

Micro :
Atmel le fabricant du micro, qui connaît mieux que quiconque son produit, indique que la première mesure analogique est souvent fausse. Normalement cela ne s'applique qu'au démarrage du convertisseur analogique/Numérique ou à un changement d'entrée (A0-A6) mais cela ne coûte rien de faire une rafale de 5 mesures et de ne garder que la dernière.

LM35
Dans la data sheet du produit il est clairement rappelé que le LM35 n'aime absolument pas les liaisons trop capacitives.
Ce n'est pas réservé au LM35 mais cela s'applique aux circuits CMOS.
Donc le fabricant du LM35 recommande d'insérer une résistance entre le LM35 et le fil de connexion pour éviter des mesures fausses.
J'ai fait quelques essais et avec 50 m de RJ45 et 4,7k la mesure est stable.
Je suppose que tu utilise ces plaques dites breadboard, il se peut que, même si la distance est courte, tu es un gros effet capacitif, mais ce n'est pas sûr.
De toute manière évite d'avoir des fils qui font de grosses boucles, le mieux est de ne pas utiliser de fils trop longs et de les plaquer contre la plaque.

Obtient déjà une mesure presque stable ( par exemple pour Tréel= 20°C une mesure comprise aléatoirement entre 18 et 22 °C et qui donne une moyenne proche de 20 °C.
Si tu réussi a obtenir ce résultat on verra pour des méthodes qui permettront d'améliorer la précision mais chaque chose en son temps.
Attention d'un LM35 à un autre il peut y avoir des différences de 1 à 2 °C, c'est précisé dans la datasheet.

Tout d'abords merci pour vos réponses éclairés.
Mais...: Je me suis tromper de composant !!!
J'ai utiliser le récepteur Infra-rouge a la place du capteur de température LM35 (n'ayant pas vue de composant a trois pattes autre, j'ai pris celui-ci, alors que le capteur était dans le sachet).
Je crois que j'ai droit au bonnet d'âne dans le coin du board.
En utilisant le bon composant et comme formule:

FACTOR*temp_voltage*1000

j'obtiens les mêmes résultats que avec la formule vue dans le bouquin:

(5.0*temp_voltage*100.0)/1024

Je suis désolé de cette pollution de forum et je m'en excuse.

Il faut effectivement faire plusieurs mesures et de faire la moyenne afin d'obtenir un résultat exacte.
La doc mentionner est celle du starter-kit: https://s3-ap-northeast-1.amazonaws.com/sain-amzn/20/UNO+R3+Starter+Kit+Tutoral.rar
mais c'est faux puisque il faut que je multiplie par 1000 pour convertir en degrés ou:

#define FACTOR 5.0/1023
FACTOR*temp_voltage*100

Autrement dit, la documentation dit:
valeur analogique: 1023 == 0,5 Volt
alors que si l'on considère le calcule on a
valeur analogique: 1023 == 5,0 Volt.

Je m'excuse encore une fois pour cette erreur stupide.

Bonsoir,
Ce n'est pas grave.
Mais reconnaître son erreur et déjà un pas vers la sagesse :slight_smile: