- Komponen yang Dibutuhkan: -
- Sensor Suhu DS18B20:
- Diagram sirkuit: -
- Langkah-langkah atau alur kode: -
- Penjelasan Kode:
- Mendapatkan Data dari Sensor Suhu DS18B20:
Umumnya sensor suhu LM35 digunakan dengan mikrokontroler untuk mengukur suhu karena murah dan mudah didapat. Tetapi LM35 memberikan nilai analog dan kita perlu mengubahnya menjadi digital menggunakan ADC (Analog to Digital Converter). Tetapi hari ini kami menggunakan sensor suhu DS18B20 di mana kami tidak memerlukan konversi ADC untuk mendapatkan suhu. Di sini kita akan menggunakan Mikrokontroler PIC dengan DS18B20 untuk mengukur Temperatur.
Jadi disini kita sedang membangun Termometer dengan spesifikasi sebagai berikut menggunakan unit mikrokontroler PIC16F877A dari microchip.
- Ini akan menunjukkan kisaran penuh suhu dari -55 derajat hingga +125 derajat.
- Ini hanya akan menampilkan suhu jika suhu berubah +/-.2 derajat.
Komponen yang Dibutuhkan: -
- Pic16F877A - paket PDIP40
- Papan Roti
- Pilih-3
- Adaptor 5V
- LCD JHD162A
- Sensor suhu DS18b20
- Kabel untuk menghubungkan periferal.
- Resistor 4,7k - 2 lembar
- 10k pot
- Kristal 20mHz
- 2 buah kapasitor keramik 33pF
Sensor Suhu DS18B20:
DS18B20 adalah sensor yang sangat baik untuk mendeteksi suhu secara akurat. Sensor ini memberikan resolusi 9bit hingga 12bit pada penginderaan suhu. Sensor ini berkomunikasi hanya dengan satu kabel dan tidak memerlukan ADC untuk mendapatkan suhu analog dan mengubahnya secara digital.
Spesifikasi dari sensor tersebut adalah: -
- Mengukur Suhu dari -55 ° C hingga + 125 ° C (-67 ° F hingga + 257 ° F)
- ± 0,5 ° C Akurasi dari -10 ° C hingga + 85 ° C
- Resolusi yang Dapat Diprogram dari 9 Bit hingga 12 Bit
- Tidak Ada Komponen Eksternal yang Diperlukan
- Sensor tersebut menggunakan 1-Wire® Interface
Jika kita melihat gambar pinout di atas dari datasheet, kita dapat melihat bahwa sensor terlihat persis sama seperti paket BC547 atau BC557, TO-92. Pin pertama adalah Ground, Pin kedua adalah DQ atau data dan pin ketiga adalah VCC.
Di bawah ini adalah spesifikasi kelistrikan dari Datasheet yang akan dibutuhkan untuk desain kami. Tegangan suplai pengenal untuk sensor adalah + 3.0V hingga + 5.5V. Itu juga perlu menarik tegangan suplai yang sama dengan tegangan suplai yang disebutkan di atas.
Juga, ada margin akurasi + -0,5 derajat Celcius untuk kisaran -10 Derajat C hingga +85 Derajat Celcius, dan akurasi berubah untuk margin jangkauan penuh, yaitu + -2 Derajat untuk -55 Derajat hingga + Rentang 125 derajat.
Jika kita kembali melihat datasheet, kita akan melihat spesifikasi koneksi dari sensor tersebut. Kita dapat menghubungkan sensor dalam mode daya parasit di mana diperlukan dua kabel, DATA dan GND, atau kita dapat menghubungkan sensor menggunakan catu daya eksternal, yang membutuhkan tiga kabel terpisah. Kami akan menggunakan konfigurasi kedua.
Karena sekarang kita sudah familiar dengan peringkat daya sensor dan area terkait koneksi, sekarang kita dapat berkonsentrasi pada pembuatan skema.
Diagram sirkuit: -
Jika kita melihat diagram rangkaian kita akan melihat bahwa: -
LCD karakter 16x2 terhubung melintasi mikrokontroler PIC16F877A, di mana RB0, RB1, RB2 dihubungkan ke pin LCD RS, R / W, dan E. Dan RB4, RB5, RB6 dan RB7 terhubung melintasi LCD 4 pin D4, D5, D6, D7. LCD terhubung dalam mode 4bit atau mode nibble.
Osilator kristal 20MHz dengan dua kapasitor keramik 33pF dihubungkan melalui pin OSC1 dan OSC2. Ini akan memberikan frekuensi clock 20Mhz konstan ke mikrokontroler.
DS18B20 juga terhubung sesuai konfigurasi pin dan dengan resistor pull-up 4.7k seperti yang dibahas sebelumnya. Saya telah menghubungkan semua ini di papan tempat memotong roti.
Jika Anda baru mengenal Mikrokontroler PIC daripada mengikuti Tutorial Mikrokontroler PIC kami yang menyatakan Memulai dengan Mikrokontroler PIC.
Langkah-langkah atau alur kode: -
- Atur konfigurasi mikrokontroler yang meliputi konfigurasi Osilator.
- Atur port yang diinginkan untuk LCD termasuk register TRIS.
- Setiap siklus dengan sensor ds18b20 dimulai dengan reset, jadi kami akan mereset ds18b20 dan menunggu pulsa hadir.
- Tulis papan gores dan atur resolusi sensor 12bit.
- Lewati pembacaan ROM diikuti dengan reset pulsa.
- Kirimkan perintah suhu konversi.
- Baca suhu dari papan gores.
- Periksa nilai suhu apakah negatif atau positif.
- Cetak suhu pada LCD 16x2.
- Tunggu perubahan suhu +/-. 20 derajat Celcius.
Penjelasan Kode:
Kode lengkap untuk Termometer Digital ini diberikan di akhir tutorial ini dengan Video Demonstrasi. Anda akan membutuhkan beberapa file header untuk menjalankan program ini yang dapat diunduh dari sini.
Pertama, kita perlu mengatur bit konfigurasi di mikrokontroler pic dan kemudian mulai dengan fungsi utama void .
Kemudian di bawah empat baris digunakan untuk memasukkan file header perpustakaan, lcd.h dan ds18b20.h . Dan xc.h untuk file header mikrokontroler.
#include
Definisi ini digunakan untuk mengirimkan perintah ke sensor suhu. Perintah-perintah tersebut dicantumkan di lembar data sensor.
# tentukan skip_rom 0xCC # tentukan convert_temp 0x44 # tentukan write_scratchpad 0x4E # tentukan resolusi_12bit 0x7F # tentukan read_scratchpad 0xBE
Tabel 3 dari lembar data sensor ini menunjukkan semua perintah di mana makro digunakan untuk mengirim perintah masing-masing.
Suhu hanya akan ditampilkan di layar jika suhu berubah +/- .20 derajat. Kita dapat mengubah celah suhu ini dari makro temp_gap ini. Dengan mengubah nilai pada makro ini, spesifikasi akan berubah.
Dua variabel float lainnya yang digunakan untuk menyimpan data suhu yang ditampilkan dan membedakannya dengan celah suhu
# Tentukan temp_gap 20 float pre_val = 0, aft_val = 0;
Dalam fungsi void main () , lcd_init () ; adalah fungsi untuk menginisialisasi LCD. Ini lcd_init () fungsi disebut dari lcd.h perpustakaan.
Register TRIS digunakan untuk memilih pin I / O sebagai input atau output. Dua variabel pendek TempL dan TempH yang tidak bertanda tangan digunakan untuk menyimpan data resolusi 12bit dari sensor suhu.
batal main (batal) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; TempL pendek unsigned, TempH; unsigned int t, t2; float perbedaan1 = 0, perbedaan2 = 0; lcd_init ();
Mari kita lihat while loop, di sini kita memecah while (1) menjadi potongan-potongan kecil.
Garis-garis itu digunakan untuk merasakan sensor suhu terhubung atau tidak.
sementara (ow_reset ()) {lcd_com (0x80); lcd_puts ("Harap Hubungkan"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
Dengan menggunakan segmen kode ini kita menginisialisasi sensor dan mengirim perintah untuk mengubah suhu.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); write_byte (0); write_byte (0); write_byte (resolusi_12bit); // Resolusi 12bit ow_reset (); write_byte (skip_rom); write_byte (convert_temp);
Kode ini untuk menyimpan data suhu 12bit dalam dua variabel pendek unsigned.
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 dicek kode lengkapnya di bawah ini, kita telah membuat kondisi if-else untuk mengetahui tanda suhu apakah positif atau negatif.
Dengan menggunakan kode pernyataan If , kita memanipulasi data dan melihat apakah suhunya negatif atau tidak dan menentukan perubahan suhu berada pada kisaran +/-.20 derajat atau tidak. Dan di bagian lain kami memeriksa apakah suhu positif atau tidak dan deteksi perubahan suhu.
kode
Mendapatkan Data dari Sensor Suhu DS18B20:
Mari kita lihat jarak waktu Antarmuka 1-Wire®. Kami menggunakan Crystal 20Mhz. Jika kita melihat ke dalam file ds18b20.c, kita akan lihat
#define _XTAL_FREQ 20000000
Definisi ini digunakan untuk rutinitas penundaan kompilator XC8. 20Mhz diatur sebagai frekuensi kristal.
Kami membuat lima fungsi
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
Protokol 1-Wire ® membutuhkan slot terkait waktu yang ketat untuk berkomunikasi. Di dalam lembar data, kita akan mendapatkan informasi terkait slot waktu yang sempurna.
Di dalam fungsi di bawah ini kami membuat slot waktu yang tepat. Penting untuk membuat penundaan yang tepat untuk menahan dan melepaskan dan mengontrol bit TRIS dari port sensor masing-masing.
unsigned char ow_reset (kosong) {DQ_TRIS = 0; // Tris = 0 (keluaran) DQ = 0; // setel pin # ke rendah (0) __delay_us (480); // 1 kabel membutuhkan waktu tunda DQ_TRIS = 1; // Tris = 1 (masukan) __delay_us (60); // 1 kabel membutuhkan waktu tunda jika (DQ == 0) // jika ada pluse kehadiran {__delay_us (480); kembali 0; // return 0 (1-wire is presence)} lain {__delay_us (480); kembali 1; // return 1 (1-wire is NOT presence)}} // 0 = keberadaan, 1 = tidak ada bagian
Sekarang sesuai deskripsi slot waktu di bawah ini yang digunakan dalam Baca dan Tulis, kami membuat fungsi baca dan tulis masing-masing.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // tarik DQ rendah untuk memulai slot waktu DQ_TRIS = 1; DQ = 1; // lalu kembalikan tinggi untuk (i = 0; i <3; i ++); // tunda 15us dari awal pengembalian slot waktu (DQ); // kembalikan nilai baris DQ} kosongkan write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // tarik DQ rendah untuk memulai slot waktu jika (bitval == 1) DQ = 1; // kembalikan DQ tinggi jika menulis 1 __delay_us (5); // tahan nilai untuk sisa slot waktu DQ_TRIS = 1; DQ = 1; } // Delay menyediakan 16us per loop, ditambah 24us. Oleh karena itu penundaan (5) = 104us
Periksa lebih lanjut semua file header dan.c terkait di sini.
Jadi beginilah cara kita menggunakan sensor DS18B20 untuk mendapatkan suhu dengan Mikrokontroler PIC.
Jika Anda ingin membuat Termometer Digital sederhana dengan LM35, lihat proyek di bawah ini dengan Mikrokontroler lain:
- Pengukuran Suhu Ruangan dengan Raspberry Pi
- Termometer Digital menggunakan Arduino dan LM35
- Termometer Digital menggunakan LM35 dan 8051
- Pengukuran Suhu menggunakan Mikrokontroler LM35 dan AVR