Daftar Isi:
- Langkah 1: Menyatukan Semuanya
- Langkah 2: Penerima
- Langkah 3: Pemancar
- Langkah 4: Kode
- Langkah 5: Membuatnya Bekerja
- Langkah 6: Menggunakan Program
- Langkah 7: Kontrol Suhu
- Langkah 8: Data Historis
Video: Autostat: Termostat Jarak Jauh: 8 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:57
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
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
Langkah 3: 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
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
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
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
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:
Pengendali Jarak Jauh Berbasis LoRa - Kontrol Peralatan Dari Jarak Jauh: 8 Langkah
Pengendali Jarak Jauh Berbasis LoRa | Mengontrol Peralatan Dari Jarak Jauh: Hai, apa kabar, Guys! Akarsh di sini dari CETech. Dalam proyek ini, kita akan membuat remote control yang dapat digunakan untuk mengontrol berbagai instrumen seperti LED, motor atau jika kita berbicara tentang kehidupan kita sehari-hari, kita dapat mengontrol aplikasi rumah kita
Smokin' - Mesin Asap Terkendali Jarak Jauh dengan Harga Murah: 5 Langkah (dengan Gambar)
Smokin' - Mesin Asap Terkendali Jarak Jauh dengan Harga Murah: Ini adalah instruksi singkat tentang cara membuat mesin asap kecil yang relatif kecil, dapat dikendalikan dari jarak jauh, murah dan menyenangkan, yang dapat digunakan untuk mengerjai teman, melakukan trik sulap, menguji aliran udara, atau apa pun keinginan hati Anda. Penafian: Build ini berisi
Sensor Jarak IR Jarak Jauh: 3 Langkah
Sensor Jarak IR Jarak Jauh: Sensor inframerah adalah Modul terbaik untuk deteksi objek tetapi masalahnya adalah ia bekerja untuk jarak yang sangat pendek. dalam artikel ini, kami akan membagikan bagaimana Anda dapat meningkatkan jangkauan dan faktor-faktor apa yang mempengaruhi jangkauan
Tingkatkan Jarak Efektif pada Pemancar Pemicu Jarak Jauh Flash 'ebay' Dengan Antena: 6 Langkah
Tingkatkan Jarak Efektif pada Pemancar Pemicu Jarak Jauh Flash 'ebay' Dengan Antena: Penggemar kamera dapat membeli pemicu jarak jauh versi murah untuk unit lampu kilat eksternal, mengendalikan unit lampu kilat tipe hot-shoe atau 'studio'. Pemicu ini menderita karena daya pemancar yang rendah dan dengan demikian jarak kontrol efektif yang kecil. ini bulan
Pelepasan Kabel Jarak Jauh Olympus Evolt E510 (Versi 2 Dengan Fokus Otomatis pada Jarak Jauh): 6 Langkah (dengan Gambar)
Olympus Evolt E510 Remote Cable Release (Versi 2 Dengan Fokus Otomatis pada Remote): Kemarin saya membuat remote satu tombol sederhana untuk Olympus E510 saya. Sebagian besar kamera memiliki tombol pelepas rana (tombol yang Anda tekan untuk mengambil gambar) yang memiliki dua mode. Jika tombol ditekan perlahan, kamera akan fokus otomatis dan mengukur cahaya