- Componente necesare: -
- Senzor de temperatură DS18B20:
- Diagrama circuitului: -
- Etape sau flux de cod: -
- Explicatie cod:
- Obținerea datelor de la senzorul de temperatură DS18B20:
În general, senzorul de temperatură LM35 este utilizat cu microcontrolere pentru a măsura temperatura, deoarece este ieftin și ușor disponibil. Dar LM35 oferă valori analogice și trebuie să le convertim în digitale folosind ADC (Analog to Digital Converter). Dar astăzi folosim senzorul de temperatură DS18B20 în care nu avem nevoie de o conversie ADC pentru a obține temperatura. Aici vom folosi microcontrolerul PIC cu DS18B20 pentru a măsura temperatura.
Deci, aici construim un termometru cu următoarele specificații folosind unitatea de microcontroler PIC16F877A de la microcip.
- Se va afișa o gamă completă de temperatură de la -55 grade la +125 grade.
- Va afișa temperatura numai dacă temperatura se schimbă + / -.2 grade.
Componente necesare: -
- Pic16F877A - pachet PDIP40
- Pâine
- Pickit-3
- Adaptor de 5V
- LCD JHD162A
- Senzor de temperatură DS18b20
- Cabluri pentru conectarea perifericelor.
- 4.7k rezistențe - 2 buc
- Oala de 10k
- 20mHz Crystal
- 2 buc condensatori ceramici 33pF
Senzor de temperatură DS18B20:
DS18B20 este un senzor excelent pentru a detecta cu precizie temperatura. Acest senzor oferă o rezoluție de 9 biți la 12 biți la detectarea temperaturii. Acest senzor comunică cu un singur fir și nu are nevoie de niciun ADC pentru a obține temperaturi analogice și pentru a le converti digital.
Specificația senzorului este: -
- Măsurează temperaturi de la -55 ° C la + 125 ° C (-67 ° F la + 257 ° F)
- ± 0,5 ° C Precizie de la -10 ° C la + 85 ° C
- Rezoluție programabilă de la 9 biți la 12 biți
- Nu sunt necesare componente externe
- Senzorul utilizează interfața 1-Wire®
Dacă ne uităm la imaginea de mai sus din foaia de date, putem vedea că senzorul arată exact la fel ca pachetul BC547 sau BC557, TO-92. Primul pin este la sol, al doilea pin este DQ sau datele, iar al treilea pin este VCC.
Mai jos este specificația electrică din Fișa tehnică, care va fi necesară pentru proiectarea noastră. Tensiunea nominală de alimentare pentru senzor este de + 3,0V până la + 5,5V. De asemenea, trebuie să trageți tensiunea de alimentare care este aceeași cu tensiunea de alimentare menționată mai sus.
De asemenea, există o marjă de precizie care este de + -0,5 grade Celsius pentru intervalul de la -10 grade C la +85 grade Celsius, iar precizia se modifică pentru marja întregului interval, care este de + -2 grade pentru -55 grade până la + Gama de 125 de grade.
Dacă ne uităm din nou la foaia tehnică, vom vedea specificațiile conexiunii senzorului. Putem conecta senzorul în modul de alimentare parazită în care sunt necesare două fire, DATA și GND, sau putem conecta senzorul folosind o sursă de alimentare externă, unde sunt necesare trei fire separate. Vom folosi a doua configurație.
Deoarece acum suntem familiarizați cu puterea nominală a senzorului și a zonelor legate de conexiune, ne putem concentra acum pe realizarea schemei.
Diagrama circuitului: -
Dacă vedem schema circuitului, vom vedea că: -
LCD de 16x2 caractere este conectat la microcontrolerul PIC16F877A, în care RB0, RB1, RB2 sunt conectate la pinul LCD RS, R / W și E. D7. Ecranul LCD este conectat în modul 4 biți sau în modul nibble.
Un oscilator de cristal de 20 MHz cu doi condensatori ceramici de 33pF este conectat pe pinul OSC1 și OSC2. Acesta va oferi o frecvență de ceas constantă de 20 MHz la microcontroler.
DS18B20 este, de asemenea, conectat conform configurației pinului și cu un rezistor de tragere de 4.7k, așa cum s-a discutat anterior. Am conectat toate acestea în panou.
Dacă nu sunteți nou în PIC Microcontroller, urmați tutorialele noastre PIC Microcontroller care indică prin Noțiuni introductive despre PIC Microcontroller.
Etape sau flux de cod: -
- Setați configurațiile microcontrolerului care includ configurația oscilatorului.
- Setați portul dorit pentru LCD, inclusiv registrul TRIS.
- Fiecare ciclu cu senzor ds18b20 începe cu resetare, așa că vom reseta ds18b20 și vom aștepta pulsul de prezență.
- Scrieți scratchpad-ul și setați rezoluția senzorului pe 12 biți.
- Săriți citirea ROM, urmată de un impuls de resetare.
- Trimiteți comanda de conversie a temperaturii.
- Citiți temperatura de pe scratchpad.
- Verificați valoarea temperaturii dacă este negativă sau pozitivă.
- Imprimați temperatura pe ecranul LCD 16x2.
- Așteptați schimbările de temperatură pentru +/-. 20 grade Celsius.
Explicatie cod:
Codul complet pentru acest termometru digital este dat la sfârșitul acestui tutorial cu un videoclip demonstrativ. Veți avea nevoie de câteva fișiere antet pentru a rula acest program, care pot fi descărcate de aici.
Mai întâi, trebuie să setăm biții de configurare în microcontrolerul pic și apoi să începem cu funcția principală nulă .
Apoi, sub patru linii sunt utilizate pentru includerea fișierului antet bibliotecă, lcd.h și ds18b20.h . Și xc.h este pentru fișierul antet al microcontrolerului.
#include
Aceste definiții sunt utilizate pentru trimiterea comenzii către senzorul de temperatură. Comenzile sunt listate în foaia de date a senzorului.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Acest tabel 3 din foaia de date a senzorului arată toate comenzile în care macrocomenzile sunt utilizate pentru a trimite comenzile respective.
Temperatura se va afișa pe ecran numai dacă temperatura se schimbă +/- .20 grade. Putem schimba acest decalaj de temperatură din această macro temp_gap . Prin modificarea valorii la această macro, specificația va fi modificată.
Alte două variabile flotante utilizate pentru stocarea datelor de temperatură afișate și le diferențiază cu diferența de temperatură
#define temp_gap 20 float pre_val = 0, aft_val = 0;
În funcția main () nulă , lcd_init () ; este o funcție de inițializare a ecranului LCD. Această funcție lcd_init () este apelată din biblioteca lcd.h.
Registrele TRIS sunt utilizate pentru a selecta pinii I / O ca intrare sau ieșire. Două variabile scurte nesemnate TempL și TempH sunt utilizate pentru stocarea datelor de rezoluție de 12 biți de la senzorul de temperatură.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; TempL scurt, fără semn, TempH; nesemnat int t, t2; float difference1 = 0, difference2 = 0; lcd_init ();
Să vedem bucla while, aici rupem bucla while (1) în bucăți mici.
Aceste linii sunt utilizate pentru a detecta că senzorul de temperatură este conectat sau nu.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Vă rugăm să vă conectați"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Prin utilizarea acestui segment de cod, inițializăm senzorul și trimitem comanda pentru a converti temperatura.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (resolution_12bit); // rezoluție 12 biți ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Acest cod este destinat stocării datelor de temperatură pe 12 biți în două variabile scurte nesemnate.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Apoi, dacă verificați codul complet de mai jos, vom crea condiția if-else pentru a afla semnul temperaturii dacă este pozitiv sau negativ.
Utilizând codul de instrucțiune If , manipulăm datele și vedem dacă temperatura este sau nu negativă și determinăm că schimbările de temperatură sunt în +/-.20 grade sau nu. Și în altă parte, am verificat dacă temperatura este pozitivă sau nu și detectarea schimbărilor de temperatură.
cod
Obținerea datelor de la senzorul de temperatură DS18B20:
Să vedem decalajul de timp al interfeței 1-Wire®. Folosim cristalul de 20 MHz. Dacă ne uităm în fișierul ds18b20.c, vom vedea
#define _XTAL_FREQ 20000000
Această definiție este utilizată pentru rutina de întârziere a compilatorului XC8. 20Mhz este setat ca frecvență de cristal.
Am realizat cinci funcții
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Protocolul 1-Wire ® are nevoie de sloturi stricte legate de sincronizare pentru a comunica. În cadrul fișei tehnice, vom obține informații despre intervalele de timp perfecte.
În interiorul funcției de mai jos am creat intervalul de timp exact. Este important să creați întârzierea exactă pentru menținere și eliberare și să controlați bitul TRIS al portului senzorului respectiv.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (ieșire) DQ = 0; // setați pinul # la scăzut (0) __delay_us (480); // 1 fir necesită întârziere DQ_TRIS = 1; // Tris = 1 (intrare) __delay_us (60); // 1 fir necesită întârziere dacă (DQ == 0) // dacă există o prezență {__delay_us (480); retur 0; // returnează 0 (1 fir este prezență)} else {__delay_us (480); retur 1; // returnează 1 (1 fir nu este prezență)}} // 0 = prezență, 1 = nu are parte
Acum, conform descrierii intervalului de timp de mai jos, utilizată în Citire și Scriere, am creat funcția de citire și scriere , respectiv.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // trageți DQ jos pentru a începe intervalul de timp DQ_TRIS = 1; DQ = 1; // apoi reveniți mare pentru (i = 0; i <3; i ++); // întârziere 15us de la începutul returnării intervalului de timp (DQ); // returnează valoarea liniei DQ} void write_bit (bit bitval) {DQ_TRIS = 0; DQ = 0; // trageți DQ jos pentru a începe intervalul de timp dacă (bitval == 1) DQ = 1; // returnează DQ high dacă scrie 1 __delay_us (5); // țineți valoarea pentru restul intervalului de timp DQ_TRIS = 1; DQ = 1; } // Întârzierea oferă 16us pe buclă, plus 24us. Prin urmare întârziere (5) = 104us
Verificați în continuare toate anteturile și fișierele.c aici.
Deci, așa putem folosi senzorul DS18B20 pentru a obține temperatura cu microcontrolerul PIC.
Dacă doriți să construiți un termometru digital simplu cu LM35, verificați mai jos proiectele cu alte microcontrolere:
- Măsurarea temperaturii camerei cu Raspberry Pi
- Termometru digital folosind Arduino și LM35
- Termometru digital folosind LM35 și 8051
- Măsurarea temperaturii utilizând microcontrolerul LM35 și AVR