Pages: [1]   Go Down
Author Topic: Montage capteur température MCP9700A  (Read 2876 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 20
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3566
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 20
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu pourrais utiliser des DS1820 :

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

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 20
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
« Last Edit: August 03, 2010, 10:05:13 am by nicop » Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: August 03, 2010, 10:25:39 am by jfs » Logged

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 20
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: August 03, 2010, 11:15:06 am by jfs » Logged

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

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

As-tu regardé cette page :

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

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 20
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: