Dalam pelajaran sebelumnya, kami telah bekerja dengan sensor suhu dan kelembaban DHT11, serta dengan termistor. Kali ini kami akan mencoba berurusan dengan sensor suhu populer lainnya - DS18B20. Perangkat ini memungkinkan Anda mengukur suhu dalam kisaran dari -55 °C hingga +125 °C dengan akurasi ±0,5 °C (pada suhu dari -10 °C hingga +85 °C). DS18B20 dapat ditenagai oleh tegangan 3,3 dan 5 Volt. Sensor itu sendiri adalah sirkuit mikro yang dapat ditemukan dalam berbagai kasus: Modul siap pakai juga populer, di mana sensor, resistor pull-up, dan konektor ditempatkan.
Pilihan lain adalah sensor dalam kapsul baja tertutup dengan kawat:
1. Menghubungkan modul DS18B20-ROC ke Arduino
Dalam tutorial ini, kita akan bekerja dengan modul sensor suhu yang dikembangkan di RobotClass. Kami akan menghubungkannya ke pengontrol Arduino Uno. Seperti DHT11, sensor DS18B20 menggunakan bus kabel tunggal (1 kabel) untuk berkomunikasi dengan pengontrol. Jadi kita hanya membutuhkan tiga kabel untuk menghubungkan sensor ke Arduino. diagram sirkuit Tampilan tata letakCatatan. Dalam hal menggunakan bukan modul, tetapi sirkuit mikro terpisah, perlu untuk menghubungkan output sirkuit mikro OUT ke kontak daya melalui resistor 4,7 KΩ. Pada modul di atas, resistor ini sudah terpasang.
2. Program untuk menerima data dari sensor DS18B20
Mari kita buat program yang akan membaca pembacaan suhu dari sensor setiap detik dan mengeluarkannya ke port COM. #termasukKesimpulan
Menggunakan sensor suhu, Anda dapat membuat sistem ventilasi otomatis paling sederhana di apartemen atau di rumah kaca. Cukup menambahkan operator kondisi ke program, yang akan memeriksa apakah suhu telah mencapai nilai tertentu dan menyalakan kipas menggunakan relai. Dengan cara yang sama kami bekerjaDalam tutorial ini, kita akan menggunakan sensor suhu DS18B20 dengan Arduino UNO untuk membuat termometer. DS18B20 adalah pilihan yang baik ketika proyek akurasi tinggi membutuhkan respons yang baik. Kami akan menunjukkan cara menghubungkan DS18B20 ke milik Anda dan menampilkan data suhu pada LCD 16x2.
Ikhtisar sensor DS18B20
Sensor DS18B20 berkomunikasi dengan Arduino melalui bus 1-kawat. Menurut definisi, hanya satu jalur data (dan ground) yang diperlukan untuk berkomunikasi dengan Arduino.
Setiap DS18B20 memiliki kode serial 64-bit atau alamat unik yang memungkinkan beberapa DS18B20 beroperasi pada bus kabel tunggal yang sama. Oleh karena itu, penggunaan mikroprosesor memudahkan untuk mengontrol beberapa DS18B20 yang didistribusikan di area yang luas. Aplikasi untuk fitur ini termasuk kontrol lingkungan, sistem kontrol suhu di gedung, dan peralatan mekanis.
Fitur DS18B20
- Hanya satu antarmuka kabel tunggal yang diperlukan untuk komunikasi antara mikrokontroler dan sensor.
- Hanya satu komponen eksternal yang diperlukan: resistor 4,7 kΩ.
- Dapat ditenagai dari jalur data secara langsung, membutuhkan tegangan 3,0 hingga 5,5V.
- Setiap perangkat memiliki kode serial 64-bit unik yang disimpan di ROM internal.
- Dapat mengukur suhu dari -55 ° C hingga + 125 ° C (-67 ° F hingga + 257 ° F).
- Akurasi ± 0,5 ° C dari -10 ° C hingga + 85 ° C.
Proyek ini menggunakan DS18B20, yang hadir dalam bentuk pengukur suhu yang tahan air. Penggunaan sensor tahan air memperluas kemungkinan - sensor suhu akan dapat mengukur suhu cairan seperti air, bahan kimia, teh dan kopi.
Persyaratan Komponen
Persyaratan peralatan untuk termometer Anda cukup standar, kami akan membutuhkan:
- Layar LCD 16x2
- Sensor suhu DS18B20
- Kabel jumper
- Resistor 1K
- Papan roti
Diagram koneksi
Buat koneksi sesuai dengan diagram di bawah ini.
Kami menghubungkan sensor dan Arduino
- VCC -> Arduino 5V plus resistor 4.7K dari VCC ke Data
- Data -> Pin 7 Arduino
- GND -> GND Arduino
Koneksi untuk LCD dan Arduino UNO
- Pin 1 -> GND
- Pin 2 -> VCC
- Pin 3 -> Pin Arduino 3
- Pin 4 -> Pin Arduino 33
- Pin 5 -> GND
- Pin 6 -> Pin Arduino 31
- Pin 7-10 -> GND
- Pin 11 -> Pin Arduino 22
- Pin 12 -> Pin Arduino 24
- Pin 13 -> Pin Arduino 26
- Pin 14 -> Pin Arduino 28
- Pin 15 -> VCC melalui resistor 220 ohm
- Pin 16 -> GND
Hubungkan potensiometer seperti yang ditunjukkan di atas ke pin 3 pada LCD untuk mengontrol kontras.
Proyek ini bekerja pada suhu hingga 125°C. Jika ada beberapa disonansi pada suhu yang ditampilkan, periksa kembali sambungan ke resistor yang terhubung ke DS18B20. Setelah menghubungkan semua yang dijelaskan di atas, kita dapat beralih ke pemrograman.
Kode sumber untuk termometer
Sebelum mengunggah kode sumber, Anda perlu menyiapkan dua pustaka yang diperlukan untuk menjalankan kode ini di lingkungan Arduino.
- Pustaka pertama disebut - OneWire ().
- Perpustakaan kedua disebut - DallasTemperature ().
Setelah mengunduh kedua perpustakaan, pindahkan file ke folder perpustakaan Arduino default. Kemudian salin kode ke dan unggah setelah memeriksa ulang apakah sensor Anda terhubung dengan benar.
//Kode dimulai #includeKira-kira seperti ini:
Kami dapat mengukur suhu hingga 100 °C dengan sensor ini! Dia sangat responsif.
Setelah Anda membuat proyek, uji perangkat dengan merendam sensor dalam air panas dan dingin.
Sensor suhu di Arduino adalah salah satu jenis sensor yang paling umum. Ada banyak pilihan yang tersedia untuk pengembang proyek termometer Arduino. pilihan yang berbeda, berbeda dalam prinsip operasi, akurasi, desain. Sensor digital DS18B20 adalah salah satu sensor suhu paling populer, sering digunakan dalam wadah tahan air untuk mengukur suhu air atau cairan lainnya. Dalam artikel ini Anda akan menemukan deskripsi sensor ds18b20 dalam bahasa Rusia, bersama-sama kami akan mempertimbangkan fitur menghubungkan ke arduino, prinsip pengoperasian sensor, deskripsi perpustakaan dan sketsa.
DS18B20 adalah sensor suhu digital dengan banyak fitur berguna. Faktanya, DS18B20 adalah mikrokontroler keseluruhan yang dapat menyimpan nilai pengukuran, memberi sinyal suhu di luar batas yang ditentukan (kita dapat mengatur dan mengubah batas), mengubah akurasi pengukuran, cara berinteraksi dengan pengontrol, dan banyak lagi. Semua ini dalam paket yang sangat kecil, yang juga tersedia dalam versi tahan air.
Sensor suhu DS18B20 memiliki berbagai tipe housing. Anda dapat memilih dari tiga - 8-Pin SO (150 mils), 8-Pin SOP, dan 3-Pin TO-92. Yang terakhir adalah yang paling umum dan dibuat dalam wadah tahan air khusus, sehingga dapat digunakan dengan aman di bawah air. Setiap sensor memiliki 3 pin. Untuk kasing TO-92, Anda perlu melihat warna kabel: hitam - arde, merah - daya dan putih / kuning / biru - sinyal. Di toko online, Anda dapat membeli modul DS18B20 yang sudah jadi.
Dimana beli sensornya
Secara alami, DS18B20 adalah yang termurah untuk dibeli di Aliexpress, meskipun juga dijual di toko online khusus Rusia dengan arduino. Berikut adalah beberapa tautan untuk contoh:
Memori sensor terdiri dari dua jenis: operasional dan non-volatile - SRAM dan EEPROM. Yang terakhir berisi register konfigurasi dan register TH, TL, yang dapat digunakan sebagai register tujuan umum, kecuali digunakan untuk menentukan kisaran toleransi suhu.
Tugas utama DS18B20 adalah menentukan suhu dan mengubah hasilnya ke dalam bentuk digital. Kita dapat secara mandiri mengatur resolusi yang diperlukan dengan mengatur jumlah bit presisi - 9, 10, 11 dan 12. Dalam kasus ini, resolusi masing-masing akan sama dengan 0.5C, 0.25C, 0.125C dan 0.0625C.
Pengukuran suhu yang diterima disimpan dalam SRAM sensor. Byte 1 dan 2 menyimpan nilai suhu yang diterima, 3 dan 4 menyimpan batas pengukuran, 5 dan 6 dicadangkan, 7 dan 8 digunakan untuk deteksi suhu presisi tinggi, 9 byte terakhir menyimpan kode CRC tahan kebisingan.
Menghubungkan DS18B20 ke Arduino
DS18B20 adalah sensor digital. Sensor digital mengirimkan nilai suhu yang diukur dalam bentuk kode biner tertentu, yang diumpankan ke pin digital atau analog arduino dan kemudian diterjemahkan. Kodenya bisa sangat berbeda, ds18b20 bekerja pada protokol data 1-Wire. Kami tidak akan merinci protokol digital ini, kami hanya akan menunjukkan minimum yang diperlukan untuk memahami prinsip-prinsip interaksi.
Pertukaran informasi dalam 1-Wire terjadi karena operasi berikut:
- Inisialisasi - definisi urutan sinyal dari mana pengukuran dan operasi lainnya dimulai. Perangkat master mengirimkan pulsa reset, setelah itu sensor harus memberikan pulsa kehadiran, yang menunjukkan bahwa ia siap untuk melakukan operasi.
- Penulisan data - byte data sedang ditransfer ke sensor.
- Membaca data - satu byte diterima dari sensor.
Untuk bekerja dengan sensor, kami membutuhkan perangkat lunak:
- Arduino IDE
- Perpustakaan OneWire, jika Anda menggunakan beberapa sensor di bus, Anda dapat menggunakan perpustakaan DallasTemperature. Ini akan berjalan di atas OneWire.
Dari peralatan yang Anda butuhkan:
- Satu atau lebih sensor DS18B20;
- mikrokontroler Arduino;
- konektor;
- resistor 4,7 kOhm (jika satu sensor terhubung, resistor dengan nilai 4 hingga 10K akan menyala);
- Papan sirkuit;
- Kabel USB untuk menghubungkan ke komputer.
Sensor terhubung ke papan Arduino UNO secara sederhana: GND dari sensor suhu terhubung ke Arduino GND, Vdd terhubung ke 5V, Data terhubung ke pin digital apa pun.
Diagram koneksi paling sederhana untuk sensor digital DS18B20 ditunjukkan pada gambar.
Algoritma untuk memperoleh informasi tentang suhu dalam sketsa terdiri dari langkah-langkah berikut:
- Menentukan alamat sensor, memeriksa koneksinya.
- Perintah dikirim ke sensor dengan persyaratan untuk membaca suhu dan memasukkan nilai terukur ke dalam register. Prosedur ini memakan waktu lebih lama dari yang lain, dibutuhkan sekitar 750 ms.
- Perintah diberikan untuk membaca informasi dari register dan mengirim nilai yang diterima ke "port monitor",
- Jika diperlukan, itu akan dikonversi ke Celcius/Fahrenheit.
Contoh sketsa sederhana untuk DS18B20
Sketsa paling sederhana untuk bekerja dengan sensor digital adalah sebagai berikut. (dalam sketsa kami menggunakan perpustakaan OneWire, yang akan kami bicarakan lebih detail nanti).
#termasuk
Sketsa untuk bekerja dengan sensor ds18b20 tanpa penundaan
Anda dapat sedikit memperumit program untuk ds18b20 untuk menghilangkan perlambatan dalam sketsa.
#termasuk
Perpustakaan DallasTemperature dan DS18b20
Dalam sketsa kami, kami dapat menggunakan perpustakaan DallasTemperature, yang menyederhanakan beberapa aspek bekerja dengan sensor ds18b20 melalui 1-Wire. Contoh sketsa:
#termasuk
Pustaka OneWire untuk bekerja dengan DS18B20
DS18B20 menggunakan protokol 1-Wire untuk bertukar informasi dengan arduino, yang perpustakaannya telah ditulis dengan sangat baik. Anda dapat dan harus menggunakannya agar tidak mengimplementasikan semua fungsi secara manual. . Untuk menginstal perpustakaan, unduh arsip, buka paketnya ke folder perpustakaan direktori Arduino Anda. Pustaka disertakan menggunakan perintah #include
Semua sensor DS18B20 terhubung secara paralel, satu resistor cukup untuk semuanya. Menggunakan perpustakaan OneWire, Anda dapat membaca semua data dari semua sensor secara bersamaan. Jika jumlah sensor yang terhubung lebih dari 10, Anda harus memilih resistor dengan resistansi tidak lebih dari 1,6 kOhm. Selain itu, untuk pengukuran suhu yang lebih akurat, Anda perlu memasang resistor 100 ... 120 Ohm tambahan antara output data pada papan Arduino dan data pada setiap sensor. Anda dapat mengetahui dari sensor mana nilai tertentu diperoleh menggunakan kode serial 64-bit unik yang akan dikeluarkan sebagai hasil dari eksekusi program.
Untuk menghubungkan sensor suhu dalam mode normal, Anda perlu menggunakan sirkuit yang ditunjukkan pada gambar.
kesimpulan
Chip Dallas DS18B20 adalah perangkat yang sangat menarik. Sensor suhu dan termometer berdasarkan itu memiliki karakteristik yang dapat diterima untuk sebagian besar tugas, fungsionalitas tingkat lanjut, dan relatif murah. DS18B20 telah mendapatkan popularitas tertentu sebagai perangkat tahan air untuk mengukur suhu cairan.
Per fitur tambahan Anda harus membayar dengan kompleksitas relatif bekerja dengan sensor. Untuk menghubungkan DS18B20, kita pasti membutuhkan resistor dengan peringkat sekitar 5K. Untuk bekerja dengan sensor dalam sketsa Arduino, Anda perlu menginstal perpustakaan tambahan dan mendapatkan keterampilan tertentu untuk bekerja dengannya - semuanya tidak sepenuhnya sepele di sana. Namun, Anda dapat membeli modul yang sudah jadi, dan dalam kebanyakan kasus itu akan cukup untuk membuat sketsa contoh sederhana diberikan dalam artikel ini.
Dalam proses mempelajari mikrokontroler, cepat atau lambat menjadi perlu untuk mengukur parameter meteorologi seperti itu lingkungan seperti suhu tubuhnya. Pasar global modern untuk komponen elektronik menawarkan berbagai macam sensor suhu. Perbedaan utama di antara mereka adalah dalam kisaran suhu yang diukur, tegangan suplai, area aplikasi, dimensi keseluruhan, metode konversi suhu, antarmuka untuk interaksi dengan sistem kontrol pengguna. Kebetulan secara historis bahwa saat ini salah satu sensor suhu paling populer adalah sensor DS18B20 Dallas Semiconductor Corp. Kisah berikut adalah tentang dia.
DS18B20– sensor suhu digital dengan resolusi konversi yang dapat diprogram.
Fitur khas:
1) Menggunakan bus data antarmuka 1-Wire untuk berinteraksi dengan sistem kontrol;
2) Kehadiran kode identifikasi serial 64-bit unik yang terletak di memori ROM internal dan ditujukan untuk sistem multipoint di mana diperlukan untuk menangani sensor tertentu;
3) Tegangan suplai adalah 3-5,5V, yang memungkinkannya untuk digunakan tidak hanya dalam sistem 5-volt, tetapi juga dalam 3,3 (sebagian besar mikrokontroler);
4) Kisaran suhu yang diukur adalah -55…+125 о ;
5) Akurasi ± 0,5 ° C, meskipun ini hanya berlaku untuk kisaran -10 ... + 85 ° C;
6) Resolusi konversi ditentukan oleh pengguna dan 9…12 bit;
7) Memiliki register internal pemicu ambang atas dan bawah dengan pembangkitan sinyal alarm untuk sistem yang menggunakan logika operasi termostatik;
8) Sensor ini adalah perangkat lunak yang kompatibel dengan DS1822 dan banyak digunakan dalam pengontrol termostatik industri, sistem industri, elektronik konsumen, dan sistem sensitif suhu lainnya.
Deskripsi dan prinsip pengoperasian perangkat:
Dalam artikel saya, saya akan menjelaskan contoh bekerja dengan sensor yang dibuat dalam paket TO-92.
Ini terlihat seperti ini:
Di dalam alat ini diatur dengan sangat sederhana, lihat sendiri:
Mari kita lihat lebih dekat diagram blok ini.
Namun, menyalakan dengan cara ini memperkenalkan beberapa batasan pada parameter waktu sensor. Menahan saluran data untuk sementara waktu akan melepaskan kapasitor, yang akan menyebabkan de-energi saluran Vdd INTERNAL, dan, karenanya, sensor secara keseluruhan. Oleh karena itu, selama waktu yang tidak digunakan, garis DQ harus dipertahankan tinggi. Satu catatan penting harus dicatat. Saat mengubah suhu dan menyalin data dari Scratchpad ke EEPROM (ke salah satu register), arus yang dikonsumsi oleh saluran Vdd INTERNAL dapat mencapai 1,5 mA, yang tidak dapat ditanggung oleh kapasitor internal, dan akan ada penurunan tegangan yang besar pada tarikan -up resistor, yang secara tidak dapat diterima akan mempengaruhi pengoperasian perangkat secara umum. Untuk melakukan ini, perlu untuk mengatur garis DQ dalam skema pull-up yang kuat, diimplementasikan sesuai dengan skema berikut:
Setelah mengeluarkan perintah MengubahT atau SalinanPapan penggaris perlu untuk menyalakan pull-up yang kuat dari saluran DQ dengan transistor MOSFET selambat-lambatnya 10 s (maks), menurut pengembang sensor, dan kemudian menunggu waktu konversi (Tconv) atau waktu transfer data (Twr = 10 ms), dan saat ini tidak ada tindakan yang diambil ketika pull-up yang kuat aktif pada garis DQ seharusnya tidak!
Sedikit yang perlu dikatakan tentang daya standar, karena semuanya sederhana di sini, dan bahkan MOSFET tidak diperlukan sama sekali:
Subsistem "64-BIT ROM AND 1-Wire PORT" berisi kode identifikasi serial 64-bit yang unik yang terletak di memori ROM non-volatil, dan node ini juga berisi antarmuka untuk interaksi dengan sistem kontrol 1-Wire. Subsistem "Memory Control Logic" melakukan transfer data antara subsistem antarmuka 1-Wire dan memori tipe Scratchpad, yang, pada gilirannya, memiliki akses ke register sensor temperatur, register ambang alarm tinggi dan rendah, register konfigurasi, dan register generator checksum 8-bit untuk melindungi sistem dari data yang salah.
Saat dihidupkan, sensor default ke resolusi konversi 12-bit dan segera memasuki mode daya rendah. Untuk memulai konversi, master harus mengirim perintah MengubahT . Setelah mengubah suhu menjadi kode digital, kode ini disimpan dalam memori Scratchpad sebagai kata dua byte, dan sensor beralih kembali ke mode hemat daya.
Konversi suhu.
Sekarang mari kita cari tahu bagaimana suhu diubah dalam sensor. Faktanya, ADC terletak di dalam sensor suhu itu sendiri, dan data keluaran yang terletak di register suhu ditransfer ke memori Scratchpad. Data suhu memiliki format berikut:
Bendera S adalah bendera tanda, digunakan untuk menunjukkan tanda bilangan (S=0 adalah bilangan yang terdapat pada bit 10-0 adalah positif, dan S=1 jika bilangan yang terdapat pada bit yang sama adalah negatif, yaitu dalam hal ini kasus suhu diwakili dalam kode komplemen dua (kode komplemen dua)).
Ketika diatur ke resolusi konversi 12-bit, semua 12 bit (bit 11-bit 0) diaktifkan dan berisi data yang valid. Bila diatur ke 11 bit, isi bit 0 harus diabaikan, bila diatur ke 10 bit, bit 0 dan 1 tidak boleh diperhitungkan, dan seterusnya.
Sinyal alarm adalah fungsi termostat.
Untuk ini, 2 register 8-bit, Th dan Tl, disediakan. Th berisi nilai ambang suhu atas, dan Tl, masing-masing, yang lebih rendah. Jika suhu di atas Th atau di bawah Tl, tanda alarm disetel. Bendera alarm ini dideteksi oleh master dengan mengeluarkan perintah Pencarian Alarm ke garis DQ. Bendera alarm diperbarui setelah setiap operasi konversi suhu. Kebetulan, hanya bit 11 hingga 4 dari register suhu yang digunakan dibandingkan dengan register Th atau Tl, yang berarti bahwa fungsi termostat hanya berfungsi untuk suhu integer. Register secara fisik adalah memori EEPROM, sehingga mereka mempertahankan nilainya saat daya dimatikan. Register itu sendiri mirip dengan register suhu, hanya saja 8-bit, flag S memiliki arti yang persis sama seperti pada kasus sebelumnya:
Kode ini, seperti disebutkan sebelumnya, diperlukan untuk mengidentifikasi setiap perangkat pada saluran dalam sistem pengukuran suhu multipoint.
Format memori ini adalah:
8 bit yang lebih rendah dicadangkan untuk penunjukan keluarga, dan berisi nilai 0x28. 48 bit berikutnya berisi nomor seri unik perangkat. Byte paling signifikan berisi nilai checksum CRC yang dihitung untuk 56 bit memori ROM yang lebih rendah.
Organisasi memori.
Memori pemancar terdiri dari ruang memori Scratchpad dan EEPROM untuk menyimpan data konfigurasi dan nilai register alarm tinggi dan rendah.
Saat daya dimatikan, byte data 2, 3 dan 4 mempertahankan nilainya di EEPROM. Nah, saat dihidupkan, nilai di dalamnya tetap tidak berubah. Bytes 0 dan 1 berisi nilai suhu yang dikonversi, byte 5, 6, 7 dicadangkan untuk penggunaan internal dan tidak dapat diakses oleh pengguna untuk kebutuhannya.
Byte ke-8 berisi nilai yang dihasilkan oleh logika generasi CRC bawaan untuk byte 0 hingga 7, yang meminimalkan kemungkinan pembacaan suhu yang salah pada akhirnya.
Perlu dicatat bahwa jika fungsi termostat tidak digunakan, maka register Th dan Tl dapat digunakan sebagai memori tujuan umum - Anda dapat menyimpan informasi apa pun di dalamnya.
Data ditulis ke byte 2, 3 dan 4 dimulai dengan bit paling tidak signifikan dari byte 2 menggunakan instruksi Tulis Scratchpad. Untuk memeriksa integritas data yang direkam, Anda dapat membacanya, untuk itu Anda perlu mengirim perintah ke sensor Baca Scratchpad, setelah itu master harus menerima data mulai dari bit paling tidak signifikan dari byte 0.
Untuk menyimpan data register tinggi dan rendah termostat, serta register konfigurasi di memori EEPROM, perangkat master harus mengirim perintah ke sensor Salin Scratchpad.
Seperti disebutkan sebelumnya, data yang sudah ditulis ke EEPROM akan disimpan saat daya dimatikan. Tetapi ketika daya dihidupkan, nilai-nilai dari sel EEPROM yang sesuai secara otomatis dimuat ke dalam register memori papan gores yang sesuai. Nyaman bukan? :)
Selain itu, data yang ditulis ke EEPROM dapat ditimpa ke memori scratchpad kapan saja. Ini diperlukan, misalnya, ketika Anda mengubah konfigurasi selama operasi, dan kemudian Anda perlu beralih ke "mode normal", mis. mengembalikan konfigurasi operasi sebelum perubahan isi register memori papan gores. Sebenarnya, untuk ini, perangkat master harus mengirim perintah ke sensor Ingat E2 .
Dalam register konfigurasi, hanya 2 bit yang dapat ditentukan oleh pengguna: R0 dan R1. Bit-bit ini menentukan resolusi konversi suhu, dan diatur ke 1 secara default, yang merupakan pengaturan awal untuk resolusi konversi 12-bit.
Semua kemungkinan konfigurasi bit ini dan izin terkait ditunjukkan pada tabel di bawah ini. Perlu dicatat bahwa semakin besar resolusi konversi, semakin lama waktu konversi, misalnya untuk resolusi 12-bit, waktu konversi adalah 750ms (maks.).
Interaksi dengan sistem kontrol.
DS18B20, seperti disebutkan sebelumnya, menggunakan bus data antarmuka 1-Wire untuk berkomunikasi dengan perangkat slave. Oleh karena itu, untuk menghubungkannya, sistem kontrol harus menyediakan output dengan saluran terbuka atau dengan status garis Hi-Z.
Konfigurasi internal antarmuka sensor ditunjukkan di bawah ini:
Dalam keadaan tidak aktif (idle state), saluran DQ ditarik oleh resistor ke catu daya "+". Jadi, antar transaksi (transfer data), jalur ini harus selalu diadakan dalam keadaan ini. Jika, karena alasan apa pun, transaksi harus ditangguhkan, saluran DQ harus tetap tinggi jika transfer ini akan dilanjutkan lebih lanjut. Dalam proses penghentian transaksi, kita dapat menjaga jalur DQ pada tingkat logika yang tinggi selama yang kita inginkan, mulai dari 1 s. Tetapi, jika bus data ditahan rendah selama lebih dari 480 s, reset lengkap semua sensor yang ada pada bus ini akan terjadi.
Urutan operasi untuk pertukaran.
Setiap kali sistem kontrol mengakses sensor, urutan tindakan berikut harus diperhatikan:
1) Inisialisasi;
2) perintah ROM (diikuti dengan pertukaran data yang diperlukan);
3) Perintah fungsi sensor (diikuti dengan komunikasi yang diperlukan).
Jika tidak ada langkah saat mengakses sensor, sensor tidak akan merespon. Pengecualiannya adalah perintah MencariROM [ F0 H] dan AlarmMencari [ ECH] , setelah eksekusi mereka, master harus kembali ke langkah pertama dari urutan kontrol.
Jadi. Semua transaksi dimulai dengan inisialisasi. Operasi ini diikuti oleh pembangkitan pulsa reset oleh master, di mana slave (dalam hal ini, sensor) mengirimkan pulsa kehadiran ke master, yang memberitahukan bahwa sensor terhubung dan siap untuk operasi.
Secara umum, bus antarmuka 1-Wire yang diimplementasikan dalam sensor mendefinisikan beberapa jenis sinyal pada jalur data: pulsa reset, pulsa kehadiran, tulis 0, tulis 1, baca 0, baca 1. Semua operasi ini diimplementasikan oleh perangkat master , dengan pengecualian pulsa kehadiran. Itu hanya dibentuk oleh sensor.
Jadi, sebagai permulaan, master masuk ke mode pemancar dan menyetel garis DQ ke 0 setidaknya selama 480 s (disorot dengan warna hitam tebal). Ini mengatur ulang sensor. Kemudian saluran harus dilepaskan dan perangkat master harus dimasukkan ke dalam mode penerima, sedangkan resistor pull-up akan mengatur saluran data ke tingkat logika yang tinggi (disorot dengan warna hitam tipis). Setelah sensor merasakan tepi yang naik, sensor akan menunggu 15-60µs dan mereset jalur data ke 0 dengan antarmuka perangkat kerasnya, dan akan menyimpannya selama 60-240µs. Setelah waktu ini, sensor akan melepaskan saluran dan akan diatur ke level logika 1 setidaknya selama 480 s setelah sensor mendeteksi pulsa reset.
Sekarang mari kita bicara tentang bagaimana proses transfer data dilakukan. Umumnya, transfer bit. Intinya adalah sebagai berikut. Sebuah periode waktu diambil, dan selama waktu ini master melihat apa yang kita miliki di telepon, katakanlah 1 - itu berarti kita menulis 1, jika 0 - itu berarti kita menulis nol. Tapi ini hanya penjelasan abstrak. Sebenarnya, ada beberapa nuansa yang terkait dengan kerangka waktu dari keseluruhan kasus ini.
Lihat gambar:
Semuanya dimulai dengan fakta bahwa master harus menurunkan jalur data ke level logika rendah, dan sejak saat itu slot tulis / baca 1/0 dimulai, berlangsung dari 60 hingga 120 s. Di antara slot tulis / baca, jalur data harus diatur ke 1 untuk waktu tidak kurang dari waktu pemulihan (1 s). Untuk mengatur slot tulis 0, perlu untuk menjaga jalur data pada 0 sepanjang slot, tetapi jika perlu untuk menulis ke sensor 1, maka pertama-tama reset jalur data ke 0, kemudian tunggu setidaknya 1 s dan lepaskan garis pada 1, selama slot tulis 1 (60- 120µs) akan menulis 1 ke sensor (lihat gambar kanan atas).
Faktanya, jika 1 terdeteksi pada jalur data dalam 15-60 s setelah start, maka 1 akan ditulis, dan jika 0 terdeteksi dalam 60-240 s, maka 0 akan ditulis.
Pembacaan data disertai oleh perangkat master, ketika mereset saluran, menunggu setidaknya 1 s, dan selama 15 s melihat apa yang terjadi di saluran: jika 0 tetap, maka sensor mentransmisikan 0, jika beralih ke 1, kemudian 1 ditransmisikan.
tim.
perintah ROM.
Perintah ini harus mengikuti urutan inisialisasi dan berisi instruksi untuk menemukan sensor yang sesuai, dll. Kapasitas setiap instruksi adalah 8 bit. Setelah menjalankan perintah yang sesuai, Anda dapat mengirim perintah fungsi ke sensor.
CARI ROM |
Ketika sistem awalnya terhubung, ia harus mengenali semua perangkat yang terhubung ke bus. Untuk itulah perintah ini. Tapi, karena kami hanya memiliki satu sensor, kami tidak akan menggunakan perintah ini. |
BACA ROM |
Perintah ini hanya digunakan ketika hanya ada satu sensor di bus. Hal ini memungkinkan perangkat master untuk membaca isi 64 bit memori ROM tanpa menggunakan perintah find. Dan jika Anda mencoba menggunakan perintah ini dengan lebih dari 1 sensor yang terhubung, semuanya akan mulai mentransmisikan konten memori ini, yang akan menyebabkan konsekuensi yang tidak diinginkan. |
ROM PERTANDINGAN |
Ini adalah perintah pencocokan ROM. Master melepaskan 64 bit ROM yang sesuai dari sensor yang terhubung ke bus, dan sudah menentukan apa yang harus dilakukan dengannya (mengukur suhu, dll.). Sensor lain di bus akan menunggu giliran mereka saat ini. |
LEWATI ROM |
Ini adalah perintah lewati ROM. Tidak memperhitungkan alamat sensor tertentu di bus, tetapi alamat sekaligus. Setelah perintah ini, Anda dapat mengeluarkan, misalnya, perintah konversi suhu, dan semua sensor akan memulai konversi. Namun, mengeluarkan perintah baca memori setelah memanggil perintah ini akan menyebabkan hasil yang tidak terduga (karena semua sensor akan mengirimkan data sekaligus). Ini berarti bahwa hanya dengan satu sensor yang terhubung, situasi seperti itu mungkin terjadi. |
PENCARIAN ALARM |
Perintah ini identik dengan yang pertama dalam tabel ini, kecuali bahwa perintah itu mencari sensor di bus dengan flag alarm yang disetel. |
perintah fungsional.
Perintah-perintah ini melakukan operasi fungsional dari setiap proses, misalnya, memulai operasi konversi suhu, menyalin memori, dll. Ada 6 perintah total, masing-masing panjang bit adalah 8 bit.
KONVERSI KE |
Mulai konversi suhu. Setelah menjalankan perintah ini, data 2-byte dimasukkan ke dalam register suhu. |
TULIS SCRATCHPAD |
Menulis data ke register 2-4 mulai dari bit kedua, paling tidak signifikan terlebih dahulu. Selama transfer data ke tiga register, harus diperhatikan bahwa master tidak mereset sensor, karena kehilangan data mungkin terjadi. |
BACA SCRATCHPAD |
Memulai proses transfer data untuk semua register memori scratchpad, dimulai dengan bit rendah byte 0 dan diakhiri dengan bit tinggi byte 8 (CRC). |
SALIN SCRATCHPAD |
Instruksi ini menyalin isi register byte 2, 3, dan 4 ke lokasi EEPROM yang sesuai. |
INGAT E2 |
Perintah ini menyalin data dari EEPROM ke lokasi yang sesuai di papan gores. Seperti disebutkan sebelumnya, operasi ini terjadi secara otomatis ketika daya dihidupkan. |
BACA POWER SUPPLY |
Faktanya, itulah kebijaksanaan bekerja dengan sensor suhu DS18B20. Untuk informasi lebih rinci, silakan merujuk ke lembar data (). Sekarang perlu untuk menerapkan semua bisnis ini dalam besi.
Diagram skema perangkat:
Gambar perakitan papan sirkuit tercetak (maaf untuk kualitasnya, saya baru saja berhasil, untuk debugging):
Jangan lupa untuk mencerminkan papan dengan benar
Karena ini adalah papan tempat memotong roti, saya mengeluarkannya dari proyek lama, jadi papan di atas sedikit berbeda dari yang saya miliki (di milik saya, saya sekarang telah menghapus semua yang berlebihan dan menjadi persis seperti pada gambar di atas).
Inilah yang terjadi pada saya:
Ternyata itu sandwich
Kode sumber program ditulis dalam lingkungan pengembangan. Saya tidak mencoba menggunakan perpustakaan kompiler avr-gcc yang siap pakai secara maksimal, tetapi menulis semuanya, seperti yang mereka katakan, "dengan tangan". Tujuan saya bukan untuk mendemonstrasikan keahlian C, tetapi hanya sebuah contoh yang ditulis dalam satu jam yang dapat memberi pemula gambaran umum tentang bekerja dengan sensor.
Perangkat ini dimaksudkan untuk digunakan di dalam ruangan, oleh karena itu tidak menyediakan pengukuran suhu negatif.
Unduh sumber dan papan sirkuit tercetak LAY Anda bisa di bawah ini
Setiap pertanyaan atau saran tambahan dipersilakan di: [dilindungi email]
DS18B20 adalah sensor suhu digital. Sensornya sangat mudah digunakan.
Pertama, ini digital, dan kedua, hanya memiliki satu kontak, dari mana kami menerima sinyal yang berguna. Artinya, Anda dapat menghubungkan sejumlah besar sensor ini ke satu Arduino secara bersamaan. Pin akan lebih dari cukup. Tidak hanya itu, Anda bahkan dapat menghubungkan beberapa sensor ke satu pin di Arduino! Tapi hal pertama yang pertama.
DS18B20 memiliki berbagai faktor bentuk. Jadi pilihan mana yang akan digunakan ada di tangan Anda. Tersedia tiga opsi: 8-Pin SO (150 mils), 8-Pin SOP, dan 3-Pin TO-92. Berselancar di eBay atau Aliexpress menunjukkan bahwa orang Cina menawarkan versi TO-92 dalam wadah tahan air. Artinya, Anda dapat dengan aman mencelupkan keajaiban seperti itu ke dalam air, menggunakannya dalam hujan, dll. dll. Sensor ini dibuat dengan tiga pin keluaran (hitam - GND, merah - Vdd dan putih - Data).
Berbagai faktor bentuk sensor DS18B20 ditunjukkan pada gambar di bawah ini.
Model DS18B20 dalam wadah tahan air:
DS18B20 nyaman digunakan. Anda dapat menyalakannya melalui kontak data (dalam hal ini, Anda hanya menggunakan dua dari tiga kontak untuk koneksi!). Sensor beroperasi pada rentang tegangan dari 3,0 V hingga 5,5 V dan mengukur suhu dalam rentang dari -55 °C hingga +125°C (dari -67°F hingga +257°F) dengan akurasi ±0,5°C (dari -10 °C hingga +85 °C).
Fitur keren lainnya: Anda dapat menghubungkan hingga 127 sensor secara paralel! dan membaca pembacaan suhu dari masing-masing secara terpisah. Tidak sepenuhnya jelas di proyek mana ini mungkin diperlukan, tetapi sambungkan dua sensor dan kendalikan suhu di lemari es dan freezer bisa. Pada saat yang sama, Anda akan meninggalkan banyak pin di Arduino secara gratis ... Secara umum, fitur yang bagus.
Apa yang Anda Butuhkan untuk Mengontrol Suhu dengan Arduino dan DS18B20
Perangkat lunak
- Tentu saja, Anda memerlukan Arduino IDE;
- Pustaka OneWire, yang membuatnya lebih mudah untuk bekerja dengan sensor Arduino dan DS18B20;
- Sketsa...
Mengunggah sketsa ke Arduino
Sketsa di bawah ini ada di perpustakaan OneWire, dalam kategori contoh. Buka "File" - "Contoh" - "OneWire" dan pilih contoh "DS18x20_Temperature". Kode program ditunjukkan di bawah ini.
Contoh ini menggunakan Perpustakaan OneWire untuk mengumpulkan data dari semua sensor suhu DS28B20 yang terhubung (cara menghubungkan beberapa sensor dijelaskan di akhir artikel) dan menampilkannya di jendela monitor serial Arduino IDE.
Di jendela monitor serial, Anda akan melihat sesuatu seperti ini:
ROM = 28 88 84 82 5 0 0 6A
Tidak ada lagi alamat.
ROM = 28 88 84 82 5 0 0 6A
Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1
Suhu = 21,37 Celcius, 70,47 Fahrenheit
Tidak ada lagi alamat.
ROM = 28 88 84 82 5 0 0 6A
Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1
Suhu = 21,37 Celcius, 70,47 Fahrenheit
Tidak ada lagi alamat.
Pastikan Anda memasukkan pin yang benar!
Pada baris 10, yang mengatakan “OneWire ds(2);” pin diatur untuk menghubungkan kontak data dari sensor.
Dalam contoh ini, pin 2 digunakan, tetapi nilai default untuk pin dalam contoh OneWire adalah 10. Anda juga dapat menggunakannya.
#sertakan <OneWire.h>
// contoh penggunaan perpustakaan OneWire DS18S20, DS18B20, DS1822
OneWire ds(2); // pada pin 10 (membutuhkan resistor 4,7 kΩ)
pengaturan batal (batal) (
Serial.begin(9600);
lingkaran kosong (batal) (
byte sekarang = 0;
mengapung celcius, fahrenheit;
jika (!ds.search(addr)) (
Serial.println("Tidak ada lagi alamat.");
Serial.println();
ds.reset_search();
Serial.print("ROM=");
Serial.write(" ");
Serial.print(tambahkan[i], HEX);
if (OneWire::crc8(addr, 7) != addr) (
Serial.println("CRC tidak valid!");
Serial.println();
// byte pertama mendefinisikan chip
Serial.println("Chip = DS18S20"); // atau DS1820 yang lebih lama
Serial.println("Chip = DS18B20");
Serial.println("Chip = DS1822");
Serial.println("Perangkat bukan perangkat keluarga DS18x20.");
ds pilih(tambahkan);
penundaan (1000); // 750 mungkin atau mungkin tidak cukup
// kita bisa menggunakan ds.depower() di sini, tapi reset akan mengatasinya
sekarang = ds.reset();
ds pilih(tambahkan);
Serial.print("Data = ");
Cetak serial (sekarang, HEX);
cetak seri("");
data[i] = ds.read();
Serial.print(data[i], HEX);
cetak seri("");
Serial.print("CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
// konversi yang diberikan ke suhu aktual
// karena hasilnya adalah bilangan bulat 16 bit, maka harus disimpan di
// variabel dengan tipe data "int16_t", yang selalu 16 bit,
// bahkan jika kita mengkompilasi pada prosesor 32-bit
int16_t mentah = (data
jika (data == 0x10) (
mentah = (mentah & 0xFFF0) + 12 - data;
byte cfg = (data & 0x60);
// untuk nilai kecil, bit kecil tidak ditentukan, mari kita setel ke nol
if (cfg == 0x00) mentah = mentah & ~7; // resolusi 9 bit, 93,75 ms
lain jika (cfg == 0x20) mentah = mentah & ~3; // resolusi 10 bit, 187,5 ms
lain jika (cfg == 0x40) mentah = mentah & ~1; // resolusi 11 bit, 375 ms
//// resolusi default adalah 12 bit, waktu konversi adalah 750 ms
celsius = (mengambang) mentah / 16.0;
fahrenheit = celsius * 1,8 + 32,0;
Serial.print("Suhu = ");
Cetak serial (celsius);
Serial.print("Celcius, ");
Cetak serial (fahrenheit);
Serial.println("Fahrenheit");
Bagaimana cara menghubungkan beberapa sensor DS18B20 ke Arduino?
Anda dapat menghubungkan beberapa sensor suhu digital DS18B20 secara paralel. Pada saat yang sama, perpustakaan OneWire akan memungkinkan Anda membaca data dari semua sensor secara bersamaan.
Dua metode untuk menghubungkan sensor dijelaskan di bawah ini.
Untuk sejumlah besar sensor (lebih dari 10), perlu menggunakan resistor dengan resistansi lebih rendah (misalnya, 1,6 kOhm atau bahkan kurang).
Selain itu, jika Anda menghubungkan lebih dari 10 sensor secara paralel, mungkin ada masalah (kesalahan akuntansi). Oleh karena itu, disarankan untuk memasang resistor 100...120 ohm tambahan antara pin data pada Arduino dan pin data pada masing-masing sensor!
Hasil sketsa sebelumnya dengan dua sensor yang terhubung mungkin terlihat seperti ini:
ROM = 28 88 84 82 5 0 0 6A
Data = 1 51 1 4B 46 7F FF F 10 FE CRC=FE
Suhu = 21,06 Celcius, 69,91 Fahrenheit
ROM = 28 DA CA 27 5 0 0 49
Data = 1 4E 1 4B 46 7F FF 2 10 D9 CRC=D9
Suhu = 20,87 Celcius, 69,57 Fahrenheit
Tidak ada lagi alamat.
Memilih sensor yang tepat
Akan menyenangkan untuk mengetahui dari sensor mana Anda mendapatkan data saat Anda menggunakan beberapa sensor secara paralel. Bagaimana cara melakukannya?
Nomor seri
Karena sensornya digital, masing-masing memiliki nomor seri individual yang dapat digunakan untuk mengidentifikasi sensor tertentu. Semuanya tampak sederhana. Tapi... kita perlu menentukan nomor seri ini terlebih dahulu sebelum kita dapat menggunakannya untuk mengidentifikasi sensor, kan?
Anda dapat melihat pada contoh di atas bahwa sketsa memberi kami data dalam bentuk nomor seri 64-bit - nilai "ROM". Misalnya:
28 88 84 82 5 0 0 6A atau 28 DA CA 27 5 0 0 49 pada contoh di atas.
Jangan lupa, jika Anda menggunakan sejumlah besar sensor secara bersamaan (10 atau lebih), Anda perlu menambahkan resistor 100 ... 120 Ohm antara pin data dari sensor DS18B20 dan pin data pada Arduino ( untuk setiap sensor!).
Diagram di bawah ini menunjukkan bagaimana menghubungkan beberapa sensor secara paralel menggunakan tiga pin.
Tinggalkan komentar, pertanyaan, dan bagikan Anda pengalaman pribadi di bawah. Dalam diskusi, ide dan proyek baru sering lahir!