- Kinakailangan ang Mga Bahagi: -
- DS18B20 Temperatura Sensor:
- Diagram ng circuit: -
- Mga hakbang o daloy ng code: -
- Paliwanag sa Code:
- Pagkuha ng Data mula sa DS18B20 Temperature Sensor:
Pangkalahatan, ang sensor ng temperatura ng LM35 ay ginagamit sa mga microcontroller upang masukat ang temperatura sapagkat ito ay mura at madaling magagamit. Ngunit nagbibigay ang LM35 ng mga halagang analog at kailangan naming i-convert ang mga ito sa digital gamit ang ADC (Analog to Digital Converter). Ngunit ngayon gumagamit kami ng sensor ng temperatura ng DS18B20 kung saan hindi namin kailangan ng isang ADC conversion upang makuha ang temperatura. Dito ay gagamitin namin ang PIC Microcontroller sa DS18B20 upang masukat ang Temperatura.
Kaya dito nagtatayo kami ng isang Thermometer na may sumusunod na detalye na gumagamit ng PIC16F877A microcontroller unit mula sa microchip.
- Ipapakita nito ang Buong saklaw ng temperatura mula -55 degree hanggang +125 degree.
- Ipapakita lamang nito ang temperatura kung nagbago ang temperatura + / -.2 degree.
Kinakailangan ang Mga Bahagi: -
- Pic16F877A - Pakete ng PDIP40
- Lupon ng Tinapay
- Pitas-3
- 5V adapter
- LCD JHD162A
- Sensor ng temperatura ng DS18b20
- Mga wire upang ikonekta ang mga peripheral.
- 4.7k Resistors - 2pcs
- 10k palayok
- 20mHz Crystal
- 2 pcs 33pF ceramic capacitor
DS18B20 Temperatura Sensor:
Ang DS18B20 ay isang mahusay na sensor upang tumpak na maunawaan ang temperatura. Nagbibigay ang sensor na ito ng 9bit hanggang 12bit na resolusyon sa sensing ng temperatura. Ang sensor na ito ay nakikipag-usap sa isang wire lamang at hindi nangangailangan ng anumang ADC upang makakuha ng mga analog temperatura at pag-convert sa mga ito sa digital.
Ang pagtutukoy ng sensor ay: -
- Mga Sukat ng Temperatura mula -55 ° C hanggang + 125 ° C (-67 ° F hanggang + 257 ° F)
- ± 0.5 ° C Ganap na kawastuhan mula -10 ° C hanggang + 85 ° C
- Programmable Resolution mula 9 Bits hanggang 12 Bits
- Walang Kinakailangan na Panlabas na Mga Bahagi
- Gumagamit ang sensor ng 1-Wire® Interface
Kung titingnan natin ang imahe ng pinout sa itaas mula sa datasheet, makikita natin na ang sensor ay mukhang eksaktong kapareho tulad ng BC547 o BC557 package, TO-92. Ang unang pin ay Ground, Pangalawang pin ay DQ o ang data at ang Pangatlong pin ay VCC.
Sa ibaba ay ang pagtutukoy ng elektrikal mula sa Datasheet na kakailanganin para sa aming disenyo. Ang na-rate na boltahe ng suplay para sa sensor ay + 3.0V hanggang + 5.5V. Kailangan din ng hilahin ang boltahe ng suplay na kapareho ng boltahe ng suplay na nakasaad sa itaas.
Gayundin, mayroong isang margin ng katumpakan na + -0.5 degree Celsius para sa saklaw ng -10 Degree C hanggang +85 Degree Celsius, at ang mga pagbabago sa kawastuhan para sa buong saklaw na margin, na kung saan ay + -2 Degree para sa -55 Degree hanggang + Saklaw ng 125 degree.
Kung muli naming titingnan ang datasheet, makikita namin ang pagtutukoy ng koneksyon ng sensor. Maaari naming ikonekta ang sensor sa mode ng kapangyarihan ng parasitiko kung saan kailangan ang dalawang wires, DATA at GND, o maaari nating ikonekta ang sensor gamit ang panlabas na suplay ng kuryente, kung saan kinakailangan ang tatlong magkakahiwalay na mga wire. Gagamitin namin ang pangalawang pagsasaayos.
Dahil pamilyar tayo ngayon sa mga rating ng kuryente ng sensor at mga kaugnay na lugar ng koneksyon, maaari na kaming mag-concentrate sa paggawa ng eskematiko.
Diagram ng circuit: -
Kung nakikita natin ang circuit diagram makikita natin ito: -
Ang 16x2 character LCD ay konektado sa buong PIC16F877A microcontroller, kung saan ang RB0, RB1, RB2 ay konektado sa LCD pin RS, R / W, at E. At ang RB4, RB5, RB6 at RB7 ay konektado sa kabuuan ng 4 pin D4, D5, D6, ng LCD. D7. Ang LCD ay konektado sa 4bit mode o nibble mode.
Ang isang kristal na Oscillator na 20MHz na may dalawang ceramic capacitor ng 33pF ay konektado sa buong OSC1 at OSC2 pin. Magbibigay ito ng pare-parehong 20Mhz na dalas ng orasan sa microcontroller.
Ang DS18B20 ay konektado din ayon sa pagsasaayos ng pin at may 4.7k pull up risistor tulad ng tinalakay dati. Ang lahat ng ito ay nakakonekta ko sa breadboard.
Kung bago ka sa PIC Microcontroller kaysa sundin ang aming Mga Tutorial sa PIC Microcontroller na nagsasaad sa Pagsisimula sa PIC Microcontroller.
Mga hakbang o daloy ng code: -
- Itakda ang mga pagsasaayos ng microcontroller na kasama ang pagsasaayos ng Oscillator.
- Itakda ang nais na port para sa LCD kasama ang TRIS register.
- Ang bawat pag-ikot na may sensor ng ds18b20 ay nagsisimula sa pag-reset, kaya't ire-reset namin ang ds18b20 at hintayin ang presensya ng pulso.
- Isulat ang scratchpad at itakda ang resolusyon ng sensor 12bit.
- Laktawan ang nabasang ROM na sinusundan ng isang pag-reset ng pulso.
- Magsumite ng command ng pag-convert ng temperatura.
- Basahin ang temperatura mula sa simula.
- Suriin ang halaga ng temperatura kung negatibo o positibo.
- I-print ang temperatura sa 16x2 LCD.
- Maghintay para sa mga pagbabago sa temperatura para sa +/-. 20 degree Celsius.
Paliwanag sa Code:
Ang buong code para sa Digital Thermometer na ito ay ibinibigay sa pagtatapos ng tutorial na ito na may isang Demonstration Video. Kakailanganin mo ng ilang mga file ng header upang patakbuhin ang program na ito na maaaring ma-download mula dito.
Una, kailangan naming itakda ang mga config bit sa pic microcontroller at pagkatapos ay magsimula sa walang bisa na pangunahing pag- andar.
Pagkatapos sa ibaba ng apat na linya ay ginagamit para sa pagsasama ng file ng header ng library, lcd.h at ds18b20.h . At ang xc.h ay para sa file ng header ng microcontroller.
# isama
Ang mga kahulugan na ito ay ginagamit para sa pagpapadala ng utos sa sensor ng temperatura. Ang mga utos ay nakalista sa datasheet ng sensor.
#define skip_rom 0xCC #define convert_temp 0x44 #define wrote_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Ang Talahanayan 3 na ito mula sa datasheet ng sensor ay nagpapakita ng lahat ng mga utos kung saan ginagamit ang macros sa pagpapadala ng kani-kanilang mga utos.
Ipapakita lamang ang temperatura sa screen kung ang temperatura ay nagbago +/- .20 degree. Maaari nating baguhin ang agwat ng temperatura na ito mula sa temp_gap macro na ito. Sa pamamagitan ng pagbabago ng halaga sa macro na ito, mababago ang detalye.
Ang iba pang dalawang variable ng float na ginamit para sa pagtatago ng ipinakitang data ng temperatura at pag-iba-ibahin ang mga ito sa agwat ng temperatura
# tukuyin ang temp_gap 20 float pre_val = 0, aft_val = 0;
Sa void main () function, ang lcd_init () ; ay isang pagpapaandar upang simulan ang LCD. Ang pagpapaandar ng lcd_init () na ito ay tinawag mula sa lcd.h library.
Ginagamit ang mga rehistro ng TRIS upang piliin ang mga I / O na pin bilang input o output. Ang dalawang hindi pirmadong maikling variable na TempL at TempH ay ginagamit para sa pagtatago ng data ng resolusyon ng 12bit mula sa sensor ng temperatura.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; unsigned maikling TempL, TempH; unsigned int t, t2; pagkakaiba sa float1 = 0, pagkakaiba2 = 0; lcd_init ();
Tingnan natin ang habang loop, narito pinuputol natin ang habang (1) loop sa maliliit na chunks.
Ang mga linya na iyon ay ginagamit upang maunawaan ang temperatura sensor ay konektado o hindi.
habang (ow_reset ()) {lcd_com (0x80); lcd_puts ("Mangyaring Kumonekta"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Sa pamamagitan ng paggamit ng segment na ito ng code ay pinasimulan namin ang sensor at nagpapadala ng utos upang i-convert ang temperatura.
lcd_puts (""); ow_reset (); magsulat_byte (magsulat_scratchpad); write_byte (0); write_byte (0); write_byte (resolusyon_12bit); // 12bit resolution ow_reset (); write_byte (laktawan ang _mula); write_byte (convert_temp);
Ang code na ito ay para sa pagtatago ng data ng temperatura ng 12bit sa dalawang hindi naka-sign na maikling variable.
habang (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (laktawan ang _mula); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Pagkatapos kung suriin mo ang kumpletong code sa ibaba, gumawa kami ng kung-ibang kondisyon upang malaman ang tanda ng temperatura kung ito ba ay positibo o negatibo.
Sa pamamagitan ng paggamit ng Kung code ng pahayag, ginagamit namin ang data at makita kung negatibo ang temperatura o hindi at matukoy ang mga pagbabago sa temperatura ay nasa +/-.20 degree range o hindi. At sa ibang bahagi ay nasuri namin kung positibo ang temperatura o hindi at binago ng temperatura ang pagtuklas.
code
Pagkuha ng Data mula sa DS18B20 Temperature Sensor:
Tingnan natin ang agwat ng oras ng 1-Wire® Interface. Gumagamit kami ng 20Mhz Crystal. Kung titingnan natin ang loob ng ds18b20.c file, makikita natin
#define _XTAL_FREQ 20000000
Ang kahulugan na ito ay ginagamit para sa XC8 na gawain ng pagkaantala ng compiler. Ang 20Mhz ay itinakda bilang dalas ng kristal.
Gumawa kami ng limang pagpapaandar
- ow_reset
- read_bit
- basahin_byte
- sumulat_bit
- sumulat_byte
Ang 1-Wire ® na proteksyon ay nangangailangan ng mahigpit na mga puwang na nauugnay sa tiyempo upang makipag-usap. Sa loob ng datasheet, makakakuha kami ng perpektong impormasyon na nauugnay sa time-slot.
Sa loob ng pagpapaandar sa ibaba nilikha namin ang eksaktong puwang ng oras. Mahalaga na lumikha ng eksaktong pagkaantala para sa paghawak at paglabas at kontrolin ang TRIS na piraso ng port ng kani-kanilang sensor.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (output) DQ = 0; // set pin # to low (0) __delay_us (480); // 1 wire nangangailangan ng pagkaantala ng oras DQ_TRIS = 1; // Tris = 1 (input) __delay_us (60); // 1 wire nangangailangan ng pagkaantala ng oras kung (DQ == 0) // kung mayroong pagkakaroon ng plus pluse {__delay_us (480); ibalik ang 0; // return 0 (1-wire ay pagkakaroon)} iba pa {__delay_us (480); ibalik ang 1; // return 1 (1-wire ay HINDI pagkakaroon)}} // 0 = pagkakaroon, 1 = walang bahagi
Ngayon ayon sa paglalarawan ng slot ng oras sa ibaba na ginamit sa Basahin at Isulat, nilikha namin ang pagbasa at pagsulat ng pagpapaandar ayon sa pagkakabanggit.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // hilahin ang DQ mababa upang magsimula ng timeslot DQ_TRIS = 1; DQ = 1; // pagkatapos ay bumalik nang mataas para sa (i = 0; i <3; i ++); // antala ang 15us mula sa pagsisimula ng ulit na pagbalik (DQ); // return halaga ng linya ng DQ} walang bisa na write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // hilahin ang DQ mababa upang magsimula ng timeslot kung (bitval == 1) DQ = 1; // return DQ mataas kung isulat ang 1 __delay_us (5); // humahawak ng halaga para sa natitirang beses na timeslot DQ_TRIS = 1; DQ = 1; } // Nagbibigay ang pagkaantala ng 16us bawat loop, kasama ang 24us. Samakatuwid pagkaantala (5) = 104us
Dagdag na suriin ang lahat ng mga kaugnay na header at.c file dito.
Kaya't ito ay kung paano namin magagamit ang DS18B20 sensor upang makuha ang temperatura sa PIC Microcontroller.
Kung nais mong bumuo ng isang simpleng Digital Thermometer na may LM35, pag-checkout sa ibaba ng mga proyekto kasama ang iba pang mga Microcontroller:
- Pagsukat ng Temperatura sa Silid na may Raspberry Pi
- Digital Thermometer gamit ang Arduino at LM35
- Digital Thermometer gamit ang LM35 at 8051
- Pagsukat ng Temperatura gamit ang LM35 at AVR Microcontroller