Go Down

Topic: Montage capteur température MCP9700A (Read 3166 times) previous topic - next topic

nicop

Bonjours,

Grand nouveau dans le monde de l'électronique je cherche à fabriquer un contrôleur climatique pour une miniserre.

Je suis arriver à brancher et à contrôler le capteur d'hygrométrie mais pour le capteur de température rien à faire je n'y arrive pas; La mesure est vraiment fluctuante et aléatoire donc inutilisable.

Si quelqu'un pouvais m'aider ce serais sympa, j'ai essayer plein de montages différents en m'aidant de doc glaner sur internet mais rien à faire.

fdufnews

Si on en croit la doc microchip, il n'y a à priori rien de spécial à faire. Il suffit de mettre entre 2,75 et 5V sur la broche Vcc et connecter Vout sur une entrée analogique.
Par contre la dynamique n'est pas très importante (1,5V).
La sensibilité du capteur c'est 10mV/°C. Le codeur analogique numérique de l'ATmega dans la configuration par défaut c'est 5/1024 soit environ 5mV/lsb. Le précision du codeur c'est 2 à 4,5lsb (suivant la fréquence de l'horloge de l'ADC, voir la doc de l'ATmega). Donc on voit que la précision de la mesure est à 1 à 2 degrés près. Si tu ajoutes à ça le bruit que l'on ramene dans l'ADC par les alimentations ta mesure va être à quelques degrés près.

nicop

Alors j'ai tout bon mais la valeur fluctue de 40 à 50 °C et non de quelques degrés.

Je sens que je vais changer de capteur!

Jean-François

Tu pourrais utiliser des DS1820 :

http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertCapteursComplexesDS18B20Detection
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

nicop

#4
Aug 03, 2010, 05:04 pm Last Edit: Aug 03, 2010, 05:05 pm by nicop Reason: 1
Bonne idée, je vient donc d'en acheter et cela marche effectivement très bien. J'ai utiliser ton lien pour la librairie et le code, merci beaucoup Jean-François.

Seulement la température est fausse, beaucoup plus basse qu'en réalité.
Une idée pour étalonnée?

Jean-François

#5
Aug 03, 2010, 05:23 pm Last Edit: Aug 03, 2010, 05:25 pm by jfs Reason: 1
Il me semble qu'il y a une histoire avec le [ch730]F et les [ch730]C ... à vérifier.

Vérifie si la linéarité est juste et si c'est le cas tu compense avec la différence en additionnant une variable de cette valeur à ta mesure.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

nicop

En fait la librairie que j'ai utiliser est pour un capteur DS18B20 et j'ai un capteur DS18S20.
D'ailleurs le moniteur avant de me donner la température m'indique que mon capteur n'est pas un DS18B20.

J'ai utiliser le code donné à la fin de cette page.

Une idée de la modification à apporter où juste comme tu me le conseil juste avant une simple soustraction de la valeur trouvé?

Jean-François

#7
Aug 03, 2010, 06:10 pm Last Edit: Aug 03, 2010, 06:15 pm by jfs Reason: 1
J'ai retrouvé le sujet que j'avais fais, au message #11 je fais mention des [ch730]C :

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1209105786

Quote
En fait la librairie que j'ai utiliser est pour un capteur DS18B20 et j'ai un capteur DS18S20.
D'ailleurs le moniteur avant de me donner la température m'indique que mon capteur n'est pas un DS18B20.

J'ai utiliser le code donné à la fin de cette page.

Une idée de la modification à apporter où juste comme tu me le conseil juste avant une simple soustraction de la valeur trouvé?


Regarde le lien que j'ai mis message #5.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Jean-François

As-tu regardé cette page :

http://www.arduino.cc/playground/Learning/OneWire
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

nicop

Merci beaucoup, ça marche enfin.

Voici mon code pour lire la température et l'hygrométrie (capteur 808H5V5 de chez Libelium):


#include <OneWire.h>
const int modeLecture=0xBE;
const int lancerMesure=0x44;
const int broche_OneWire=10; //declaration constante de broche
int HrPin = 4; // variable identifiant le port analogique 5 de la carte, l'hygrométre
byte data[12]; // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
byte adresse[8]; // Tableau de 8 octets pour stockage du code d'adresse 64 bits du composant One Wire
float ma_tempetf=0.0;
OneWire  capteur(broche_OneWire);  // crée un objet One Wire sur la broche voulue
void setup()   {
Serial.begin(9600);
capteurInit();
}
void loop(){
ma_tempetf=capteurMesureTemp();
Serial.print ("Temperature = ");
Serial.print (ma_tempetf,2);
Serial.println (" Degres Celsius.");
int HrMesuree = analogRead (HrPin); // Obtenir la lecture du capteur d'hygrométrie
float hygrometrie = (HrMesuree-164)/6.16;  // Convertir la lecture de l'hygromètre en hygromètrie
Serial.print (hygrometrie); Serial. println (" % "); // Affichage de l'hygrométrie
Serial.println (" ");
}
void capteurInit(void)
{
Serial.println("**** Detection du capteur **** ");

while (capteur.search(adresse)== false) // tant qu'aucun nouveau capteur est détecté
{
 // la fonction search renvoie la valeur FAUX si aucun élément 1-wire est trouvé.
 Serial.println("Aucun capteur 1-wire present sur la broche ! "); // affiche message + saut de ligne
 delay (1000); // pause 1 seconde
}
//la suite est exécutée seulement si un capteur est détecté
 // la fonction search renvoie la valeur VRAI si un élément 1-wire est trouvé.
 // Stocke son code d'adresse 16 bits dans le tableau adresse[8]
 // adresse envoyé à la fonction correspond à l'adresse de début du tableau adresse[8] déclaré ...  
 Serial.print ("1 capteur 1-wire present avec code adresse 64 bits : ");
 //--- affichage des 64 bits d'adresse au format hexadécimal
  for(int i = 0; i < 8; i++) { // l'adresse renvoyée par la fonction search est stockée sur 8 octets
   if (adresse<16) Serial.print('0'); // pour affichage des O poids fort au format hexadécimal
   Serial.print(adresse, HEX); // affiche 1 à 1 les 8 octets du tableau adresse au format hexadécimal
   Serial.print(" ");
 }
 Serial.println();
 //---- test du type de capteur ----
 // le type du capteur est donné par le 1er octet du code adresse 64 bits
 // Valeur 0x28 pour capteur type DS18B20, 0x10 pour type DS18S20, 0x22 pour type DS1820
 if (adresse[0]==0x10)
 {
   Serial.println ("Type du capteur present : Capteur temperature DS18S20.");
 }
 else
 {
   Serial.println ("Le capteur present n'est pas un capteur de temperature DS18S20.");
 }
 //----- contrôle du code CRC ----
 // le dernier octet de l'adresse 64bits est un code de contrôle CRC
 // à l'aide de la fonction crc8 on peut vérifier si ce code est valide
 if (capteur.crc8( adresse, 7) == adresse[7]) // vérification validité code CRC de l'adresse 64 bits
 // le code CRC de l'adresse 64 bits est le 8ème octet de l'adresse (index 7 du tableau)
 {
   Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : VALIDE !");
 }
 else
 {
   Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : NON VALIDE !");    
 }

 //------- message final détection ----
 Serial.println("----- fin de la recherche du capteur ----");
 Serial.println("");  
}
//----------- fin de la fonction d'initialisation du capteur ----------


//-------------- fonction de mesure de la température ---------------
float capteurMesureTemp(void) { //fonction qui renvoie résultat float et ne reçoit rien
  //-------- variable locale de la fonction ----------
 int tempet=0; // variable pour resultat brute  de la mesure
 float tempetf=0.0; // variable pour resultat à virgule de la mesure
// Serial.println("**** Acquisition d'une mesure de la temperature **** ");

 // avant chaque nouvelle instruction, il faut :
 //    * initialiser le bus 1-wire
 //    * sélectionner le capteur détecté
 //    * envoyer l'instruction

//--------- lancer une mesure --------
 capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
 capteur.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
 capteur.write(lancerMesure,1); // lance la mesure et alimente le capteur par la broche de donnée

//-------- pause d'une seconde -----
delay(5000);     // au moins 5 seconde
 capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
 capteur.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
 capteur.write(modeLecture,1); // passe en mode lecture de la RAM du capteur
// ----------- lire les 9 octets de la RAM (appelé Scratchpad) ----
for ( int i = 0; i < 9; i++) {           // 9 octets de RAM stockés dans 9 octets
   data = capteur.read();            // lecture de l'octet de rang i stocké dans tableau data
 }
//----- caclul de la température mesurée (enfin!) ---------
data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles
tempet=data[1]; // bits de poids fort
tempet=tempet<<8;
tempet=tempet+data[0]; // bits de poids faible
// --- en mode 12 bits, la résolution est de 0.5°C - cf datasheet DS18S20
tempetf=float(tempet)*50;
tempetf=tempetf/100.0;
return (tempetf);
}

Go Up