Daftar Isi:

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

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

Video: Autostat: Termostat Jarak Jauh: 8 Langkah (dengan Gambar)
Video: cara menentukan suhu termostat yang benar, dan cara meletakkan sensor suhu pada mesin tetas 2024, Juli
Anonim
Autostat: Termostat Jarak Jauh
Autostat: Termostat Jarak Jauh

Pertanyaan yang mungkin Anda tanyakan adalah "mengapa Anda membuat termostat jarak jauh lainnya?"

Jawaban atas pertanyaan itu adalah, saya harus melakukannya, dan termostat pintar di pasaran terlalu mahal.

Peringatan yang adil, ini adalah build "bukti konsep" yang memerlukan beberapa output tambahan untuk benar-benar mengontrol termostat Anda, tetapi intinya sudah ada dan dapat dimodifikasi tergantung pada keadaan spesifik Anda. Juga, ini masih dalam proses, jadi harapkan beberapa pembaruan dan perubahan (terutama pada kode Matlab)

Untuk memulai, saya ingin memperingatkan Anda, ini memerlukan tiga program (salah satunya cukup mahal), beberapa perpustakaan dan paket dukungan untuk program tersebut, dan Anda harus membuat semuanya berbicara satu sama lain. Ini sakit kepala. Dengan peringatan itu, mari kita mulai dengan materinya.

Perangkat keras

  • arduino nano
  • arduino uno (atau nano lain, saya hanya menggunakan uno karena saya punya satu tergeletak di sekitar)
  • berbagai macam kabel jumper, beberapa pria/pria dan dua set tiga jumper pria/wanita bergabung
  • Penerima frekuensi radio (RF) 433MHz, saya menggunakan MX-05V
  • Pemancar RF 433MHz, saya menggunakan MX-FS-03V
  • Termometer akurasi tinggi dan sensor kelembaban DHT11 (yang saya gunakan dipasang pada chip tiga cabang dengan resistor yang diperlukan sudah terpasang)
  • papan tempat memotong roti (jika Anda tidak ingin menyolder ini semua bersama-sama)
  • telepon dengan GPS (iPhone 8 dalam hal ini, tetapi saya juga menggunakan Galaxy S8)
  • Wadah cetak 3D (tidak terlalu diperlukan, wadah apa pun akan berfungsi atau tidak ada sama sekali)

Perangkat lunak

  • Matlab dari MathWorks (Saya memiliki edisi 2018a, tetapi saya juga menggunakan edisi 2017a-b)
  • Ponsel Matlab terpasang di ponsel Anda
  • paket dukungan arduino untuk Matlab
  • Paket sensor iPhone untuk Matlab
  • arduino IDE
  • Paket dukungan RadioHead dan pustaka arduino IDE
  • Pustaka DHT11 untuk arduino IDE
  • python 3.7 (pastikan pustaka pyserial atau pustaka serial diinstal, yang seharusnya untuk versi 3.4 atau yang lebih baru)

Langkah 1: Menyatukan Semuanya

Menyatukan Semuanya
Menyatukan Semuanya
Menyatukan Semuanya
Menyatukan Semuanya
Menyatukan Semuanya
Menyatukan Semuanya

Pertama-tama saya sarankan Anda melakukan beberapa tutorial arduino yang berhubungan dengan pemancar RF hanya untuk memastikan bahwa bagian Anda berfungsi dan kabelnya benar. Ada banyak contoh yang tersedia, dengan kode yang disertakan (bagi kita di luar sana yang tidak tahu apa-apa tentang C dan C++).

Ikuti diagram pengkabelan di bawah ini untuk merakit arduino dan sensor. Satu hal yang perlu diingat saat memasang kabel arduino adalah bahwa port data yang saya gunakan tidak diperlukan tetapi disarankan.

JIKA Anda memutuskan untuk mengubah port data yang Anda gunakan, Anda hanya perlu menentukan pin dalam kode Anda. Secara pribadi, saya pikir lebih mudah untuk tetap menggunakan port default yang dikenali oleh perpustakaan arduino.

Dan untuk memperjelas, nano dan uno dapat dipertukarkan, tetapi saya menggunakan nano untuk sisi pemancar proyek untuk mengurangi ukuran monitor suhu.

Catatan samping: alat hijau yang memegang nano adalah wadah cetak 3D.

Langkah 2: Penerima

Penerima
Penerima

Langkah 3: Pemancar

Pemancar
Pemancar

Langkah 4: Kode

Setelah pengkabelan selesai, Anda perlu menjalankan semua program dan pustaka diinstal (jika Anda belum melakukannya), saya anggap Anda sudah melakukannya, Anda perlu memulai Matlab dan menjalankan paket dukungan iPhone. Baik ponsel Anda dan Matlab harus berada di jaringan wifi yang sama saat ini.

Di jendela perintah Matlab tulis:

konektor aktif

Ini akan meminta Anda untuk memasukkan kata sandi lima digit yang akan Anda gunakan untuk terhubung di iPhone Anda. Pastikan Anda mengingat kata sandinya. Ketika Anda telah memasukkan kata sandi Matlab akan menampilkan beberapa informasi, termasuk alamat IP Anda. Gunakan ini di langkah berikutnya, yang berasal dari instruksi dari menu bantuan "Memulai sensor" di perangkat seluler Matlab.

  • Ikuti langkah-langkah ini untuk mengirim data sensor ke MathWorks Cloud atau komputer:
  • Jika Anda mengirim data sensor ke komputer dan jika belum diinstal, unduh dan instal Paket Dukungan MATLAB untuk Sensor Apple iOS di MATLAB.
  • Hubungkan MATLAB Mobile ke MathWorks Cloud atau komputer menggunakan Pengaturan.
  • Buat objek mobiledev di MATLAB (di komputer Anda), misalnya: >> m = mobiledev
  • Pilih satu atau lebih sensor dan ketuk Mulai.

Ikuti langkah-langkah ini untuk mencatat data sensor secara lokal di perangkat Anda:

  • Pada layar Sensor, pilih sensor yang datanya ingin Anda kumpulkan.
  • Pilih Log.
  • Ketuk tombol Mulai.
  • Setelah selesai mengumpulkan data, ketuk tombol Berhenti.
  • Di pop-up, masukkan nama log sensor.
  • Ulangi langkah 1-5 jika perlu.

Bagian ini akan dirujuk kembali ke Bagian 4, jadi tidak perlu benar-benar mulai mengumpulkan data. Siapkan ponsel Anda dan Matlab mobile siap.

Sekarang Anda perlu membuat folder di suatu tempat di komputer Anda untuk menampung file kode Matlab. Anda akan memiliki empat file terpisah, dua untuk fungsi latar belakang (file.m) dan satu file kode Matlab untuk GUI (.mlapp),.

Pertama adalah perhitungan massa udara di rumah Anda (ini memungkinkan Matlab mengetahui berapa lama waktu yang dibutuhkan untuk memanaskan/mendinginkan rumah Anda)

fungsi [Mass]= CalcMass(T_in, P_out, Chng_dir)

runCalc=0; Tmp_start=T_in; waktu_mulai=jam; time_end = 0 saat runCalc <= 1 if T_ins==(Tmp_start+(7*Chng_dir)) time_end=clock; 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:

function [stempel waktu, pwr_usage]= dist_cntrl(Lat_in, Lon_in, P_out, r_pref, kecepatan, T_pref, massa)

StatistikOtomatis = 1; saya = 1; sementara AutoStat == 1 time_start = jam; m = pengembang seluler; t = csvread('nilai.csv', 0, 1); t= t(i); stempel waktu= [0, 0, 0, 0, 0, 0]; pwr_penggunaan = 0; saya = i+1; format panjang; %haversine rumus untuk menghitung jarak berdasarkan lintang dan %bujur a_hav=(sind((m. Latitude-Lat_in)./2)).^2+cosd(Lat_in).*cosd(m.latitude).*(sind((m. Bujur-Bujur_in)./2)).^2; c_hav= 2.*atan2d(persegi(a_hav), kuadrat(1-a_hav)); d_hav= 6371.*c_hav; Jarak=d_hav.*1000; %memperkirakan waktu Anda untuk kembali time_rtn=(Dist-r_pref)./speed; %menghitung pengaturan termostat yang diperlukan berdasarkan daya keluar dari %AC dan massa udara rumah. calcTmp_set=((-1.*P_out.*time_rtn)./(massa.*(1.005)))+T_pref; %menentukan apakah pengaturan termostat saat ini perlu diubah jika round(calcTmp_set) ~= round(t) timeACon = clock; PwrCntr = P_out; timeACon= waktuACon + jam-waktu_start; cost=P_out*timeACon*rate; else PwrCntr = 0 stempel waktu akhir(akhir+1, [1:6]) = jam; pwr_usage(end+1, 1)= PwrCntr; jeda (5) akhir akhir

Kedua file ini adalah fungsi Matlab. Anda tidak perlu mengaksesnya kecuali Anda berencana memodifikasinya untuk kebutuhan khusus, karena Anda akan memanggilnya dari GUI. Simpan kedua file secara terpisah, yang pertama sebagai CalcMass.m dan yang kedua sebagai dist_cntrl.m, itu akan menjadi nama yang digunakan kode GUI untuk memanggil fungsi, jadi kecuali Anda ingin mengedit sisa kode di bawah ini, tetap gunakan konvensi penamaan.

Sebelum Anda masuk ke kode GUI, Anda perlu membuka perancang aplikasi untuk Matlab, yang dapat Anda buka dengan menavigasi di bilah menu Matlab, atau dengan metode favorit saya yang memasukkan perintah berikut di jendela perintah Matlab:

desainer aplikasi

Setelah desainer aplikasi terbuka, buka file aplikasi baru (.mlapp) dan hapus semua kode default dari jendela kode. Kemudian ganti semuanya dengan yang berikut ini dan tekan tombol run.

classdef Control_1 < matlab.apps. AppBase % Properti yang sesuai dengan properti komponen aplikasi (Access = public) UIGambar matlab.ui. Gambar TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. tombol 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. NumericEditSuhu BidangArahSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.ui.container. Tab Temperature1SpinnerLabel matlab.ui.control. Label Temperature1Spinner matlab. 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 matlab.ui.control. Pengukur PenghematanTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes Bulan IniCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLabel matlab.ui.control. EditLabelTotalSimpanan

metode (Akses = pribadi)

% Nilai berubah fungsi: tempnow

function tempnowValueChanged(aplikasi, acara) temp = app.tempnow. Value; temp=randi([60, 90], 1, 50) app. Gauge. Value = 0 for i = length(temp) app. Gauge. Value= temp(i) pause(1) end end

% Nilai berubah fungsi: TemperatureDirectionSwitch

function TemperatureDirectionSwitchValueChanged(app, event) way = app. TemperatureDirectionSwitch. Value; cara= uint8(jalan) cara = panjang(jalan) jika cara == 4 Chng_dir = -1; lain Chng_dir = 1; akhir Chng_dir; akhir

% Nilai berubah fungsi: DDFH

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

% Nilai diubah fungsi: AvgLocalSpeedEditField

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

% Nilai berubah fungsi: PowerOutputRatingEditField

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

% Nilai berubah fungsi: EnergyEfficiencyRatingEditField

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

% Fungsi penekanan tombol: RunDiagnosticButton

function RunDiagnosticButtonPushed(app, event) way = app. TemperatureDirectionSwitch. Value; cara= uint8(jalan) cara = panjang(jalan) jika cara == 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

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

% Nilai berubah fungsi: Temperature2Spinner

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

% Nilai berubah fungsi: Switch

fungsi SwitchValueChanged(aplikasi, acara) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Bujur P_out = 0; r_pref = aplikasi. DDFH. Nilai; T_pref = app. Temperature1Spinner. Value; kecepatan = m. Kecepatan; massa = 200; kecepatan = app. AvgLocalSpeedEditField. Value; Auto_Stat = aplikasi. Switch. Value; dist_cntrl(Lat_in, Lon_in, P_out, r_pref, T_pref, kecepatan, massa) ujung akhir

% Inisialisasi dan konstruksi aplikasi

metode (Akses = pribadi)

% Buat UIGambar dan komponen

fungsi createComponents (aplikasi)

% Buat Gambar UI

app. UIGambar = uifigure; app. UIGambar. Posisi = [100 100 640 480]; app. UIGambar. Nama = 'Gambar UI';

% Buat Grup Tab

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

% Buat Tab Pengaturan

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

% Buat RunDiagnosticButton

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

% Buat EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel(app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'kanan'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Peringkat Efisiensi Energi';

% Buat EnergyEfficiencyRatingEditField

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

% Buat PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel(app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'kanan'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Peringkat Output Daya';

% Buat PowerOutputRatingEditField

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

% Buat AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel(app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'kanan'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Rta. Kecepatan Lokal';

% Buat AvgLocalSpeedEditField

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

% Buat Jarak yang DiinginkandariRumahEditFieldLabel

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

% Buat DDFH

app. DDFH = uieditfield(app. SetupTab, 'numerik'); app. DDFH. Batas = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn(aplikasi, @DDFHValueChanged, benar); app. DDFH. HorizontalAlignment = 'tengah'; app. DDFH. Position = [139 135 100 22];

% Buat TemperatureDirectionSwitchLabel

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

% Buat TemperatureDirectionSwitch

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

% Buat TempSettingsTab

app. TempSettingsTab = utab(app. TabGroup); app. TempSettingsTab. Title = 'Temp. Pengaturan';

% Buat Temperatur1SpinnerLabel

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, benar); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Nilai = 60;

% Buat Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel(app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'tengah'; 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, benar); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Nilai = 60;

% Buat Saklar

app. Switch = uiswitch(app. TempSettingsTab, 'slider'); app. Switch. Item = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn(aplikasi, @SwitchValueChanged, benar); 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 = 'kanan'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = '';

% Buat sementara

app.tempnow = uieditfield(app. TempSettingsTab, 'numerik'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn(aplikasi, @tempnowValueChanged, benar); app.tempnow. HorizontalAlignment = 'tengah'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Nilai = 60;

% Buat GaugeLabel

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

% Buat Pengukur

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

% Buat Tab Tabungan

app. SavingsTab = utab(app. TabGroup); app. SavingsTab. Title = 'Tabungan';

% Buat UIAxes

app. UIAxes = uiaxes(app. SavingsTab); title(app. UIAxes, 'Savings') xlabel(app. UIAxes, 'Bulan dan Tahun') 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 Bulan IniBiayaEditFieldLabel

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

% Buat Bulan IniBiayaEditField

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

% Buat TotalTabunganEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel(app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'kanan'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Total Tabungan';

% Buat TotalTabunganEditField

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

metode (Akses = publik)

% Bangun aplikasi

aplikasi fungsi = Control_1

% Buat dan konfigurasikan komponen

buat Komponen (aplikasi)

% Daftarkan aplikasi dengan Desainer Aplikasi

registerApp(app, app. UIGambar)

jika nargout == 0

hapus ujung akhir aplikasi

% Kode yang dijalankan sebelum penghapusan aplikasi

fungsi hapus (aplikasi)

% Hapus UIGambar saat aplikasi dihapus

hapus (app. UIGambar) ujung ujung ujung

Anda mungkin akan mendapatkan kesalahan, yang tidak masalah. Tutup saja GUI yang dihasilkan setelah Anda menekan run, kami akan segera mengumpulkan sisa program dan data yang diperlukan.

Karena Matlab sudah diatur, kita dapat beralih ke python. Pertama, jalankan program python baik dari command prompt Anda (di windows) atau dengan menggunakan file.exe di folder python Anda. Pastikan bahwa semua pustaka yang sesuai telah diinstal dengan menggunakan perintah impor.

impor serial

impor waktu impor csv

Ini adalah tiga perpustakaan yang harus Anda mulai, meskipun kami akan segera membuat perpustakaan kami sendiri. Jika ada semacam kesalahan dengan perintah ini, kembali dan pastikan perpustakaan diinstal dan berada di folder Lib di folder python. Selanjutnya kita akan menghasilkan apa yang saya sebut pustaka pythonlogger. Nama ini tidak perlu, Anda dapat menyebutnya apa pun yang Anda inginkan, itu hanya nama file python (.py) yang Anda buat.

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

def pythonprint():

import pythonlogger import serial import time import csv ser = serial. Serial('COM8') # COM8 adalah port serial arduino, ini kemungkinan akan berbeda untuk setiap pengguna, yaitu periksa port serial Anda di arduino IDE ser.flushInput() sementara Benar: coba: ser_bytes = ser.readline() print(ser_bytes) dengan open("test_data.csv", "a") as f: writer = csv.writer(f, delimiter=", ") # set data ke dimasukkan sebagai writer.writerow([time.time(), ser_bytes]) #menulis data ke test_data.csv kecuali: print("Error Occured") break

Simpan teks sebagai "masukkan nama perpustakaan yang Anda inginkan".py di folder Lib. Perhatikan juga bahwa baris def pythonprint() mendefinisikan nama fungsi yang akan Anda panggil, sehingga Anda dapat mengubahnya menjadi def "masukkan nama yang Anda inginkan untuk fungsi Anda"(). Ketika perpustakaan disimpan, kita dapat beralih ke kode arduino.

Buka IDE arduino dan buka dua jendela sketsa baru. Simpan kedua file sketsa itu di tempat yang nyaman, nama file ini tidak masalah. Kemudian hapus semua kode default dan ganti dengan yang berikut ini.

Untuk arduino penerima:

#termasuk

#include #include #include // ini tidak digunakan tetapi diperlukan untuk mengkompilasi driver RH_ASK; struct dataStruct{ float temp; }data saya; void setup() { Serial.begin(9600); // Debugging hanya jika (!driver.init()) Serial.println("init gagal"); } void loop() { uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = ukuran(buf); if (driver.recv(buf, &buflen)) // Non-blocking { int i; // Pesan dengan checksum yang baik diterima, buang. //driver.printBuffer("Dapatkan:", buf, buflen); memcpy(&Datasaya, buf, ukuran(Datasaya)); Serial.println(""); Serial.print(myData.temp); } }

P. S. //driver.printBuffer…. dll baris adalah kode tes. Tidak perlu khawatir kecuali Anda melakukan diagnosa dan ingin mengetahui apakah Anda benar-benar menerima data.

Untuk pemancar arduino

#termasuk

#include #include #include // ini tidak digunakan tetapi perlu dikompilasi#include #include int pin=4; DHT11 dht11 (pin); pengemudi RH_ASK; struct dataStruct{ float temp; }data saya; byte tx_buf[sizeof(myData)] = {0}; //Jadi argumennya adalah bitrate, pin transmisi (tx), //pin penerima (rx), pin ppt, isInverse. 2 yang terakhir tidak digunakan.void setup() { Serial.begin(9600); // Debugging hanya jika (!driver.init()) Serial.println("init gagal"); } void loop() { int salah; suhu mengambang, humi; pesan uint8_t; if((err=dht11.read(humi, temp))==0) myData.temp = temp; memcpy(tx_buf, &Datasaya, ukuran(Datasaya)); byte ukuran=ukuran(myData); { Serial.println(myData.temp); driver.send((uint8_t *)tx_buf, zize); driver.waitPacketSent(); //menghentikan eksekusi sampai semua data terkirim delay(2000); //tunggu 2 detik } }

Perintah include seharusnya sudah cukup, tetapi jika nanti Anda mengalami masalah dengan transfer data, Anda mungkin ingin mencari di folder perpustakaan RadioHead dan menyertakan sisa nama file, dalam format yang sama.

Langkah 5: Membuatnya Bekerja

Membuatnya Bekerja
Membuatnya Bekerja
Membuatnya Bekerja
Membuatnya Bekerja
Membuatnya Bekerja
Membuatnya Bekerja

Sekarang setelah kita memiliki semua kode dan arduino telah terpasang, kita dapat menghubungkan arduino ke komputer Anda dan memuat kodenya. Pastikan Anda mengirim kode yang benar ke mikrokontroler penerima dan pengirim. Anda dapat memiliki kedua arduino yang terhubung ke komputer Anda saat ini sedang berjalan tetapi Anda harus memastikan Anda memiliki port yang benar dipilih untuk bergerak maju, atau Anda dapat memutuskan transmisi arduino dan menyalakannya dari beberapa sumber lain setelah kodenya diunggah.

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

Jangan buka serial monitor saat Anda melakukan ini, python tidak dapat membaca serial saat monitor terbuka. Setelah python terbuka, panggil fungsi pythonprint sebagai berikut.

pythonlogger.pythonprint()

Ini akan memulai pengumpulan data dari port serial arduino. Jika Anda membuka folder python sekarang, Anda akan melihat bahwa file.csv baru telah dibuat bernama "test_data.csv", yang menyimpan semua informasi waktu dan suhu. Ini akan menjadi file yang diakses Matlab untuk melakukan semua perhitungan dan kontrolnya.

Peringatan lain: jangan buka test_data.csv saat data sedang diakses atau ditulis. Jika Anda melakukannya, python dan/atau kode Matlab akan macet dan mengirim kembali kesalahan

Jika Anda memutuskan untuk membuka.csv nanti, Anda akan melihat bahwa kolom waktu hanyalah rangkaian angka yang sangat besar. Itu karena perintah time.time() menulis jumlah detik sejak 1 Januari 1970.

Pada titik ini python harus mencetak data suhu yang dibaca dari port serial. Seharusnya terlihat seperti:

b'25.03'/r/n

Jangan khawatir tentang karakter tambahan, kode Matlab mengindeks untuk lima nilai tengah di kolom kedua file.csv.

Sekarang semua program pendukung berfungsi dan data sedang dikumpulkan, kita dapat mulai mengumpulkan data GPS dari program seluler Matlab yang telah disiapkan sebelumnya dan menjalankan kode GUI Matlab. Setelah Anda berada di tab sensor Matlab mobile, pilih GPS dan tekan tombol start.

Jika Anda baru menggunakan Matlab seluler, lihat kembali ke langkah 4 dan lihat tangkapan layar di atas. Jika Anda masih mengalami masalah, pastikan Anda terhubung ke komputer yang Anda pilih sebelumnya (di tab pengaturan) dan gunakan tautan dari perintah "konektor aktif" untuk memeriksa apakah Matlab online.

Langkah 6: Menggunakan Program

Menggunakan Program
Menggunakan Program

Ada banyak hal yang terjadi di latar belakang dalam sistem ini. Data suhu sedang dikumpulkan dan dicatat oleh arduino dan pyton, Matlab mengumpulkan data GPS dari ponsel Anda dan menjalankan perhitungan untuk melihat seberapa jauh Anda dari rumah dan menyetel termostat Anda berdasarkan semua informasi itu. Di mana Anda masuk adalah memberikan preferensi Anda.

Jalankan kode GUI Matlab. Buka file.mlapp dan lihat tab pertama. Anda harus mengumpulkan informasi untuk ini sendiri, efisiensi dan peringkat daya unit pemanas/pendingin Anda biasanya dapat ditemukan pada unit itu sendiri, dan kecepatan rata-rata Anda hanyalah perkiraan yang baik tentang seberapa cepat Anda mengemudi. Setelah nilai dimasukkan, tekan tombol "Jalankan Diagnostik" dan program mengontrol termostat Anda untuk mengumpulkan informasi tentang rumah Anda.

Pindah ke menu berikutnya.

Langkah 7: Kontrol Suhu

Pengatur suhu
Pengatur suhu

Menu ini memungkinkan Anda untuk memilih suhu yang diinginkan saat berada di rumah dan di luar. Atur Suhu #1 ke suhu nyaman Anda, dan Suhu #2 ke nilai tinggi atau rendah yang aman untuk rumah Anda (pastikan Anda tidak mengaturnya ke 100 derajat saat Anda memiliki anjing di rumah, dll.).

Langkah 8: Data Historis

Data historis
Data historis

Akhirnya Anda dapat melihat berapa banyak uang yang Anda simpan dengan menggunakan kontrol otomatis. Ini pada dasarnya memperkirakan berapa banyak energi yang akan digunakan jika termostat Anda disetel ke suhu pilihan Anda 24/7, kemudian mengurangi energi aktual yang digunakan.

Selamat membangun.

Direkomendasikan: