- Componenti richiesti: -
- Sensore di temperatura DS18B20:
- Schema elettrico:-
- Passaggi o flusso di codice: -
- Spiegazione del codice:
- Acquisizione dei dati dal sensore di temperatura DS18B20:
Generalmente, il sensore di temperatura LM35 viene utilizzato con microcontrollori per misurare la temperatura perché è economico e facilmente disponibile. Ma LM35 fornisce valori analogici e dobbiamo convertirli in digitali utilizzando ADC (convertitore analogico-digitale). Ma oggi utilizziamo il sensore di temperatura DS18B20 in cui non abbiamo bisogno di una conversione ADC per ottenere la temperatura. Qui useremo il microcontrollore PIC con DS18B20 per misurare la temperatura.
Quindi qui stiamo costruendo un termometro con le seguenti specifiche utilizzando l' unità microcontrollore PIC16F877A da microchip.
- Mostrerà la gamma completa di temperatura da -55 gradi a +125 gradi.
- Visualizzerà la temperatura solo se la temperatura cambia di +/- 0,2 gradi.
Componenti richiesti: -
- Pic16F877A - Pacchetto PDIP40
- Tagliere per il pane
- Pickit-3
- Adattatore 5V
- LCD JHD162A
- Sensore di temperatura DS18b20
- Fili per collegare le periferiche.
- Resistori 4.7k - 2 pezzi
- Pentola da 10k
- Cristallo da 20 mHz
- Condensatori ceramici da 2 pezzi 33pF
Sensore di temperatura DS18B20:
DS18B20 è un eccellente sensore per rilevare con precisione la temperatura. Questo sensore fornisce una risoluzione da 9 a 12 bit sul rilevamento della temperatura. Questo sensore comunica con un solo filo e non necessita di alcun ADC per acquisire temperature analogiche e convertirle in digitale.
La specifica del sensore è: -
- Misura temperature da -55 ° C a + 125 ° C (da -67 ° F a + 257 ° F)
- ± 0,5 ° C Precisione da -10 ° C a + 85 ° C
- Risoluzione programmabile da 9 bit a 12 bit
- Nessun componente esterno richiesto
- Il sensore utilizza l'interfaccia 1-Wire®
Se guardiamo l'immagine di pinout sopra dalla scheda tecnica, possiamo vedere che il sensore ha lo stesso identico aspetto del pacchetto BC547 o BC557, TO-92. Il primo pin è Ground, il secondo pin è DQ oi dati e il terzo pin è VCC.
Di seguito sono riportate le specifiche elettriche dalla scheda tecnica che saranno necessarie per il nostro progetto. La tensione di alimentazione nominale per il sensore è compresa tra +3,0 V e + 5,5 V. È inoltre necessario tirare su la tensione di alimentazione che è la stessa della tensione di alimentazione indicata sopra.
Inoltre, c'è un margine di precisione che è + -0,5 gradi Celsius per la gamma da -10 gradi C a +85 gradi Celsius, e la precisione cambia per il margine dell'intervallo completo, che è + -2 gradi per -55 gradi a + Gamma di 125 gradi.
Se guardiamo di nuovo la scheda tecnica, vedremo le specifiche di connessione del sensore. Possiamo collegare il sensore in modalità alimentazione parassita dove sono necessari due fili, DATI e GND, oppure possiamo collegare il sensore utilizzando un'alimentazione esterna, dove sono necessari tre fili separati. Useremo la seconda configurazione.
Poiché ora abbiamo familiarità con le potenze nominali del sensore e le aree correlate alla connessione, possiamo ora concentrarci sulla creazione dello schema.
Schema elettrico:-
Se vediamo lo schema elettrico vedremo che: -
L'LCD 16x2 caratteri è collegato al microcontrollore PIC16F877A, in cui RB0, RB1, RB2 sono collegati ai pin LCD RS, R / W ed E. E RB4, RB5, RB6 e RB7 sono collegati ai 4 pin D4, D5, D6, D7. Il display LCD è connesso in modalità 4 bit o in modalità nibble.
Un oscillatore a cristallo da 20 MHz con due condensatori ceramici da 33pF è collegato ai pin OSC1 e OSC2. Fornirà una frequenza di clock costante di 20 Mhz al microcontrollore.
DS18B20 è anche collegato secondo la configurazione dei pin e con un resistore di pull up da 4.7k come discusso in precedenza. Ho collegato tutto questo nella breadboard.
Se non hai familiarità con il microcontrollore PIC, segui i nostri tutorial sul microcontrollore PIC che indicano Iniziare con il microcontrollore PIC.
Passaggi o flusso di codice: -
- Imposta le configurazioni del microcontrollore che includono la configurazione dell'oscillatore.
- Impostare la porta desiderata per LCD compreso il registro TRIS.
- Ogni ciclo con sensore ds18b20 inizia con il reset, quindi resetteremo il ds18b20 e aspetteremo l'impulso di presenza.
- Scrivi lo scratchpad e imposta la risoluzione del sensore a 12bit.
- Salta la lettura della ROM seguita da un impulso di reset.
- Invia il comando di conversione della temperatura.
- Leggi la temperatura sullo scratchpad.
- Verificare il valore della temperatura se negativo o positivo.
- Stampa la temperatura sul display LCD 16x2.
- Attendere che la temperatura cambi di +/-.20 gradi Celsius.
Spiegazione del codice:
Il codice completo per questo termometro digitale viene fornito alla fine di questo tutorial con un video dimostrativo. Avrai bisogno di alcuni file di intestazione per eseguire questo programma che può essere scaricato da qui.
Per prima cosa, dobbiamo impostare i bit di configurazione nel microcontrollore pic e quindi iniziare con la funzione void main .
Poi di seguito quattro linee sono utilizzate per inclusi file di intestazione della libreria, lcd.h e ds18b20.h . E xc.h è per il file di intestazione del microcontrollore.
#includere
Queste definizioni vengono utilizzate per inviare il comando al sensore di temperatura. I comandi sono elencati nella scheda tecnica del sensore.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
La tabella 3 della scheda tecnica del sensore mostra tutti i comandi in cui vengono utilizzate le macro per inviare i rispettivi comandi.
La temperatura verrà visualizzata sullo schermo solo se la temperatura cambia di +/- 0,20 gradi. Possiamo modificare questo intervallo di temperatura da questa macro temp_gap . Modificando il valore in questa macro, la specifica verrà modificata.
Altre due variabili float utilizzate per memorizzare i dati di temperatura visualizzati e differenziarli con il gap di temperatura
#define temp_gap 20 float pre_val = 0, aft_val = 0;
Nella funzione void main () , lcd_init () ; è una funzione per inizializzare LCD. Questa funzione lcd_init () viene chiamata dalla libreria lcd.h.
I registri TRIS vengono utilizzati per selezionare i pin I / O come input o output. Due variabili brevi senza segno TempL e TempH vengono utilizzate per memorizzare i dati di risoluzione a 12 bit dal sensore di temperatura.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; TempL breve senza segno, TempH; unsigned int t, t2; float differenza1 = 0, differenza2 = 0; lcd_init ();
Vediamo il ciclo while, qui spezziamo il ciclo while (1) in piccoli blocchi.
Queste linee vengono utilizzate per rilevare che il sensore di temperatura è collegato o meno.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Please Connect"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Utilizzando questo segmento di codice inizializziamo il sensore e inviamo il comando per convertire la temperatura.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (resolution_12bit); // Risoluzione a 12 bit ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Questo codice serve per memorizzare i dati di temperatura a 12 bit in due variabili brevi senza segno.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Quindi, se controlli il codice completo di seguito, abbiamo creato la condizione if-else per scoprire il segno della temperatura se è positivo o negativo.
Usando il codice dell'istruzione If , manipoliamo i dati e vediamo se la temperatura è negativa o meno e determiniamo che i cambiamenti di temperatura sono in un intervallo di +/- 0,20 gradi o meno. E in altra parte abbiamo verificato se la temperatura è positiva o meno e il rilevamento delle variazioni di temperatura.
codice
Acquisizione dei dati dal sensore di temperatura DS18B20:
Vediamo l'intervallo di tempo dell'interfaccia 1-Wire®. Stiamo usando 20Mhz Crystal. Se guardiamo all'interno del file ds18b20.c, vedremo
#define _XTAL_FREQ 20000000
Questa definizione viene utilizzata per la routine di ritardo del compilatore XC8. 20 Mhz è impostato come frequenza del cristallo.
Abbiamo creato cinque funzioni
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Il protocollo 1-Wire ® necessita di slot strettamente legati ai tempi per comunicare. All'interno della scheda tecnica, otterremo informazioni relative alla fascia oraria perfetta.
All'interno della funzione sottostante abbiamo creato la fascia oraria esatta. È importante creare il ritardo esatto per tenere e rilasciare e controllare il bit TRIS della porta del rispettivo sensore.
carattere non firmato ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (output) DQ = 0; // imposta il pin # a basso (0) __delay_us (480); // 1 filo richiede un ritardo di tempo DQ_TRIS = 1; // Tris = 1 (input) __delay_us (60); // 1 filo richiede un ritardo se (DQ == 0) // se è presente una presenza {__delay_us (480); return 0; // return 0 (1-wire è presenza)} else {__delay_us (480); ritorno 1; // return 1 (1-wire NON è presenza)}} // 0 = presenza, 1 = nessuna parte
Ora, come da descrizione del time slot di seguito utilizzata in Read e Write, abbiamo creato rispettivamente la funzione di lettura e scrittura .
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // trascina DQ basso per avviare la fascia oraria DQ_TRIS = 1; DQ = 1; // quindi ritorna alto per (i = 0; i <3; i ++); // ritardare 15us dall'inizio del ritorno della fascia oraria (DQ); // restituisce il valore della riga DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // tira DQ basso per iniziare il periodo di tempo if (bitval == 1) DQ = 1; // restituisce DQ alto se scrivi 1 __delay_us (5); // conserva il valore per il resto del periodo di tempo DQ_TRIS = 1; DQ = 1; } // Delay fornisce 16us per loop, più 24us. Quindi ritardo (5) = 104us
Controlla ulteriormente tutti i file di intestazione e.c correlati qui.
Quindi è così che possiamo utilizzare il sensore DS18B20 per ottenere la temperatura con il microcontrollore PIC.
Se vuoi costruire un semplice termometro digitale con LM35, controlla sotto i progetti con altri microcontrollori:
- Misurazione della temperatura ambiente con Raspberry Pi
- Termometro digitale che utilizza Arduino e LM35
- Termometro digitale con LM35 e 8051
- Misurazione della temperatura utilizzando LM35 e microcontrollore AVR