Kontainer Pengiriman Sampel Terkontrol Suhu Presisi dengan Sensor PT-100 dan Arduino UNO
Komponen dan Perlengkapan
Sensor Suhu PT 100
×
1
Arduino UNO
×
1
Baterai Lithium Ion
10400 mAh
×
1
Kotak Polystyrene
Daur ulang dari pengiriman konvensional sampel/kimia
×
1
Blok Tembaga
Dua blok tembaga sekitar 80x50x10mm, untuk dishaping sebagai heat sink dan pemasangan Peltier, dengan lubang untuk heat pipe.
×
1
Modul Papan Sumber Daya Boost Disesuaikan ULS
×
1
Pendingin Heatpipe
×
1
Potensiometer Digital
×
1
Magic Gel
Untuk meningkatkan transfer panas kita bisa memasukkan batang logam di antara sampel
×
1
Konverter DC
×
1
Modul Peltier
×
1
Kapasitor 3.3 uF
×
1
Pipa Panas
×
1
Sumber Daya untuk Listrik Jaringan
×
1
Pemisah DC untuk Sumber Daya
×
1
Layar LCD Adafruit
×
1
Mat Pemanas
Untuk memanaskan sampel
×
1
Blok Klem
×
1
Kantong Plastik
×
1
Stopak DC Panel Mount
×
1
Saklar Four Pole Double Throw
×
1
Saklar Single Pole Double Throw
×
1
Kantong Plastik Eksternal untuk Elektronika
×
1
Konektor Blok Klem, 3 jalur
×
1
Konektor Blok Klem, 5 jalur
×
1
Tali Tempel Hook and Loop DualLock
×
1
Adafruit Proto-screwshield
Untuk koneksi kabel screw terminal yang lebih kuat ke Arduino
×
1
Charger Baterai Lithium-ion USB Adafruit
×
1
Penguat Sensor Suhu PT100 Adafruit
×
1
Alat dan Mesin yang Diperlukan
Pemolot (generik)
Dremel 4000
Titik Klem
Bor
Alat pelupas kabel, tang, pemotong
Mesin bubut manual
Untuk dishaping bagian tembaga
Aplikasi dan Layanan Online
GitHub
Kami menggunakan perpustakaan sleemanj untuk Potensiometer Digital MCP41100 (terima kasih sleemanj!). Kami juga menggunakan perpustakaan Adafruit untuk setiap modul Adafruit yang kami gunakan; tersedia dari halaman produk.
Arduino IDE
Tentang Proyek Ini
Mr ThermoParcel: Kontainer Terkontrol Suhu untuk Pengangkutan Sampel
Tujuannya adalah mengembangkan kontainer terkontrol suhu yang dapat digunakan untuk mengangkut dengan aman sampel sensitif dengan layanan pos konvensional. Perangkat prototipe kami, yang disebut Mr ThermoParcel, bekerja dalam rentang suhu 4-37 °C, dan dapat diberdayakan oleh adaptor listrik jaringan, baterai internal, atau sumber 12V lain seperti lighter mobil atau charger laptop.
Genesis Proyek Kami
Ide kami berasal dari masalah nyata yang kami hadapi dalam penelitian akademis: pertukaran yang aman dari sampel biologis sensitif dengan kolaborator. Viola bekerja pada penyakit malaria, dan sering ada kebutuhan untuk mengirim atau menerima sampel darah. Namun, jika sampel tidak disimpan pada suhu yang benar selama penyimpanan dan pengiriman, mereka dapat mudah degradasi dan menjadi tidak berguna. Ini semakin menyedihkan saat sampel mengandung jenis darah berharga yang memiliki respons khusus terhadap malaria dan berasal dari pasien langka.
Metode umum untuk mengirim sampel darah jenis ini adalah dengan membeku sepenuhnya sebelum pengiriman, menggunakan kurir standar untuk barang beku, dan kemudian melelehkan dengan hati-hati setelah pengiriman. Selain masih mahal, sistem ini jauh dari ideal, karena membeku/melelehkan selalu mengubah atau merusak bagian dari sampel, dan proses melelehnya sendiri mengikuti protokol spesifik yang memerlukan kimia tambahan. Selain itu, barang seringkali dikirimkan ke Universitas di depot paket kampus, di mana kondisi penyimpanan yang tidak tepat dan keterlambatan notifikasi pengiriman adalah penyebab umum degradasi sampel.
Konsep Desain
Kami mengintegrasikan sistem kontrol suhu dalam kotak polystyrene konvensional berukuran paket kecil, daur ulang dari pengiriman kimia. Kami mengoptimalkan dan mengujinya dengan sampel darah, tetapi sistem yang sama dapat digunakan untuk berbagai jenis bahan biologis lainnya seperti sel, media kultur, kimia sensitif suhu, emulsi, dan enzim, atau bahkan disesuaikan untuk item padat.
Konsep sistem ditunjukkan dalam Gambar 1. Pendingin dicapai dengan modul Peltier, dengan sisi dingin ditempel pada kotak sampel kecil di dalam wadah polystyrene, dan sisi panas terhubung ke heat sink eksternal. Pemanasan dilakukan dengan mat pemanas yang ditempatkan di dalam kotak sampel. Suhu selalu dipantau menggunakan sensor dalam kontak dengan sampel, dan intensitas pemanasan/pendingin diatur oleh pengontrol Arduino.
Implementasi
Desain perangkat keras kontainer
Wadah eksternal adalah kotak polystyrene dengan dimensi 250x250x250mm dan tekanan dinding 45mm di semua sisi, yang merupakan jenis kotak umum yang digunakan dalam pengiriman laboratorium dengan layanan pos standar. Kantong plastik (125x70x40mm) ditempatkan di dalam, dan berisi dua tabung sentrifug 50mL. Tabung ini berfungsi sebagai kemasan sekunder sesuai peraturan untuk Bahan Biologis dan Infeksius, Kategori B UN3373 (link: https://www.un3373.com/info/regulations/ ). Sampel primer adalah enam tabung Eppendorf 2mL yang berisi spesimen, dipisahkan oleh jaringan serap untuk mencegah kebocoran apa pun. Mr ThermoParcel mampu menyimpan hingga 50mL sampel cair dengan mengganti kemasan sekunder keras dengan kantong fleksibel yang dapat menampung lebih banyak spesimen, misalnya hingga tiga atau empat tabung 15mL (link: https://www.alphalabs.co.uk/laboratory-products/consumables/sample-handling/sample-transport/95kpa-pouches ). Untuk meningkatkan keseragaman pemanasan/pendingin di dalam kotak internal, dan memastikan kontak termal antara lembar tembaga, sampel, dan sensor suhu, kami mencor gel padat yang isolir listrik di sekitar sampel. Kotak internal yang berisi sampel ditunjukkan dalam Gambar 2.
Sistem Pendingin dan Pemanas
Suhu internal dipantau dengan termometer resistensi Pt 100Ohm (atau Detektor Suhu Resistensi, RTD) yang ditempatkan dalam kontak dengan sampel, dan dikontrol dengan sistem PID menggunakan modul Peltier (pendingin) atau mat pemanas (pemanas). Untuk membuang panas dari Peltier di luar kotak, sisi panas modul Peltier ditempatkan dalam kontak termal dengan bagian tembaga eksternal dan heat sink (pendingin CPU) melalui tiga pipa tembaga panas. Sisi dingin ditempel pada lembar tembaga tipis yang melewati kotak, mengudarkan sampel secara seragam. Detail kopling termal ditunjukkan dalam Gambar 3.
Mat pemanas ditempatkan di dalam kotak internal dalam kontak dengan sensor suhu dan sampel.
Elektronika & Penyaluran
Regulasi pendingin dan pemanas
Modul Peltier yang digunakan oleh Mr ThermoParcel berdaya tahan 3,9A dan 7,6V pada daya pendingin maksimal. Untuk mengontrol suhu secara efektif, jumlah daya yang dikirimkan ke modul Peltier diatur secara elektronik menggunakan pengatur switching step-down dapat disesuaikan PTN78020W. Pengatur menerima tegangan input dalam rentang 7-36V, dan menghasilkan output dalam rentang 2,5-12,6V, dengan keterbatasan bahwa output tidak boleh melebihi input dikurangi 2V. Tegangan output diatur dengan menetapkan nilai resistensi tertentu antara dua pin regulasi, sesuai tabel dalam datasheet perangkat. Mr ThermoParcel menggunakan potensiometer digital MCP41100 100kOhm, yang dikontrol oleh Arduino, untuk mengatur tegangan output secara elektronik berdasarkan pembacaan suhu. Karena seluruh rentang tegangan output PTN78020W memerlukan variasi tegangan melebihi 1MOhm, tegangan diterapkan ke modul Peltier bahkan ketika potensiometer digital diatur ke 100kOhm, sehingga modul Peltier tidak dapat “dimatikan” menggunakan potensiometer digital saja. Konsep regulasi yang sama berlaku untuk pemanasan yang dilakukan dengan mat pemanas. Mat ini hanyalah resistor yang membuarkan arus sebagai panas, dan mengatur tegangan adalah cara langsung untuk mengontrol daya yang dikirimkan.
Sumber daya
Sumber daya DC 12V digunakan untuk memberi daya langsung pada PTN78020W ketika Mr ThermoParcel dekat dengan soket listrik jaringan. Ini memungkinkan output hingga 10V, yang cukup untuk menggerakkan Peltier pada daya maksimal, dan mat pemanas pada daya yang cukup untuk tujuan proyek. Dengan rentang input 7-36V pengatur PTN78020W, Mr ThermoParcel juga dapat dijalankan dengan sebagian besar sumber daya DC yang digunakan untuk laptop dan perangkat elektronik lainnya, serta soket lighter yang ditemukan dalam mobil. Ketika daya eksternal tidak tersedia, Mr ThermoParcel diberdayakan oleh baterai Li-ion 3,7V, 10400mAh. Baterai masih memberi daya pada pengatur PTN78020W, tetapi untuk mencapai tegangan input yang diperlukan untuk menggerakkan modul Peltier (10-12V pada input PTN78020W), konverter DC-DC step-up XL6019 terhubung terlebih dahulu pada output baterai.
Penyaluran Arduino
Daya diberikan ke Arduino langsung dari input eksternal 12V jika tersedia, melalui soket jack pada papan. Jika menggunakan baterai internal, tegangan yang sama diatur pada soket menggunakan output dari konverter XL6019.
Arduino mengatur daya yang dikirimkan ke modul Peltier/mat pemanas dengan mengontrol resistensi potensiometer digital. Penyaluran dilakukan sesuai instruksi dalam perpustakaan sleemanj MCP41 series, dengan potensiometer dalam konfigurasi resistor variabel. Arduino juga terhubung ke penguat Pt100 RTD Adafruit MAX31865, yang digunakan untuk membaca sensor suhu, dan ke LCD Shield RGB Adafruit, yang digunakan untuk menampilkan data suhu dan operasi sistem. Keduanya disalurkan sesuai dokumentasi Adafruit yang menyeluruh yang ditemukan di halaman produk.
Perangkat lunak
Semua modul Adafruit yang terhubung ke Arduino dioperasikan dengan perpustakaan masing-masing, dan potensiometer digital dengan perpustakaan sleemanj MCP41 series. Fungsi inti dari kode Arduino di Mr ThermoParcel berkaitan dengan kontrol suhu, yang diimplementasikan dengan sistem PID loop tertutup. Titik set suhu diberikan oleh pengguna melalui tombol LCD shield. Setiap pembacaan suhu yang diukur kemudian digunakan untuk mendapatkan deviasi dari titik set, dan sehingga menghitung nilai PID yang dikirimkan ke potensiometer digital untuk mengatur daya pendingin/pemanas. Saklar toggle fisik eksternal menentukan apakah output daya diarahkan ke modul Peltier (pendingin) atau mat pemanas (pemanas). Karena tidak ada saklar elektronik dalam sistem, perbedaan dibuat dalam kode antara mode pemanasan dan mode pendingin, dan pengguna harus memilih mode yang tepat menggunakan tombol LCD shield. Perbedaan ini memastikan bahwa nilai PID yang dihitung memiliki tanda yang benar. Selama pengujian kami kami mencoba berbagai nilai untuk faktor PID, dan amati bahwa istilah P saja cukup dalam sebagian besar situasi untuk tetap dalam ±0,5°C dari titik set, sehingga kami akhirnya menghapus faktor I dan D. Ini mungkin disebabkan oleh kapasitas panas yang cukup besar dari sampel dan kotak internal yang diisi gel, yang membuat perubahan suhu lambat (biasanya rata-rata 0,02°C/detik dalam regime tercepat).
Kinerja
Ketika diberdayakan oleh listrik jaringan, Mr ThermoParcel pendingin hingga 4°C saat mulai dari suhu kamar 21-23°C dalam waktu sekitar 1 jam. Suhu 8-10°C tercapai dalam 20 menit pertama. Memulai lagi dari suhu kamar, dan menggunakan mat pemanas, 37°C tercapai dalam waktu sekitar 10 menit. Semua suhu dipertahankan pada titik set dalam ±0,5°C.
Ketika diberdayakan hanya oleh baterai internal, sekitar 10°C adalah suhu minimum yang dapat tercapai, dalam waktu 1,5-2 jam. Dengan mat pemanas, 37°C masih dapat diperoleh tetapi dalam 40-60 menit. Keterbatasan ini disebabkan oleh tingkat pengosongan baterai: baterai Li-ion di Mr ThermoParcel berdaya tahan arus pengosongan maksimum 7A pada 3,7V, namun dikonversi step-up ke 10-12V arus pengosongan perlu lebih tinggi untuk mempertahankan daya maksimum modul Peltier. Karena baterai memiliki sirkui perlindungan sendiri yang memutus outputnya dalam kasus beban arus berlebihan, sistem tidak dapat berfungsi jika sistem pendingin/pemanas mencoba menarik arus yang lebih besar dari rating maksimum. Saat beroperasi melalui baterai, konsumsi daya dibatasi oleh perangkat lunak ke tingkat yang aman. Keterbatasan ini sepenuhnya karena baterai yang digunakan di sini, dan baterai dengan tingkat pengosongan yang lebih tinggi tersedia secara luas. Alternatifnya, baterai Li-ion dengan 3 sel dalam seri dan tegangan nominal 11,1V akan memecahkan masalah dan juga menghilangkan kebutuhan akan konverter DC step-up.
Arah Masa Depan
Dalam tahap pengembangan saat ini, perangkat kami tidak dapat dikirim, terutama karena ukuran dan bagian bergerak dari pendingin CPU, dan keawetan konstruksi. Namun, setelah heat sink diganti dengan sistem pendingin pasif dan kemasan sekunder 95k Pa digunakan, Mr ThermoParcel dapat dimasukkan dalam wadah kaku yang sesuai untuk pengiriman yang aman, memenuhi semua persyaratan kurir standar untuk mengirim sampel melalui pesawat dan semua sarana transportasi lainnya.
Dengan tujuan inti yang tercapai, komponen lain dapat ditambahkan untuk memperluas fungsionalitas perangkat. Profil suhu selama pengiriman dapat disimpan dalam memori lokal untuk verifikasi nanti, atau dikirim langsung ke pengguna melalui SMS pada interval teratur menggunakan modul GSM Arduino. Penerima GPS juga dapat dimasukkan untuk pelacakan paket mandiri dan pengumpulan tepat waktu saat pengiriman.
Kode
PID_LCD_controller_v03
PID_LCD_controller_v03Arduino
Kode Arduino untuk terhubung ke modul yang digunakan oleh Mr ThermoParcel, menjalankan pengontrol PID, menampilkan informasi pada panel LCD, dan menerima input pengguna.
#include <Adafruit_MAX31865.h> // import PT100 temperature sensor library #include <MCP41_Simple.h> // import digital potentiometer library #include <Adafruit_RGBLCDShield.h> // import LCD display & buttons shield library #include <utility/Adafruit_MCP23017.h> // import I2C expander library #include <Wire.h> // Setting up digital potentiometer MCP41_Simple digitalPotentiometer; // create digital potentiometer object const uint8_t digitalPotentiometer_CS = 10; // Setting up PT100 temperature sensor // Use software SPI for PT100 temperature sensor: CS, DI, DO, CLK Adafruit_MAX31865 PT100amplifier = Adafruit_MAX31865(2, 3, 4, 5); // Set value of the Rref resistor. Use 430.0 for PT100 temperature sensor. #define RREF 430.0 // Nominal 0-degrees-C resistance of the sensor, 100.0ohm for PT100 #define RNOMINAL 100.0 // Setting up LCD display shield with buttons Adafruit_RGBLCDShield LCD_shield = Adafruit_RGBLCDShield(); //#define OFF 0x0 // ON and OFF states can be used to turn on/off the LCD backlight //#define ON 0x1 void setup() { Serial.begin(115200); Serial.println("Mr ThermoParcel, starting operation..."); PT100amplifier.begin(MAX31865_4WIRE); // set to 2WIRE or 4WIRE as necessary, 4-wire RTD in this case // Initialise digital potentiometer digitalPotentiometer.begin(digitalPotentiometer_CS); // Set the wiper to an arbitrary point between 0 and 255 digitalPotentiometer.setWiper( 200 ); // Initialise LCD display shield // set up the LCD's number of columns and rows: LCD_shield.begin(16, 2); // set up setpoint and measured T text on LCD with the correct spacings LCD_shield.print("Tsetpoint: C"); LCD_shield.setCursor(0, 1); LCD_shield.print("Tsample: C"); } // Initialise PID constants, temperature related variables and shield button value int powerMode = 1; // powerMode=1 for battery power, powerMode=-1 for mains power; used to prevent battery overload int operationMode = 1; // operationMode=1 for cooling, operationMode=-1 for heating; used to correct sign of PID terms float PT100ratio; // Define resistance ratio variable for PT100 sensor uint8_t buttonsPressed = 0; float kp = 500.0; //; int ki = 5; int kd = 3.9; float PID_p = 0.0; // int PID_i = 0; int PID_d = 0; float Tmeasured = -1.0; float Tsetpoint = 22.0; // Start around room temperature float PID_error = 5; float PID_value = 0; // Define print_Tsetpoint function to correctly print the temperature setpoint on the LCD screen static char TsetpointString[3]; void print_Tsetpoint(int T) { // Print Tsetpoint in the correct place LCD_shield.setCursor(10, 0); dtostrf(T, 3, 0, TsetpointString); LCD_shield.print(TsetpointString); } // Define print_Tmeasured function to correctly print the measured temperature on the LCD screen static char TmeasuredString[4]; void print_Tmeasured(float T) { // Print Tmeasured in the correct place LCD_shield.setCursor(8, 1); dtostrf(T, 5, 1, TmeasuredString); LCD_shield.print(TmeasuredString); } // Define print_powerMode function to correctly print the power mode (B, battery; M, mains) void print_powerMode() { LCD_shield.setCursor(15, 0); if (powerMode == 1) { LCD_shield.print("B"); } else if (powerMode == -1) { LCD_shield.print("M"); } } // Define print_operationMode function to correctly print the power mode (C, Peltier cooler; H, heating mat) void print_operationMode() { LCD_shield.setCursor(15, 1); if (operationMode == 1) { LCD_shield.print("C"); } else if (operationMode == -1) { LCD_shield.print("H"); } } // *** main loop *** void loop() { // Read temperature uint16_t rtd = PT100amplifier.readRTD(); PT100ratio = rtd; PT100ratio /= 32768; Tmeasured = PT100amplifier.temperature(RNOMINAL, RREF); Serial.print("Setpoint Temperature = "); Serial.println(Tsetpoint); Serial.print("Temperature = "); Serial.println(Tmeasured); // Print temperature values and modes print_Tsetpoint(Tsetpoint); print_Tmeasured(Tmeasured); print_powerMode(); print_operationMode(); // Calculate the error between setpoint and measured value PID_error = Tmeasured - Tsetpoint; //Calculate the P value PID_p = operationMode * kp * PID_error; // Calculate total PID value, if above maximum (255) keep at 255, if below minimum (0) keep at 0 PID_value = (int) PID_p; //+ PID_i + PID_d; Serial.print("PID_p = "); Serial.println(PID_p); Serial.print("powerMode = "); Serial.println(powerMode); Serial.print("operationMode = "); Serial.println(operationMode); Serial.print("PID_error = "); Serial.println(PID_error); Serial.print("PID_value = "); Serial.println(PID_value); // If in battery mode (powerMode=1) limit output to avoid battery overload // If in mains mode (powerMode=-1) allow full power (255) if (powerMode == 1) { if (PID_value < 0) { PID_value = 0; } if (PID_value > 120) { PID_value = 120; } } else if (powerMode == -1) { if (PID_value < 0) { PID_value = 0; } if (PID_value > 255) { PID_value = 255; } } Serial.print("Adjusted PID_value = "); Serial.println(PID_value); // Set digital potentiometer resistance from PID value digitalPotentiometer.setWiper(255 - PID_value); // Detect any buttons pressed, change the setpoint value if needed, and display measured and setpoint T // delay() funcion calls ensure that enough time is given to press buttons and see the values change delay(1000); buttonsPressed = LCD_shield.readButtons(); if (buttonsPressed & BUTTON_SELECT) { // Highlight that system in edit mode by blinking the cursor LCD_shield.setCursor(14, 0); LCD_shield.blink(); delay(1000); buttonsPressed = 0; // Stay in edit mode until SELECT button is pressed again. Buttons UP and DOWN change Tsetpoint. // LEFT toggles operation mode (heating/cooling). RIGHT toggles power mode (battery/mains). while (not (buttonsPressed & BUTTON_SELECT)) { buttonsPressed = LCD_shield.readButtons(); if (buttonsPressed & BUTTON_UP) { Tsetpoint += 1; } if (buttonsPressed & BUTTON_DOWN) { Tsetpoint -= 1; } if (buttonsPressed & BUTTON_RIGHT) { powerMode *= -1; print_powerMode(); } if (buttonsPressed & BUTTON_LEFT) { operationMode *= -1; print_operationMode(); } print_Tsetpoint(Tsetpoint); LCD_shield.setCursor(14, 0); delay(500); } // Exit edit mode and stop blinking cursor LCD_shield.noBlink(); buttonsPressed = 0; } Serial.println(); }
Skematik
Skematik rangkaian dengan semua komponen utama kontainer terkontrol suhu kami.Skematik penyaluran yang diminta oleh pengguna lain dari komunitas. Ini adalah yang kami gunakan untuk merakit penyaluran, jadi ini jelek dan tidak pernah dimaksudkan untuk publikasi! Tapi mungkin bisa membantu.Penyaluran potensiometer ke komponen lain.