Mündəricat:

Avtostat: Uzaqdan Termostat: 8 Addım (Şəkillərlə birlikdə)
Avtostat: Uzaqdan Termostat: 8 Addım (Şəkillərlə birlikdə)

Video: Avtostat: Uzaqdan Termostat: 8 Addım (Şəkillərlə birlikdə)

Video: Avtostat: Uzaqdan Termostat: 8 Addım (Şəkillərlə birlikdə)
Video: 🔱🏁Aftoşlar✴🏁zirr kayfdi eee 2024, Noyabr
Anonim
Avtostat: Uzaqdan Termostat
Avtostat: Uzaqdan Termostat

Yəqin soruşduğunuz sual "niyə başqa bir uzaq termostat hazırlayırsınız?"

Bu sualın cavabı, məcbur oldum və bazarın ağıllı termostatları çox bahadır.

Ədalətli xəbərdarlıq, bu, termostatınızı idarə etmək üçün bir neçə əlavə çıxış tələb edəcək "konsepsiyanı sübut edən" bir quruluşdur, ancaq nüvə yerindədir və xüsusi vəziyyətinizə görə dəyişdirilə bilər. Ayrıca, bu hələ də davam edən bir işdir, buna görə bir neçə yeniləmə və dəyişiklik gözləyin (xüsusən Matlab kodunda)

Başlamaq üçün sizi xəbərdar etmək istəyirəm, bunun üçün üç proqram (onlardan biri olduqca bahalı), kifayət qədər kitabxana və proqramlar üçün dəstək paketləri tələb olunur və bunların hamısının bir -biri ilə danışmasını təmin etməlisiniz. Baş ağrısıdır. Bu xəbərdarlıqdan sonra materiallarla başlayaq.

Avadanlıq

  • arduino nano
  • arduino uno (və ya başqa bir nano, yalnız uno istifadə etdim, çünki ətrafımda yatırdım)
  • müxtəlif keçid kabelləri, bəzi kişi/kişi və üç qoşulmuş kişi/qadın tullanan iki dəst
  • 433MHz radio tezliyi (RF) qəbuledicisi, MX-05V istifadə etdim
  • 433MHz RF ötürücü, MX-FS-03V istifadə etdim
  • DHT11 yüksək dəqiqlikli termometr və rütubət sensoru (istifadə etdiyim üç zərbəli çipə quraşdırılmış tələb olunan rezistorlar artıq quraşdırılmışdır)
  • çörək taxtası (hamısını birlikdə lehimləmək istəmirsinizsə)
  • GPS ilə bir telefon (bu vəziyyətdə iPhone 8, amma mən də Galaxy S8 istifadə etmişəm)
  • 3D çap konteyner (həqiqətən lazım deyil, hər hansı bir konteyner işləyəcək və ya heç biri yoxdur)

Proqram təminatı

  • MathWorks-dən Matlab (2018a nəşrim var, amma 2017a-b nəşrlərindən də istifadə etmişəm)
  • Matlab mobil telefonunuza quraşdırılıb
  • Matlab üçün arduino dəstək paketi
  • Matlab üçün iPhone sensor paketi
  • arduino IDE
  • RadioHead, arduino IDE paketlərini və kitabxanalarını dəstəkləyir
  • Arduino IDE üçün DHT11 kitabxanası
  • python 3.7 (3.4 və ya daha yeni versiya üçün olmalı olan kitabxana kitabxanasının və ya serial kitabxanasının quraşdırıldığından əmin olun)

Addım 1: Hamısını bir araya gətirmək

Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək
Hamısını bir araya gətirmək

Əvvəlcə hissələrinizin işlədiyini və naqillərin düzgün olduğundan əmin olmaq üçün RF ötürücüləri ilə məşğul olan bir neçə arduino dərsləri etməyinizi təklif edərdim. Kod daxil olmaqla bir çox nümunə mövcuddur (C və C ++ haqqında çox az şey bilənlər üçün).

Arduino və sensorlar yığmaq üçün aşağıdakı kabel sxemlərinə əməl edin. Arduinoları bağlayarkən yadda saxlamaq lazım olan bir şey, istifadə etdiyim məlumat portlarının tələb olunmaması, lakin tövsiyə edilməsidir.

İstifadə etdiyiniz məlumat limanlarını dəyişdirmək qərarına gəlsəniz, kodunuzdakı pinləri təyin etməlisiniz. Şəxsən məncə, arduino kitabxanalarının tanıdığı standart limanlara yapışmaq daha asandır.

Və aydın olmaq üçün nano və uno bir -birini əvəz edir, amma temperatur monitorunun ölçüsünü azaltmaq üçün layihənin ötürücü tərəfi üçün nanodan istifadə etdim.

Yan qeyd: nanonu tutan yaşıl zolaq 3D çaplı konteynerdir.

Addım 2: Alıcı

Alıcı
Alıcı

Addım 3: ötürücü

Verici
Verici

Addım 4: Kod

Kablolama işləri başa çatdıqdan sonra bütün proqramları işə salmalı və kitabxanaları quraşdırmalısınız (əgər hələ də yoxsa), məncə, sizdə var, Matlab -ı işə salmalı və iPhone dəstək paketini işə salmalısınız. Bu anda həm telefonunuz, həm də Matlab eyni wifi şəbəkəsində olmalıdır.

Matlabın əmr pəncərəsinə yazın:

bağlayıcı aktivdir

Bu, iPhone -a qoşulmaq üçün istifadə edəcəyiniz beş rəqəmli bir parol daxil etməyinizi istəyəcək. Şifrəni xatırladığınızdan əmin olun. Şifrəni daxil etdiyiniz zaman Matlab, IP ünvanınız da daxil olmaqla bəzi məlumatları göstərəcək. Bunu Matlab mobile -dakı "Sensorlarla işə başlama" yardım menyusundakı təlimatlardan gələn növbəti addımda istifadə edin.

  • Sensor məlumatlarını MathWorks Cloud və ya kompüterə göndərmək üçün aşağıdakı adımları yerinə yetirin:
  • Sensor məlumatlarını kompüterə göndərirsinizsə və hələ quraşdırılmamışdırsa, MATLAB -da Apple iOS Sensorları üçün MATLAB Dəstək Paketini yükləyin və quraşdırın.
  • Parametrlərdən istifadə edərək MATLAB Mobile -ı MathWorks Cloud -a və ya kompüterə qoşun.
  • MATLAB -da (kompüterinizdə) mobiledev obyekti yaradın, məsələn: >> m = mobiledev
  • Bir və ya daha çox sensoru seçin və Başla vurun.

Sensor məlumatlarını cihazınızda lokal olaraq qeyd etmək üçün bu addımları izləyin:

  • Sensorlar ekranında məlumat toplamaq istədiyiniz sensorları seçin.
  • Giriş seçin.
  • Başlat düyməsini vurun.
  • Məlumat toplamağı bitirdikdə, Stop düyməsinə vurun.
  • Açılan pəncərədə sensor jurnalının adını daxil edin.
  • Gerekirse 1-5 addımları təkrarlayın.

Bu hissəyə 4 -cü hissədə istinad ediləcək, buna görə hələ məlumat toplamağa başlamağa ehtiyac yoxdur. Telefonunuzu əlinizdə və Matlab mobilinizi hazır saxlayın.

İndi Matlab kod fayllarını yerləşdirmək üçün kompüterinizdə bir yerdə bir qovluq yaratmalısınız. Arxa fon funksiyaları üçün iki ayrı fayl (.m faylları) və GUI (.mlapp) üçün bir Matlab kod faylı olacaq.

Birincisi, evinizdəki havanın kütləvi hesablanmasıdır (bu, Matlaba evinizi qızdırmaq/soyutmaq üçün nə qədər vaxt lazım olduğunu bildirir)

funksiya [Kütlə] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = saat; time_end = 0 runCalc <= 1 olarkən T_ins == (Tmp_start+(7*Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; başqa PwrCntr = P_out; runCalc = runCalc+0.1 bitmə vaxtı_diag = vaxt_öç-vaxt_start Kütlə = (P_out*zaman_diaq) /7.035

Və ikincisi:

funksiya [zaman damgaları, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, sürət, T_pref, kütlə)

AutoStat = 1; i = 1; AutoStat == 1 time_start = saat; m = mobiledev; t = csvread ('dəyərlər.csv', 0, 1); t = t (i); vaxt damgaları = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; uzunluq formatı; Enlem və %longintude a_hav = (sind ((Latın-Lat_in)./ 2)) əsasında məsafənin hesablanması üçün %haversine formulu.^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; %, vaxt_rtn = (Dist-r_pref)./ sürəti qaytarmaq üçün vaxtınızı təxmin edir; Evin kondisioneri və hava kütləsinin söndürülməsinə əsaslanaraq lazımi termostat parametrini hesablayır. calcTmp_set = ((-1.*P_out.*time_rtn)./ (kütlə.*(1.005)))+T_pref; %, yuvarlaq (calcTmp_set) ~ = yuvarlaq (t) timeACon = saat olduqda cari termostat parametrinin dəyişdirilməsinin lazım olub -olmadığını müəyyən edir; PwrCntr = P_out; timeACon = timeACon + clock-time_start; dəyəri = P_out*zamanACon*dərəcəsi; else PwrCntr = 0 son zaman damgaları (son+1, [1: 6]) = saat; pwr_usage (son+1, 1) = PwrCntr; fasilə (5) sonu son

Bu faylların hər ikisi də Matlab funksiyalarıdır. Onları GUI -dən çağıracağınız üçün xüsusi ehtiyaclar üçün dəyişdirməyi planlaşdırmadığınız təqdirdə onlara daxil olmaq lazım olmayacaq. Hər iki faylı ayrı -ayrılıqda saxlayın, birincisi CalcMass.m, ikincisi dist_cntrl.m olaraq, bunlar GUI kodunun funksiyaları çağırmaq üçün istifadə etdiyi adlar olacaq, buna görə də aşağıdakı kodun qalan hissəsini redaktə etmək istəməsəniz adlandırma konvensiyası.

GUI koduna girməzdən əvvəl Matlab menyu çubuğunda gedərək aça biləcəyiniz və ya Matlab əmr pəncərəsinə aşağıdakı əmri daxil edən ən sevdiyim metodla aça biləcəyiniz Matlab üçün proqram tərtibatçısını açmalısınız:

appdesigner

Tətbiq dizayneri açıldıqdan sonra yeni bir tətbiq faylını (.mlapp) açın və bütün standart kodu kod pəncərəsindən silin. Sonra hamısını aşağıdakılarla əvəz edin və qaç düyməsini vurun.

classdef Control_1 <matlab.apps. AppBase % Tətbiq komponentlərinin xüsusiyyətlərinə uyğun olan xüsusiyyətlər (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 TemperaturDirectionSwitchLabel matlab.ui.control. Label TemperaturDirectionSwitch matlab.ui.container. Tab Temperatur1Spin ui.control. Spinner Temperatur2SpinnerLabel matlab.ui.cont rol. Label Temperatur2Spinner matlab.ui.control. Spinner Switch matlab.ui.control. Switch EditFieldLabel matlab.ui.control. Label tempnow matlab.ui.control. NumericEditField GaugeLabel matlab.ui.control. Label Ölçücü matlab.ui.control. Ölçü Əmanətləri Tab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField. TabloField. FieldField

metodlar (Access = özəl)

Dəyişdirilən funksiya: tempnow

tempnowValueChanged funksiyası (tətbiq, hadisə) 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

Dəyişdirilən funksiya: TemperatureDirectionSwitch

funksiyası TemperatureDirectionSwitchValueChanged (app, event) way = app. TemperatureDirectionSwitch. Value; yol = uint8 (yol) yol = uzunluq (yol) əgər yol == 4 Chng_dir = -1; başqa Chng_dir = 1; son Chng_dir; bitmək

Dəyişdirilən funksiya: DDFH

funksiyası DDFHValueChanged (tətbiq, hadisə) r_pref = app. DDFH. Value; bitmək

Dəyişdirilən funksiya: AvgLocalSpeedEditField

funksiyası AvgLocalSpeedEditFieldValueChanged (tətbiq, hadisə) sürət = app. AvgLocalSpeedEditField. Value; bitmək

Dəyişdirilən funksiya: PowerOutputRatingEditField

funksiyası PowerOutputRatingEditFieldValueChanged (app, event) value = app. PowerOutputRatingEditField. Value; bitmək

Dəyər dəyişən funksiya: EnergyEfficiencyRatingEditField

funksiyası EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; bitmək

Button funksiyası itələdi: RunDiagnosticButton

funksiyası RunDiagnosticButtonPushed (app, event) way = app. TemperatureDirectionSwitch. Value; yol = uint8 (yol) yol = uzunluq (yol) əgər yol == 4 Chng_dir = -1; başqa Chng_dir = 1; son T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

bitmək

Dəyişdirilən funksiya: Temperatur1Spinner

funksiyası Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; bitmək

Dəyişdirilən funksiya: Temperature2Spinner

funksiyası Temperature2SpinnerValueChanged (tətbiq, hadisə) dəyəri = app. Temperature2Spinner. Value; bitmək

Dəyişdirilən funksiya: keçid

SwitchValueChanged funksiyası (tətbiq, hadisə) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; sürət = m Sürət; kütlə = 200; sürət = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, sürət, kütlə) son ucu

App başlatma və tikinti

metodlar (Access = özəl)

UIFigure və komponentləri yaradın

createComponents funksiyası (tətbiq)

UIFigure yaradın

app. UIFigure = uifigure; app. UIFigure. Mövqe = [100 100 640 480]; app. UIFigure. Name = 'UI Şəkil';

TabGroup yaradın

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

SetupTab yaradın

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Quraşdırma';

RunDiagnosticButton yaradın

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, doğru); app. RunDiagnosticButton. FontWeight = 'qalın'; app. RunDiagnosticButton. Mövqe = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Diaqnostikanı Çalışdır';

EnergyEfficiencyRatingEditFieldLabel yaradın

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'sağ'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Enerji səmərəliliyi reytinqi';

EnergyEfficiencyRatingEditField yaradın

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'rəqəmsal'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, doğru); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'mərkəzi'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

PowerOutputRatingEditFieldLabel yaradın

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

PowerOutputRatingEditField yaradın

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'rəqəmsal'); app. PowerOutputRatingEditField. Limits = [0 Məlumat]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, doğru); app. PowerOutputRatingEditField. HorizontalAlignment = 'mərkəzi'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

AvgLocalSpeedEditFieldLabel yaradın

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'sağ'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Ort. Yerli Sürət ';

AvgLocalSpeedEditField yaradın

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'rəqəmsal'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, doğru); app. AvgLocalSpeedEditField. HorizontalAlignment = 'mərkəzi'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

DesireDistancefromHouseEditFieldLabel yaradın

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'sağ'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'İstədiyiniz məsafə'; 'Evdən'};

DDFH yaradın

app. DDFH = uieditfield (app. SetupTab, 'rəqəmsal'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (tətbiq, @DDFHValueChanged, doğru); app. DDFH. HorizontalAlignment = 'mərkəzi'; app. DDFH. Mövqe = [139 135 100 22];

TemperatureDirectionSwitchLabel yaradın

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'mərkəzi'; app. TemperatureDirectionSwitchLabel. Mövqe = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Temperatur istiqaməti';

TemperatureDirectionSwitch yaradın

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'kaydırıcı'); app. TemperatureDirectionSwitch. Items = {'Yuxarı', 'Aşağı'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, doğru); app. TemperatureDirectionSwitch. Mövqe = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Yuxarıda';

TempSettingsTab yaradın

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

Temperatur1SpinnerLabel yaradın

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'mərkəzi'; app. Temperature1SpinnerLabel. Mövqe = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Temperatur'; '#1'};

Temperatur1Spinner yaradın

app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (tətbiq, @Temperature1SpinnerValueChanged, doğru); app. Temperature1Spinner. Pozisiya = [157 346 100 68]; app. Temperature1Spinner. Value = 60;

Temperature2SpinnerLabel yaradın

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'mərkəzi'; app. Temperature2SpinnerLabel. Mövqe = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperatur'; '#2'};

Temperature2Spinner yaradın

app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (tətbiq, @Temperature2SpinnerValueChanged, doğru); app. Temperature2Spinner. Pozisiya = [157 230 100 70]; app. Temperature2Spinner. Value = 60;

Keçid yaradın

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

EditFieldLabel yaradın

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

Müvəqqəti məlumat yaradın

app.tempnow = uieditfield (app. TempSettingsTab, 'rəqəmsal'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (tətbiq, @tempnowValueChanged, doğru); app.tempnow. HorizontalAlignment = 'mərkəzi'; app.tempnow. FontSize = 26; app.tempnow. Mövqe = [409 230 133 117]; app.tempnow. Value = 60;

GaugeLabel yaradın

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'mərkəzi'; app. GaugeLabel. Mövqe = [225 32 42 22]; app. GaugeLabel. Text = 'Ölçer';

Göstərici yaradın

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

SavingsTab yaradın

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Əmanət';

UIAxes yaradın

app. UIAxes = uiaxes (app. SavingsTab); başlıq (app. UIAxes, 'Əmanətlər') xlabel (app. UIAxes, 'Ay və İl') ylabel (app. UIAxes, 'Pul') app. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.6066666666666667] app. UIAxes. Color = [0.9412 0.9412 0.9412]; app. UIAxes. Mövqe = [146 219 348 237];

ThisMonthCostEditFieldLabel yaradın

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'mərkəzi'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Bu Ayın Xərcləri';

ThisMonthCostEditField yaradın

app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'rəqəmsal'); app. ThisMonthCostEditField. Limits = [0 Məlumat]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'mərkəzi'; app. ThisMonthCostEditField. Position = [417 39 137 58];

TotalSavingsEditFieldLabel yaradın

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'sağ'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Ümumi qənaət';

TotalSavingsEditField yaradın

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'rəqəmsal'); app. TotalSavingsEditField. Limits = [0 Məlumat]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'mərkəzi'; app. TotalSavingsEditField. Position = [88 39 137 58]; sonu son

metodlar (Access = public)

Tətbiq qurun

funksiya app = Control_1

Komponentləri yaradın və konfiqurasiya edin

createComponents (tətbiq)

App Designer ilə app Qeydiyyat

registerApp (app, app. UIFigure)

nargout varsa == 0

tətbiqin sonunu aydınlaşdırın

Tətbiq silmədən əvvəl icra olunan kod

funksiyanı silmək (tətbiq)

Tətbiq silindikdə UIFigure silin

silmək (app. UIFigure) sonu sonu

Çox güman ki, bir səhv alacaqsınız, bu da problem deyil. Qaçış düyməsini basdıqdan sonra yaradılan GUI -ni bağlayın, qalan proqramları və məlumatları bir anda toplayacağıq.

Matlab qurulduğundan pythona keçə bilərik. Birincisi, python proqramını ya əmr satırından (pəncərələrdə) və ya python qovluğunuzdakı.exe faylını istifadə edərək işlədin. İdxal əmrindən istifadə edərək bütün uyğun kitabxanaların quraşdırıldığından əmin olun.

idxal serialı

idxal vaxtı idxal csv

Başlamanız lazım olan üç kitabxana bunlardır, baxmayaraq ki, tezliklə öz kitabxanamızı hazırlayacağıq. Bu əmrlərdə bir növ səhv varsa, geri qayıdın və kitabxanaların python qovluğundakı Lib qovluğunda olduğuna əmin olun. Sonra pythonlogger kitabxanası adlandırdığım şeyi yaradacağıq. Bu ad lazım deyil, istədiyinizə zəng edə bilərsiniz, sadəcə yaratdığınız python faylının (.py) adıdır.

Bir mətn redaktoru açın, Sublime3 istifadə edirəm, lakin notepad yaxşı işləyir və bu kodu daxil edin.

def pythonprint ():

idxal pythonlogger serial idxal vaxtı idxal csv ser = serial. Serial ('COM8') # COM8, arduino serial portudur, bu hər bir istifadəçi üçün fərqli ola bilər, yəni arduino IDE ser.flushInput () -də serial portunuzu yoxlayın. Doğru: cəhd edin: ser_bytes = ser.readline () print (ser_bytes) with open ("test_data.csv", "a") as f: editor = csv.writer (f, delimiter = ",") # data ayarlar vergüllə ayrılmış yazar kimi yazılmalıdır.writerow ([time.time (), ser_bytes]) #data test_data.csv yazır, istisna olmaqla: print ("Error Occured") break

Mətni Lib qovluğunda "istədiyiniz kitabxananın adını daxil edin".py olaraq qeyd edin. Def pythonprint () xəttinin zəng edəcəyiniz funksiyanın adını təyin etdiyinə diqqət yetirin, buna görə onu "funksiyanız üçün istədiyiniz adı daxil edin" () olaraq dəyişə bilərsiniz. Kitabxana saxlanıldıqda arduino koduna keçə bilərik.

Arduino IDE -ni açın və iki yeni eskiz pəncərəsini açın. Bu iki eskiz sənədini əlverişli bir yerdə saxlayın, bu faylların adının heç bir əhəmiyyəti yoxdur. Sonra bütün standart kodu silin və aşağıdakılarla əvəz edin.

Qəbul edən arduino üçün:

#daxil edin

#include #include #include // bu istifadə edilmir, lakin RH_ASK sürücüsünü tərtib etmək üçün lazımdır; struktur dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // Ayarlama yalnız (! Driver.init ()) Serial.println ("init uğursuz oldu"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Bloklanmayan {int i; // Yaxşı bir yoxlama məbləği olan bir mesaj alın, atın. //driver.printBuffer("Aldım: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer …. etc xətti test kodudur. Diaqnoz qoymadığınız və həqiqətən məlumat aldığınızı anlamaq istəməyincə bu barədə narahat olmağa ehtiyac yoxdur.

Arduino ötürücü üçün

#daxil edin

#include #include #include // bu istifadə edilmir, ancaq #daxil etmək #intlud int pin = 4; DHT11 dht11 (pin); RH_ASK sürücüsü; struktur dataStruct {float temp; } myData; bayt tx_buf [sizeof (myData)] = {0}; // Deməli, arqumentlər bit sürəti, ötürücü pin (tx), // qəbul pin (rx), ppt pin, isInverse. Son 2 istifadə edilmir. Void setup () {Serial.begin (9600); // Ayarlama yalnız (! Driver.init ()) Serial.println ("init uğursuz oldu"); } void loop () {int err; float temp, humi; uint8_t msg; 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); sürücü.waitPacketSent (); // bütün məlumatlar gecikmə göndərilənə qədər icranı dayandırın (2000); // 2 saniyə gözləyin}}

Daxil etmək əmrləri kifayət qədər olmalıdır, ancaq sonradan məlumat ötürülməsi ilə bağlı hər hansı bir probleminiz varsa, RadioHead kitabxana qovluğuna baxmaq və fayl adlarının qalan hissəsini eyni formatda daxil etmək istəyə bilərsiniz.

Addım 5: Çalışdırın

İşlətmək
İşlətmək
İşlətmək
İşlətmək
İşlətmək
İşlətmək

İndi bütün kodları bir araya gətirdik və arduino yığdıqdan sonra arduinonu kompüterinizə bağlaya və kodu yükləyə bilərik. Doğru kodu qəbul edən və ötürən mikrokontrolörlərə göndərdiyinizə əmin olun. Bu işləyərkən hər iki arduino -nu kompüterinizə bağlaya bilərsiniz, ancaq doğru irəliləyən portu seçdiyinizə əmin olmalısınız, ya da ötürücü arduino -nu ayırıb başqa bir qaynaqdan istifadə edə bilərsiniz. yükləndi.

Bu barədə danışarkən, indi IDE alətlər menyusundan qəbuledici arduino ilə əlaqəli portu seçməlisiniz və python çalıştırmalısınız.

Bunu edərkən serial monitoru açmayın, monitor açıq ikən python serialı oxuya bilməz. Python açıldıqdan sonra pythonprint funksiyasını aşağıdakı kimi çağırın.

pythonlogger.pythonprint ()

Bu arduino serial portundan məlumat toplamağa başlayacaq. Python qovluğunuzu indi açarsanız, "test_data.csv" adlı yeni bir.csv faylının yaradıldığını görürsünüz ki, bu da bütün vaxt və temperatur məlumatlarını saxlayır. Bu, Matlabın bütün hesablamalarını və nəzarətlərini etmək üçün daxil olduğu fayl olacaq.

Başqa bir xəbərdarlıq: məlumatlara daxil olarkən və ya yazılarkən test_data.csv faylını açmayın. Bunu etsəniz, python və/və ya Matlab kodu çökəcək və səhv göndərəcək

. Csv faylını daha sonra açmağa qərar verərsəniz, zaman sütununun çox böyük bir rəqəmlər simli olduğunu görəcəksiniz. Bunun səbəbi, time.time () əmrinin 1 Yanvar 1970 -ci ildən bəri saniyə sayını yazmasıdır.

Bu nöqtədə python, serial portundan oxuduğu temperatur məlumatlarını çap etməlidir. Belə bir şeyə bənzəməlidir:

b'25.03 '/r/n

Əlavə simvollardan narahat olmayın,.csv faylının ikinci sütunundakı orta beş dəyər üçün Matlab kodu indeksləri.

İndi bütün dəstəkləyici proqramlar işləyir və məlumatlar toplanır, əvvəllər qurulmuş Matlab mobil proqramından GPS məlumatlarını toplamağa başlaya və Matlab GUI kodunu işlədə bilərik. Matlab mobil cihazının sensor sekmesine daxil olduqdan sonra GPS seçin və başlanğıc düyməsini vurun.

Matlab mobile -da yenisinizsə, 4 -cü addıma müraciət edin və yuxarıdakı ekran görüntülərinə baxın. Hələ də problemləriniz varsa, əvvəllər seçdiyiniz kompüterə qoşulduğunuzdan (parametrlər sekmesinde) əmin olun və Matlabın onlayn olduğunu yoxlamaq üçün "bağlayıcı aç" əmrindən istifadə edin.

Addım 6: Proqramdan istifadə

Proqramdan istifadə
Proqramdan istifadə

Bu sistemdə arxa planda bir çox şeylər gedir. Temperatur məlumatları arduino və pyton tərəfindən toplanır və daxil edilir, Matlab telefonunuzdan GPS məlumatları toplayır və evinizdən nə qədər uzaq olduğunuzu görmək üçün termostat quraraq bütün bu məlumatlara əsaslanaraq hesablamalar aparır. Girdiyiniz yer seçimlərinizi təmin edir.

Matlab GUI kodunu işə salın.. Mlapp faylını açın və ilk sekmeye baxın. Bunun üçün məlumatları özünüz toplamalısınız, qızdırıcı/soyuducu qurğunuzun səmərəliliyi və güc dərəcəsi ümumiyyətlə cihazın özündə tapıla bilər və orta sürətiniz nə qədər sürətli sürdüyünüzü yaxşı qiymətləndirir. Dəyərlər daxil edildikdən sonra "Diaqnostikanı Çalışdır" düyməsini basın və proqram eviniz haqqında məlumat toplamaq üçün termostatınızı idarə edir.

Növbəti menyuya keçin.

Addım 7: Temperatura Nəzarət

Temperatur Nəzarəti
Temperatur Nəzarəti

Bu menyu evdə və xaricdə istədiyiniz temperaturu seçməyə imkan verir. 1 nömrəli temperaturu rahat istiliyinizə və 2 nömrəli temperaturu eviniz üçün təhlükəsiz olan yüksək və ya aşağı bir dəyərə qoyun (evdə itləriniz olarkən 100 dərəcəyə qoymadığınızdan əmin olun).

Addım 8: Tarixi məlumatlar

Tarixi məlumatlar
Tarixi məlumatlar

Nəhayət, avtomatik idarəetmə vasitəsi ilə nə qədər qənaət etdiyinizi görə bilərsiniz. Bu, termostatınızın 24/7 istədiyiniz temperatura qurulduğu təqdirdə nə qədər enerjinin istifadə ediləcəyini təxmin edir, sonra istifadə etdiyiniz həqiqi enerjinizi çıxardır.

Bina uğurlar.

Tövsiyə: