Kit Perokok Arang Terkontrol Suhu Presisi – Buat Karya BBQ Sendiri
Komponen dan Perlengkapan
- Arduino MKR1000 – 1 unit
- Blower Brushless 5V – 1 unit
- Modul Driver MOSFET IRF520N – 1 unit
- Thermistor NTC 100K ohm – 1 unit
- Papan Roti (generik) – 1 unit
- Kabel jumper (generik) – 1 set
- Baterai Lipo 3.7V >= 700mAh – 1 unit
Aplikasi dan Layanan Online
- Arduino IDE
- Microsoft Visual Studio 2015
Tentang Proyek Ini
Kisah Di Balik Layar
Sebagian besar pemula perokok BBQ yang serius tahu bahwa rasa terbaik berasal dari penggunaan arang untuk memanaskan perokok mereka. Perokok propan dan listrik memiliki kontrol suhu yang lebih baik, tetapi kehilangan rasa arang. Sebagai sumber panas, arang bisa menjadi kesulitan. Anda perlu terus memantau suhu, menyesalankan ventilasi untuk mencoba mendapatkan suhu yang benar, dan harus bermain-main dengan itu beberapa kali untuk mendapatkannya tepat. Lalu, Anda harus terus melakukan itu setiap setengah jam saat tingkat arang berubah di perokok. Bukankah akan hebat jika hanya duduk kembali di sofa Anda, menikmati minuman dingin favorit Anda dan acara olahraga di TV sambil membiarkan perokok melakukan pekerjaannya?
Proyek
Buat pengontrol yang memantau suhu di perokok dan menyesuaikan aliran udara ke arang untuk mempertahankan suhu yang benar. Juga, sediakan cara untuk memantau suhu baik perokok maupun sonda daging secara jarak jauh. Ini didasarkan pada Arduino MKR1000 yang akan dirilis segera dengan Wi-Fi bawaan dan dukungan untuk pengisian daya baterai LiPo.
Hardware
Suhu di perokok dipantau menggunakan Thermistor NTC 100K dalam pembagi tegangan yang terhubung ke salah satu input analog MKR. Thermistor ini dipilih karena digunakan untuk ujung panas Prusa RepRab di printer 3D, sehingga tersedia secara luas dan murah. Bisa dibeli sudah dipasang pada kabel silikon tahan suhu tinggi untuk membuat sonda suhu yang ideal. Thermistor dimasukkan ke dalam tabung stainless tipis (1/4 inci atau lebih kecil) untuk perlindungan fisik dengan satu ujung dicrimp untuk menutupnya dan kabel dijamin di ujung lain menggunakan heat shrink.
Pembagi tegangan menggunakan resistor 10K sebagai setengah lain dari pembagi tegangan. Nilai ini dipilih karena mendekati resistansi thermistor NTC 100K pada suhu perokok tipikal (225 F). Ini memberikan rentang yang baik untuk pengukuran suhu, memberikan pembacaan dari sekitar 50 F hingga di atas 300 F dengan granularitas yang wajar.
A0 digunakan untuk memantau suhu. Ini menggunakan sonda yang lebih pendek yang ditempatkan pada grate di dalam perokok. Pin analog lainnya dapat digunakan untuk membuat lebih banyak sonda thermistor dan pembagi tegangan untuk dimasukkan ke dalam daging yang sedang diperokok untuk memantau suhu internal daging untuk mengetahui kapan sudah matang.
Di sisi lain, blower kecil dipasang pada ventilasi di perokok. Mangkuk stainless kecil untuk makanan anjing dipasang di atas ventilasi di perokok dan blower dipasang pada lubang di dasar mangkuk. Ini berfungsi dua hal, pertama untuk menutup ventilasi udara sepenuhnya, dan kedua untuk memberikan beberapa isolasi termal antara tubuh perokok dan blower. Blower dikontrol menggunakan MOSFET N channel. Ini bisa langsung di kabel, tetapi untuk kemudahan konstruksi, model MOSFET digunakan. Gate pada MOSFET terhubung ke pin digital Arduino
Pembangunan
Untuk implementasi pertama, semuanya dilakukan pada papan roti untuk menjaga kesederhanaan. Jembatan thermistor mudah di kabel, resistor 10K dari Vcc (3.3V untuk MKR) ke satu sisi thermistor dan sisi lain ke ground. Sambungkan jumper antara tengah jembatan dan pin analog pada MKR. Potong panjang tabung untuk digunakan sebagai sonda, Krimp satu ujung di sekrup untuk melakukannya. Alat sepak bola kemudian digunakan untuk melipat sudut tabung yang dicrimp untuk membuat ujung yang lebih tajam. Geser thermistor ke dalam tabung sampai mencapai ujung. Slip potongan heat shrink di ujung lain dan kabel. Terapkan panas untuk menyusutkannya dan mengamankan kabel.
Sisi blower hampir sama sederhana. Amankan kabel ke blower ke blok output terminal pada modul MOSFET dengan memperhatikan polaritas. Pasang paket baterai LiPo Anda dan kabel dari plug JST ke blok terminal daya pada modul MOSFET, lagi dengan memperhatikan polaritas. Pasang plug JST ke jack JST untuk pengisian daya baterai pada MKR. Jalankan tiga jumper untuk Vcc, ground, dan kabel kontrol dari pin pada papan MOSFET ke MKR. Baterai 10,000 mAh digunakan untuk memberikan daya baterai yang banyak dengan blower.
Pada papan roti, beberapa item ditambahkan yang tidak ada dalam skematik. Ada resistor variabel 10K yang dapat digunakan untuk menghasilkan tegangan untuk menguji sketsa dengan memindahkan salah satu jumper dari thermistor ke penggeser pada resistor variabel (ujung resistor terhubung ke Vcc dan ground). Ada juga LED dengan resistor pembatas arus 330 Ohm yang terhubung ke pin output 0 untuk menunjukkan saat sketsa menyala dan mematikan kipas.
Perangkat Lunak
Ada dua bagian perangkat lunak yang terlibat. Salah satu adalah sketsa untuk mengontrol Arduino dan yang lain adalah Aplikasi Windows Universal, sehingga perokok dapat dipantau secara jarak jauh pada setiap perangkat Windows 10.
Sketsa sebagian besar didasarkan pada sketsa server Wi-Fi dari buku Simon Monks "Programming Arduino Next Steps: Going Further with Sketches".
Pada dasarnya ini membuat server web sederhana yang melayani satu halaman yang menunjukkan suhu yang diukur dan memungkinkan suhu target untuk perokok diatur. Inisialisasi terdiri dari menyiapkan adaptor Wi-Fi dan menetapkan alamat IP tetap untuk mengetahui apa yang harus dihubungkan saat tidak terhubung ke komputer untuk melihat alamat DHCP yang ditetapkan. Pin 0 diatur ke output. Dalam loop, ia memeriksa apakah ada klien yang mencoba terhubung, dan jika demikian maka melayani halaman web. Jika ada permintaan, ia juga memeriksa apakah termasuk parameter dalam url untuk mengatur suhu target. Lalu memeriksa suhu perokok dan menyala-kan blower jika di bawah suhu target dan mematikan jika di atas.
Mengukur suhu menggunakan thermistor dalam pembagi tegangan relatif sederhana. Pertama dari pembacaan input analog, kita dapat menentukan penurunan tegangan pada resistor tetap (Pembacaan jika resistor tetap terhubung ke ground, Vcc - pembacaan jika terhubung ke Vcc) Kita kemudian menggunakan Hukum Ohm (V=IR) untuk menghitung arus (I) melalui resistor (I = V/R) Karena arus yang sama mengalir melalui thermistor, kita menggunakan hukum Ohm lagi untuk menghitung resistansi thermistor. R = V/I dimana V adalah penurunan tegangan thermistor (pembacaan input analog atau Vcc - pembacaan tergantung pada sisi mana pembagi berada) dan I adalah arus yang baru saja kita hitung. Menggunakan R kita dapat memasukkannya ke dalam persamaan Beta Thermistor:
1/T = 1/T0 + 1/Beta * ln(R/R0)
Dimana R0 adalah Resistansi thermistor pada T0
(Catatan, semua suhu dalam Kelvin jadi pastikan untuk memperhitungkan hal itu)
Melayani halaman HTML sederhana pada dasarnya melibatkan Mengirim blok header html dan kode pemformatan html di sekitar suhu yang diukur. Ini juga mencakup input untuk suhu target dan tombol untuk menyertakannya dalam permintaan kembali ke server.
Aplikasi Windows Universal
Ini adalah bagian yang memungkinkan Anda untuk duduk kembali dan bersantai tahu perokok Anda menghasilkan beberapa daging sapi yang paling baik di perokokan barat Pecos (atau sungai pilihan Anda). Ini secara berkala memuat halaman web dari perokok, memparsing suhu dan menampilkannya. Ini juga memungkinkan Anda untuk mengatur suhu target untuk perokok.
Kode untuk baik sketsa dan Aplikasi Universal tersedia di repositori GitHub yang tercantum di bawah ini.
Kode
Sketsa Pengontrol Perokok
#include <SPI.h> #include <WiFi101.h> char ssid[] = "BeeBar2"; char pass[] = "9254582716"; WiFiServer server(80); WiFiClient client; const int numPins = 10; int pins[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int pinState[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; char line1[100]; char buffer[100]; IPAddress server_IP(192,168,123,90) ; float targetTemperature = 225; float smokerTemperature = 225; float v0; void setup() { Serial.begin(9600); while (!Serial) {}; for (int i = 0; i < numPins; i++) { pinMode(pins[i], OUTPUT); } analogReadResolution(12); if (WiFi.begin(ssid, pass)) { WiFi.config(server_IP); printWifiStatus(); server.begin(); } else { Serial.println("Could not connect to network"); } } void loop() { client = server.available(); if (client) { if (client.connected()) { readHeader(); if (! pageNameIs("/")) { client.stop(); return; } readTargetTempParam(); client.println("HTTP/1.1 200 OK\nContent-Type: text/html\n"); sendBody(); delay(1); client.stop(); } } int reading = analogRead(0); v0 = (float) reading / 1241.0; smokerTemperature = ThermisterTemp(v0, 100000, 10000, 3950, 25); digitalWrite(0, smokerTemperature<targetTemperature); } void sendBody() { client.println("<html><body>"); sendAnalogReadings(); client.println("<form method='GET'>"); client.print("\n<h1>Target Temperature:</h1> <input type='number' value='"); client.print(targetTemperature); client.println("' name='t'><br>"); client.println("<input type='submit' value='Update'/>\n</form>\n</body></html>"); } void sendAnalogReadings() { client.println("<h1>Temperatures</h1>\n<table border='1'>"); client.print("<tr><td>Smoker "); client.print("</td><td>"); client.print(smokerTemperature); client.println(" F</td></tr>"); for (int i = 1; i < 7; i++) { int reading = analogRead(i); if (reading > 0) { float v = (float) reading / 1241.0; float T = ThermisterTemp(v, 100000, 10000, 3950, 25); client.print("<tr><td>Probe "); client.print(i); client.print("</td><td>"); client.print(T); client.println(" F</td></tr>"); } } client.println("</table>"); } void readHeader() { while (readRequestLine(buffer) > 1 && buffer[0] != '\n') {} } int readRequestLine(char *line) { char ch; int i = 0; while (ch != '\n' && i < 100 && client.available()) { if (client.available()) { ch = client.read(); line[i] = ch; i ++; } } line[i] = '\0'; return i; } boolean pageNameIs(char* name) { int i = 4; char ch = line1[i]; while (ch != ' ' && ch != '\n' && ch != '?') { if (name[i - 4] != line1[i]) { return false; } i++; ch = line1[i]; } return true; } float readTargetTempParam() { int len = strlen(line1); for (int i = 0; i < len; i++) { if (line1[i] == 't' && line1[i + 1] == '=') { float val = 0; for (int j=i+2; j< len; j++) { if (isDigit(line1[j])) { val *= 10; val += (int)line1[j]-'0'; } else { break; } } targetTemperature = val; return val; } } return -1; } void printWifiStatus() { Serial.print("SSID: "); Serial.println(WiFi.SSID()); IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); } float ThermisterTemp(float Vtherm, int R0therm, int Rfixed, int Beta, int T0) { double I = (3.3 - Vtherm) / Rfixed; double Rtherm = Vtherm / I; T0 += 273.15; double T = 1.0/( (1.0/((double)Beta))*log((Rtherm)/((double)R0therm)) + (1.0/((double)T0)) ); return (float) ((9*(T-273.15))/5)+32; } Sketsa Pengontrol Perokok & Aplikasi Universal
https://github.com/DuncanBarbee/SmokerController
Skematik
Mrkr1000 direpresentasikan oleh Arduino Nano. File Fritzing dan gambar skematik tersedia dalam dokumen proyek.