Outils pour utilisateurs

Outils du site


wiki:projets:3_sondes_thermique_arduino

Ceci est une ancienne révision du document !


<= Page précédente PCR : Sommaire

/!\ Cette partie n'a pas été vérifiée, le code peut ne pas fonctionner /!\ 26/09/2014

Dans cette partie, nous allons apprendre à afficher la température de 3 sondes thermiques DS18B20 waterproof avec un arduino et à enregistrer les données en temps réèl sur un fichier excel.

Matériels et équipements nécessaire

- un breadbord avec des jumpers

nuclearwaste101.files.wordpress.com_2012_07_breadboard.jpg img.dxcdn.com_productimages_sku_146935_1.jpg

- 1 arduino ou similaire fournisseur : Electrodragon 9.64 €
upload.wikimedia.org_wikipedia_commons_3_38_arduino_uno_-_r3.jpg
- 3 résistances 4,7KOhms (pas chère)
media.digikey.com_renders_yageo_20renders_rsf100jb-47k.jpg

- 3 sondes thermiques résistantes à l’eau DS18B20 fournisseur : Electrodragon 2.5*3=6 €
s3.electrodragon.com_wp-content_uploads_2013_02_ds18b20-water-proof-probe-with-cable-2.jpg

- une alimentation 5V-1A (fait maison ou non)

Construction

Il faut réaliser ce montage :


Code

1) Récupération de l'adresses des sondes thermiques

Il faut ensuite récupérer l'adresse des sondes thermiques avec ce code (trouvé sur http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

// This sketch looks for 1-wire devices and
// prints their addresses (serial number) to
// the UART, in a format that is useful in Arduino sketches
// Tutorial: 
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
 
#include <OneWire.h>
 
OneWire  ds(8);  // Connect your 1-wire device to pin 3
 
void setup(void) {
  Serial.begin(9600);
  discoverOneWireDevices();
}
 
void discoverOneWireDevices(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
 
  Serial.print("Looking for 1-Wire devices...\n\r");
  while(ds.search(addr)) {
    Serial.print("\n\rFound \'1-Wire\' device with address:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print("CRC is not valid!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rThat's it.\r\n");
  ds.reset_search();
  return;
}
 
void loop(void) {
  // Rien à mettre ici
}

2) Programme permettant l'affichage de la température des 3 sondes

Après avoir téléverser le programme, cliquer sur “moniteur série” pour afficher les 3 valeurs des sondes. Noter les quelques part et entrer le code suivant pour mesurer les données des 3 sondes en meme temps.

#include <OneWire.h> //importe la librairie OneWire
int broche_OneWire = 11; // Choisit la pin d'entrée digitale de l'arduino
OneWire  capteur(broche_OneWire);;
//---- code des instructions du capteur
const int modeLecture=0xBE;
const int lancerMesure=0x44;
 
void setup() {
    Serial.begin(9600);
}
 
void loop() {
  float T_sonde_denaturation=0;
  byte Adresse1[8]={0x28,0x16,0xB2,0x47,0x05,0x00,0x00,0x68}; // entre les {}, mettre les adresses de vos sondes mesurées par vos sondes grace au code précédant
  float T_sonde_taq=0;
  byte Adresse2[8]={0x28,0x9F,0x9E,0x47,0x05,0x00,0x00,0xCD};
  float T_sonde_hybridation=0;
  byte Adresse3[8]={0x28,0xEB,0x51,0x47,0x05,0x00,0x00,0xC4};
 
  T_sonde_denaturation=getTemp(Adresse1); 
  T_sonde_hybridation=getTemp(Adresse2);
  T_sonde_taq=getTemp(Adresse3);
  Serial.println(T_sonde_denaturation);
  Serial.println(T_sonde_hybridation);
  Serial.println(T_sonde_taq);
  Serial.println("Fin");
 
 
 
 
}
 
 
float getTemp(byte adressecapteur[8]) { //fonction qui renvoie résultat float et ne reçoit rien
  //-------- variable locale de la fonction ----------
  byte data[12]; // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
  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(adressecapteur); // 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(750);     // 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(adressecapteur); // 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  <- Le bug était caché la
  tempet=data[1]; // bits de poids fort
  tempet=tempet<<8;
  tempet=tempet+data[0]; // bits de poids faible
  */
  tempet=(data[1]<<8)|data[0]; // a l'arrache style !
  // --- 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);
}

<= Page précédente PCR : Sommaire

wiki/projets/3_sondes_thermique_arduino.1412256640.txt.gz · Dernière modification: 2016/09/11 10:46 (modification externe)