[[(http://pmclab.fr/dokuwiki/doku.php?id=wiki:projets:pcr_facile|<= Page précédente PCR : Sommaire]] ====== Afficher la température de 3 sondes thermiques DS18B20 waterproof avec un arduino====== ===== Matériels et équipements nécessaire ===== - un breadbord avec des jumpers\\ {{http://nuclearwaste101.files.wordpress.com/2012/07/breadboard.jpg?200}} {{http://img.dxcdn.com/productimages/sku_146935_1.jpg?200}}\\ - 1 arduino ou similaire [[(http://www.electrodragon.com/product/arduino-uno-r3/?added-to-cart=6067|fournisseur : Electrodragon]] 9.64 €\\ {{http://upload.wikimedia.org/wikipedia/commons/3/38/Arduino_Uno_-_R3.jpg?200}}\\ - 3 résistances 4,7KOhms (pas chère) \\ {{http://media.digikey.com/Renders/Yageo%20Renders/RSF100JB-47K.jpg?75}}\\ - 3 sondes thermiques résistantes à l’eau DS18B20 [[(http://www.electrodragon.com/product/4-channels-relay-module/|fournisseur : Electrodragon]] 2.5*3=6 €\\ {{http://s3.electrodragon.com/wp-content/uploads/2013/02/DS18B20-Water-Proof-Probe-with-Cable-2.jpg?200}}\\ - une alimentation 5V-1A (fait maison ou non) \\ Factultatif mais cool : - un fer a souder \\ {{http://chrihani.ma/img/cms/FER.jpg?200}}\\ - de l'étain \\ {{http://i2.cdscdn.com/pdt2/9/2/2/1/700x700/biz3700420300922/rw/bobine-de-fil-d-etain-soudure.jpg?200}}\\ ===== Construction ===== Avant toute chose il est nécessaire de mettre de l'étain sur les broches des sondes afin qu'elles puissent rentrer facilement dans le breadbord. Il faut réaliser ce montage : \\ {{http://image.noelshack.com/fichiers/2014/39/1411744557-3sonde-breadbord-2.png}}\\ /!\ Faites attention à la couleur des broches des sondes, voici le codes couleurs qui peut varier selon les modèles : - jaune : les données de la sonde\\ - rouge : l'alimenation (+)\\ - bleu ou vert : la masse (-)\\ Si cela ne fonctionne pas je vous conseille de vérifier les couleurs auprès du constructeur.\\ ===== 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 ds(10); // Connecte 1-wire sur la pine d'entrée digitale de ton choix (ici 10) 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 } Copie colle ce code dans une nouvelle fenêtre du programme arduino.\\ Il faut d'abord installé la librairie one-Wire, si tu ne sais pas comment faire, va sur [[http://mchobby.be/wiki/index.php?title=Installation_d%27un_librairie_Arduino|Comment installer une librairie sur Arduino]]\\ Connecte ton arduino avec l'ordinateur\\ Enregistre le puis suit les instruction de cette image : \\ {{http://img11.hostingpics.net/pics/400758lecturedesadressesdessondes.jpg}} === 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 même temps. #include //importe la librairie OneWire int broche_OneWire = 10; // 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]={/*Met ici l'adresse d'une sonde récupérée grâce au programme précédent*/}; // doit ressembler à ça : // byte Adresse1[8]={0x28,0x9F,0x9E,0x47,0x05,0x00,0x00,0xCD}; float T_sonde_taq=0; byte Adresse2[8]={/*Met ici l'adresse d'une sonde récupérée grâce au programme précédent*/}; float T_sonde_hybridation=0; byte Adresse3[8]={/*Met ici l'adresse d'une sonde récupérée grâce au programme précédent*/}; 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); } En cliquant sur "Moniteur Série", vous devrez observer ceci : \\ {{http://img11.hostingpics.net/pics/573968affichagetemprature.jpg}} Si vous avez une valeur comme "-0.06" ou similaire qui s'affiche à la place de la température, cela peut signifier au moins deux choses : \\ - Vous avez mal fait les branchements\\ - L'adresse est incorrecte\\ [[wiki:tutoriels:donnee_arduino_excel|Récupérons maintenant ces données sur un fichier excel (Windows)]]\\ [[(http://pmclab.fr/dokuwiki/doku.php?id=wiki:projets:pcr_facile|<= Page précédente PCR : Sommaire]]