Go Down

Topic: Thermostat ds18b20 (Read 2485 times) previous topic - next topic

qg44

Bonjour à tous,
Voilà, je débute dans l'univers arduino et je galère...
Mon but est de faire un thermostat avec un arduino et un capteur ds18b20.
Côté hardware pas de soucis, mais coté programmation j'ai beaucoup de mal... Ça fait 6h que je planche dessus...
J'ai un peu modifié un programme que j'ai trouvé sur mon club élec :
Code: [Select]

// --- Programme Arduino ---
// Copyright X. HINAULT - Créé le 11/04/2010
// www.mon-club-elec.fr

// --- Que fait ce programme ? ---
/* réalise un thermomètre de précision avec affichage
du résultat dans la fenêtre Terminal série,
à l'aide d'un capteur de température One-wire de type DS18B20.
Une mesure est effectuée toute les secondes. */

// --- Fonctionnalités utilisées ---
// Utilise la connexion série vers le PC
// Utilise un ou plusieurs capteurs One Wire

// --- Circuit à réaliser ---
// Connexion série entre la carte Arduino et le PC (utilise les broches 0 et 1)  
// Connecter  sur la broche 2 la broche de données du capteur One Wire

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---

#include <OneWire.h> // librairie pour capteur OneWire

// --- Déclaration des constantes ---

//---- code des instructions du capteur
const int modeLecture=0xBE;
const int lancerMesure=0x44;

// --- constantes des broches ---

const int broche_OneWire=2; //declaration constante de broche
const int resn=13; //broche 13 sortie resistance normale

// --- Déclaration des variables globales ---
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;

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
OneWire  capteur(broche_OneWire);  // crée un objet One Wire sur la broche voulue


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

pinMode (resn, OUTPUT);

// --- ici instructions à exécuter au démarrage ---
Serial.begin(115200); // initialise connexion série à 115200 bauds

// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission


// --- initialisation du capteur DS18B20 ------

capteurInit(); // appel de la fonction d'initialisation du capteur - au début seulement
// prise en compte du premier capteur trouvé

} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

ma_tempetf=capteurMesureTemp(); // appel de la fonction de mesure - renvoie une valeur float

Serial.print ("Temperature = ");
Serial.print (ma_tempetf,2);
Serial.println (" Degres Celsius. ");

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

//*************** Autres Fonctions du programme *************

//************************** fonction d'initialisation du capteur ****************

void capteurInit(void) // fonction qui ne reçoit rien et ne renvoie rien
{
// XXXXXXXXXXXXXXXXXXXXXX Détection du capteur présent sur la broche XXXXXXXXXXXXXXXXXXXXXXX
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[i]<16) Serial.print('0'); // pour affichage des O poids fort au format hexadécimal
   Serial.print(adresse[i], 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]==0x28)
 {
   Serial.println ("Type du capteur present : Capteur temperature DS18B20.");
 }
 else
 {
   Serial.println ("Le capteur present n'est pas un capteur de temperature DS18B20.");
 }


 //----- 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

// XXXXXXXXXXXXXXXXXXXXXX Lancement d'une mesure et lecture du résultat XXXXXXXXXXXXXXXXXXXXXXX

// 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(1000);     // au moins 750 ms
          // il faudrait mettre une instruction capteur.depower ici, mais le reset va le faire


//---------- passer en mode LECTURE -------------
 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[i] = 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.0625°C - cf datasheet DS18B20
tempetf=float(tempet)*6.25;
tempetf=tempetf/100.0;

return (tempetf);

if (tempetf<50)  
 digitalWrite(resn,1); //si la température est inférieure à 50, resn est à 1

if (tempetf>60)
 digitalWrite(resn,0); //si la température est supérieure à 60, resn est à 0
}
// --------------- fin de la fonction de mesure de la température ----------

// --- Fin programme ---


La broche 13 ne se met jamais à 1, j'ai bien la température dans le serial !
Merci d'avance,
Quentin

Artouste



J'ai un peu modifié un programme que j'ai trouvé sur mon club élec :
Code: [Select]



if (tempetf<50)  
 digitalWrite(resn,HIGH); //si la température est inférieure à 50, resn est à 1

if (tempetf>60)
 digitalWrite(resn,LOW); //si la température est supérieure à 60, resn est à 0
}
// --------------- fin de la fonction de mesure de la température ----------

// --- Fin programme ---


La broche 13 ne se met jamais à 1, j'ai bien la température dans le serial !
Merci d'avance,
Quentin


rapidement
digitalwrite c'est high ou low, il me semble

qg44

#2
Oct 20, 2012, 11:55 am Last Edit: Oct 20, 2012, 01:08 pm by qg44 Reason: 1
Bonjour,
Parfait,merci beaucoup, il suffisait en effet de changer les 1 et 0 en high et low mais également de mettre la fonction return après :
Code: [Select]
if (tempetf<22)  digitalWrite(resn,HIGH); //si la tepérature est inférieure à 22, resn est à 1

return (tempetf);


Mais j'ai maintenant un autre soucis : ça marche parfaitement tant que j'ai le moniteur série sur l'ordinateur, mais dès que je le ferme ça ne fonctionne plus : la broche ne passe ni en high ni en low si la température passe le seuil...

Je n'arrive pas à trouver sur internet un programme avec un 18b20 qui ne renvoi pas sur un moniteur série.
Comment faire ?
Quentin

skywodd

Bonjour,

Tout d'abord :
- quelle carte arduino ?
- quelle version de l'ide ?

Y a t'il une boucle d'attente sur le port série ?
Si oui c'est elle qui bloque le programme en attendant l'ouverture du moniteur série.

J'ai fait un tutoriel sur le DS18B20 qui explique la base de la base :
http://skyduino.wordpress.com/2012/04/26/arduino-capteur-de-temperature-ds18b20/
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Robert95200

Salut, j'ai une question dans ton programme ou as tu définie la fonction de ton capteur parce que quand je vérifie ton programme il me dise qu'il y a une erreur a la ligne  "OneWire  capteur(broche_OneWire);  // crée un objet One Wire sur la broche voulue"

Message d'erreur :

sketch_mar25a:44: error: 'OneWire' does not name a type
sketch_mar25a.ino: In function 'void capteurInit()':
sketch_mar25a:91: error: 'capteur' was not declared in this scope
sketch_mar25a:135: error: 'capteur' was not declared in this scope
sketch_mar25a.ino: In function 'float capteurMesureTemp()':
sketch_mar25a:170: error: 'capteur' was not declared in this scope

Merci d'avance

-Standby

Tu n'a certainement pas installé la librairie OneWire Robert.
The Mind is like a parachute it works best when opened.

skywodd


Tu n'a certainement pas installé la librairie OneWire Robert.

+1

Voir ici pour l'installer :
http://www.pjrc.com/teensy/td_libs_OneWire.html
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Robert95200

Effectivement je ne l'avait pas installé, après l'avoir installé sa a marché, désolé je débute avec arduino  :)

Merci !!

Go Up