- Reikalingi komponentai: -
- DS18B20 temperatūros jutiklis:
- Grandinės schema: -
- Veiksmai arba kodo eiga: -
- Kodo paaiškinimas:
- Gaunami duomenys iš DS18B20 temperatūros jutiklio:
Paprastai temperatūros jutiklis LM35 naudojamas temperatūros matavimui su mikrovaldikliais, nes jis yra pigus ir lengvai prieinamas. Bet LM35 pateikia analogines vertes ir mes turime jas konvertuoti į skaitmenines, naudodami ADC (Analog to Digital Converter). Bet šiandien mes naudojame DS18B20 temperatūros jutiklį, kuriame mums nereikia ADC konversijos, kad gautume temperatūrą. Temperatūrai matuoti naudosime PIC mikrovaldiklį su DS18B20.
Taigi, čia mes statome termometrą su tokia specifikacija, naudodami PIC16F877A mikrovaldiklio bloką iš mikroschemos.
- Tai rodys visą temperatūros diapazoną nuo -55 laipsnių iki +125 laipsnių.
- Temperatūra bus rodoma tik tada, jei temperatūra pasikeis + / -.2 laipsnių.
Reikalingi komponentai: -
- „Pic16F877A“ - PDIP40 paketas
- Bandomoji Lenta
- „Pickit-3“
- 5V adapteris
- Skystųjų kristalų ekranas JHD162A
- DS18b20 temperatūros jutiklis
- Laidai periferiniams įrenginiams prijungti.
- 4.7k rezistoriai - 2vnt
- 10 tūkst. Puodo
- 20mHz kristalas
- 2 vnt keraminiai kondensatoriai 33pF
DS18B20 temperatūros jutiklis:
DS18B20 yra puikus jutiklis, kuris tiksliai nustato temperatūrą. Šis jutiklis užtikrina 9–12 bitų skiriamąją gebą jutant temperatūrą. Šis jutiklis bendrauja tik su vienu laidu ir jam nereikia jokio ADC, kad gautų analoginę temperatūrą ir paverstų ją skaitmeniniu būdu.
Jutiklio specifikacija yra: -
- Matuoja temperatūrą nuo -55 ° C iki + 125 ° C (-67 ° F iki + 257 ° F)
- ± 0,5 ° C Tikslumas nuo -10 ° C iki + 85 ° C
- Programuojama skiriamoji geba nuo 9 iki 12 bitų
- Išorinių komponentų nereikia
- Jutiklis naudoja „1-Wire®“ sąsają
Jei pažvelgsime į aukščiau pateiktą vaizdą iš duomenų lapo, galime pamatyti, kad jutiklis atrodo visiškai toks pat kaip BC547 ar BC557 paketas, TO-92. Pirmasis kaištis yra įžemintas, antrasis kaištis yra DQ arba duomenys, o trečiasis kaištis yra VCC.
Žemiau pateikiama elektros specifikacija iš duomenų lapo, kuri bus reikalinga mūsų projektui. Nominali jutiklio maitinimo įtampa yra nuo + 3,0 V iki + 5,5 V. Taip pat reikia padidinti maitinimo įtampą, kuri yra tokia pati kaip aukščiau nurodyta maitinimo įtampa.
Taip pat yra tikslumo riba, kuri yra –0,5 laipsnio Celsijaus, esant diapazonui nuo –10 laipsnių C iki +85 laipsnių Celsijaus, o tikslumo kaita keičiasi visos diapazono ribos, kuri yra + -2 laipsniai, kai –55 laipsnių iki + 125 laipsnių diapazonas.
Jei dar kartą pažvelgsime į duomenų lapą, pamatysime jutiklio prijungimo specifikaciją. Jutiklį galime prijungti parazitinės energijos režimu, kai reikia dviejų laidų - DATA ir GND, arba galime prijungti jutiklį naudodami išorinį maitinimo šaltinį, kur reikia trijų atskirų laidų. Mes naudosime antrąją konfigūraciją.
Kadangi dabar esame susipažinę su jutiklio galingumu ir su jungtimi susijusiose srityse, dabar galime sutelkti dėmesį į schemos kūrimą.
Grandinės schema: -
Jei pamatysime schemą, pamatysime, kad: -
16x2 simbolių skystųjų kristalų ekranas yra prijungtas prie PIC16F877A mikrovaldiklio, kuriame RB0, RB1, RB2 yra prijungti prie LCD kaiščių RS, R / W ir E. D7. Skystųjų kristalų ekranas yra prijungtas 4 bitų arba nibble režimu.
20MHz kristalinis osciliatorius su dviem keraminiais 33pF kondensatoriais yra sujungtas per OSC1 ir OSC2 kaiščius. Tai mikrokontroleriui užtikrins pastovų 20 MHz taktinį dažnį.
DS18B20 taip pat yra prijungtas pagal kaiščių konfigūraciją ir su 4,7 k traukimo rezistoriumi, kaip aptarta anksčiau. Aš visa tai sujungiau duonos lentoje.
Jei dar nesinaudojote „PIC“ mikrovaldikliu, vadovaukitės mūsų „PIC“ mikrovaldiklio vadovėliais, kuriuose nurodyta „Pradėti naudoti„ PIC “mikrovaldiklį.
Veiksmai arba kodo eiga: -
- Nustatykite mikrovaldiklio konfigūracijas, į kurias įeina osciliatoriaus konfigūracija.
- Nustatykite norimą LCD prievadą, įskaitant TRIS registrą.
- Kiekvienas ciklas su ds18b20 jutikliu prasideda iš naujo, todėl mes iš naujo nustatysime ds18b20 ir lauksime, kol bus buvimo impulsas.
- Parašykite įbrėžinį ir nustatykite 12bit jutiklio skiriamąją gebą.
- Praleiskite skaitytą ROM, o po to - iš naujo pulsą.
- Pateikite komandą konvertuoti temperatūrą.
- Perskaitykite temperatūrą iš nulio.
- Patikrinkite, ar neigiama ar teigiama temperatūros vertė.
- Spausdinkite temperatūrą 16x2 LCD ekrane.
- Palaukite, kol temperatūra pasikeis +/-. 20 laipsnių Celsijaus.
Kodo paaiškinimas:
Visas šio skaitmeninio termometro kodas pateikiamas šios pamokos pabaigoje su demonstraciniu vaizdo įrašu. Norėdami paleisti šią programą, jums reikės kelių antraštės failų, kuriuos galite atsisiųsti iš čia.
Pirma, mes turime nustatyti konfigūracijos bitus pic mikrovaldiklyje ir tada pradėti nuo negaliojančios pagrindinės funkcijos.
Tada žemiau keturios eilutės yra naudojamos įskaitant bibliotekos antraštės failą, lcd.h ir ds18b20.h . Ir xc.h yra mikrovaldiklis antraštės faile.
# įtraukti
Šie apibrėžimai naudojami komandai siųsti temperatūros jutikliui. Komandos yra išvardytos jutiklio duomenų lape.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Šioje 3 lentelėje iš jutiklio duomenų lapo rodomos visos komandos, kuriose makrokomandos naudojamos atitinkamoms komandoms siųsti.
Temperatūra ekrane bus rodoma tik tada, jei temperatūra pasikeis +/- .20 laipsnių. Mes galime pakeisti šį temperatūros skirtumą iš šios temp_gap makrokomandos. Pakeitus šios makrokomandos vertę, specifikacija bus pakeista.
Kiti du kintamieji kintamieji, naudojami rodomiems temperatūros duomenims saugoti ir diferencijuojami pagal temperatūros tarpą
#define temp_gap 20 plūduriuojantis pre_val = 0, aft_val = 0;
Be void main () funkciją, lcd_init () ; yra funkcija inicijuoti LCD ekraną. Ši funkcija lcd_init () iškviečiama iš bibliotekos lcd.h.
TRIS registrai naudojami įvesties ar išvesties įvesties / išvesties kaiščiams pasirinkti. Du neprisirašę trumpieji kintamieji „ TempL“ ir „ TempH“ naudojami saugant 12 bitų skiriamosios gebos duomenis iš temperatūros jutiklio.
negaliojantis pagrindinis (negaliojantis) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; nepasirašytas trumpas TempL, TempH; nepasirašytas int t, t2; plūduriuojantis skirtumas1 = 0, skirtumas2 = 0; lcd_init ();
Pažiūrėkime „while“ kilpą, čia mes suskaidome „ while“ (1) kilpą į mažus gabalėlius.
Tos linijos naudojamos temperatūros jutikliui prijungti ar ne.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Prašau prisijungti"); lcd_com (0xC0); lcd_puts ("Temp-Sense Zondas"); }
Naudodami šį kodo segmentą, mes inicijuojame jutiklį ir siunčiame komandą temperatūrai konvertuoti.
lcd_puts (""); ow_reset (); rašymo_baitas (rašymo_braižas); rašymo_baitas (0); rašymo_baitas (0); rašymo_baitas (skiriamoji geba 12 bitų); // 12 bitų skyra ow_reset (); write_byte (praleisti_rom); rašymo_baitas (konvertuoti_temp);
Šis kodas skirtas 12 bitų temperatūros duomenims saugoti dviem nepasirašytais trumpaisiais kintamaisiais.
while (skaitymo_baitas () == 0xff); __delay_ms (500); ow_reset (); write_byte (praleisti_rom); rašymo_baitas (skaitymo_braižymas); TempL = skaitymo baitas (); TempH = skaitymo baitas ();
Tada, jei patikrinsite visą žemiau esantį kodą, mes sukursime sąlygą „if-else“, kad sužinotume, ar temperatūros ženklas yra teigiamas, ar neigiamas.
Naudodami teiginio „ If“ kodą, mes tvarkome duomenis ir matome, ar temperatūra yra neigiama, ar ne, ir nustatome, ar temperatūros pokyčiai yra +/-, 20 laipsnių diapazone, ar ne. Ir kita dalis mes patikrinti, ar temperatūra yra teigiama, ar ne, ir temperatūra keičiasi aptikimo.
kodas
Gaunami duomenys iš DS18B20 temperatūros jutiklio:
Pažiūrėkime, koks yra „1-Wire®“ sąsajos laiko tarpas. Mes naudojame 20 MHz kristalą. Jei pažvelgsime į ds18b20.c failo vidų, pamatysime
#define _XTAL_FREQ 20000000
Šis apibrėžimas naudojamas XC8 kompiliatoriaus uždelsimo rutinai. 20Mhz nustatytas kaip kristalo dažnis.
Mes atlikome penkias funkcijas
- ow_reset
- skaityti_bit
- skaityti baitu
- write_bit
- write_byte
„1-Wire ®“ protokolui bendrauti reikalingi griežti su laiku susiję laiko tarpsniai. Duomenų lape gausime puikią su laiko tarpais susijusią informaciją.
Žemiau esančioje funkcijoje sukūrėme tikslų laiko tarpą. Svarbu sukurti tikslią atitinkamo jutiklio prievado TRIS bitų palaikymo ir atleidimo bei valdymo delsą.
nepasirašytas char ow_reset (negaliojantis) {DQ_TRIS = 0; // Tris = 0 (išvestis) DQ = 0; // nustatyti PIN kodą į žemą (0) __delay_us (480); // 1 laidas reikalauja laiko atidėjimo DQ_TRIS = 1; // Tris = 1 (įvestis) __delay_us (60); // 1 laidas reikalauja laiko atidėjimo, jei (DQ == 0) //, jei yra buvimo pliusas {__delay_us (480); grąžinti 0; // grąžinti 0 (1 laidas yra buvimas)} else {__delay_us (480); grąžinti 1; // grąžinti 1 (1 laidas NĖRA)}} // 0 = buvimas, 1 = nėra dalies
Dabar pagal toliau pateiktą laiko tarpo aprašą, naudojamą skaitymo ir rašymo metu, mes sukūrėme atitinkamai skaitymo ir rašymo funkciją.
nepasirašyta char read_bit (negaliojanti) {nepasirašyta char i; DQ_TRIS = 1; DQ = 0; // patraukite DQ žemai, kad pradėtumėte laiko tarpą DQ_TRIS = 1; DQ = 1; // tada grįžkite į aukštą (i = 0; i <3; i ++); // atidėkite 15us laiko tarpo grąžinimo pradžią (DQ); // grąžina DQ eilutės vertę} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // traukite DQ žemą, kad pradėtumėte laiko intervalą if (bitval == 1) DQ = 1; // grąžink aukštą DQ, jei parašysi 1 __delay_us (5); // sulaikyti reikšmę likusiam laiko tarpui DQ_TRIS = 1; DQ = 1; } // Vėlavimas suteikia 16us vienai linijai ir 24us. Todėl vėlavimas (5) = 104us
Čia dar patikrinkite visus susijusius antraštės ir.c failus.
Taigi tokiu būdu mes galime naudoti DS18B20 jutiklį, kad gautume temperatūrą su PIC mikrovaldikliu.
Jei norite sukurti paprastą skaitmeninį termometrą su LM35, patikrinkite toliau pateiktus projektus su kitais mikrovaldikliais:
- Kambario temperatūros matavimas naudojant avietę Pi
- Skaitmeninis termometras naudojant „Arduino“ ir LM35
- Skaitmeninis termometras naudojant LM35 ir 8051
- Temperatūros matavimas naudojant LM35 ir AVR mikrovaldiklį