İçindekiler:

Autostat: Uzak Termostat: 8 Adım (Resimlerle)
Autostat: Uzak Termostat: 8 Adım (Resimlerle)

Video: Autostat: Uzak Termostat: 8 Adım (Resimlerle)

Video: Autostat: Uzak Termostat: 8 Adım (Resimlerle)
Video: Обзор приложения AutoStat. Подсчёт расходов на авто, в одном удобном месте! 2024, Temmuz
Anonim
Autostat: Uzak Termostat
Autostat: Uzak Termostat

Muhtemelen sorduğunuz soru "neden başka bir uzaktan termostat yapıyorsunuz?"

Bu sorunun cevabı, zorundaydım ve piyasadaki akıllı termostatlar çok pahalı.

Adil uyarı, bu, termostatınızı gerçekten kontrol etmek için birkaç ekstra çıkış gerektiren "kavram kanıtı" yapısıdır, ancak çekirdek yerinde ve özel durumunuza bağlı olarak değiştirilebilir. Ayrıca, bu hala devam eden bir çalışmadır, bu nedenle birkaç güncelleme ve değişiklik bekleyin (özellikle Matlab kodunda)

Başlamak için sizi uyarmak istiyorum, bunun için üç program (biri oldukça pahalı), epeyce kitaplık ve programlar için destek paketleri gerekiyor ve hepsinin birbiriyle konuşmasını sağlamanız gerekiyor. Baş ağrısıdır. Bu uyarıyı ortadan kaldırarak malzemelere başlayalım.

Donanım

  • arduino nano
  • arduino uno (veya başka bir nano, uno'yu kullandım çünkü etrafta bir tane vardı)
  • çeşitli atlama kabloları, bazı erkek/erkek ve iki takım birleştirilmiş üç erkek/dişi köprü
  • 433MHz radyo frekansı(RF) alıcısı, MX-05V kullandım
  • 433MHz RF verici, MX-FS-03V kullandım
  • DHT11 yüksek hassasiyetli termometre ve nem sensörü (kullandığım, gerekli dirençler zaten kurulu olan üç uçlu bir çip üzerine kurulu)
  • breadboard (hepsini birlikte lehimlemek istemiyorsanız)
  • GPS'li bir telefon (bu durumda iPhone 8, ancak ben de bir Galaxy S8 kullandım)
  • 3D baskılı kap (gerçekten gerekli değil, herhangi bir kap çalışır veya hiç çalışmaz)

Yazılım

  • MathWorks'ten Matlab (2018a sürümüne sahibim, ancak 2017a-b sürümlerini de kullandım)
  • Telefonunuzda yüklü olan Matlab mobil
  • Matlab için arduino destek paketi
  • Matlab için iPhone sensör paketi
  • arduino IDE'si
  • Arduino IDE'nin RadioHead destek paketleri ve kitaplıkları
  • arduino IDE için DHT11 kütüphanesi
  • python 3.7 (sürüm 3.4 veya daha yenisi için olması gereken pyserial kitaplığının veya seri kitaplığın kurulu olduğundan emin olun)

Adım 1: Hepsini Bir Araya Getirmek

Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy
Hepsini bir araya koy

Her şeyden önce, parçalarınızın çalıştığından ve kablolamanın doğru olduğundan emin olmak için RF vericileri ile ilgili birkaç arduino öğreticisi yapmanızı öneririm. Dahil edilen kodla birlikte birçok örnek var (C ve C++ hakkında çok az veya hiçbir şey bilmeyen bizler için).

Arduino ve sensörleri monte etmek için aşağıdaki kablo şemalarını izleyin. Arduino'ları bağlarken akılda tutulması gereken bir şey, kullandığım veri portlarının gerekli olmadığı ancak tavsiye edildiğidir.

Kullandığınız veri bağlantı noktalarını değiştirmeye karar verirseniz, kodunuzdaki pinleri tanımlamanız yeterlidir. Şahsen, arduino kitaplıklarının tanıdığı varsayılan bağlantı noktalarına bağlı kalmanın daha kolay olduğunu düşünüyorum.

Açık olmak gerekirse, nano ve uno birbirinin yerine kullanılabilir, ancak sıcaklık monitörünün boyutunu küçültmek için projenin verici tarafında nano'yu kullandım.

Yan not: nano'yu tutan yeşil mekanizma, 3D baskılı kaptır.

2. Adım: Alıcı

Alıcı
Alıcı

Adım 3: Verici

verici
verici

Adım 4: Kod

Kablolama bittiğinde, tüm programları çalıştırmanız ve kitaplıkları kurmanız gerekir (henüz yapmadıysanız), sahip olduğunuzu varsayacağım, Matlab'ı başlatmanız ve iPhone destek paketini çalıştırmanız gerekir. Bu noktada hem telefonunuzun hem de Matlab'ın aynı wifi ağında olması gerekiyor.

Matlab'ın komut penceresinde şunu yazın:

konektör açık

Bu, iPhone'unuza bağlanmak için kullanacağınız beş basamaklı bir şifre girmenizi ister. Şifreyi hatırladığınızdan emin olun. Şifreyi girdiğinizde Matlab, IP adresiniz de dahil olmak üzere bazı bilgileri gösterecektir. Bunu, Matlab mobile'daki "Sensörlere başlarken" yardım menüsündeki talimatlardan gelen bir sonraki adımda kullanın.

  • Sensör verilerini MathWorks Cloud'a veya bir bilgisayara göndermek için şu adımları izleyin:
  • Sensör verilerini bir bilgisayara gönderiyorsanız ve halihazırda kurulu değilse, MATLAB'da Apple iOS Sensörleri için MATLAB Destek Paketini indirip kurun.
  • MATLAB Mobile'ı MathWorks Cloud'a veya Ayarlar'ı kullanarak bir bilgisayara bağlayın.
  • MATLAB'da (bilgisayarınızda) mobiledev nesnesi oluşturun, örneğin: >> m = mobiledev
  • Bir veya daha fazla sensör seçin ve Başlat'a dokunun.

Sensör verilerini cihazınızda yerel olarak günlüğe kaydetmek için şu adımları izleyin:

  • Sensörler ekranında, veri toplamak istediğiniz sensörleri seçin.
  • Günlük'ü seçin.
  • Başlat düğmesine dokunun.
  • Veri toplamayı bitirdiğinizde Durdur düğmesine dokunun.
  • Açılır pencerede sensör günlüğünün adını girin.
  • Gerekirse 1-5 arasındaki adımları tekrarlayın.

Bu bölüme Bölüm 4'te tekrar değinilecektir, dolayısıyla henüz veri toplamaya başlamanıza gerek yoktur. Sadece telefonunuzu elinizin altında ve Matlab mobile hazır tutun.

Şimdi, Matlab kod dosyalarını barındırmak için bilgisayarınızda bir yerde bir klasör oluşturmanız gerekiyor. Dört ayrı dosyanız olacak, ikisi arka plan işlevleri için (.m dosyaları) ve GUI için bir Matlab kod dosyası (.mlapp),.

Birincisi, evinizdeki havanın kütle hesaplamasıdır (bu, Matlab'ın evinizi ısıtmanın/soğutmanın ne kadar sürdüğünü bilmesini sağlar)

function [Kütle]= CalcMass(T_ins, P_out, Chng_dir)

runCalc=0; Tmp_start=T_ins; time_start=saat; time_end = 0 iken runCalc <= 1 if T_ins==(Tmp_start+(7*Chng_dir)) time_end=clock; PwrCntr = 0; runCalc=0; başka PwrCntr = P_out; runCalc=runCalc+0.1 bitiş bitiş time_diag= time_end-time_start Kütle=(P_out*time_diag)/7.035

Ve ikincisi:

function [zaman damgaları, pwr_usage]= dist_cntrl(Lat_in, Lon_in, P_out, r_pref, hız, T_pref, kütle)

OtoStat = 1; ben = 1; iken AutoStat == 1 time_start=clock; m = mobil dev; t = csvread('değerler.csv', 0, 1); t= t(i); zaman damgaları= [0, 0, 0, 0, 0, 0]; pwr_usage = 0; ben = ben+1; biçim longg; Enlem ve %longintude temelinde mesafeyi hesaplamak için %haversine formülü a_hav=(sind((m. Lat-Lat_in)./2)).^2+cosd(Lat_in).*cosd(m.latitude).*(sind((m. Boylam-Boy_in)./2)).^2; c_hav= 2.*atan2d(sqrt(a_hav), sqrt(1-a_hav)); d_hav= 6371.*c_hav; Uzak=d_hav.*1000; %dönüş zamanınızı tahmin eder time_rtn=(Dist-r_pref)./speed; % klimanın güç çıkışına ve evin hava kütlesine göre gerekli termostat ayarını hesaplar. calcTmp_set=((-1.*P_out.*time_rtn)./(kütle.*(1.005)))+T_pref; % eğer round(calcTmp_set) ise mevcut termostat ayarının değiştirilmesi gerekip gerekmediğini belirler ~= round(t) timeACon = saat; PwrCntr = P_out; timeACon= timeACon + saat-zaman_başlangıç; maliyet=P_out*timeACon*oran; else PwrCntr = 0 bitiş zaman damgaları(bitiş+1, [1:6]) = saat; pwr_usage(son+1, 1)= PwrCntr; duraklat(5) bitiş sonu

Bu dosyaların her ikisi de Matlab işlevleridir. Onları GUI'den arayacağınız için, belirli ihtiyaçlar için değiştirmeyi planlamadığınız sürece bunlara erişmeniz gerekmeyecektir. Her iki dosyayı da ayrı ayrı kaydedin, ilki CalcMass.m ve ikincisi dist_cntrl.m olarak, bunlar GUI kodunun işlevleri çağırmak için kullandığı adlar olacaktır, bu nedenle aşağıdaki kodun geri kalanını düzenlemek istemiyorsanız, buna bağlı kalın adlandırma kuralı.

GUI koduna girmeden önce, Matlab menü çubuğunda gezinerek veya Matlab komut penceresine aşağıdaki komutu girerek en sevdiğim yöntemle açabileceğiniz Matlab için uygulama tasarımcısını açmanız gerekir:

uygulama tasarımcısı

Uygulama tasarımcısı açıldığında yeni bir uygulama dosyası (.mlapp) açın ve kod penceresinden tüm varsayılan kodu silin. Ardından hepsini aşağıdaki ile değiştirin ve çalıştır düğmesine basın.

classdef Control_1 < matlab.apps. AppBase % Uygulama bileşenleri özelliklerine karşılık gelen özellikler (Erişim = genel) UI Figure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Düğme 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 TemperatureYönSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.ui.container. Sekme Sıcaklığı1SpinnerEtiket matlab.ui. SpinnerEtiket matlab.ui. Spinner. ui.control. Spinner Sıcaklık2SpinnerLabel matlab.ui.cont rol. Etiket Sıcaklık2Spinner matlab.ui.control. Spinner Anahtarı matlab.ui.control. Switch EditFieldLabel matlab.ui.control. Label tempnow matlab.ui.control. NumericEditField GaugeLabel matlab.ui.control. Label Gauge matlab.ui.control. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField ToplamTasarruflarEditFieldLabel. Field. Field.

yöntemler (Erişim = özel)

% Değer değiştirilen fonksiyon: tempnow

işlev tempnowValueChanged(uygulama, olay) temp = app.tempnow. Value; temp=randi([60, 90], 1, 50) app. Gauge. Value = 0 için i = uzunluk(temp) app. Gauge. Value= temp(i) duraklama(1) bitiş bitiş

% Değer değiştirilen fonksiyon: TemperatureDirectionSwitch

function TemperatureDirectionSwitchValueChanged(app, event) yol = app. TemperatureDirectionSwitch. Value; yol= uint8(yol) yol = uzunluk(yol) ise yol == 4 Chng_dir = -1; başka Chng_dir = 1; bitiş Chng_dir; son

% Değer değiştirilen fonksiyon: DDFH

işlev DDFHValueChanged(uygulama, olay) r_pref = app. DDFH. Value; son

% Değer değiştirilen işlev: AvgLocalSpeedEditField

işlev AvgLocalSpeedEditFieldValueChanged(uygulama, olay) hız = app. AvgLocalSpeedEditField. Value; son

% Değer değişti işlevi: PowerOutputRatingEditField

işlev PowerOutputRatingEditFieldValueChanged(app, event) value = app. PowerOutputRatingEditField. Value; son

% Değer değiştirilen işlev: EnergyEfficiencyRatingEditField

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

% Düğmeye basma işlevi: RunDiagnosticButton

function RunDiagnosticButtonPushed(uygulama, olay) yol = app. TemperatureDirectionSwitch. Value; yol= uint8(yol) yol = uzunluk(yol) ise yol == 4 Chng_dir = -1; başka Chng_dir = 1; bitiş T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1(T_ins, P_out, Chng_dir)

son

% Değer değiştirilen fonksiyon: Sıcaklık1Spinner

function Sıcaklık1SpinnerValueChanged(app, event) value = app. Temperature1Spinner. Value; son

% Değer değiştirilen fonksiyon: Sıcaklık2Spinner

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

% Değer değiştirilen fonksiyon: Anahtar

işlev SwitchValueChanged(uygulama, olay) m = mobiledev; Lat_in = m. Enlem Lon_in = m. Boylam P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; hız = m. Hız; kütle = 200; hız = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl(Lat_in, Lon_in, P_out, r_pref, T_pref, hız, kütle) end end

% Uygulama başlatma ve oluşturma

yöntemler (Erişim = özel)

% UI Figure ve bileşenleri oluştur

function createComponents(app)

% UI Figürü Oluştur

app. UIŞekil = uifigure; app. UI Figure. Position = [100 100 640 480]; app. UI Figure. Name = 'UI Figürü';

% TabGrubu Oluştur

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

% Kurulum Sekmesi Oluştur

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

% RunDiagnosticButton Oluştur

app. RunDiagnosticButton = uibutton(app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn(app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'kalın'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Tanılamayı Çalıştır';

% EnergyEfficiencyRatingEditFieldLabel Oluştur

app. EnergyEfficiencyRatingEditFieldLabel = uilabel(app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'sağ'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Enerji Verimliliği Derecelendirmesi';

% EnergyEfficiencyRatingEditField Oluştur

app. EnergyEfficiencyRatingEditField = uieditfield(app. SetupTab, 'sayısal'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn(app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'merkez'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% PowerOutputRatingEditFieldLabel Oluştur

app. PowerOutputRatingEditFieldLabel = uilabel(app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'sağ'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Güç Çıkışı Derecesi';

% PowerOutputRatingEditField Oluştur

app. PowerOutputRatingEditField = uieditfield(app. SetupTab, 'sayısal'); app. PowerOutputRatingEditField. Limits = [0 Bilgi]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn(app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'merkez'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% AvgLocalSpeedEditFieldLabel Oluştur

app. AvgLocalSpeedEditFieldLabel = uilabel(app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'sağ'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Ort. Yerel Hız';

% AvgLocalSpeedEditField Oluştur

app. AvgLocalSpeedEditField = uieditfield(app. SetupTab, 'sayısal'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn(app, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'merkez'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% DesiredDistancefromHouseEditFieldLabel Oluştur

app. DesiredDistancefromHouseEditFieldLabel = uilabel(app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'sağ'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'İstenen Mesafe'; 'Evden'};

% DDFH Oluştur

app. DDFH = uieditfield(app. SetupTab, 'sayısal'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn(app, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'merkez'; app. DDFH. Position = [139 135 100 22];

% TemperatureDirectionSwitchLabel Oluştur

app. TemperatureDirectionSwitchLabel = uilabel(app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'merkez'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Sıcaklık Yönü';

% SıcaklıkYön Anahtarı Oluştur

app. TemperatureDirectionSwitch = uiswitch(app. SetupTab, 'kaydırıcı'); app. TemperatureDirectionSwitch. Items = {'Yukarı', 'Aşağı'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn(app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Yukarı';

% TempAyarları Sekmesi Oluştur

app. TempSettingsTab = uitab(app. TabGroup); app. TempSettingsTab. Title = 'Sıcaklık. Ayarlar';

% Sıcaklık1SpinnerLabel Oluştur

app. Temperature1SpinnerLabel = uilabel(app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'merkez'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Sıcaklık '; '#1'};

% Sıcaklık Oluştur1Spinner

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

% Sıcaklık2SpinnerLabel Oluştur

app. Temperature2SpinnerLabel = uilabel(app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'merkez'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Sıcaklık '; '#2'};

% Sıcaklık Oluşturma2Spinner

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

% Anahtar Oluştur

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

% EditFieldLabel Oluştur

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

% Tempnow oluştur

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

% GaugeLabel Oluştur

app. GaugeLabel = uilabel(app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'merkez'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Ölçer';

% Gösterge Oluştur

app. Gauge = uigauge(app. TempSettingsTab, 'dairesel'); 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;

% Tasarruf Sekmesi Oluştur

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

% UIAx Oluşturma

app. UIAxes = uiaxes(app. SavingsTab); title(app. UIAxes, 'Tasarruf') xlabel(app. UIAxes, 'Ay ve Yıl') ylabel(app. UIAxes, 'Para') app. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.606666666666667]; app. UIAxes. Color = [0.9412 0.9412 0.9412]; app. UIAxes. Position = [146 219 348 237];

% ThisMonthCostEditFieldLabel Oluştur

app. ThisMonthCostEditFieldLabel = uilabel(app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'merkez'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Bu Ayın Maliyeti';

% ThisMonthCostEditField Oluştur

app. ThisMonthCostEditField = uieditfield(app. SavingsTab, 'sayısal'); app. ThisMonthCostEditField. Limits = [0 Bilgi]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'merkez'; app. ThisMonthCostEditField. Position = [417 39 137 58];

% TotalSavingsEditFieldLabel Oluştur

app. TotalSavingsEditFieldLabel = uilabel(app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'sağ'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Toplam Tasarruf';

% Toplam TasarrufEditField Oluştur

app. TotalSavingsEditField = uieditfield(app. SavingsTab, 'sayısal'); app. TotalSavingsEditField. Limits = [0 Bilgi]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'merkez'; app. TotalSavingsEditField. Position = [88 39 137 58]; son son

yöntemler (Erişim = genel)

% Uygulama oluştur

işlev uygulaması = Control_1

% Bileşen oluştur ve yapılandır

createComponents(uygulama)

% Uygulamayı App Designer'a kaydedin

registerApp(app, app. UI Figure)

eğer nargout == 0

uygulama sonu sonunu temizle

% Uygulama silinmeden önce yürütülen kod

işlev silme (uygulama)

% Uygulama silindiğinde UI Figure'yi sil

sil(app. UI Figure) bitiş bitiş bitiş

Muhtemelen sorun olmayan bir hata alırsınız. Çalıştır'a bastıktan sonra oluşturulan GUI'yi kapatmanız yeterlidir, geri kalan gerekli programları ve verileri birazdan toplayacağız.

Matlab kurulduğundan python'a geçebiliriz. İlk olarak, python programını komut isteminizden (Windows'ta) veya python klasörünüzdeki.exe dosyasını kullanarak çalıştırın. Import komutunu kullanarak tüm uygun kitaplıkların yüklendiğinden emin olun.

seriyi içe aktar

içe aktarma zamanı içe aktarma csv

Bunlar, başlamanız gereken üç kitaplık, ancak yakında kendi kitaplığımızı oluşturacağız. Bu komutlarda bir tür hata varsa, geri dönün ve kitaplıkların kurulu olduğundan ve python klasöründeki Lib klasöründe olduğundan emin olun. Daha sonra pythonlogger kitaplığı dediğim şeyi oluşturacağız. Bu ad gerekli değildir, istediğiniz gibi adlandırabilirsiniz, bu sadece oluşturduğunuz python dosyasının (.py) adıdır.

Bir metin düzenleyici açın, Sublime3 kullanıyorum ama not defteri gayet iyi çalışıyor ve bu kodu girin.

tanım pythonprint():

pythonlogger import seri import time import csv ser = serial. Serial('COM8') # COM8 arduino seri portudur, bu muhtemelen her kullanıcı için farklı olacaktır, yani arduino IDE'deki seri portunuzu kontrol edin ser.flushInput() iken Doğru: deneyin: ser_bytes = ser.readline() print(ser_bytes) open("test_data.csv", "a") ile f:writer = csv.writer(f, delimiter=", ") # verileri şu şekilde ayarlar virgülle ayrılmış yazar.writer.writer.([time.time(), ser_bytes]) #test_data.csv'ye veri yazar, şu hariç: print("Error Occured") break

Metni Lib klasörüne "istediğiniz kitaplığın adını girin".py olarak kaydedin. Ayrıca, def pythonprint() satırının, çağıracağınız işlevin adını tanımladığını unutmayın, böylece bunu def "işleviniz için istediğiniz adı girin"() olarak değiştirebilirsiniz. Kütüphane kaydedildiğinde arduino koduna geçebiliriz.

Arduino IDE'yi açın ve iki yeni çizim penceresi açın. Bu iki çizim dosyasını uygun bir yere kaydedin, bu dosyaların adı önemli değil. Ardından tüm varsayılan kodu silin ve aşağıdaki ile değiştirin.

Alıcı arduino için:

#Dahil etmek

#include #include #include // bu kullanılmaz ancak RH_ASK sürücüsünü derlemek için gereklidir; struct dataStruct{ float temp; }benim verim; geçersiz kurulum() { Serial.begin(9600); // Hata ayıklama yalnızca (!driver.init()) Serial.println("init başarısız"); } geçersiz döngü() { uint8_t tampon[RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof(tampon); if (driver.recv(buf, &buflen)) // Engellemeyen { int i; // Sağlama toplamı iyi olan mesaj alındı, boşaltın. //driver.printBuffer("Alınan:", tampon, tampon); memcpy(&myData, tampon, sizeof(myData)); Seri.println(""); Serial.print(myData.temp); } }

not //driver.printBuffer…. etc satırı test kodudur. Teşhis yapmıyorsanız ve gerçekten veri alıp almadığınızı anlamak istemiyorsanız, bunun için endişelenmenize gerek yok.

verici arduino için

#Dahil etmek

#include #include #include // bu kullanılmaz ancak derlemek için gereklidir#include #include int pin=4; DHT11 dht11(pin); RH_ASK sürücüsü; struct dataStruct{ float temp; }benim verim; bayt tx_buf[sizeof(myData)] = {0}; //Argümanlar bit hızı, iletim pini (tx), //alma pini (rx), ppt pin, isInverse. Son 2 tanesi kullanılmaz.void setup() { Serial.begin(9600); // Hata ayıklama yalnızca (!driver.init()) Serial.println("init başarısız"); } geçersiz döngü() { int hata; yüzer sıcaklık, humi; uint8_t msj; if((err=dht11.read(humi, temp))==0) myData.temp = temp; memcpy(tx_buf, &myData, sizeof(myData)); bayt zize=sizeof(myData); { Serial.println(myData.temp); driver.send((uint8_t *)tx_buf, zize); driver.waitPacketSent(); //tüm veriler gönderilene kadar yürütmeyi durdur delay(2000); //2 saniye bekle } }

Dahil etme komutları yeterli olacaktır, ancak daha sonra veri aktarımıyla ilgili herhangi bir sorun yaşarsanız, RadioHead kitaplık klasörüne bakmak ve dosya adlarının geri kalanını aynı biçimde eklemek isteyebilirsiniz.

Adım 5: Çalıştırmak

Çalıştırmak
Çalıştırmak
Çalıştırmak
Çalıştırmak
Çalıştırmak
Çalıştırmak

Artık tüm kodlara sahip olduğumuza ve arduino'yu bir araya getirdiğimize göre, arduino'yu bilgisayarınıza bağlayabilir ve kodu yükleyebiliriz. Alıcı ve verici mikrodenetleyicilere doğru kodu gönderdiğinizden emin olun. Bu çalışırken her iki arduinoyu da bilgisayarınıza bağlayabilirsiniz, ancak ileriye doğru doğru bağlantı noktasının seçili olduğundan emin olmanız gerekir veya kod gönderildiğinde verici arduino'nun bağlantısını kesebilir ve başka bir kaynaktan çalıştırabilirsiniz. yüklendi.

Bundan bahsetmişken, şimdi IDE araçları menüsünden alıcı arduino'nuza bağlı olan portu seçip python'u çalıştırmalısınız.

Bunu yaparken seri monitörü açmayın, monitör açıkken python seriyi okuyamaz. Python açıldıktan sonra pythonprint işlevini aşağıdaki gibi çağırın.

pythonlogger.pythonprint()

Bu, arduino seri bağlantı noktasından veri toplamayı başlatacaktır. Şimdi python klasörünüzü açarsanız, tüm zaman ve sıcaklık bilgilerini tutan "test_data.csv" adlı yeni bir.csv dosyasının oluşturulduğunu göreceksiniz. Bu, Matlab'ın tüm hesaplamalarını ve kontrollerini yapmak için eriştiği dosya olacaktır.

Başka bir uyarı: verilere erişilirken veya yazılırken test_data.csv dosyasını açmayın. Bunu yaparsanız, python ve/veya Matlab kodu çökecek ve bir hata gönderecektir

.csv dosyasını daha sonra açmaya karar verirseniz, zaman sütununun yalnızca çok büyük bir sayı dizisi olduğunu fark edeceksiniz. Bunun nedeni, time.time() komutunun 1 Ocak 1970'den bu yana geçen saniye sayısını yazmasıdır.

Bu noktada python, seri porttan okuduğu sıcaklık verilerini yazdırıyor olmalıdır. Şunun gibi görünmelidir:

b'25.03'/r/n

Fazladan karakterler için endişelenmeyin, Matlab kodu.csv dosyasının ikinci sütunundaki ortadaki beş değer için indeksler.

Artık tüm destekleyici programlar çalıştığına ve veriler toplandığına göre, daha önce kurulmuş olan Matlab mobil programından GPS verilerini toplamaya başlayabilir ve Matlab GUI kodunu çalıştırabiliriz. Matlab mobile'ın sensör sekmesine girdikten sonra GPS'i seçin ve başlat düğmesine basın.

Matlab mobilde yeniyseniz 4. adıma geri dönün ve yukarıdaki ekran görüntülerine bakın. Hala sorun yaşıyorsanız, daha önce seçtiğiniz bilgisayara (ayarlar sekmesinde) bağlı olduğunuzdan emin olun ve Matlab'ın çevrimiçi olup olmadığını kontrol etmek için "bağlayıcı açık" komutundaki bağlantıyı kullanın.

Adım 6: Programı Kullanma

Programı Kullanma
Programı Kullanma

Bu sistemde arka planda birçok şey oluyor. Sıcaklık verileri arduino ve pyton tarafından toplanır ve kaydedilir, Matlab telefonunuzdan GPS verilerini toplar ve evinizden ne kadar uzakta olduğunuzu görmek için hesaplamalar yapar ve tüm bu bilgilere göre termostatınızı ayarlar. Geldiğiniz yer tercihlerinizi sağlıyor.

Matlab GUI kodunu çalıştırın..mlapp dosyasını açın ve ilk sekmeye bakın. Bunun için bilgileri kendiniz toplamanız gerekecek, ısıtma/soğutma ünitenizin verimliliği ve güç derecesi genellikle ünitenin kendisinde bulunabilir ve ortalama hızınız ne kadar hızlı sürdüğünüzün iyi bir tahminidir. Değerler girildikten sonra, "Teşhisi Çalıştır" düğmesine basın ve program, eviniz hakkında bilgi toplamak için termostatınızı kontrol eder.

Bir sonraki menüye geçin.

Adım 7: Sıcaklık Kontrolü

Sıcaklık kontrolü
Sıcaklık kontrolü

Bu menü, evde ve dışarıdayken tercih ettiğiniz sıcaklığı seçmenizi sağlar. Sıcaklık #1'i rahat sıcaklığınıza ve Sıcaklık #2'yi eviniz için güvenli olan yüksek veya düşük bir değere ayarlayın (evde köpekleriniz varken, vb. 100 dereceye ayarlamadığınızdan emin olun).

8. Adım: Geçmiş Veriler

Tarihsel veri
Tarihsel veri

Son olarak otomatik kontrolü kullanarak ne kadar tasarruf ettiğinizi izleyebilirsiniz. Bu, termostatınızın 7/24 tercih ettiğiniz sıcaklığa ayarlanması durumunda ne kadar enerji kullanılacağını tahmin eder ve ardından kullandığınız gerçek enerjiyi çıkarır.

İyi şanslar bina.

Önerilen: