Ce site contient essentiellement des notes de travail. Le contenu est en constante évolution, et loin d'être achevé. (+ d'infos)
La plupart des documentations informatiques sont orientées Debian / Ubuntu.

Electronique/Hardware/Sensors/LM335/Arduino

De Ordinoscope.net
< Electronique‎ | Hardware‎ | Sensors‎ | LM335
Révision datée du 29 juin 2014 à 12:52 par Jcheger (discussion | contributions) (Câblage)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Sauter à la navigation Sauter à la recherche

Introduction

La lecture d'un valeur analogique n'est jamais d'une grande précision, et souvent assez variable. Le code suivant a une résolution de 0.45°C et fluctue d'environ 3°C.

Il est aussi à rappeler qu'un thermomètre devrait être placé en contact avec un matériaux qui lui donnera de l'inertie, tel qu'un plaque ou un boîtier métallique. Par exemple, dans l'industrie, la mesure de précision de réfrigérateurs se fait avec une sonde plongée dans un liquide (de préférence qui ne gèle pas, ex. glycol), ou dans du sable pour des congélateurs (ex. -80 °C). La mesure des courants d'air n'a aucun intérêt.

Mes premiers tests avec les exemples trouvés sur le net ont été catastrophiques, jusqu'à ce que je comprenne que la formule (temp / 1023.0) * 5.0 * 100.0 utilise la tension de l'Arduino (le 5.0). En USB la tension n'est jamais de 5.0V ! Et la différence entre 5.0 et 4.67V donnaient des résultats aberrants de l'ordre de 50°C dans mon bureau. Une fois la tension corrigée, les lectures étaient de l'ordre de 25°C.

Câblage

La valeur de la résistance de pullup dépend de la tension d'alimentation. Pour du 5V: 2.2kΩ (ou 2x 1kΩ en série).

Code

#define PIN_TEMP A0

/**
 * If you get wrong values, it's because of a wrong voltage, typically because your Arduino is powered by USB.
 * You have to measure your real voltage and use it as a multiplier in the raw to kelvin conversion.
 */
float voltage = 4.67;

void setup () {
  Serial.begin (115200);
  pinMode (PIN_TEMP, INPUT);
}

void loop () {
  float temp_r = analogRead (PIN_TEMP);
  float temp_k = (((temp_r / 1023.0) * voltage) * 100.0);
  float temp_c = temp_k - 273.0;
  float temp_f = temp_c * (9.0 / 5.0) + 32.0;

  Serial.print ("raw: ");
  Serial.print (temp_r);
  Serial.print (", kelvin: ");
  Serial.print (temp_k);
  Serial.print (", celsius: ");
  Serial.print (temp_c);
  Serial.print (", farenheit: ");
  Serial.println (temp_f);

  delay (1000);
}

Références