Mesure de temperature avec thermocouple avec Adafruit MAX31856

Bonjour à tous,
J'utilise une carte Arduino Uno et un module Adafruit MAX31856 pour mesurer des températures avec un thermocouple de type K.
C´est ma première expérience avec les deux et avant de me lancer dans l´écriture d´un programme correspondant mieux à mes besoins j´ai voulu tester mon montage en utilisant les 3 examples de programme inclus dans la librairie du MAX31856.
Ces 3 programmes s´appelent : max31856_manual.ino, max31856_oneshot.ino et max31856_continuous.ino
J´ai testé les 3 et tous me fournissent en sortie:

  • L´heure (au format heure, minutes, secondes et millieme de seconde).
  • La température à -199,92
    Hors je devrais mesurer la température ambiante d´environ 26ºC
    Les connexions entre la carte Uno et le module sont correctes (vérifiées plusieurs fois) et je pense à un défaut de fonctionnement du module Adafruit.

Comment m´en assurer ? Quelqu´un a-t´il une idée ?
Merci d´avance.
Alain

Bonjour aanomade

Ce qui démontre que le câblage entre le module et l'Arduino est bon.
Regardes, du côté du thermocouple.

Cordialement
jpbbricole

reBonjour aanomade

Une autre piste, mesurer à l'ohmmètre, la résistance du thermocouple.

Cordialement
jpbbricole

Si tu as activé l'option "Afficher l'horodatage" du moniteur série, oui.
Pour le reste, les 3 exemples sont bien prévus pour fonctionner avec un thermocouple K (MAX31856_TCTYPE_K).
Es-tu sûr d'avoir alimenté la carte sous 5V ?
Es-tu sûr de tes fils DUPONT ?

Merci pour votre reponse.
Oui Alimentee su 5 V
Je vais verifier la continuite de mes fils.
Ou se trouve la fonction "Afficher l'horodatage" du moniteur série ? et peut-on la desactiver ?
Je me passerais bien d´afficher les milliemes de seconde mais mon soucis principal c´est
d´obtenir la mesure de temperature.

Bonjour aanomade

et la résistance de ton thermocouple.

Cordialement
jpbbricole

Case à cocher en bas à gauche.

Si la continuite est bonne connaitre la valeur de la resistance du thermocouple ne presente pas d´ interet car elle est tres tres faible.
Cordialement
aanomade

J'avais mal compris ce que tu avais déjà écrit :woozy_face:

Fais une photo, en gros plan, de ton montage.

La température du thermocouple est mauvaise mais, dans l'exemple max31856_oneshot.ino est-ce que :

  • le bon type de thermocouple est affiché?
  • la température de la soudure froide est correcte?

A la ligne 25 du programme le bon thermocouple type K est déclaré :
maxthermo.setThermocoupleType(MAX31856_TCTYPE_K);
Je ne sais a quoi correspond la valeur -199,92 qui s´affiche sur chaque ligne a droite de
l´heure. c´est suppose etre la temperature mais laquelle des deux soudure froide ou chaude ?

On ne parle pas de la même chose.
J'ai cité le programme max31856_oneshot.ino, qui est installé avec les exemples de la librairie Adafruit_MAX31856, parce que justement, il commente toutes les impressions.
Voir ci-dessous

// Basic example using one-shot measurement.
// The call to readThermocoupleTemperature() is blocking for O(100ms)

#include <Adafruit_MAX31856.h>

// Use software SPI: CS, DI, DO, CLK
Adafruit_MAX31856 maxthermo = Adafruit_MAX31856(10, 11, 12, 13);
// use hardware SPI, just pass in the CS pin
//Adafruit_MAX31856 maxthermo = Adafruit_MAX31856(10);

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);
  Serial.println("MAX31856 thermocouple test");

  maxthermo.begin();

  maxthermo.setThermocoupleType(MAX31856_TCTYPE_K);

  Serial.print("Thermocouple type: ");
  switch (maxthermo.getThermocoupleType() ) {
    case MAX31856_TCTYPE_B: Serial.println("B Type"); break;
    case MAX31856_TCTYPE_E: Serial.println("E Type"); break;
    case MAX31856_TCTYPE_J: Serial.println("J Type"); break;
    case MAX31856_TCTYPE_K: Serial.println("K Type"); break;
    case MAX31856_TCTYPE_N: Serial.println("N Type"); break;
    case MAX31856_TCTYPE_R: Serial.println("R Type"); break;
    case MAX31856_TCTYPE_S: Serial.println("S Type"); break;
    case MAX31856_TCTYPE_T: Serial.println("T Type"); break;
    case MAX31856_VMODE_G8: Serial.println("Voltage x8 Gain mode"); break;
    case MAX31856_VMODE_G32: Serial.println("Voltage x8 Gain mode"); break;
    default: Serial.println("Unknown"); break;
  }

}

void loop() {
  Serial.print("Cold Junction Temp: ");
  Serial.println(maxthermo.readCJTemperature());

  Serial.print("Thermocouple Temp: ");
  Serial.println(maxthermo.readThermocoupleTemperature());
  // Check and print any faults
  uint8_t fault = maxthermo.readFault();
  if (fault) {
    if (fault & MAX31856_FAULT_CJRANGE) Serial.println("Cold Junction Range Fault");
    if (fault & MAX31856_FAULT_TCRANGE) Serial.println("Thermocouple Range Fault");
    if (fault & MAX31856_FAULT_CJHIGH)  Serial.println("Cold Junction High Fault");
    if (fault & MAX31856_FAULT_CJLOW)   Serial.println("Cold Junction Low Fault");
    if (fault & MAX31856_FAULT_TCHIGH)  Serial.println("Thermocouple High Fault");
    if (fault & MAX31856_FAULT_TCLOW)   Serial.println("Thermocouple Low Fault");
    if (fault & MAX31856_FAULT_OVUV)    Serial.println("Over/Under Voltage Fault");
    if (fault & MAX31856_FAULT_OPEN)    Serial.println("Thermocouple Open Fault");
  }
  delay(1000);
}

Pour supprimer l'horodatage des messages il faut cliquer sur le symbole indiqué ci-dessous

image

Merci beaucoup pour vos explications.
J´ai trouvé l´origine du problème. C´est mom module Adafruit MAX31856 qui est deffectueux ou bien un problème de connexion sur le breadboard.
Je vais investiguer plus avant mais en attendant je viens de remplacer le module MAX31856 par un autre et les trois programmes examples de Adafruit fonctionnent parfaitement.

J´étais technicien électronicien mais n´avait jamais de programmation sauf en Basic au tout debut de l´informatique grqnd public en 1982 avec un TI 99 et Apple IIe. Je débute avec Arduino et n´ai aucune expérience de programmation en C++.
Je vais essayer de modifier le programme example pour pouvoir, en plus de la mesure de température gérer : un module RTC, un module SD, un afficheur et calculer et afficher dTºC/dt en ºC/heure.
Alors il est fort probable que je fasse de nouveau appel aux lumières du forum.
Un grand merci à tous.

Bonjour,
Sans vouloir abuser de votre temps pouvez-vous m´aider à rajouter une ou quelques lignes de programme pour modifier la cadence d´échantillonage de la température sur le programme example d´Adafruit : max31856_continuous.ino
Je veux mesurer la température d´un four a gaz qui monte relativement lentement en température. Je voudrais pouvoir définir une acquisition toute les minutes ou toute les 5 minutes ou autre.
Est-ce possible?
Merci

max31856_continuous.ino fait une acquisitio en continu donc ce n'est pas la structure de programme la mieux adaptée au besoin.

max31856_oneshot.ino fait une acquisition toutes les secondes il suffirait juste de changer la valeur de l'argument de delay() pour allonger le temps entre 2 acquisitions. Delay attends comme paramètre un temps en millisecondes.
Dans le programme, il y a un delay(1000) ce qui indique que le programme va attendre 1s.
Pour une minute tu peux faire delay(60000UL). UL pour indiquer que la constante est de type Unsigned Long.
Pour que le code soit plus lisible, tu pourrais éventuellement faire ceci:

  • ajouter cette ligne au début du programme

#define MINUTE (60000UL)

  • ensuite dans le corps du programme tu peux mettre

delay(5 * MINUTE)


Est-ce le seul besoin?

Je pose la question car delay() bloque complètement le processeur pendant tout le temps et il ne peut rien faire d'autre. Il ne peut même pas être interrompu.

Merci pour vos conseils.
Pout tout vous dire, modifier ce programme n´est que la première partie de mon projet mais je sens bien que je n´y arriverai pas tout seul. En plus de la température j´ai besoin de connaître (et d´afficher) la vitesse de variation de la température calculée sur l´intervalle de temps entre deux acquisitions.
J´ai l´intention de rajouter un afficheur LCD et une carte micro SD pour y enregistrer T ºC, dT ºC/dt et les heures, minutes et secondes . Pour pouvoir ensuite tracer la courbe de chauffe sur Excel.
Tout cela me parait bien trop ambitieux pour mes faibles connaissances en programmation.
Alors si ce n´est pas trop demander je veux bien de l´aide.
Merci

Je viens d´essayer les modifs suggérées que j´ai place sous :
#include <Adafruit_MAX31856.h>
#include MINUTE (60000UL)
quand je compile il me sort :

#include MINUTE (60000UL)
^~~~~~
exit status 1

Compilation error: #include expects "FILENAME" or

Erreur de ma part c'est ceci qu'il faut

#define MINUTE (60000UL)

J'ai corrigé le message initial.

Oui ça y est. Il faut aussi enlever le S de MINUTES dans delay.
Merci

Peut-être commencer en jetant un œil sur des projets existants pour voir si ce que tu veux n'existe pas déjà ou au moins s'il serait possible de prendre des morceaux pour réaliser ton projet.