- Nepieciešamās sastāvdaļas: -
- DS18B20 temperatūras sensors:
- Shēmas shēma: -
- Soļi vai kodu plūsma: -
- Koda skaidrojums:
- Datu iegūšana no DS18B20 temperatūras sensora:
Parasti temperatūras mērīšanai LM35 temperatūras sensoru izmanto ar mikrokontrolleriem, jo tas ir lēts un viegli pieejams. Bet LM35 dod analogās vērtības, un mums tās jāpārvērš ciparos, izmantojot ADC (Analog to Digital Converter). Bet šodien mēs izmantojam DS18B20 temperatūras sensoru, kurā mums nav nepieciešama ADC pārveidošana, lai iegūtu temperatūru. Temperatūras mērīšanai šeit izmantosim PIC mikrokontrolleru ar DS18B20.
Tātad šeit mēs veidojam termometru ar šādu specifikāciju, izmantojot PIC16F877A mikrokontrolleru bloku no mikroshēmas.
- Tas parādīs pilnu temperatūras diapazonu no -55 grādiem līdz +125 grādiem.
- Temperatūra tiks rādīta tikai tad, ja temperatūra mainīsies + / -.2 grādi.
Nepieciešamās sastāvdaļas: -
- Pic16F877A - PDIP40 pakete
- Maizes dēlis
- Pikets-3
- 5V adapteris
- LCD JHD162A
- DS18b20 temperatūras sensors
- Vadi perifērijas ierīču savienošanai.
- 4.7k rezistori - 2gab
- 10k katls
- 20mHz kristāls
- 2 gab 33pF keramikas kondensatori
DS18B20 temperatūras sensors:
DS18B20 ir lielisks sensors, lai precīzi noteiktu temperatūru. Šis sensors nodrošina temperatūras sensora izšķirtspēju no 9 līdz 12 bitiem. Šis sensors sazinās tikai ar vienu vadu, un tam nav nepieciešams ADC, lai iegūtu analogo temperatūru un pārveidotu tās digitāli.
Sensora specifikācija ir: -
- Mēra temperatūru no -55 ° C līdz + 125 ° C (-67 ° F līdz + 257 ° F)
- ± 0,5 ° C precizitāte no -10 ° C līdz + 85 ° C
- Programmējama izšķirtspēja no 9 līdz 12 bitiem
- Ārējie komponenti nav nepieciešami
- Sensors izmanto 1-Wire® interfeisu
Ja mēs aplūkosim iepriekš redzamo attēlu no datu lapas, mēs varam redzēt, ka sensors izskatās tieši tāds pats kā BC547 vai BC557 pakete TO-92. Pirmais tapa ir Ground, otrais pin ir DQ vai dati, bet trešais pin ir VCC.
Zemāk ir elektriskā specifikācija no datu lapas, kas būs nepieciešama mūsu projektēšanai. Sensora nominālais barošanas spriegums ir no + 3,0 V līdz + 5,5 V. Ir nepieciešams arī palielināt barošanas spriegumu, kas ir tāds pats kā iepriekš norādītais barošanas spriegums.
Ir arī precizitātes rezerve, kas ir -0,5 grādi pēc Celsija diapazonā no -10 grādiem C līdz +85 grādiem pēc Celsija, un precizitāte mainās pilnā diapazonā, kas ir + -2 grādi temperatūrai -55 grādi līdz + 125 grādu diapazons.
Ja mēs vēlreiz aplūkosim datu lapu, mēs redzēsim sensora savienojuma specifikāciju. Mēs varam savienot sensoru parazitārā enerģijas režīmā, kur nepieciešami divi vadi, DATA un GND, vai arī mēs varam savienot sensoru, izmantojot ārēju barošanas avotu, kur nepieciešami trīs atsevišķi vadi. Mēs izmantosim otro konfigurāciju.
Tā kā mēs tagad esam iepazinušies ar sensora jaudas rādītājiem un ar savienojumu saistītajiem apgabaliem, tagad mēs varam koncentrēties uz shēmas izveidošanu.
Shēmas shēma: -
Ja mēs redzam shēmu, mēs redzēsim, ka: -
16x2 rakstzīmju LCD ir savienots ar PIC16F877A mikrokontrolleru, kurā RB0, RB1, RB2 ir savienoti ar LCD kontaktiem RS, R / W un E. Un RB4, RB5, RB6 un RB7 ir savienoti ar LCD 4 kontaktu D4, D5, D6, D7. LCD ir savienots 4 bitu vai kniebiena režīmā.
20MHz kristāla oscilators ar diviem keramikas kondensatoriem 33pF ir savienots pāri OSC1 un OSC2 tapām. Tas mikrokontrollerim nodrošinās nemainīgu 20Mhz pulksteņa frekvenci.
DS18B20 ir savienots arī atbilstoši tapu konfigurācijai un ar 4,7 k lielu pretestību, kā tika apspriests iepriekš. To visu es esmu savienojis maizes dēlī.
Ja PIC mikrokontrolieris jums ir jauns, tad ievērojiet mūsu PIC mikrokontrolleru apmācības, kurās norādīts, kā sākt darbu ar PIC mikrokontrolleru.
Soļi vai kodu plūsma: -
- Iestatiet mikrokontrollera konfigurācijas, kas ietver oscilatora konfigurāciju.
- Iestatiet LCD vēlamo portu, ieskaitot TRIS reģistru.
- Katrs cikls ar ds18b20 sensoru sākas ar atiestatīšanu, tāpēc mēs atiestatīsim ds18b20 un gaidīsim klātbūtnes impulsu.
- Uzrakstiet kasetni un iestatiet sensora izšķirtspēju 12 bitu.
- Izlaidiet lasīto ROM, kam seko atiestatīšanas impulss.
- Iesniedziet komandu Konvertēt temperatūru.
- Izlasiet temperatūru no skrāpēšanas paneļa.
- Pārbaudiet, vai temperatūras vērtība ir negatīva vai pozitīva.
- Drukājiet temperatūru uz 16x2 LCD.
- Pagaidiet temperatūras izmaiņas +/-. 20 grādus pēc Celsija.
Koda skaidrojums:
Pilns šī digitālā termometra kods ir norādīts šīs apmācības beigās ar demonstrācijas video. Lai palaistu šo programmu, jums būs nepieciešami daži galvenes faili, kurus var lejupielādēt šeit.
Pirmkārt, mums ir jāiestata konfigurācijas biti pic mikrokontrollerī un pēc tam jāsāk ar tukšu galveno funkciju.
Tad turpmāk četras līnijas tiek izmantoti arī bibliotēkas header failu, lcd.h un ds18b20.h . Un xc.h ir paredzēts mikrokontrolleru galvenes failam.
# iekļaut
Šīs definīcijas tiek izmantotas komandu nosūtīšanai temperatūras sensoram. Komandas ir norādītas sensora datu lapā.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Šajā sensora datu lapas 3. tabulā ir parādītas visas komandas, kurās makro tiek izmantoti, lai nosūtītu attiecīgās komandas.
Temperatūra ekrānā tiks parādīta tikai tad, ja temperatūra mainīsies +/- .20 grādu. Mēs varam mainīt šo temperatūras starpību no šī temp_gap makro. Mainot vērtību šajā makro, specifikācija tiks mainīta.
Citi divi mainīgie mainīgie, kurus izmanto parādīto temperatūras datu glabāšanai un diferencē tos ar temperatūras starpību
#define temp_gap 20 pludiņš pre_val = 0, pakaļējais_val = 0;
In spēku Main () funkciju, lcd_init () ; ir LCD inicializācijas funkcija. Šo funkciju lcd_init () izsauc no bibliotēkas lcd.h.
TRIS reģistrus izmanto, lai izvēlētos I / O tapas kā ieeju vai izvadi. Divi neparakstīti īsi mainīgi TempL un TempH tiek izmantoti 12 bitu izšķirtspējas datu glabāšanai no temperatūras sensora.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; neparakstīts īss TempL, TempH; neparakstīts int t, t2; pludiņa starpība1 = 0, starpība2 = 0; lcd_init ();
Apskatīsim kamēr cilpu, šeit mēs sadalām cilpu while (1) mazos gabaliņos.
Šīs līnijas tiek izmantotas, lai noteiktu, vai temperatūras sensors ir pievienots vai nav.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Lūdzu, izveidojiet savienojumu"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Izmantojot šo koda segmentu, mēs inicializējam sensoru un nosūtām komandu, lai pārveidotu temperatūru.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); rakstāmbaits (0); rakstāmbaits (0); write_byte (izšķirtspēja_12bit); // 12 bitu izšķirtspēja ow_reset (); write_byte (izlaist_rom); write_byte (konvertēt_temp);
Šis kods ir paredzēts 12 bitu temperatūras datu glabāšanai divos neparakstītos īsajos mainīgajos.
while (lasāmbaits () == 0xff); __kavēšanās_ms (500); ow_reset (); write_byte (izlaist_rom); write_byte (lasīt_skrāpējumu paliktni); TempL = lasāmbaits (); TempH = lasāmbaits ();
Tad, ja jūs pārbaudīsit pilnu kodu zemāk, mums ir jāizveido nosacījums if-else, lai uzzinātu, vai temperatūras zīme ir pozitīva vai negatīva.
Izmantojot If paziņojuma kodu, mēs manipulējam ar datiem un redzam, vai temperatūra ir negatīva vai nē, un nosakām, vai temperatūras izmaiņas ir +/-, 20 grādu diapazonā vai nē. Un cits daļā mēs pārbaudījām, vai temperatūra ir pozitīvs vai nē, un temperatūras izmaiņas atklāšanu.
kods
Datu iegūšana no DS18B20 temperatūras sensora:
Apskatīsim 1-Wire® interfeisa laika starpību. Mēs izmantojam 20Mhz Crystal. Ja ieskatīsimies failā ds18b20.c, mēs to redzēsim
#define _XTAL_FREQ 20000000
Šī definīcija tiek izmantota XC8 kompilatora aizkavēšanās rutīnai. 20Mhz ir iestatīts kā kristāla frekvence.
Mēs veicām piecas funkcijas
- ow_reset
- lasīt_bit
- lasīt baitu
- write_bit
- write_byte
1-Wire ® protokolam ir nepieciešami stingri laika ierobežojumi, lai sazinātos. Datu lapas iekšpusē mēs iegūsim perfektu informāciju par laika nišu.
Zemāk esošajā funkcijā mēs izveidojām precīzu laika nišu. Ir svarīgi izveidot precīzu aizturi attiecīgā sensora porta TRIS bitu turēšanai un atlaišanai un kontrolei.
neparakstīts char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (izeja) DQ = 0; // iestatiet tapu # uz zemu (0) __delay_us (480); // 1 vads prasa laika aizkavi DQ_TRIS = 1; // Tris = 1 (ievade) __kavēšanās_us (60); // 1 vads prasa laika aizkavi, ja (DQ == 0) //, ja ir klātbūtnes plus {__delay_us (480); atgriešanās 0; // atgriezt 0 (1-vads ir klātbūtne)} cits {__delay_us (480); atgriezties 1; // atgriezties 1 (1 vads NAV klātbūtne)}} // 0 = klātbūtne, 1 = nav daļas
Tagad saskaņā ar zemāk redzamo laika nišu aprakstu, kas izmantots lasīšanas un rakstīšanas procesā, mēs attiecīgi izveidojām lasīšanas un rakstīšanas funkciju.
neparakstīta char read_bit (void) {neparakstīta char i; DQ_TRIS = 1; DQ = 0; // velciet DQ zemu, lai sāktu laika nišu DQ_TRIS = 1; DQ = 1; // tad atgriezieties augstu par (i = 0; i <3; i ++); // aizkavēt 15us no laika grafika atgriešanās sākuma (DQ); // atgriež DQ līnijas vērtību} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // velciet DQ zemu, lai sāktu laika joslu if (bitval == 1) DQ = 1; // atgriež DQ augstu, ja raksti 1 __delay_us (5); // aizturēt vērtību atlikušajā laika daļā DQ_TRIS = 1; DQ = 1; } // Kavēšanās nodrošina 16us vienā cilpā, plus 24us. Tāpēc kavēšanās (5) = 104us
Šeit pārbaudiet visus saistītos galvenes un.c failus.
Tādējādi mēs varam izmantot DS18B20 sensoru, lai iegūtu temperatūru ar PIC mikrokontrolleru.
Ja vēlaties izveidot vienkāršu digitālo termometru ar LM35, pārbaudiet zemāk esošos projektus ar citiem mikrokontrolleriem:
- Telpas temperatūras mērīšana ar Aveņu Pi
- Digitālais termometrs, izmantojot Arduino un LM35
- Digitālais termometrs, izmantojot LM35 un 8051
- Temperatūras mērīšana, izmantojot LM35 un AVR mikrokontrolleru