Mengukur suhu secara akurat dengan Arduino

10

Saya mencoba membangun termostat dengan Arduino. Saya ingin memberinya daya menggunakan baterai / charger ponsel yang membuat voltase sistem cukup bervariasi. Saat ini saya menggunakan Arduino Uno, tetapi setelah selesai saya akan porting ke Lilypad.

Pertama saya mencoba menggunakan sensor suhu TMP36 . Sejauh ini kegagalan total. Sementara sensor itu sendiri tampak sangat stabil, saya tidak dapat menemukan cara untuk mengukur tegangannya secara akurat.

Menggunakan referensi built-in 5v untuk sensor analog tidak bekerja sama sekali - bahkan didukung oleh USB arduino + 5V sebenarnya + 4.8V (yang menggeser suhu yang diukur beberapa derajat). Ketika papan diberi daya dari baterai, tegangan turun menjadi sekitar 4V dan suhu-roket langit diukur. Saya juga mencoba menggunakan + 3.3V dari papan sebagai referensi. Tampaknya lebih stabil ketika papan dinyalakan dari USB, tetapi voltase turun ketika baterai habis.

Apakah ada cara lain untuk mengukur tegangan output sensor dengan andal?

Untuk tahap kedua saya berencana menggunakan termistor. Baru saja memesan beberapa termistor 20K ini .

Dari apa yang saya mengerti, ini harus lebih mudah untuk mengukur secara akurat jika saya membangun pembagi tegangan dan menggunakan V_in sebagai tegangan referensi untuk ADC.

Beberapa pertanyaan tentang mereka:

  • Apakah masuk akal untuk menggunakan beberapa pembagi tegangan dengan resistor tetap yang berbeda untuk meningkatkan akurasi?
  • Saya dapat menggunakan pin yang dapat diprogram sebagai V_in, dan mengukur suhu menggunakan beberapa level tegangan yang berbeda. Meskipun tidak jelas bagi saya apakah ini benar-benar akan meningkatkan akurasi.
Usov
sumber
Silakan kirim kode konversi suhu Anda.
geometrikal
Silakan tentukan apa yang Anda maksud dengan "akurat". Apa resolusi suhu dan akurasi absolut yang ingin Anda capai?
Joe Hass
Saya berharap mendapatkan resolusi sekitar 1-2 derajat. Kesalahan kalibrasi absolut 1-2 derajat juga tidak masalah. Dari apa yang saya pahami relatif mudah untuk mendapatkan titik referensi pada 0C, dan saya kira saya bisa mendapatkan titik kedua (lebih kasar) pada suhu kamar dengan sensor kalibrasi silang.
Usov
1-2 derajat untuk suhu di kisaran 5-25C.
Usov
@geometrikal Saya tidak memilikinya saat ini, tetapi pada dasarnya sama dengan yang lainnya: drop sampel pertama, tunggu beberapa millis, sampel beberapa kali lebih banyak dan sampel rata-rata. Kemudian skala ulang dengan apa yang Anda percaya tegangan referensi Anda.
Usov

Jawaban:

2

Tampaknya Anda menyadari masalah dengan perubahan tegangan referensi dan jika Anda menggunakan perangkat seperti TMP36 (tetap 10mV / degC) tidak ada yang dapat Anda lakukan selain menggunakan referensi tegangan dari sebuah chip untuk menstabilkan sesuatu.

Namun, jika Anda menggunakan RTD atau termistor maka masalahnya tidak akan muncul. Anda ADC sedang membuat pengukuran ratiometrik - ia membandingkan input ADC dengan tegangan referensi NAMUN, jika Anda menyalakan RTD atau termistor (melalui resistor yang sesuai) dari tegangan ref yang sama, itu tidak akan mempengaruhi pembacaan. Jika ref naik 10% maka tegangan juga masuk ke ADC.

Andy alias
sumber
4

Saya pikir Anda harus mempertimbangkan menggunakan sensor suhu digital seperti DS18B20 / DS18S20 karena tidak tergantung pada keakuratan ATmega ADC Anda untuk mengukur sinyal anaolg, ia menggunakan protokol digital 1-kawat untuk melaporkan suhu.

Lihat tutorial berikut
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino

alexan_e
sumber
2
Jawaban ini tidak terlalu membantu kecuali Anda menjelaskan mengapa OP harus beralih ke sensor yang berbeda, dan Anda tidak memberikan alasan untuk itu. Hanya memberikan tautan dalam jawaban bukanlah ide yang baik karena sering mati dan konten jawabannya hilang.
Joe Hass
Daripada menuliskan jawaban saya sendiri di baris yang sama, saya telah mengedit A ini untuk mengatasi masalah yang diangkat oleh Joe.
RedGrittyBrick
@ JoHass Satu-satunya alternatif selain menautkan ke artikel eksternal adalah dengan melampirkan kode di balasan tetapi saya tidak memiliki kode sendiri untuk dilampirkan dan itu tidak akan sangat adil untuk melampirkan kode orang lain tanpa persetujuan mereka. Bahkan jika tautannya mati perpustakaan untuk Arduino dapat dengan mudah ditemukan menggunakan google dan DS18B20 sebagai kata kunci. Mengenai penjelasannya, itu adalah kesalahan saya, saya berpikir bahwa menyebutkan bahwa sensornya digital akan menjelaskan maksud saya.
alexan_e
Terima kasih atas komentarnya. Untuk beberapa alasan sensor digital cukup sulit ditemukan. Baik pemasok lokal (Maplin) maupun orang-orang online murah (er) (saya menggunakan Spiraltronics) tidak menjual apa pun. £ 3 pengiriman pop + masih membuatnya menjadi pilihan yang relatif mahal.
Usov
@Usov Menilai dari tautan yang Anda berikan, saya asumsikan Anda tinggal di Inggris. Saya biasanya membeli komponen-komponen ini dengan harga murah dari Tiongkok tetapi saya juga menemukannya di ebay.uk dengan harga £ 1,49, mungkin itu cocok untuk Anda
alexan_e
3

Pengukuran Anda akan sebagus tegangan referensi untuk ADC baik. Arduino secara default menggunakan tegangan suplai sebagai tegangan referensi, tetapi dalam kasus Anda cara yang tepat untuk melakukannya adalah dengan menggunakan pin Aref dari arduino. Anda harus mendapatkan chip khusus yang disebut "Referensi tegangan" dan menghubungkannya ke pin Aref, lalu atur ADC untuk menggunakan referensi eksternal dalam kode Arduino ( analogReference(EXTERNAL))

Tegangan referensi harus dipilih sehingga ayunan penuh sensor suhu Anda akan masuk ke dalam tegangan referensi. TMP36 akan menampilkan ~ 1.5V @ 100C, jadi Anda harus menggunakan referensi di atas 1.5V untuk mengukur suhu hingga 100C. Anda ingin referensi Anda sedekat mungkin dengan voltase maksimum yang diukur untuk mendapatkan resolusi sebanyak mungkin.

Atmega328p memiliki dua referensi internal yang dapat digunakan tanpa komponen eksternal. Satu adalah 1.1V, yang lain 2.56V. Mereka biasanya akurasi sedikit lebih buruk daripada apa yang Anda dapatkan dengan menggunakan komponen khusus eksternal. Periksa dokumentasi Arduino untuk referensi analogReference dan Atmega328p untuk akurasi referensi internal.

Jika Anda benar-benar ingin mendapatkan kacang dengan rentang yang berbeda, Anda dapat menggunakan beberapa referensi eksternal dan mengubahnya dengan menggunakan saklar analog seperti 74hc4051. Atau Anda dapat beralih di antara dua referensi internal.

Dengan termistor Anda akan memiliki hasil yang lebih baik jika Anda mengatur sumber arus konstan daripada menggunakan resistor bodoh. Di sisi lain - resistor bodoh bertenaga dari referensi tegangan stabil akan berfungsi ok.

Ketika memilih referensi eksternal, pastikan Anda memiliki voltase yang cukup untuk mengakomodasi tegangan drop-out saat menyalakan dari baterai dan baterai sedang flat. Vref + Vdropout <Vbat-min.

miceuz
sumber
Terima kasih atas komentar Anda. Ini pada dasarnya adalah komentar yang sama yang saya dapatkan hari ini - membangun tegangan ref saya sendiri di dioda zener atau mendapatkan regulator tegangan rendah khusus untuk AREF.
Usov
Mengapa hasil yang lebih baik dengan arus konstan dan termistor?
geometrikal
2

Tidak memiliki referensi ADC yang stabil sebenarnya adalah gejala dari masalah lain di sirkuit Anda: Anda tidak memasok tegangan yang cukup tinggi ke papan. Ini ditunjukkan oleh persediaan 5V yang turun ke 4V dan juga yang jatuh 3.3V.

Regulator tegangan (MC33269D-5.0 IIRC) pada papan Arduino memiliki tegangan putus ~ 1,0V, oleh karena itu Anda perlu menyediakan setidaknya 6V untuk mendapatkan output 5V yang stabil. Baterai AA dimulai pada 1,5-1,6V dan hampir mati pada 1,1V sehingga Anda harus memberi daya pada papan dengan setidaknya 6 baterai AA untuk output yang stabil selama masa pakai baterai.

Didukung dengan benar, Anda dapat menggunakan referensi ADC internal atau jalur 5V atau 3.3V. Karena sensor suhu bervariasi sekitar 10mV per derajat Celcius, Anda dapat menggunakan pembagi tegangan untuk mengatur tegangan referensi yang setara dengan tegangan output sensor maksimum yang diharapkan (misalnya untuk 50 derajat C). Ini akan memberikan pengukuran yang lebih tepat.

Jika Anda ingin menggunakan kurang dari 6 baterai AA, coba konverter boost DC-DC, mis . Https://www.sparkfun.com/products/10968 . Contoh yang ditautkan mengambil 1V - 4V dan menghasilkan 5V. Output akan dimasukkan langsung ke pin 5V dari Arduino, melewati regulatornya.

Agar papan beroperasi lebih lama dengan baterai, letakkan MCU untuk tidur di antara sensor membaca. The rocketscream perpustakaan daya rendah sangat bagus untuk tujuan ini. Tapi itu hanya sangat berguna ketika menggunakan regulator / DC-DC converter yang efisien karena regulator Arduino standar menggunakan 10mA dengan sendirinya!

geometrikal
sumber
1

Jawaban untuk pertanyaan Apakah ada cara lain untuk mengukur tegangan output sensor dengan andal?

ADC menggunakan tegangan referensi untuk konversi dari analog ke digital. Jadi jika ada perubahan tegangan referensi, nilai yang dikonversi (yaitu nilai digital) akan berubah. Nilai digital akan berbeda untuk input analog yang sama jika tegangan referensi berubah.

Satu pilihan mudah adalah dengan menggunakan tegangan referensi internal di dalam Arduino (yaitu pengontrol Atmega).

Lihat tautan di bawah ini di mana kode sampel disediakan untuk menggunakan ADC internal (nama fungsi Arduino - analogReferensi (DEFAULT))

http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/

Saya pikir ini akan menyelesaikan masalah Anda dan tidak perlu beralih ke termistor.

robomon
sumber
Saya tidak yakin bagaimana "Hacking Wifi finder" relevan - saya tidak dapat menemukan relevansi apa pun di sana. Mengenai referensi ADC internal - saya menulis tentang hal itu. Ini tidak berfungsi bahkan ketika Arduino diaktifkan dari USB. Dan ketika papan didukung dari baterai ponsel (3,7 - 4,5V) bahkan lebih buruk.
Usov
Maaf ini kesalahan salin / tempel. Akan segera memperbaiki tautan!
robomon
@Usov tautan terkoreksi!
robomon
1.1V internal telah dapat mengapung lebih dari 10% menurut atmega328 spec. Ini sepertinya juga bukan referensi yang bisa diandalkan.
Usov