- Components necessaris: -
- Sensor de temperatura DS18B20:
- Esquema de connexions:-
- Passos o flux de codi: -
- Explicació del codi:
- Obtenció de dades del sensor de temperatura DS18B20:
En general, el sensor de temperatura LM35 s’utilitza amb microcontroladors per mesurar la temperatura, ja que és barat i és fàcilment disponible. Però LM35 dóna valors analògics i els hem de convertir en digitals mitjançant ADC (convertidor analògic a digital). Però avui fem servir un sensor de temperatura DS18B20 en el qual no necessitem una conversió ADC per obtenir la temperatura. Aquí utilitzarem el microcontrolador PIC amb DS18B20 per mesurar la temperatura.
Així doncs, aquí estem construint un termòmetre amb les següents especificacions mitjançant la unitat de microcontrolador PIC16F877A del microxip.
- Es mostrarà un rang complet de temperatura des de -55 graus fins a +125 graus.
- Només mostrarà la temperatura si la temperatura canvia de +/- 0,2 graus.
Components necessaris: -
- Pic16F877A - paquet PDIP40
- Taula de pa
- Pickit-3
- Adaptador de 5 V.
- LCD JHD162A
- Sensor de temperatura DS18b20
- Filferros per connectar perifèrics.
- Resistències de 4,7 k: 2 unitats
- Olla de 10k
- Cristall de 20 MHz
- 2 condensadors ceràmics de 33 pF
Sensor de temperatura DS18B20:
DS18B20 és un sensor excel·lent per detectar amb precisió la temperatura. Aquest sensor proporciona una resolució de 9 bits a 12 bits en la detecció de temperatura. Aquest sensor es comunica amb un sol cable i no necessita cap ADC per adquirir temperatures analògiques i convertir-les digitalment.
L'especificació del sensor és: -
- Mesura temperatures de -55 ° C a + 125 ° C (-67 ° F a + 257 ° F)
- ± 0,5 ° C Precisió des de -10 ° C fins a + 85 ° C
- Resolució programable de 9 bits a 12 bits
- No es requereixen components externs
- El sensor utilitza la interfície 1-Wire®

Si observem la imatge pinout superior del full de dades, podem veure que el sensor té exactament el mateix aspecte que el paquet BC547 o BC557, TO-92. El primer pin és Ground, el segon pin és DQ o les dades i el tercer pin és VCC.
A continuació es mostra l’especificació elèctrica del full de dades que serà necessària per al nostre disseny. La tensió nominal d'alimentació del sensor és de + 3,0 V a + 5,5 V. També cal pujar la tensió d’alimentació que és la mateixa que la tensió d’alimentació indicada anteriorment.

A més, hi ha un marge de precisió que és de + -0,5 graus centígrads per al rang de -10 graus C a +85 graus centígrads, i la precisió canvia per al marge de rang complet, que és de + -2 graus durant -55 graus a + Abast de 125 graus.
Si tornem a mirar el full de dades, veurem les especificacions de connexió del sensor. Podem connectar el sensor en mode d’alimentació paràsita on es necessiten dos cables, DATA i GND, o podem connectar el sensor mitjançant una font d’alimentació externa, on es necessiten tres cables separats. Utilitzarem la segona configuració.

Com que ara estem familiaritzats amb les potències nominals del sensor i les àrees relacionades amb la connexió, ara ens podem concentrar a fer l’esquema.
Esquema de connexions:-

Si veiem el diagrama del circuit veurem que: -
El LCD de 16x2 caràcters està connectat a través del microcontrolador PIC16F877A, en el qual RB0, RB1, RB2 estan connectats al pin LCD RS, R / W i E. D7. La pantalla LCD està connectada en mode de 4 bits o en mode de picat.
Un oscil·lador de cristall de 20 MHz amb dos condensadors ceràmics de 33pF està connectat a través dels pins OSC1 i OSC2. Proporcionarà una freqüència de rellotge constant de 20 MHz al microcontrolador.
El DS18B20 també es connecta segons la configuració del pin i amb una resistència de pujada de 4,7 k com s'ha comentat anteriorment. He connectat tot això a la taula de treball.
Si no coneixeu el microcontrolador PIC, seguiu els nostres tutorials PIC sobre microcontroladors que indiquen la secció Introducció al microcontrolador PIC.
Passos o flux de codi: -
- Definiu les configuracions del microcontrolador que incloguin la configuració de l’oscil·lador.
- Configureu el port desitjat per a LCD, inclòs el registre TRIS.
- Tots els cicles amb sensor ds18b20 comencen amb reset, de manera que restablirem el ds18b20 i esperarem el pols de presència.
- Escriviu el ratolí i configureu la resolució del sensor de 12 bits.
- Omet la lectura de la ROM seguida d’un pols de reinici.
- Envieu l’ordre de temperatura de conversió.
- Llegiu la temperatura des del ratolí.
- Comproveu el valor de la temperatura tant si és negatiu com positiu.
- Imprimiu la temperatura a la pantalla LCD de 16x2.
- Espereu els canvis de temperatura durant +/- 20 graus centígrads.

Explicació del codi:
El codi complet d’aquest termòmetre digital es dóna al final d’aquest tutorial amb un vídeo de demostració. Necessiteu alguns fitxers de capçalera per executar aquest programa que es pot descarregar des d’aquí.
Primer, hem d’establir els bits de configuració al microcontrolador pic i després començar amb la funció principal void .
A continuació, s'utilitzen quatre línies per incloure el fitxer de capçalera de la biblioteca, lcd.h i ds18b20.h . I xc.h és per al fitxer de capçalera del microcontrolador.
#incloure
Aquestes definicions s’utilitzen per enviar ordres al sensor de temperatura. Les ordres es mostren al full de dades del sensor.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE

Aquesta taula 3 del full de dades del sensor mostra totes les ordres en què s’utilitzen les macros per enviar ordres respectives.
La temperatura només es mostrarà a la pantalla si la temperatura canvia de +/- 0,20 graus. Podem canviar aquesta bretxa de temperatura a partir d'aquesta macro temp_gap . Si canvieu el valor d'aquesta macro, es canviarà l'especificació.
Altres dues variables flotants que s’utilitzen per emmagatzemar les dades de temperatura mostrades i les diferencien amb la bretxa de temperatura
#define temp_gap 20 float pre_val = 0, aft_val = 0;
En la funció void main () , lcd_init () ; és una funció per inicialitzar LCD. Aquesta funció lcd_init () s’anomena des de la biblioteca lcd.h.
Els registres TRIS s’utilitzen per seleccionar pins d’E / S com a entrada o sortida. S'utilitzen dues variables curtes sense signar TempL i TempH per emmagatzemar les dades de resolució de 12 bits del sensor de temperatura.
void main (buit) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; TempL curt sense signar, TempH; unsigned int t, t2; diferència flotant1 = 0, diferència2 = 0; lcd_init ();
Vegem el bucle while, aquí dividim el bucle while (1) en petits trossos.
Aquestes línies s’utilitzen per detectar que el sensor de temperatura està connectat o no.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Connecteu-vos"); lcd_com (0xC0); lcd_puts ("sonda Temp-Sense"); }
En utilitzar aquest segment de codi, inicialitzem el sensor i enviem l’ordre per convertir la temperatura.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (resolució_12bit); // resolució de 12 bits ow_reset (); write_byte (skip_rom); write_byte (convertir_temp);
Aquest codi serveix per emmagatzemar les dades de temperatura de 12 bits en dues variables curtes sense signar.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
A continuació, si comproveu el codi complet a continuació, crearem la condició if-else per esbrinar el signe de temperatura si és positiu o negatiu.
Mitjançant l’ús del codi d’instruccions If , manipulem les dades i comprovem si la temperatura és negativa o no i determinem que els canvis de temperatura estan en un rang de +/-.20 graus o no. I en una altra part, vam comprovar si la temperatura és positiva o no i la detecció dels canvis de temperatura.
codi
Obtenció de dades del sensor de temperatura DS18B20:
Vegem la bretxa horària de la interfície 1-Wire®. Estem utilitzant Crystal de 20 MHz. Si mirem dins del fitxer ds18b20.c, veurem
#define _XTAL_FREQ 20000000
Aquesta definició s'utilitza per a la rutina de retard del compilador XC8. 20 MHz es defineix com a freqüència de cristall.
Vam fer cinc funcions
- ow_reset
- read_bit
- read_byte
- bit_escriptura
- write_byte
El protocol 1-Wire ® necessita espais estrictes relacionats amb el temps per comunicar-se. Dins del full de dades, obtindrem informació perfecta relacionada amb les franges horàries.

Dins de la funció següent vam crear la franja horària exacta. És important crear el retard exacte per mantenir i alliberar i controlar el bit TRIS del port del sensor respectiu.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (sortida) DQ = 0; // Estableix el pin # a low (0) __delay_us (480); // 1 cable requereix un retard de temps DQ_TRIS = 1; // Tris = 1 (entrada) __delay_us (60); // 1 cable requereix un retard de temps si (DQ == 0) // si hi ha un plus de presència {__delay_us (480); retorn 0; // retorna 0 (1 cable és presència)} else {__delay_us (480); retorn 1; // retorna 1 (1 cable NO és presència)}} // 0 = presència, 1 = cap part
Ara, segons la descripció de la franja horària que s'utilitza a Lectura i escriptura a continuació, hem creat la funció de lectura i escriptura respectivament.

unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // baixeu DQ per iniciar el període de temps DQ_TRIS = 1; DQ = 1; // a continuació, torneu alt per (i = 0; i <3; i ++); // retardar 15us des del començament del retorn de la franja horària (DQ); // retorn del valor de la línia DQ} void write_bit (bit bit) {DQ_TRIS = 0; DQ = 0; // baixeu DQ per iniciar el període de temps si (bitval == 1) DQ = 1; // retorna DQ alt si escriu 1 __delay_us (5); // mantingui el valor de la resta del període de temps DQ_TRIS = 1; DQ = 1; } // El retard proporciona 16us per bucle, més 24us. Per tant, retard (5) = 104us
A més xec tota la capçalera relacionada i arxius.c aquí.
Així doncs, és així com podem utilitzar el sensor DS18B20 per obtenir la temperatura amb el microcontrolador PIC.
Si voleu construir un termòmetre digital senzill amb LM35, consulteu els projectes següents amb altres microcontroladors:
- Mesura de la temperatura ambient amb Raspberry Pi
- Termòmetre digital amb Arduino i LM35
- Termòmetre digital amb LM35 i 8051
- Mesura de la temperatura mitjançant microcontrolador LM35 i AVR
