Mauvaise mesure tmp36

Bonjour, comme indiqué dans le titre, j'ai un problème de mesure avec mon montage de tmp36...
J'ai créé un programme test pour voir si j'avais bien 0 en branchant mon pin du capteur (A0) sur le GND, et 1023 en le branchant sur le plus, comme indiqué dans ce topic : Problème tension analogue
(la première réponse)

Voici mon code complet (il n'est pas tout à fait terminé, si vous avez d'autres remarques :wink: )

Donc lorsque j'execute mon code, j'obtiens une mesure qui ondule aux alentours de 26°C, au lieu de 19-20, j'imagine, n'ayant pa d'autre thermomètre à proximité.
quand j'essaie avec mon code test, en branchant A0 sur GND, je n'ai effectivement pas 0 mais une mesure qui oscille entre 1 et 4, parfois plus, ça change assez vite.
Pourtant, cela fonctionnait très bien il y a quelques temps, avant je branche mes 3 leds (voir plus bas :point_down:)
mais j'ai beau chercher dans mon montage,
je ne vois pas de faux contact ou fil débranché, etc...

:point_right: C'est un thermostat et ici, les leds simulent les leds qui afficheront l'état des appareils de chauffe ou ventilation le temps d'essayer mon code.

Notes: J'ai mis 133 pour "temp-ext" car je n'ai qu'un tmp36 pour l'instant.

#include <LiquidCrystal.h>

int capteur_interieur = 0;

int capteur_exterieur = 1;


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int vert = 9;
int rouge = 8;
int bleu = 7;

/*
  int chauffe = 8;
  int arret = 7;
  int ventil = 6;
*/

void animpoint() {

  lcd.setCursor(14, 0);
  lcd.print( "." );
  delay(700);
  lcd.setCursor(14, 0);
  lcd.print( " " );
  delay(700);
}

void setup() {

  pinMode(vert, OUTPUT);
  pinMode(rouge, OUTPUT);
  pinMode(bleu, OUTPUT);


  digitalWrite (vert, HIGH);
  digitalWrite (rouge, HIGH);
  digitalWrite (bleu, HIGH);

  /*
    digitalWrite (chauffe, HIGH);
    digitalWrite (arret, HIGH);
    digitalWrite (ventil, HIGH);
  */

  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print( "INITIALISATION" );

  for (int a = 0; a < 3; a++) {
    animpoint();
  }

  digitalWrite (vert, LOW);
  digitalWrite (rouge, LOW);
  digitalWrite (bleu, LOW);

  /*
    digitalWrite (chauffe, LOW);
    digitalWrite (arret, LOW);
    digitalWrite (ventil, LOW);
  */

}

int lastTemp_int = -100;
int lastTemp_ext = -100;

void loop() {

  float temp_int = lectureTemp_int();  //appel fonction avec retour de temperature_int

  if ( abs(temp_int - lastTemp_int) < 0.20 )
    return;
  lastTemp_int = temp_int;


  lcd.setCursor(0, 0);
  lcd.print( "Int. :" );
  lcd.print( temp_int );
  lcd.write(223);  // affiche le signe degré
  lcd.print( "C" );

  lcd.print( "      " );

  delay(600);


  float temp_ext = lectureTemp_ext();

  if ( abs(temp_ext - lastTemp_ext) < 0.20 )
    return;
  lastTemp_ext = temp_ext;


  lcd.setCursor(0, 1);
  lcd.print( "Ext. :" );
  lcd.print( temp_ext );
  lcd.write(223);  // affiche le signe degré
  lcd.print( "C" );

  lcd.print( "      " );

  delay(600);

  if (temp_int < 18) {
    digitalWrite(rouge, HIGH); //en chauffe
  }

  if (temp_int > 23) {
    digitalWrite(rouge, LOW); //éteindre le chauffage
  }

  if (temp_int > 26) {
    digitalWrite(bleu, HIGH); //ventilateur
  }
}

float lectureTemp_int() {

  int valeur_int = analogRead(capteur_interieur);

  float tension_int = valeur_int * 5.0;
  tension_int /= 1024.0;

  float temperature_int = ((tension_int * 1000) - 500) / 10;
  return (temperature_int);
}
  //______________________________________________//
//                                                                              //

float lectureTemp_ext() {

  int valeur_ext = 133; //analogRead(capteur_exterieur);

  float tension_ext = valeur_ext * 5.0;
  tension_ext /= 1024.0;

  float temperature_ext = ((tension_ext * 1000) - 500) / 10;

  return (temperature_ext);

}

/*
  if (temp_int < 18) {
    digitalWrite(rouge, HIGH); //en chauffe
  }

  if (temp_int > 23) {
    digitalWrite(rouge, LOW); //éteindre le chauffage
  }

  if (temp_int > 26) {
    digitalWrite(bleu, HIGH); //ventilateur
  }

  }
*/

Bonjour

comment sont raccordées les leds ? (valeurs des résistances insérees entre sortie Arduino et leds ?)

Tel que ton code est ficelé, si la température intérieure ne bouge pas tu ne fais pas la mesure extérieure et tu ne mets pas à jour les LEDs.
Ce test fait sortir de loop() si la température est stable et donc les lignes suivantes ne sont pas traitées.

Concernant ton problème de mesure, tu as fait un programme minimum, juste la lecture du capteur et affichage de la valeur en comparant avec un thermomètre étalon?
Ne pas négliger le fait que:

  • l'alimentation de l'arduino ne fait pas exactement 5V, donc déjà une source d'erreur
  • l'ADC à sa propre erreur de conversion (voir la datasheet de l'ATmega328), une deuxième source d'erreur.
  • le LSB du convertisseur fait, si tout va bien, 5/1024 = 4.8mV, soit environ 1/2 degrés avec ton capteur.
  • le capteur est précis à +/-1°C à 25°C

Le fait d'être alimenté par l'USB peut poser des problème de répétabilité dans la mesure où si tu changes de source d'alimentation tu n'es pas certain que ta calibration restera valable.
Il faudrait peut-être envisager de travailler avec la référence interne de l'ATmega. Celle-ci même si elle n'est pas très précise à la base ne bougera pas en fonction de l'alimentation de la carte et si tu mesures Vref, une fois, ta calibration restera bonne.

Euh :sweat_smile: à vrai dire j'ai pris des résistances au hasard donc (branchées entre le pin digital et l'anode de la led) :
la bleue : 4.7kΩ
la verte & la rouge : 1kΩ

Ah oui... mince... je supprime cette ligne ou j'ajoute aussi la condition que l'ext bouge en même temps ou dans le if de int ?
Cela vient d'un code un peu similaire, et j'ai recopié ce morceau...

Oui, c'est ça que j'ai appelé "programme test", c'est ce code avant les dernières modifs, et celui ci marchait avant... en gros c'estle même sans la partie des leds, toute la partie "initialisation" (qui sert juste à faire joli d'ailleurs :sweat_smile:) qui occupe une grosse partie de setup, j'ai juste gardé lcd begin 16,2 & lcd clear, ainsi que les variables lastTemp. Le reste dans loop c'est le strict minimum pour lire le capteur in et ext (que j'aurais pu supprimer vu que je n'ai qu'un tmp pour l'instant...), et pour afficher le résultat obtenu, sans les calculs (donc entre 0 et 1023).

Et non, je viens de casser mon thermomètre et je n'en ai pas racheté ^^ J'ai juste le thermostat de la chaudière, qui est dans une autre pièce, mais à 2°C près c'est la même température.

Je viens de regarder le datasheet, sous quelle dénomination je trouve cette info ? :sweat_smile:
Et puis le plus étrange, c'est que jusqu'à maintenant, ça fonctionnait super bien, j'avais créé uniquement le programme analyse de température, mais que j'ai dû "dispatcher" pour aller avec mon nouveau prog., qui inclus les leds, l'initialisation du lcd, etc...

A la base, j'avais prévu de faire des menus avec le lcd, mais un peu trop compliqué pour moi et après de nombreuses heures de recherches sur le sujet j'ai décidé de faire le réglage de la température min et max direct dans mon programme pour cette fois.
Donc j'avais gardé le programme d'analyse de température dans un croquis à côté, et j'appelais la fonction void créée pour l'occasion. Ça a peut-être merdé lorsque j'ai tout regroupé... Je relirais mon programme complet à tête reposée.

Regarde la doc Arduino pour commencer:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.