- Komponen yang Diperlukan: -
- Sensor Suhu DS18B20:
- Gambarajah litar: -
- Langkah atau aliran kod: -
- Penjelasan Kod:
- Mendapatkan Data dari Sensor Suhu DS18B20:
Secara amnya, sensor suhu LM35 digunakan dengan mikrokontroler untuk mengukur suhu kerana harganya murah dan mudah didapati. Tetapi LM35 memberikan nilai analog dan kita perlu mengubahnya menjadi digital menggunakan ADC (Analog to Digital Converter). Tetapi hari ini kita menggunakan sensor suhu DS18B20 di mana kita tidak memerlukan penukaran ADC untuk mendapatkan suhu. Di sini kita akan menggunakan PIC Microcontroller dengan DS18B20 untuk mengukur Suhu.
Jadi di sini kita sedang membina Thermometer dengan spesifikasi berikut menggunakan unit mikrokontroler PIC16F877A dari microchip.
- Ia akan menunjukkan suhu penuh dari -55 darjah hingga +125 darjah.
- Suhu hanya akan memaparkan jika suhu berubah + / -.2 darjah.
Komponen yang Diperlukan: -
- Pakej Pic16F877A - PDIP40
- Papan Roti
- Pickit-3
- Penyesuai 5V
- LCD JHD162A
- Sensor suhu DS18b20
- Wayar untuk menyambungkan periferal.
- Perintang 4.7k - 2 keping
- 10k periuk
- Kristal 20mHz
- Kapasitor seramik 2 pcs 33pF
Sensor Suhu DS18B20:
DS18B20 adalah sensor yang sangat baik untuk merasakan suhu dengan tepat. Sensor ini memberikan resolusi 9bit hingga 12bit pada penginderaan suhu. Sensor ini berkomunikasi hanya dengan satu wayar dan tidak memerlukan ADC untuk memperoleh suhu analog dan menukarnya secara digital.
Spesifikasi sensor adalah: -
- Mengukur Suhu dari -55 ° C hingga + 125 ° C (-67 ° F hingga + 257 ° F)
- ± 0.5 ° C Ketepatan dari -10 ° C hingga + 85 ° C
- Resolusi Boleh Diprogramkan dari 9 Bits hingga 12 Bits
- Tidak Perlu Komponen Luaran
- Sensor menggunakan Antaramuka 1-Wire®
Sekiranya kita melihat gambar pinout di atas dari lembar data, kita dapat melihat bahawa sensor kelihatan sama seperti pakej BC547 atau BC557, TO-92. Pin pertama adalah Ground, pin kedua adalah DQ atau data dan pin ketiga adalah VCC.
Berikut adalah spesifikasi elektrik dari Lembaran Data yang diperlukan untuk reka bentuk kami. Voltan bekalan yang dinilai untuk sensor adalah + 3.0V hingga + 5.5V. Ia juga memerlukan voltan bekalan yang sama seperti voltan bekalan yang dinyatakan di atas.
Juga, terdapat margin ketepatan yang + -0,5 darjah Celsius untuk julat -10 Darjah C hingga +85 Darjah Celsius, dan ketepatan berubah untuk margin julat penuh, yaitu + -2 Darjah untuk -55 Darjah hingga + Julat 125 darjah.
Sekiranya kita melihat kembali lembaran data, kita akan melihat spesifikasi sambungan sensor. Kita dapat menyambungkan sensor dalam mod daya parasit di mana dua wayar diperlukan, DATA dan GND, atau kita dapat menyambungkan sensor menggunakan bekalan kuasa luaran, di mana tiga wayar berasingan diperlukan. Kami akan menggunakan konfigurasi kedua.
Oleh kerana sekarang kita sudah biasa dengan penilaian daya dari sensor dan kawasan yang berkaitan dengan sambungan, kita sekarang dapat menumpukan perhatian pada pembuatan skematik.
Gambarajah litar: -
Sekiranya kita melihat gambarajah litar, kita akan melihat bahawa: -
LCD watak 16x2 disambungkan merentas mikrokontroler PIC16F877A, di mana RB0, RB1, RB2 disambungkan ke pin LCD RS, R / W, dan E. Dan RB4, RB5, RB6 dan RB7 disambungkan di 4 pin LCD D4, D5, D6, D7. LCD disambungkan dalam mod 4bit atau mod menggigit.
Oscillator kristal 20MHz dengan dua kapasitor seramik 33pF disambungkan merentasi pin OSC1 dan OSC2. Ia akan memberikan frekuensi jam 20Mhz berterusan kepada mikrokontroler.
DS18B20 juga dihubungkan mengikut konfigurasi pin dan dengan resistor tarik 4.7k seperti yang dibincangkan sebelumnya. Saya telah menghubungkan semua ini di papan roti.
Sekiranya anda baru menggunakan PIC Microcontroller daripada ikuti Tutorial PIC Microcontroller kami yang menyatakan dengan Bermula dengan PIC Microcontroller.
Langkah atau aliran kod: -
- Tetapkan konfigurasi mikrokontroler yang merangkumi konfigurasi Oscillator.
- Tetapkan port yang diinginkan untuk LCD termasuk daftar TRIS.
- Setiap kitaran dengan sensor ds18b20 dimulakan dengan reset, jadi kami akan menetapkan semula ds18b20 dan menunggu nadi kehadiran.
- Tulis pad calar dan tetapkan resolusi sensor 12bit.
- Langkau bacaan ROM diikuti dengan denyutan semula
- Kirim arahan menukar suhu.
- Baca suhu dari calar.
- Periksa nilai suhu sama ada negatif atau positif.
- Cetak suhu pada LCD 16x2.
- Tunggu perubahan suhu hingga +/-. 20 darjah Celsius.
Penjelasan Kod:
Kod penuh untuk Termometer Digital ini diberikan pada akhir tutorial ini dengan Video Demonstrasi. Anda akan memerlukan beberapa fail header untuk menjalankan program ini yang boleh dimuat turun dari sini.
Pertama, kita perlu menetapkan bit konfigurasi dalam mikrokontroler pic dan kemudian mulakan dengan fungsi utama batal .
Kemudian di bawah empat baris digunakan untuk memasukkan fail tajuk perpustakaan, lcd.h dan ds18b20.h . Dan xc.h adalah untuk fail tajuk mikrokontroler.
#sertakan
Definisi ini digunakan untuk menghantar arahan ke sensor suhu. Perintah disenaraikan dalam lembar data sensor.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
Jadual 3 ini dari lembar data sensor menunjukkan semua arahan di mana makro digunakan untuk menghantar perintah masing-masing.
Suhu hanya akan dipaparkan di layar jika suhu berubah +/- .20 darjah. Kita boleh mengubah jurang suhu ini dari makro temp_gap ini. Dengan mengubah nilai pada makro ini, spesifikasi akan diubah.
Dua pemboleh ubah apungan lain yang digunakan untuk menyimpan data suhu yang dipaparkan dan membezakannya dengan jurang suhu
#tentukan temp_gap 20 float pre_val = 0, aft_val = 0;
Dalam fungsi utama () tidak sah , lcd_init () ; adalah fungsi untuk memulakan LCD. Ini lcd_init () fungsi dipanggil dari lcd.h perpustakaan.
Daftar TRIS digunakan untuk memilih pin I / O sebagai input atau output. Dua variabel pendek yang tidak ditandatangani TempL dan TempH digunakan untuk menyimpan data resolusi 12bit dari sensor suhu.
kekosongan utama (kekosongan) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; TempL pendek yang tidak ditandatangani, TempH; int t, t2 yang tidak ditandatangani; perbezaan apungan1 = 0, perbezaan2 = 0; lcd_init ();
Mari kita lihat gelung sementara, di sini kita memecahkan gelung sementara (1) menjadi bahagian kecil.
Garis-garis tersebut digunakan untuk merasakan sensor suhu disambungkan atau tidak.
sementara (ow_reset ()) {lcd_com (0x80); lcd_puts ("Sila Sambungkan"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Dengan menggunakan segmen kod ini kita menginisialisasi sensor dan mengirim perintah untuk menukar suhu.
lcd_puts (""); ow_reset (); write_byte (tulis_scratchpad); tulis_byte (0); tulis_byte (0); write_byte (resolusi_12bit); // Resolusi 12bit ow_reset (); write_byte (skip_rom); write_byte (tukar_temp);
Kod ini adalah untuk menyimpan data suhu 12bit dalam dua pemboleh ubah pendek yang tidak ditandatangani.
sementara (read_byte () == 0xff); __delay_ms (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Kemudian jika anda menyemak kod lengkap di bawah, kami telah membuat syarat if-else untuk mengetahui tanda suhu sama ada positif atau negatif.
Dengan menggunakan kod pernyataan If , kami memanipulasi data dan melihat apakah suhu negatif atau tidak dan menentukan perubahan suhu berada dalam julat +/-.20 darjah atau tidak. Dan di bahagian lain kami memeriksa sama ada suhu positif atau tidak dan pengesanan perubahan suhu.
kod
Mendapatkan Data dari Sensor Suhu DS18B20:
Mari lihat jurang masa antara muka 1-Wire®. Kami menggunakan Crystal 20Mhz. Sekiranya kita melihat ke dalam fail ds18b20.c, kita akan melihat
#tentukan _XTAL_FREQ 20000000
Definisi ini digunakan untuk rutin penundaan penyusun XC8. 20Mhz ditetapkan sebagai frekuensi kristal.
Kami membuat lima fungsi
- ow_reset
- baca_bit
- baca_byte
- tulis_bit
- tulis_byte
Protokol 1-Wire ® memerlukan slot yang berkaitan dengan masa yang ketat untuk berkomunikasi. Di dalam lembar data, kami akan mendapat maklumat berkaitan slot masa yang sempurna.
Di dalam fungsi di bawah ini kami membuat slot masa yang tepat. Penting untuk membuat kelewatan tepat untuk menahan dan melepaskan dan mengawal bit TRIS dari port sensor masing-masing.
char ow_reset yang tidak ditandatangani (tidak sah) {DQ_TRIS = 0; // Tris = 0 (output) DQ = 0; // tetapkan pin # ke rendah (0) __delay_us (480); // 1 wayar memerlukan kelewatan masa DQ_TRIS = 1; // Tris = 1 (input) __delay_us (60); // 1 wayar memerlukan kelewatan masa jika (DQ == 0) // jika ada kehadiran pluse {__delay_us (480); pulangan 0; // kembali 0 (1-wayar ada)} lain {__delay_us (480); pulangan 1; // kembali 1 (1 wayar BUKAN kehadiran)}} // 0 = kehadiran, 1 = tiada bahagian
Sekarang seperti keterangan slot waktu di bawah yang digunakan dalam Baca dan Tulis, kami masing-masing membuat fungsi membaca dan menulis .
char_ unsigned read_bit (tidak sah) {char i yang tidak ditandatangani; DQ_TRIS = 1; DQ = 0; // tarik DQ rendah untuk memulakan slot waktu DQ_TRIS = 1; DQ = 1; // kemudian kembali tinggi untuk (i = 0; i <3; i ++); // kelewatan 15us dari permulaan pengembalian slot waktu (DQ); // mengembalikan nilai garis DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // tarik DQ rendah untuk memulakan slot waktu jika (bitval == 1) DQ = 1; // pulangkan DQ tinggi jika tulis 1 __delay_us (5); // tahan nilai untuk baki jangka masa DQ_TRIS = 1; DQ = 1; } // Kelewatan memberikan 16us setiap gelung, ditambah 24us. Oleh itu kelewatan (5) = 104us
Selanjutnya periksa semua fail header dan.c yang berkaitan di sini.
Jadi ini adalah bagaimana kita dapat menggunakan sensor DS18B20 untuk mendapatkan suhu dengan PIC Microcontroller.
Sekiranya anda ingin membina Termometer Digital sederhana dengan LM35, lihat projek di bawah dengan Pengawal Mikro lain:
- Pengukuran Suhu Bilik dengan Raspberry Pi
- Termometer Digital menggunakan Arduino dan LM35
- Termometer Digital menggunakan LM35 dan 8051
- Pengukuran Suhu menggunakan LM35 dan AVR Microcontroller