Montage capteur température MCP9700A

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.

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.

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!

Tu pourrais utiliser des DS1820 :

http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertCapteursComplexesDS18B20Detection

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?

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.

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é?

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

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.

As-tu regardé cette page :

http://www.arduino.cc/playground/Learning/OneWire

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);
}_