m (→Code) |
(→Schéma Fritzing) |
||
Ligne 18 : | Ligne 18 : | ||
===Explication=== | ===Explication=== | ||
===Schéma Fritzing=== | ===Schéma Fritzing=== | ||
+ | |||
+ | [[Image:montageg3.png|400px]] | ||
===Code=== | ===Code=== |
Sommaire |
// --- Inclusion des librairies utilisées --- #include <OneWire.h> // librairie pour capteur OneWire #include <LiquidCrystal.h> LiquidCrystal lcd( 7, 8, 9, 10, 11, 12); byte degre[8] = { // création du caractère "°" 0b00111, 0b00101, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 }; int tempPin = 0; // --- 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 // --- 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() lcd.createChar(1, degre); // déclaration du caractère "°" lcd.begin(16, 2); // --- 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() // ******************************************************************************** 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. "); // lcd.setCursor(0, 0); // affichage sur l'afficheur lcd lcd.print("Temp: C "); // lcd.setCursor(11, 0); // lcd.write(1); // lcd.setCursor(6, 0); // lcd.print(ma_tempetf); // } //*************** Autres Fonctions du programme ************* //************************** fonction d'initialisation du capteur **************** void capteurInit(void) // fonction qui ne reçoit rien et ne renvoie rien { //-------- Détection du capteur présent sur la broche 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 --------- 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); } // --------------- fin de la fonction de mesure de la température ---------- // --- Fin programme --- http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertCapteursComplexesDS18B20ThermometreSimple
chercher ici : http://wikidebrouillard.org/index.php/Catégorie:Arduino
quelles peuvent être les applications technologique de ce montage, ou est-ce qu'on retrouve des programme qui y ressemble ?
© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique