(→Schéma Fritzing) |
m (→Code) |
||
Ligne 21 : | Ligne 21 : | ||
===Code=== | ===Code=== | ||
<pre> | <pre> | ||
- | + | // --- 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 | ||
</pre> | </pre> | ||
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