- Composants requis: -
- Capteur de température DS18B20:
- Schéma:-
- Étapes ou flux de code: -
- Explication du code:
- Obtention des données du capteur de température DS18B20:
Généralement, le capteur de température LM35 est utilisé avec des microcontrôleurs pour mesurer la température car il est bon marché et facilement disponible. Mais LM35 donne des valeurs analogiques et nous devons les convertir en numérique en utilisant ADC (Analog to Digital Converter). Mais aujourd'hui, nous utilisons un capteur de température DS18B20 dans lequel nous n'avons pas besoin d'une conversion ADC pour obtenir la température. Ici, nous utiliserons le microcontrôleur PIC avec DS18B20 pour mesurer la température.
Nous construisons donc ici un thermomètre avec la spécification suivante en utilisant une unité de microcontrôleur PIC16F877A à partir d'une puce.
- Il montrera la gamme complète de température de -55 degrés à +125 degrés.
- Il n'affichera la température que si la température change de + / -.2 degrés.
Composants requis: -
- Pic16F877A - Paquet PDIP40
- Planche à pain
- Pickit-3
- Adaptateur 5V
- LCD JHD162A
- Capteur de température DS18b20
- Fils pour connecter les périphériques.
- Résistances 4.7k - 2pcs
- Pot de 10k
- Cristal de 20 MHz
- 2 condensateurs céramiques 33pF
Capteur de température DS18B20:
Le DS18B20 est un excellent capteur pour détecter avec précision la température. Ce capteur fournit une résolution de 9 bits à 12 bits sur la détection de température. Ce capteur ne communique qu'avec un seul fil et n'a pas besoin d'ADC pour acquérir les températures analogiques et les convertir numériquement.
La spécification du capteur est: -
- Mesure les températures de -55 ° C à + 125 ° C (-67 ° F à + 257 ° F)
- ± 0,5 ° C Précision de -10 ° C à + 85 ° C
- Résolution programmable de 9 bits à 12 bits
- Aucun composant externe requis
- Le capteur utilise l'interface 1-Wire®
Si nous regardons l'image de brochage ci-dessus de la fiche technique, nous pouvons voir que le capteur ressemble exactement au boîtier BC547 ou BC557, TO-92. La première broche est la masse, la deuxième broche est DQ ou les données et la troisième broche est VCC.
Vous trouverez ci-dessous les spécifications électriques de la fiche technique qui seront nécessaires pour notre conception. La tension d'alimentation nominale du capteur est de + 3,0 V à + 5,5 V. Il faut également tirer la tension d'alimentation qui est la même que la tension d'alimentation indiquée ci-dessus.
En outre, il existe une marge de précision qui est de + -0,5 degrés Celsius pour la plage de -10 degrés C à +85 degrés Celsius, et la précision change pour la marge de plage complète, qui est de + -2 degrés pour -55 degrés à + Gamme de 125 degrés.
Si nous regardons à nouveau la fiche technique, nous verrons la spécification de connexion du capteur. Nous pouvons connecter le capteur en mode d'alimentation parasite où deux fils sont nécessaires, DATA et GND, ou nous pouvons connecter le capteur à l'aide d'une alimentation externe, où trois fils séparés sont nécessaires. Nous utiliserons la deuxième configuration.
Comme nous connaissons maintenant les puissances nominales du capteur et les zones liées aux connexions, nous pouvons maintenant nous concentrer sur la réalisation du schéma.
Schéma:-
Si nous voyons le schéma de circuit, nous verrons que: -
L'écran LCD 16x2 caractères est connecté à travers le microcontrôleur PIC16F877A, dans lequel RB0, RB1, RB2 sont connectés à la broche LCD RS, R / W et E. Et RB4, RB5, RB6 et RB7 sont connectés aux 4 broches D4, D5, D6 de l'écran LCD, D7. L'écran LCD est connecté en mode 4 bits ou en mode grignotage.
Un oscillateur à cristal de 20 MHz avec deux condensateurs en céramique de 33pF est connecté entre les broches OSC1 et OSC2. Il fournira une fréquence d'horloge constante de 20Mhz au microcontrôleur.
Le DS18B20 est également connecté selon la configuration des broches et avec une résistance de rappel de 4,7 k comme indiqué précédemment. J'ai connecté tout cela dans la maquette.
Si vous êtes nouveau sur le microcontrôleur PIC, suivez nos didacticiels sur le microcontrôleur PIC indiquant la mise en route du microcontrôleur PIC.
Étapes ou flux de code: -
- Définissez les configurations du microcontrôleur qui incluent la configuration de l'oscillateur.
- Définissez le port souhaité pour l'écran LCD, y compris le registre TRIS.
- Chaque cycle avec le capteur ds18b20 commence par une réinitialisation, nous allons donc réinitialiser le ds18b20 et attendre l'impulsion de présence.
- Écrivez le bloc-notes et définissez la résolution du capteur 12 bits.
- Ignorez la lecture de la ROM suivie d'une impulsion de réinitialisation.
- Soumettez la commande de conversion de température.
- Lisez la température sur le bloc-notes.
- Vérifiez la valeur de la température, qu'elle soit négative ou positive.
- Imprimez la température sur un écran LCD 16x2.
- Attendez que la température change pour +/-.20 degrés Celsius.
Explication du code:
Le code complet de ce thermomètre numérique est donné à la fin de ce tutoriel avec une vidéo de démonstration. Vous aurez besoin de certains fichiers d'en-tête pour exécuter ce programme qui peuvent être téléchargés à partir d'ici.
Tout d'abord, nous devons définir les bits de configuration dans le microcontrôleur pic, puis commencer avec la fonction principale void .
Ensuite, les quatre lignes ci-dessous sont utilisées pour inclure le fichier d'en-tête de la bibliothèque, lcd.h et ds18b20.h . Et xc.h est pour le fichier d'en-tête du microcontrôleur.
#comprendre
Ces définitions sont utilisées pour envoyer la commande au capteur de température. Les commandes sont répertoriées dans la fiche technique du capteur.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Ce tableau 3 de la fiche technique du capteur montre toutes les commandes où les macros sont utilisées pour envoyer les commandes respectives.
La température ne s'affichera à l'écran que si la température change de +/- .20 degrés. Nous pouvons modifier cet écart de température à partir de cette macro temp_gap . En modifiant la valeur de cette macro, la spécification sera modifiée.
Deux autres variables flottantes utilisées pour stocker les données de température affichées et les différencier avec l'écart de température
#define temp_gap 20 float pre_val = 0, aft_val = 0;
Dans la fonction void main () , lcd_init () ; est une fonction pour initialiser l'écran LCD. Cette fonction lcd_init () est appelée depuis la bibliothèque lcd.h.
Les registres TRIS sont utilisés pour sélectionner les broches d'E / S comme entrée ou sortie. Deux courtes variables TempL et TempH non signées sont utilisées pour stocker les données de résolution 12 bits du capteur de température.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; TempL court non signé, TempH; unsigned int t, t2; float difference1 = 0, difference2 = 0; lcd_init ();
Voyons la boucle while, ici nous cassons la boucle while (1) en petits morceaux.
Ces lignes sont utilisées pour détecter que le capteur de température est connecté ou non.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Veuillez vous connecter"); lcd_com (0xC0); lcd_puts ("Sonde Temp-Sense"); }
En utilisant ce segment de code, nous initialisons le capteur et envoyons une commande pour convertir la température.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (résolution_12bit); // résolution 12 bits ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Ce code sert à stocker les données de température 12 bits dans deux variables courtes non signées.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Ensuite, si vous vérifiez le code complet ci-dessous, nous avons créé une condition if-else pour savoir si le signe de la température est positif ou négatif.
En utilisant le code de l'instruction If , nous manipulons les données et voyons si la température est négative ou non et déterminons que les changements de température sont dans la plage de +/-.20 degrés ou non. Et dans une autre partie, nous avons vérifié si la température est positive ou non et la détection des changements de température.
code
Obtention des données du capteur de température DS18B20:
Voyons l'intervalle de temps de l'interface 1-Wire®. Nous utilisons du cristal 20Mhz. Si nous regardons à l'intérieur du fichier ds18b20.c, nous verrons
#define _XTAL_FREQ 20000000
Cette définition est utilisée pour la routine de délai du compilateur XC8. 20Mhz est défini comme fréquence du cristal.
Nous avons fait cinq fonctions
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Le protocole 1-Wire ® nécessite des créneaux horaires stricts pour communiquer. À l'intérieur de la fiche technique, nous obtiendrons des informations parfaites sur les plages horaires.
Dans la fonction ci-dessous, nous avons créé le créneau horaire exact. Il est important de créer le délai exact de maintien et de libération et de contrôler le bit TRIS du port du capteur respectif.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (sortie) DQ = 0; // définit la broche # sur low (0) __delay_us (480); // 1 fil nécessite un délai DQ_TRIS = 1; // Tris = 1 (entrée) __delay_us (60); // 1 fil nécessite un délai si (DQ == 0) // s'il y a un signe de présence {__delay_us (480); return 0; // retourne 0 (1 fil est la présence)} else {__delay_us (480); return 1; // retourne 1 (1 fil n'est PAS présence)}} // 0 = présence, 1 = pas de partie
Maintenant, selon la description de la tranche de temps ci-dessous utilisée en lecture et en écriture, nous avons créé la fonction de lecture et d' écriture respectivement.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // tirez DQ bas pour démarrer le créneau horaire DQ_TRIS = 1; DQ = 1; // puis retourne haut pour (i = 0; i <3; i ++); // délai de 15us depuis le début du retour de la tranche horaire (DQ); // retourne la valeur de la ligne DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // tire DQ bas pour démarrer l'intervalle de temps si (bitval == 1) DQ = 1; // retourne DQ high si write 1 __delay_us (5); // conserver la valeur pour le reste du créneau horaire DQ_TRIS = 1; DQ = 1; } // Delay fournit 16us par boucle, plus 24us. Donc retard (5) = 104us
Vérifiez davantage tous les fichiers d'en-tête et.c associés ici.
C'est ainsi que nous pouvons utiliser le capteur DS18B20 pour obtenir la température avec le microcontrôleur PIC.
Si vous souhaitez construire un simple thermomètre numérique avec LM35, consultez les projets ci-dessous avec d'autres microcontrôleurs:
- Mesure de la température ambiante avec Raspberry Pi
- Thermomètre numérique utilisant Arduino et LM35
- Thermomètre numérique utilisant LM35 et 8051
- Mesure de température à l'aide du microcontrôleur LM35 et AVR