- Potrebne komponente: -
- DS18B20 temperaturni senzor:
- Shema vezja: -
- Koraki ali pretok kode: -
- Razlaga kode:
- Pridobivanje podatkov iz temperaturnega senzorja DS18B20:
Na splošno se temperaturni senzor LM35 uporablja z mikrokrmilniki za merjenje temperature, ker je poceni in lahko dostopen. Toda LM35 daje analogne vrednosti in jih moramo pretvoriti v digitalne z uporabo ADC (Analog to Digital Converter). Danes pa uporabljamo temperaturni senzor DS18B20, pri katerem za dosego temperature ne potrebujemo pretvorbe ADC. Tu bomo za merjenje temperature uporabili mikrokrmilnik PIC z DS18B20.
Torej, tu gradimo termometer z naslednjo specifikacijo z uporabo mikrokrmilne enote PIC16F877A iz mikročipa.
- Prikazal bo celoten temperaturni razpon od -55 do +125 stopinj.
- Temperatura bo prikazana samo, če se temperatura spremeni + / -.2 stopinje.
Potrebne komponente: -
- Pic16F877A - paket PDIP40
- Odbor za kruh
- Pickit-3
- 5V adapter
- LCD JHD162A
- DS18b20 temperaturni senzor
- Žice za povezavo zunanjih naprav.
- 4.7k upori - 2 kos
- 10k lonec
- 20mHz kristal
- 2 kosa 33pF keramičnih kondenzatorjev
DS18B20 temperaturni senzor:
DS18B20 je odličen senzor za natančno zaznavanje temperature. Ta senzor zagotavlja zaznavanje temperature od 9 do 12 bitov. Ta senzor komunicira samo z eno žico in ne potrebuje nobenega ADC za pridobivanje analognih temperatur in njihovo digitalno pretvorbo.
Specifikacija senzorja je: -
- Izmeri temperature od -55 ° C do + 125 ° C (-67 ° F do + 257 ° F)
- ± 0,5 ° C Natančnost od -10 ° C do + 85 ° C
- Programabilna ločljivost od 9 do 12 bitov
- Zunanje komponente niso potrebne
- Senzor uporablja 1-Wire® vmesnik
Če pogledamo zgornjo sliko iz podatkovnega lista, lahko vidimo, da je senzor videti popolnoma enako kot BC547 ali BC557 paket TO-92. Prvi zatič je ozemljen, drugi zatič je DQ ali podatki in tretji zatič je VCC.
Spodaj je električna specifikacija iz podatkovnega lista, ki bo potrebna za našo zasnovo. Nazivna napajalna napetost senzorja je od + 3,0 V do + 5,5 V. Prav tako je treba povleči napajalno napetost, ki je enaka zgoraj navedeni napajalni napetosti.
Obstaja tudi meja natančnosti, ki je + -0,5 stopinje Celzija za območje od -10 stopinj C do +85 stopinj Celzija, natančnost pa se spreminja za mejo celotnega območja, ki je + -2 stopinje za -55 stopinj Celzija Območje 125 stopinj.
Če ponovno pogledamo podatkovni list, bomo videli specifikacijo povezave senzorja. Senzor lahko priključimo v načinu parazitskega napajanja, kjer sta potrebni dve žici, DATA in GND, ali pa senzor priključimo z zunanjim napajalnikom, kjer so potrebne tri ločene žice. Uporabili bomo drugo konfiguracijo.
Ker smo zdaj seznanjeni z nazivno močjo senzorja in področji povezave, se lahko zdaj osredotočimo na izdelavo sheme.
Shema vezja: -
Če vidimo diagram vezja, bomo videli, da:
LCD s 16 x 2 znaki je povezan prek mikrokrmilnika PIC16F877A, v katerem so RB0, RB1, RB2 priključeni na pin LCD RS, R / W in E. In RB4, RB5, RB6 in RB7 so povezani prek 4-polnega LCD-ja D4, D5, D6, D7. LCD je povezan v 4-bitnem načinu ali načinu grizenja.
Kristalni oscilator 20MHz z dvema keramičnima kondenzatorjema po 33pF je povezan prek zatiča OSC1 in OSC2. Mikrokrmilniku bo zagotavljal stalno frekvenco ure 20 MHz.
DS18B20 je povezan tudi v skladu s konfiguracijo zatiča in s 4,7 k uporovnim uporom, kot smo že omenili. Vse to sem povezal v tabli.
Če ste nov v PIC Microcontrollerju, sledite našim Vadnicam za PIC Microcontroller, v katerih piše Uvod v PIC Microcontroller.
Koraki ali pretok kode: -
- Nastavite konfiguracije mikrokrmilnika, ki vključujejo oscilator.
- Nastavite želena vrata za LCD, vključno z registrom TRIS.
- Vsak cikel s senzorjem ds18b20 se začne s ponastavitvijo, zato bomo ponastavili ds18b20 in počakali na impulz prisotnosti.
- Napišite beležnico in nastavite ločljivost senzorja 12bit.
- Preskočite branje ROM-a, čemur sledi ponastavitveni impulz.
- Predložite ukaz za pretvorbo temperature.
- Odčitajte temperaturo s pisala.
- Preverite negativno ali pozitivno vrednost temperature.
- Natisnite temperaturo na LCD 16x2.
- Počakajte na temperaturne spremembe za +/-. 20 stopinj Celzija.
Razlaga kode:
Celotna koda tega digitalnega termometra je podana na koncu te vadnice z demonstracijskim videom. Za zagon tega programa boste potrebovali nekaj datotek z glavo, ki jih lahko prenesete od tukaj.
Najprej moramo v mikrokrmilniku pic nastaviti konfiguracijske bite in nato začeti z void main funkcijo.
Nato so spodaj štiri vrstice uporabljene za vključitev datoteke glave knjižnice, lcd.h in ds18b20.h . In xc.h je za glavo datoteke mikrokrmilnika.
#include
Te definicije se uporabljajo za pošiljanje ukaza na temperaturni senzor. Ukazi so navedeni v obrazcu senzorja.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Ta tabela 3 iz podatkovnega lista senzorja prikazuje vse ukaze, v katerih se makri uporabljajo za pošiljanje ustreznih ukazov.
Temperatura se na zaslonu prikaže samo, če se temperatura spremeni za +/- .20 stopinj. To temperaturno vrzel lahko spremenimo iz tega makra temp_gap . S spreminjanjem vrednosti tega makra bo spremenjena specifikacija.
Drugi dve spremenljivi spremenljivki, ki se uporabljata za shranjevanje prikazanih temperaturnih podatkov in njihovo razlikovanje s temperaturno vrzeljo
#define temp_gap 20 float pre_val = 0, aft_val = 0;
V void main () funkcija, lcd_init () ; je funkcija za inicializacijo LCD-ja. Ta funkcija lcd_init () je poklicana iz knjižnice lcd.h.
Registri TRIS se uporabljajo za izbiro V / I nožic kot vhodnih ali izhodnih. Dve nepodpisani kratki spremenljivki TempL in TempH se uporabljata za shranjevanje 12 - bitnih podatkov ločljivosti s temperaturnega senzorja.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; nepodpisana kratka TempL, TempH; nepodpisan int t, t2; plavajoča razlika1 = 0, razlika2 = 0; lcd_init ();
Poglejmo zanko while, tukaj lomimo zanko while (1) na majhne koščke.
Te črte se uporabljajo za zaznavanje, ali je temperaturni senzor povezan ali ne.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Prosimo, povežite se"); lcd_com (0xC0); lcd_puts ("Sonda Temp-Sense"); }
Z uporabo tega segmenta kode inicializiramo senzor in pošljemo ukaz za pretvorbo temperature.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); zapis_bajta (ločljivost_12bit); // 12-bitna ločljivost ow_reset (); zapis_bajta (preskoči_rom); write_byte (convert_temp);
Ta koda je namenjena shranjevanju 12-bitnih podatkov o temperaturi v dveh nepodpisanih kratkih spremenljivkah.
medtem ko (read_byte () == 0xff); __zakasnitev_ms (500); ow_reset (); zapis_bajta (preskoči_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Nato, če preverite celotno kodo spodaj, ustvarimo pogoj if-else, da ugotovimo, ali je znak temperature pozitiven ali negativen.
Z uporabo kode stavka If manipuliramo s podatki in ugotovimo, ali je temperatura negativna ali ne, in ugotovimo, da so temperaturne spremembe v območju +/-.20 stopinj ali ne. V drugem delu pa smo preverili, ali je temperatura pozitivna ali ne, in zaznavanje temperaturnih sprememb.
Koda
Pridobivanje podatkov iz temperaturnega senzorja DS18B20:
Poglejmo časovno vrzel vmesnika 1-Wire®. Uporabljamo 20 MHz kristal. Če pogledamo v datoteko ds18b20.c, bomo videli
#define _XTAL_FREQ 20000000
Ta definicija se uporablja za rutino zakasnitve prevajalnika XC8. Kot frekvenca kristala je nastavljena 20 MHz.
Naredili smo pet funkcij
- ow_reset
- branje_bit
- preberi_bajt
- write_bit
- write_byte
Za komunikacijo protokol 1-Wire ® potrebuje stroge časovne reže. V podatkovnem listu bomo dobili popolne informacije, povezane s časovnimi obdobji.
Znotraj spodnje funkcije smo ustvarili natančno časovno režo. Pomembno je, da ustvarite natančno zakasnitev za zadrževanje in spuščanje ter nadzorujete TRIS-bit ustreznih vrat senzorja.
nepodpisan char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (izhod) DQ = 0; // nastavimo pin # na low (0) __delay_us (480); // 1 žica zahteva časovno zakasnitev DQ_TRIS = 1; // Tris = 1 (vhod) __delay_us (60); // 1 žica zahteva časovno zakasnitev, če (DQ == 0) // če je prisotnost pluse {__delay_us (480); vrnitev 0; // vrnemo 0 (1-žica je prisotnost)} else {__delay_us (480); vrnitev 1; // vrnemo 1 (1-žica NI prisotnost)}} // 0 = prisotnost, 1 = brez dela
Zdaj v skladu s spodnjim opisom časovne reže, ki se uporablja za branje in pisanje, smo ustvarili funkcijo branja in pisanja .
nepodpisani znak read_bit (void) {nepodpisani znak i; DQ_TRIS = 1; DQ = 0; // povlecite DQ nizko, da začnete časovni interval DQ_TRIS = 1; DQ = 1; // nato vrnemo visoko za (i = 0; i <3; i ++); // zamik 15us od začetka vrnitve časovne reže (DQ); // vrnjena vrednost vrstice DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // povlecite DQ nizko, da začnete časovni interval, če (bitval == 1) DQ = 1; // vrnemo DQ visoko, če napišemo 1 __delay_us (5); // zadrži vrednost za preostanek časovnega intervala DQ_TRIS = 1; DQ = 1; } // Zamuda zagotavlja 16us na zanko in 24us. Zato je zakasnitev (5) = 104us
Nadalje preverite vse povezane glave in.c datoteke tukaj.
Tako lahko s senzorjem DS18B20 dosežemo temperaturo z mikrokrmilnikom PIC.
Če želite izdelati preprost digitalni termometer z LM35, si oglejte spodnje projekte z drugimi mikrokrmilniki:
- Merjenje sobne temperature z Raspberry Pi
- Digitalni termometer z uporabo Arduina in LM35
- Digitalni termometer z uporabo LM35 in 8051
- Merjenje temperature z mikrokrmilnikom LM35 in AVR