Isi kandungan:

Autostat: Termostat Jauh: 8 Langkah (dengan Gambar)
Autostat: Termostat Jauh: 8 Langkah (dengan Gambar)

Video: Autostat: Termostat Jauh: 8 Langkah (dengan Gambar)

Video: Autostat: Termostat Jauh: 8 Langkah (dengan Gambar)
Video: Tangki radiator selalu penuh, over heat || Harus paham kerja pendingin, baru nentuin kerusakan|| 2024, Julai
Anonim
Autostat: Termostat Jauh
Autostat: Termostat Jauh

Soalan yang mungkin anda ajukan adalah "mengapa anda membuat termostat jauh yang lain?"

Jawapan untuk soalan itu adalah, saya harus, dan termostat pintar pasaran terlalu mahal.

Amaran yang wajar, ini adalah "bukti konsep" yang memerlukan beberapa output tambahan untuk benar-benar mengawal termostat anda, tetapi intinya sudah ada dan dapat diubah bergantung pada keadaan khusus anda. Juga, ini masih dalam proses, jadi harapkan beberapa kemas kini dan perubahan (terutamanya pada kod Matlab)

Untuk memulakan, saya ingin memberi amaran kepada anda, ini memerlukan tiga program (salah satunya cukup mahal), beberapa perpustakaan dan pakej sokongan untuk program-program tersebut, dan anda harus meminta mereka semua bercakap antara satu sama lain. Sakit kepala. Dengan amaran itu, mari kita mulakan dengan bahan.

Perkakasan

  • arduino nano
  • arduino uno (atau nano lain, saya hanya menggunakan uno kerana saya ada yang berbaring)
  • kabel pelompat pelbagai jenis, beberapa lelaki / lelaki dan dua set tiga jumper lelaki / wanita bergabung
  • Penerima frekuensi radio (RF) 433MHz, saya menggunakan MX-05V
  • Pemancar RF 433MHz, saya menggunakan MX-FS-03V
  • Termometer ketepatan tinggi dan sensor kelembapan DHT11 (yang saya gunakan dipasang pada cip tiga serong dengan perintang yang diperlukan sudah dipasang)
  • papan roti (jika anda tidak mahu menyatukan ini semua)
  • telefon dengan GPS (iPhone 8 dalam kes ini, tetapi saya juga menggunakan Galaxy S8)
  • Bekas bercetak 3D (tidak betul-betul diperlukan, bekas apa pun akan berfungsi atau tidak sama sekali)

Perisian

  • Matlab dari MathWorks (Saya mempunyai edisi 2018a, tetapi saya juga menggunakan edisi 2017a-b)
  • Matlab mudah alih dipasang pada telefon anda
  • pakej sokongan arduino untuk Matlab
  • Pakej sensor iPhone untuk Matlab
  • arduino IDE
  • Pakej sokongan RadioHead dan perpustakaan arduino IDE
  • Perpustakaan DHT11 untuk arduino IDE
  • python 3.7 (pastikan perpustakaan pyserial atau pustaka bersiri dipasang, yang sepatutnya untuk versi 3.4 atau lebih baru)

Langkah 1: Menggabungkan Semuanya

Menggabungkan Semuanya
Menggabungkan Semuanya
Menggabungkan Semuanya
Menggabungkan Semuanya
Menggabungkan Semuanya
Menggabungkan Semuanya

Pertama sekali saya cadangkan anda melakukan beberapa tutorial arduino yang berurusan dengan pemancar RF hanya untuk memastikan bahagian anda berfungsi dan pendawaiannya betul. Terdapat banyak contoh yang ada, dengan kod yang disertakan (bagi kita di luar sana yang tidak tahu apa-apa mengenai C dan C ++).

Ikuti rajah pendawaian di bawah untuk memasang arduino dan sensor. Satu perkara yang perlu diingat semasa memasang arduino ialah port data yang saya gunakan tidak diperlukan tetapi disyorkan.

JIKA anda memutuskan untuk menukar port data yang anda gunakan, anda hanya perlu menentukan pin dalam kod anda. Secara peribadi, saya rasa lebih mudah untuk menggunakan port lalai yang dikenali oleh pustaka arduino.

Untuk jelas, nano dan uno boleh ditukar ganti, tetapi saya menggunakan nano untuk bahagian pemancar projek untuk mengurangkan ukuran monitor suhu.

Nota sampingan: alat hijau yang memegang nano adalah bekas bercetak 3D.

Langkah 2: Penerima

Penerima
Penerima

Langkah 3: Pemancar

Pemancar
Pemancar

Langkah 4: Kodnya

Setelah pendawaian selesai, anda perlu menjalankan semua program dan perpustakaan dipasang (jika anda belum melakukannya), saya hanya akan menganggapnya, anda perlu memulakan Matlab dan menjalankan pakej sokongan iPhone. Telefon dan Matlab anda mesti berada di rangkaian wifi yang sama pada masa ini.

Di tetingkap arahan Matlab tulis:

penyambung dihidupkan

Ini akan meminta anda memasukkan kata laluan lima digit yang akan anda gunakan untuk menyambung pada iPhone anda. Pastikan anda mengingati kata laluan. Apabila anda memasukkan kata laluan Matlab akan memaparkan beberapa maklumat, termasuk alamat IP anda. Gunakan ini pada langkah seterusnya, yang berasal dari arahan dari menu bantuan "Bermula dengan sensor" di Matlab mobile.

  • Ikuti langkah-langkah ini untuk menghantar data sensor ke MathWorks Cloud atau komputer:
  • Sekiranya anda menghantar data sensor ke komputer dan jika belum dipasang, muat turun dan pasang Pakej Sokongan MATLAB untuk Sensor iOS Apple di MATLAB.
  • Sambungkan MATLAB Mobile ke MathWorks Cloud atau komputer menggunakan Tetapan.
  • Buat objek mobiledev dalam MATLAB (di komputer anda), misalnya: >> m = mobiledev
  • Pilih satu atau lebih sensor dan ketik Mula.

Ikuti langkah-langkah ini untuk log data sensor secara tempatan pada peranti anda:

  • Pada skrin Sensor, pilih sensor dari mana anda ingin mengumpulkan data.
  • Pilih Log.
  • Ketik butang Mula.
  • Setelah selesai mengumpulkan data, ketuk butang Berhenti.
  • Dalam pop timbul, masukkan nama log sensor.
  • Ulangi langkah 1-5 jika diperlukan.

Bahagian ini akan disebut kembali di Bahagian 4, jadi tidak perlu benar-benar mulai mengumpulkan data. Pastikan telefon anda sentiasa mudah digunakan dan mudah alih Matlab.

Sekarang anda perlu membuat folder di suatu tempat di komputer anda untuk menempatkan fail kod Matlab. Anda akan mempunyai empat fail berasingan, dua untuk fungsi latar (fail.m) dan satu fail kod Matlab untuk GUI (.mlapp),.

Pertama adalah pengiraan massa udara di rumah anda (ini memberitahu Matlab berapa lama masa yang diperlukan untuk memanaskan / menyejukkan rumah anda)

fungsi [Jisim] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = jam; time_end = 0 while runCalc <= 1 jika T_ins == (Tmp_start + (7 * Chng_dir)) time_end = jam; PwrCntr = 0; runCalc = 0; lain PwrCntr = P_out; runCalc = runCalc + 0.1 end end time_diag = time_end-time_start Mass = (P_out * time_diag) /7.035

Dan yang kedua:

fungsi [cap masa, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, kelajuan, T_pref, jisim)

AutoStat = 1; i = 1; sementara AutoStat == 1 time_start = jam; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); cap masa = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i + 1; format longg; % formula haversine untuk mengira jarak berdasarkan garis lintang dan% longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)). ^ 2 + cosd (Lat_in). * cosd (m.latitude). * (sind ((m. Longitude-Lon_in)./ 2)). ^ 2; c_hav = 2. * atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371. * c_hav; Dist = d_hav. * 1000; % menganggarkan masa anda untuk kembali time_rtn = (Dist-r_pref)./ kelajuan; % mengira tetapan termostat yang diperlukan berdasarkan pemadaman kuasa% penghawa dingin dan udara udara rumah. calcTmp_set = ((- 1. * P_out. * time_rtn)./ (jisim. * (1.005))) + T_pref; % menentukan sama ada tetapan termostat semasa perlu diubah jika pusingan (calcTmp_set) ~ = pusingan (t) waktuACon = jam; PwrCntr = P_out; timeACon = timeACon + clock-time_start; kos = kadar P_out * timeACon *; lain PwrCntr = 0 cap waktu akhir (akhir + 1, [1: 6]) = jam; pwr_usage (akhir + 1, 1) = PwrCntr; jeda (5) hujung akhir

Kedua-dua fail ini adalah fungsi Matlab. Anda tidak perlu mengaksesnya kecuali anda merancang untuk mengubahnya untuk keperluan tertentu, kerana anda akan memanggil mereka dari GUI. Simpan kedua-dua fail secara berasingan, yang pertama sebagai CalcMass.m dan yang kedua sebagai dist_cntrl.m, itu adalah nama yang digunakan oleh kod GUI untuk memanggil fungsi, jadi kecuali jika anda ingin mengedit selebihnya kod di bawah, tetap dengan konvensyen penamaan.

Sebelum masuk ke kod GUI, anda perlu membuka pereka aplikasi untuk Matlab, yang boleh anda buka dengan menavigasi di bar menu Matlab, atau dengan kaedah kegemaran saya yang memasukkan perintah berikut di tetingkap perintah Matlab:

perancang aplikasi

Setelah pereka aplikasi dibuka, buka fail aplikasi baru (.mlapp) dan hapus semua kod lalai dari tetingkap kod. Kemudian ganti semuanya dengan yang berikut dan tekan butang jalankan.

classdef Control_1 <matlab.apps. AppBase% Properties yang sesuai dengan sifat komponen aplikasi (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Button EnergyEfficiencyRatingEditFieldLabel matlab.ui.control. Label EnergyEfficiencyRatingEditField matlab.ui.control. NumericEditField PowerOutputRatingEditFieldLabel matlab.ui.control. Label PowerOutputRatingEditField matlab.ui.control. NumericEditField AvgLocalSpeedEditFieldLabel matlab.ui.control. Label AvgLocalSpeedEditField matlab.ui.control. NumericEditField DesiredDistancefromHouseEditFieldLabel matlab.ui.control. Label DDFH matlab.ui.control. NumericEditField TemperatureDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.ui.container. Tab TemperatureTab. Lain TemperatureTablaber. Labu. Labu. Labu. Labu. Label Label. ui.control. Spinner Temperature2SpinnerLabel matlab.ui.cont rol. Label Temperature2Spinner matlab.ui.control. Spinner Switch matlab.ui.control. Switch EditFieldLabel matlab.ui.control. Label tempnow matlab.ui.control. NumericEditField GaugeLabel matlab.ui.control. Label Gauge matau. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEfieldLabers. LabuLabungan. LabelEfieldLabungan. Label.

kaedah (Akses = peribadi)

% Nilai berubah fungsi: tempnow

fungsi tempnowValueChanged (app, event) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 for i = length (temp) app. Gauge. Value = temp (i) jeda (1) hujung akhir

% Nilai berubah fungsi: TemperatureDirectionSwitch

fungsi TemperatureDirectionSwitchValueChanged (app, event) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; lain Chng_dir = 1; tamat Chng_dir; akhir

% Nilai berubah fungsi: DDFH

fungsi DDFHValueChanged (app, event) r_pref = app. DDFH. Value; akhir

% Nilai berubah fungsi: AvgLocalSpeedEditField

fungsi AvgLocalSpeedEditFieldValueChanged (app, event) speed = app. AvgLocalSpeedEditField. Value; akhir

% Nilai berubah fungsi: PowerOutputRatingEditField

fungsi PowerOutputRatingEditFieldValueChanged (app, event) value = app. PowerOutputRatingEditField. Value; akhir

% Nilai berubah fungsi: EnergyEfficiencyRatingEditField

fungsi EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; akhir

Fungsi% ditolak butang: RunDiagnosticButton

fungsi RunDiagnosticButtonPushed (app, event) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = panjang (way) if way == 4 Chng_dir = -1; lain Chng_dir = 1; akhir T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

akhir

% Nilai berubah fungsi: Temperature1Spinner

fungsi Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; akhir

% Nilai berubah fungsi: Temperature2Spinner

fungsi Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; akhir

% Nilai berubah fungsi: Tukar

fungsi SwitchValueChanged (aplikasi, acara) m = mobiledev; Lat_in = m. Lititude Lon_in = m. Lititude P_out = 0; r_pref = app. DDFH. Nilai; T_pref = app. Temperature1Spinner. Value; kelajuan = m. Speed; jisim = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, kelajuan, jisim) hujung akhir

Permulaan dan pembinaan aplikasi

kaedah (Akses = peribadi)

% Buat UIFigure dan komponen

fungsi createComponents (aplikasi)

% Buat UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Gambar UI';

% Buat Kumpulan Kumpulan

app. TabGroup = uitabgroup (app. UIFigure); app. TabGroup. Position = [1 1 640 480];

% Buat SetupTab

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Persediaan';

% Buat RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (aplikasi, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'berani'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Jalankan Diagnostik';

% Buat EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'betul'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Penilaian Kecekapan Tenaga';

% Buat EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'angka'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (aplikasi, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'pusat'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% Buat PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'betul'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Penilaian Output Kuasa';

% Buat PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numeric'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (aplikasi, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'pusat'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Buat AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'betul'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Purata Kelajuan Tempatan ';

% Buat AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'numeric'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (aplikasi, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'pusat'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Buat Label yang DiinginkanDaripadaHouseEditField

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'betul'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Jarak yang Diinginkan'; 'dari Rumah'};

% Buat DDFH

app. DDFH = uieditfield (app. SetupTab, 'numeric'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (aplikasi, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'pusat'; app. DDFH. Position = [139 135 100 22];

% Buat TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'pusat'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Suhu Arah';

% Buat TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'slider'); app. TemperatureDirectionSwitch. Iems = {'Up', 'Down'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, benar); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Naik';

% Buat TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Tetapan ';

% Buat Temperature1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'pusat'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Suhu'; '# 1'};

% Buat Temperature1Spinner

app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (aplikasi, @ Temperature1SpinnerValueChanged, true); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;

% Buat Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'pusat'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Suhu'; '# 2'};

% Buat Temperature2Spinner

app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (aplikasi, @ Temperature2SpinnerValueChanged, true); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Value = 60;

Buat Suis

app. Switch = uiswitch (app. TempSettingsTab, 'slider'); app. Switch. Iems = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (aplikasi, @SwitchValueChanged, true); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';

% Buat EditFieldLabel

app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'betul'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = ";

% Buat tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'numeric'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (aplikasi, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'pusat'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% Buat GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'pusat'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Gauge';

% Membuat Tolok

app. Gauge = uigauge (app. TempSettingsTab, 'pekeliling'); app. Gauge. Limits = [60 90]; app. Gauge. MajorTicks = [60 65 70 75 80 85 90]; app. Gauge. Position = [185 69 120 120]; app. Gauge. Value = 60;

% Buat Tabungan

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Simpanan';

% Buat UIAxes

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (app. UIAxes, 'Month and Year') ylabel (app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.606666666666667]; app. UIAxes. Color = [0.9412 0.9412 0.9412]; app. UIAxes. Position = [146 219 348 237];

% Buat ThisMonthCostEditFieldLabel

app. TheMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. TheMonthCostEditFieldLabel. HorizontalAlignment = 'pusat'; app. TheMonthCostEditFieldLabel. Position = [439 96 94 22]; app. TheMonthCostEditFieldLabel. Text = 'Kos Bulan Ini';

% Buat ThisMonthCostEditField

app. TheMonthCostEditField = uieditfield (app. SavingsTab, 'numeric'); app. TheMonthCostEditField. Limits = [0 Inf]; app. TheMonthCostEditField. ValueDisplayFormat = '$% 7.2f'; app. TheMonthCostEditField. HorizontalAlignment = 'pusat'; app. TheMonthCostEditField. Position = [417 39 137 58];

% Buat TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'betul'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Jumlah Simpanan';

% Buat TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'angka'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$% 9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'pusat'; app. TotalSavingsEditField. Position = [88 39 137 58]; hujung akhir

kaedah (Akses = awam)

% Membina aplikasi

aplikasi fungsi = Control_1

% Membuat dan mengkonfigurasi komponen

createComponents (aplikasi)

Mendaftar aplikasi dengan Pereka Aplikasi

registerApp (app, app. UIFigure)

jika nargout == 0

hujung aplikasi yang jelas

% Kod yang dilaksanakan sebelum penghapusan aplikasi

fungsi hapus (aplikasi)

% Padam UIFigure semasa aplikasi dihapus

hapus (app. UIFigure) hujung akhir

Anda mungkin akan mendapat ralat, yang tidak ada masalah. Tutup GUI yang dihasilkan setelah anda menekan run, kami akan mengumpulkan sisa program dan data yang diperlukan dalam sekejap.

Sejak Matlab ditubuhkan, kita boleh beralih ke python. Pertama, jalankan program python sama ada dari command prompt anda (pada windows) atau dengan menggunakan file.exe dalam folder python anda. Pastikan semua perpustakaan yang sesuai dipasang dengan menggunakan arahan import.

siri import

masa import import csv

Ini adalah tiga perpustakaan yang perlu anda mulakan, walaupun kami akan membuat perpustakaan kami tidak lama lagi. Sekiranya terdapat beberapa kesalahan dengan arahan ini, kembali dan pastikan perpustakaan dipasang dan berada di folder Lib di folder python. Seterusnya kita akan menghasilkan apa yang saya panggil pythonlogger library. Nama ini tidak diperlukan, anda boleh memanggilnya mengikut kehendak anda, hanya nama fail python (.py) yang anda buat.

Buka editor teks, saya menggunakan Sublime3 tetapi notepad berfungsi dengan baik, dan masukkan kod ini.

def pythonprint ():

import pythonlogger import siri import time import csv ser = serial. Serial ('COM8') # COM8 adalah port bersiri arduino, ini mungkin akan berbeza bagi setiap pengguna, iaitu periksa port siri anda di arduino IDE ser.flushInput () sementara Betul: cuba: ser_bytes = ser.readline () cetak (ser_bytes) dengan terbuka ("test_data.csv", "a") sebagai f: author = csv.writer (f, delimiter = ",") # menetapkan data ke dimasukkan sebagai penulis.writerow yang dipisahkan koma ([time.time (), ser_bytes]) #writes data ke test_data.csv kecuali: cetak ("Kesalahan Berlaku") rehat

Simpan teks sebagai "masukkan nama pustaka yang anda mahukan".py dalam folder Lib. Perhatikan juga bahawa garis def pythonprint () menentukan nama fungsi yang akan anda panggil, jadi anda boleh mengubahnya menjadi def "masukkan nama yang anda mahukan untuk fungsi anda" (). Apabila perpustakaan disimpan, kita boleh beralih ke kod arduino.

Buka arduino IDE dan buka dua tetingkap lakaran baru. Simpan kedua fail lakaran tersebut di tempat yang senang, nama fail ini tidak menjadi masalah. Kemudian padamkan semua kod lalai dan gantikan dengan yang berikut.

Untuk arduino penerima:

#sertakan

#include #include #include // ini tidak digunakan tetapi diperlukan untuk menyusun pemacu RH_ASK; data strukturStruct {temp apungan; } myData; batal persediaan () {Serial.begin (9600); // Menyahpepijat hanya jika (! Driver.init ()) Serial.println ("init gagal"); } gelung kosong () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Tidak menyekat {int i; // Mesej dengan cek yang diterima, buang. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. the //driver.printBuffer…. baris dll adalah kod ujian. Tidak perlu risau, kecuali jika anda melakukan diagnosis dan ingin mengetahui apakah anda benar-benar menerima data.

Untuk arduino pemancar

#sertakan

#include #include #include // ini tidak digunakan tetapi diperlukan untuk menyusun # include #include int pin = 4; DHT11 dht11 (pin); Pemacu RH_ASK; data strukturStruct {temp apungan; } myData; bait tx_buf [sizeof (myData)] = {0}; // Jadi argumen adalah bitrate, transmit pin (tx), // accept pin (rx), ppt pin, isInverse. 2 yang terakhir tidak digunakan.void setup () {Serial.begin (9600); // Menyahpepijat hanya jika (! Driver.init ()) Serial.println ("init gagal"); } gelung kosong () {int err; suhu apungan, humi; uint8_t msg; jika ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); byte zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // menghentikan pelaksanaan sehingga semua data dihantar kelewatan (2000); // tunggu 2 saat}}

Perintah termasuk harus cukup, tetapi jika anda mempunyai masalah kemudian dengan pemindahan data, anda mungkin ingin melihat di folder perpustakaan RadioHead dan memasukkan nama fail yang selebihnya, dalam format yang sama.

Langkah 5: Menjadikannya Berfungsi

Menjadikannya Berfungsi
Menjadikannya Berfungsi
Menjadikannya Berfungsi
Menjadikannya Berfungsi
Menjadikannya Berfungsi
Menjadikannya Berfungsi

Setelah semua kod itu disatukan dan arduino dipasang, kita dapat menghubungkan arduino ke komputer anda dan memuatkan kodnya. Pastikan anda menghantar kod yang betul ke mikrokontroler penerima dan penghantaran. Anda boleh menyambungkan kedua arduino ke komputer semasa berjalan, tetapi anda harus memastikan bahawa port yang betul dipilih bergerak ke hadapan, atau anda boleh memutuskan sambungan arduino pemancar dan mematikannya dari beberapa sumber lain setelah kod tersebut dimuat naik.

Omong-omong, anda harus memilih port yang disambungkan ke arduino penerima anda dari menu alat IDE sekarang dan jalankan python.

Jangan buka monitor bersiri semasa anda melakukan ini, python tidak dapat membaca siri semasa monitor dibuka. Setelah python terbuka, panggil fungsi pythonprint seperti berikut.

pythonlogger.pythonprint ()

Ini akan memulakan pengumpulan data dari port bersiri arduino. Sekiranya anda membuka folder python anda sekarang, anda akan melihat bahawa fail.csv baru telah dibuat yang disebut "test_data.csv", yang menyimpan semua maklumat masa dan suhu. Ini akan menjadi fail yang diakses oleh Matlab untuk melakukan semua pengiraan dan kawalannya.

Amaran lain: jangan buka test_data.csv semasa data sedang diakses atau ditulis. Sekiranya anda melakukannya, python dan / atau kod Matlab akan rosak dan menghantar kembali ralat

Sekiranya anda memutuskan untuk membuka.csv kemudian, anda akan melihat bahawa lajur waktu hanyalah rentetan nombor yang sangat besar. Ini kerana perintah time.time () menulis bilangan saat sejak 1 Januari 1970.

Pada ketika ini python harus mencetak data suhu yang dibacanya dari port bersiri. Ia mesti kelihatan seperti:

b'25.03 '/ r / n

Jangan bimbang tentang watak tambahan, kod Matlab mengindeks nilai lima pertengahan pada lajur kedua fail.csv.

Setelah semua program sokongan berfungsi dan data dikumpulkan, kita dapat mulai mengumpulkan data GPS dari program mobile Matlab yang telah disiapkan lebih awal dan menjalankan kode GUI Matlab. Sebaik sahaja anda berada di tab sensor Matlab mobile, pilih GPS dan tekan butang mula.

Sekiranya anda baru menggunakan Matlab bergerak kembali ke langkah 4 dan lihat tangkapan skrin di atas. Sekiranya anda masih menghadapi masalah, pastikan anda tersambung ke komputer yang anda pilih sebelumnya (di tab tetapan) dan gunakan pautan dari arahan "penyambung pada" untuk memastikan Matlab dalam talian.

Langkah 6: Menggunakan Program

Menggunakan Program
Menggunakan Program

Terdapat banyak perkara yang berlaku di latar belakang dalam sistem ini. Data suhu dikumpulkan dan dicatat oleh arduino dan pyton, Matlab mengumpulkan data GPS dari telefon anda dan menjalankan pengiraan untuk melihat sejauh mana jarak anda dari rumah anda dan menetapkan termostat anda berdasarkan semua maklumat tersebut. Di mana anda masuk menyediakan pilihan anda.

Jalankan kod GUI Matlab. Buka fail.mlapp dan lihat pada tab pertama. Anda perlu mengumpulkan maklumat untuk ini, kecekapan dan penarafan kuasa unit pemanasan / penyejukan anda biasanya terdapat di unit itu sendiri, dan kelajuan rata-rata anda adalah anggaran yang baik tentang seberapa cepat anda memandu. Setelah nilai dimasukkan, tekan butang "Run Diagnostic" dan program mengawal termostat anda untuk mengumpulkan maklumat mengenai rumah anda.

Beralih ke menu seterusnya.

Langkah 7: Kawalan Suhu

Kawalan Suhu
Kawalan Suhu

Menu ini membolehkan anda memilih suhu pilihan anda semasa berada di rumah dan di luar. Tetapkan Suhu # 1 ke suhu yang selesa, dan Suhu # 2 ke nilai tinggi atau rendah yang selamat untuk rumah anda (pastikan anda tidak menetapkannya hingga 100 darjah semasa anda mempunyai anjing di rumah, dll.).

Langkah 8: Data Sejarah

Data Sejarah
Data Sejarah

Akhirnya anda dapat melihat berapa banyak wang simpanan anda dengan menggunakan kawalan automatik. Ini pada dasarnya menganggarkan berapa banyak tenaga yang akan digunakan jika termostat anda ditetapkan pada suhu pilihan anda 24/7, kemudian mengurangkan tenaga sebenar anda yang digunakan.

Nasib baik membina.

Disyorkan: