Sisukord:

Autostat: kaugtermostaat: 8 sammu (piltidega)
Autostat: kaugtermostaat: 8 sammu (piltidega)

Video: Autostat: kaugtermostaat: 8 sammu (piltidega)

Video: Autostat: kaugtermostaat: 8 sammu (piltidega)
Video: Почему FEIN выбыл из гонки? 10 шуруповертов для гипсокартона в сравнительном тесте 2024, Juuli
Anonim
Autostaat: kaugtermostaat
Autostaat: kaugtermostaat

Tõenäoliselt küsite küsimust "miks te teete teist kaugtermostaati?"

Sellele küsimusele vastasin, et pidin ja turu nutikad termostaadid on liiga kallid.

Õiglane hoiatus, see on "kontseptsiooni tõestav" konstruktsioon, mis nõuaks termostaadi tegelikuks juhtimiseks mõningaid lisaväljundeid, kuid tuum on paigas ja seda saab sõltuvalt teie konkreetsest olukorrast muuta. Lisaks on see veel pooleli, nii et oodake mõningaid värskendusi ja muudatusi (eriti Matlabi koodis)

Alustuseks tahan teid hoiatada. Selleks on vaja kolme programmi (üks neist on üsna kallis), üsna palju raamatukogusid ja programmide tugipakette ning teil on vaja lasta neil kõigil omavahel rääkida. See on peavalu. Kui see hoiatus on eemal, saate materjalidega alustada.

Riistvara

  • arduino nano
  • arduino uno (või mõni muu nano, ma lihtsalt kasutasin uno -d, kuna mul oli üks ümberringi)
  • assortii džemprikaablid, mõned isased/isased ja kaks komplekti kolmest ühendatud mees/naissoost džemprist
  • 433MHz raadiosagedusliku (RF) vastuvõtja, kasutasin MX-05V
  • 433MHz raadiosaatja, kasutasin MX-FS-03V
  • DHT11 ülitäpne termomeeter ja niiskusandur (see, mida ma kasutasin, on paigaldatud kolmeharulisele kiibile ja nõutavad takistid on juba paigaldatud)
  • leivalaud (kui te ei soovi seda kõike kokku joota)
  • GPS -iga telefon (antud juhul iPhone 8, kuid olen kasutanud ka Galaxy S8)
  • 3D -prinditud konteiner (pole tõesti vajalik, mis tahes konteiner töötab või üldse mitte)

Tarkvara

  • Matlab MathWorksist (mul on 2018a väljaanne, kuid olen kasutanud ka 2017a-b väljaandeid)
  • Matlab mobiiltelefon on teie telefoni installitud
  • arduino tugipakett Matlabile
  • iPhone'i anduripakett Matlabi jaoks
  • arduino IDE
  • RadioHeadi arduino IDE tugipaketid ja teegid
  • DHT11 raamatukogu arduino IDE jaoks
  • python 3.7 (veenduge, et installitud oleks püsiali teek või seeriaraamatukogu, mis see peaks olema versiooni 3.4 või uuema jaoks)

Samm: pange see kõik kokku

Kõike kokku panema
Kõike kokku panema
Kõike kokku panema
Kõike kokku panema
Kõike kokku panema
Kõike kokku panema

Kõigepealt soovitan teil teha mõned arduino õpetused, mis käsitlevad raadiosaatjaid, et veenduda, kas teie osad töötavad ja juhtmed on õiged. Näiteid on palju, koos koodiga (meie jaoks, kes ei tea C -st ja C ++ -st suurt midagi).

Arduino ja andurite kokkupanemiseks järgige allolevaid ühendusskeeme. Üks asi, mida arduinode ühendamisel meeles pidada, on see, et minu kasutatavad andmeportid pole nõutavad, kuid soovitatavad.

KUI otsustate oma kasutatavaid andmeporte muuta, peate lihtsalt oma koodis tihvtid määratlema. Isiklikult arvan, et arduino teekide poolt tuvastatud vaikeportide juurde on lihtsam jääda.

Ja lihtsalt, et oleks selge, nano ja uno on vahetatavad, kuid ma kasutasin nano projekti saatja poolel, et vähendada temperatuuri monitori suurust.

Kõrvalmärkus: roheline seade, mis hoiab nanot, on 3D -prinditud konteiner.

2. samm: vastuvõtja

Vastuvõtja
Vastuvõtja

3. samm: saatja

Saatja
Saatja

Samm: kood

Kui juhtmestik on lõpetatud, peate käivitama kõik programmid ja installima teegid (kui te pole seda veel teinud), siis eeldan, et teil on see olemas, peate käivitama Matlabi ja käivitama iPhone'i tugipaketi. Nii teie telefon kui ka Matlab peavad praegu olema samas WiFi -võrgus.

Kirjutage Matlabi käsuaknasse:

pistik sisse

See palub teil sisestada viiekohalise parooli, mida kasutate oma iPhone'iga ühenduse loomiseks. Veenduge, et mäletate parooli. Kui olete parooli sisestanud, kuvab Matlab teatud teavet, sealhulgas teie IP -aadressi. Kasutage seda järgmises etapis, mis tuleneb Matlab mobile'i abimenüü "Anduriga alustamine" juhistest.

  • Anduriandmete saatmiseks MathWorks Cloudi või arvutisse toimige järgmiselt.
  • Kui saadate anduri andmeid arvutisse ja kui see pole veel installitud, laadige alla ja installige MATLAB -is Apple iOS -i andurite MATLAB -i tugipakett.
  • Ühendage MATLAB Mobile seadete abil MathWorks Cloudi või arvutiga.
  • Looge MATLABis (arvutis) mobiledev objekt, näiteks: >> m = mobiledev
  • Valige üks või mitu andurit ja toksake Start.

Anduriandmete lokaalseks logimiseks oma seadmes toimige järgmiselt.

  • Valige ekraanil Andurid andurid, millelt soovite andmeid koguda.
  • Valige Logi.
  • Puudutage nuppu Start.
  • Kui olete andmete kogumise lõpetanud, puudutage nuppu Stop.
  • Sisestage hüpikaknas andurilogi nimi.
  • Vajadusel korrake samme 1-5.

Sellele jaole viidatakse tagasi 4. osas, seega pole vaja veel andmete kogumist alustada. Lihtsalt hoidke oma telefoni käepärast ja Matlabi mobiilivalmis.

Nüüd peate kusagil oma arvutis looma kausta Matlabi koodifailide majutamiseks. Teil on neli eraldi faili, kaks taustafunktsioonide jaoks (.m -failid) ja üks Matlabi koodifail graafilise kasutajaliidese jaoks (.mlapp).

Esiteks on teie maja õhu massiarvutus (see annab Matlabile teada, kui kaua kulub teie maja soojendamiseks/jahutamiseks)

function [Mass] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = kell; time_end = 0 runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; muidu PwrCntr = P_out; runCalc = runCalc+0,1 lõpuaeg_diag = time_end-time_start Mass = (P_out*time_diag)/7.035

Ja teine:

funktsioon [ajatemplid, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; i = 1; samas AutoStat == 1 time_start = kell; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); ajatemplid = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; formaat longg; %hasrsine'i valem kauguse arvutamiseks laiuskraadi ja %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m.laiuskraad).*(sind ((m.pikkuskraadid)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %hindab teie aega tagastamiseks time_rtn = (Dist-r_pref)./ speed; %arvutab vajaliku termostaadi seadistuse, lähtudes %kliimaseadme ja kodu õhumassi voolukatkestusest. calcTmp_set = ((-1.*P_out.*time_rtn)./ (mass.*(1.005)))+T_pref; %määrab, kas praegust termostaadi seadistust tuleb muuta, kui ümmargune (calcTmp_set) ~ = ümmargune (t) timeACon = kell; PwrCntr = P_out; timeACon = timeACon + clock-time_start; maksumus = P_out*timeACon*määr; else PwrCntr = 0 lõpuaja templid (lõpp+1, [1: 6]) = kell; pwr_usage (lõpp+1, 1) = PwrCntr; paus (5) lõpp

Mõlemad failid on Matlabi funktsioonid. Te ei pea neile juurde pääsema, kui te ei plaani neid konkreetsete vajaduste jaoks muuta, kuna helistate neile GUI -st. Salvestage mõlemad failid eraldi, esimene kui CalcMass.m ja teine dist_cntrl.m, need on nimed, mida GUI -kood kasutab funktsioonide kutsumiseks, nii et kui te ei soovi ülejäänud koodi muuta, järgige nimetamise konventsioon.

Enne GUI -koodi sisenemist peate avama Matlabi rakenduste kujundaja, mille saate avada Matlabi menüüribal navigeerides või minu lemmikmeetodi abil, mis sisestab Matlabi käsuaknas järgmise käsu:

appdesigner

Kui rakenduse disainer on avatud, avage uus rakendusefail (.mlapp) ja kustutage koodiaknast kogu vaikekood. Seejärel asendage see kõik järgnevaga ja vajutage käivitusnuppu.

classdef Control_1 <matlab.apps. AppBase % Atribuudid, mis vastavad rakenduse komponentide omadustele (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Button EnergyEfficiencyRatingEditFieldLabel matlab.ui.control. Label EnergyEfficiencyRatingEditField matlab.ui.control. NumericEditField PowerOutputRatingEditFieldLabel matlab.ui.control. Label PowerOutputRatingEditField matlab.ui.control. NumericEditField AvgLocalSpeedEditFieldLabel matlab.ui.control. Label AvgLocalSpeedEditField matlab.ui.control. NumericEditField DesiredDistancefromHouseEditFieldLabel matlab.ui.control. Label DDFH matlab.ui.control. NumericEditField TemperatureDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.ui.container. Tab Temperature1SpinnerLabel matlabLabel matlab.lab. 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. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLield. Laber matlab.lab.

meetodid (juurdepääs = privaatne)

% Väärtuse muudetud funktsioon: tempnow

funktsioon tempnowValueChanged (rakendus, sündmus) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 i = pikkus (temp) app. Gauge. Value = temp (i) paus (1) lõpp

% Väärtuse muudetud funktsioon: TemperatureDirectionSwitch

funktsioon TemperatureDirectionSwitchValueChanged (rakendus, sündmus) way = app. TemperatureDirectionSwitch. Value; tee = uint8 (viis) viis = pikkus (viis), kui tee == 4 Chng_dir = -1; muidu Chng_dir = 1; lõpp Chng_dir; lõpp

% Väärtuse muudetud funktsioon: DDFH

funktsioon DDFHValueChanged (rakendus, sündmus) r_pref = app. DDFH. Value; lõpp

% Väärtuse muudetud funktsioon: AvgLocalSpeedEditField

funktsioon AvgLocalSpeedEditFieldValueChanged (rakendus, sündmus) kiirus = app. AvgLocalSpeedEditField. Value; lõpp

% Väärtuse muudetud funktsioon: PowerOutputRatingEditField

funktsioon PowerOutputRatingEditFieldValueChanged (rakendus, sündmus) väärtus = app. PowerOutputRatingEditField. Value; lõpp

% Väärtuse muudetud funktsioon: EnergyEfficiencyRatingEditField

funktsioon EnergyEfficiencyRatingEditFieldValueChanged (rakendus, sündmus) väärtus = app. EnergyEfficiencyRatingEditField. Value; lõpp

% Nupu vajutamise funktsioon: RunDiagnosticButton

funktsioon RunDiagnosticButtonPushed (rakendus, sündmus) way = app. TemperatureDirectionSwitch. Value; tee = uint8 (viis) viis = pikkus (viis), kui tee == 4 Chng_dir = -1; muidu Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

lõpp

% Väärtuse muudetud funktsioon: Temperature1Spinner

funktsioon Temperature1SpinnerValueChanged (rakendus, sündmus) väärtus = app. Temperature1Spinner. Value; lõpp

% Väärtuse muudetud funktsioon: Temperature2Spinner

funktsioon Temperature2SpinnerValueChanged (rakendus, sündmus) väärtus = app. Temperature2Spinner. Value; lõpp

% Väärtuse muutmise funktsioon: lüliti

funktsioon SwitchValueChanged (rakendus, sündmus) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; kiirus = m. Kiirus; mass = 200; kiirus = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) lõpp

% Rakenduse initsialiseerimine ja ehitamine

meetodid (juurdepääs = privaatne)

% UIFigure'i ja komponentide loomine

function createComponents (rakendus)

% Loo UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Kasutajaliidese joonis';

% Loo TabGroup

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

% Loo SetupTab

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

% Loo RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (rakendus, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'paks'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Käivita diagnostika';

% Loo EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'õige'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energiatõhususe reiting';

% Loo EnergyEfficiencyRatingEditField

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

% Loo PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'õige'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Väljundvõimsuse hinnang';

% Loo PowerOutputRatingEditField

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

% Loo AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'õige'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Keskm. Kohalik kiirus”;

% Loo AvgLocalSpeedEditField

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

% Loo DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'õige'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Soovitud kaugus'; 'majast'};

% Loo DDFH

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

% Loo TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'keskus'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Temperatuuri suund';

% Loo TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'liugur'); app. TemperatureDirectionSwitch. Items = {'Üles', 'Alla'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (rakendus, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Üles';

% Loo TempSettingsTab

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

% Loo temperatuur1SpinnerLabel

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

% Loo Temperature1Spinner

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

% Loo Temperature2SpinnerLabel

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

% Loo Temperature2Spinner

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

% Loo lüliti

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

% Loo EditFieldLabel

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

% Loo tempnow

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

% Loo GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'keskus'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Mõõtur';

% Loo gabariit

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

% Loo SavingsTab

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Säästud';

% UIAxide loomine

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

% Loo seeMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'keskus'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Selle kuu kulu';

% Loo ThisMonthCostEditField

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

% Loo TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'õige'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Kokku kokkuhoid';

% Loo TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numbriline'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'keskus'; app. TotalSavingsEditField. Position = [88 39 137 58]; lõpp lõpp

meetodid (juurdepääs = avalik)

Rakenda rakendus %

funktsioon app = Control_1

% Komponentide loomine ja konfigureerimine

createComponents (rakendus)

% Registreerige rakendus App Designeris

registerApp (rakendus, rakendus. UIFigure)

kui nargout == 0

selge rakenduse lõpp

% Kood, mis käivitatakse enne rakenduse kustutamist

funktsiooni kustutamine (rakendus)

% Kustuta UIFigure, kui rakendus kustutatakse

kustuta (app. UIFigure) end end end

Tõenäoliselt saate vea, mis pole probleem. Sulgege lihtsalt pärast käivitamise vajutamist loodud GUI, kogume hetkega ülejäänud vajalikud programmid ja andmed.

Kuna Matlab on loodud, saame edasi liikuda pythoniga. Esiteks käivitage programm python kas käsurealt (Windowsis) või kasutades python -kaustas olevat.exe -faili. Veenduge, et kõik sobivad teegid on installitud, kasutades käsku import.

impordi seeria

impordi aeg import csv

Need on kolm raamatukogu, mida peate alustama, kuigi varsti teeme oma raamatukogu. Kui nende käskudega oli mingisugune viga, minge tagasi ja veenduge, et teegid on installitud ja asuvad python -kausta Lib -kaustas. Järgmisena genereerime nn pythonloggeri raamatukogu. See nimi pole vajalik, võite seda nimetada kuidas iganes soovite, see on lihtsalt teie loodud pythoni faili (.py) nimi.

Avage tekstiredaktor, ma kasutan Sublime3, kuid märkmik töötab suurepäraselt ja sisestage see kood.

def pythonprint ():

import pythonlogger impordi jadaimportimise aeg import csv ser = serial. Serial ('COM8') # COM8 on arduino jadaport, see on tõenäoliselt iga kasutaja puhul erinev, st kontrolli oma jadaporti arduino IDE ser.flushInput () Tõsi: proovige: ser_bytes = ser.readline () print (ser_bytes) avatud ("test_data.csv", "a") kui f: kirjanik = csv.writer (f, eraldaja = ",") # määrab andmed sisestatakse komaga eraldatud kirjutajana.kirjutaja ([time.time (), ser_bytes]) #kirjutab andmed test_data.csv, välja arvatud: print ("Tõrge ilmnes") break

Salvestage tekst kausta Lib kaustaga "sisestage soovitud kogu nimi".py. Pange tähele ka seda, et rida def pythonprint () määratleb selle funktsiooni nime, millele te helistate, nii et saate selle muuta, et määrata "sisestage oma funktsioonile soovitud nimi" (). Kui kogu on salvestatud, saame liikuda arduino koodi juurde.

Avage arduino IDE ja avage kaks uut visandiakent. Salvestage need kaks visandifaili mugavasse kohta, nende failide nimi pole oluline. Seejärel kustutage kogu vaikekood ja asendage see järgmisega.

Vastuvõtva arduino jaoks:

#kaasake

#include #include #include // seda ei kasutata, kuid seda on vaja draiveri RH_ASK kompileerimiseks; structure dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // Silumine ainult siis, kui (! Driver.init ()) Serial.println ("init ebaõnnestus"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Mitteblokeeriv {int i; // Hea kontrollsummaga sõnum on kätte saadud. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. jne rida on testkood. Pole vaja selle pärast muretseda, kui te ei tee diagnoosi ja soovite aru saada, kas te tegelikult andmeid saate.

Saatja arduino jaoks

#kaasake

#include #include #include // seda ei kasutata, kuid on vaja koostada #include #include int pin = 4; DHT11 dht11 (tihvt); RH_ASK juht; structure dataStruct {float temp; } myData; bait tx_buf [sizeof (myData)] = {0}; // Seega on argumendid bitikiirus, edastuspin (tx), // vastuvõtunipp (rx), ppt pin, isInverse. Viimaseid 2 ei kasutata.void setup () {Serial.begin (9600); // Silumine ainult siis, kui (! Driver.init ()) Serial.println ("init ebaõnnestus"); } void loop () {int err; ujuk temp, humi; uint8_t sõnum; if ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf ja & myData, sizeof (myData)); bait zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // peatada täitmine, kuni kõik andmed on saadetud viivitus (2000); // oota 2 sekundit}}

Kaasamise käskudest peaks piisama, kuid kui teil tekib hiljem andmeedastusega probleeme, võiksite vaadata RadioHeadi raamatukogu kausta ja lisada ülejäänud failinimed samas vormingus.

Samm 5: Pange see tööle

Töötamine
Töötamine
Töötamine
Töötamine
Töötamine
Töötamine

Nüüd, kui meil on kogu kood koos ja arduino kokku pandud, saame arduino teie arvutiga ühendada ja koodi laadida. Veenduge, et saadate vastuvõtvale ja edastavale mikrokontrollerile õige koodi. Mõlemad arduinosid saab selle töötamise ajal arvutiga ühendada, kuid peate veenduma, et edasi on valitud õige port, või saate edastava arduino lahti ühendada ja pärast koodi sisestamist mõne muu allika toiteallikaks ühendada. üles laaditud.

Sellest rääkides peaksite nüüd IDE tööriistade menüüst valima pordi, mis on ühendatud teie vastuvõtva arduinoga, ja käivitage python.

Ärge avage seeriamonitori, kui seda teete, python ei saa seeriat lugeda, kui monitor on avatud. Kui python on avatud, helistage pythonprint -funktsioonile järgmiselt.

pythonlogger.pythonprint ()

See alustab andmete kogumist arduino jadaportist. Kui avate oma pythoni kausta nüüd, näete, et on loodud uus.csv -fail nimega "test_data.csv", mis sisaldab kogu aja- ja temperatuuriteavet. See on fail, millele Matlab pääseb juurde, et teha kõik arvutused ja juhtelemendid.

Veel üks hoiatus: ärge avage test_data.csv, kui andmetele juurde pääseb või neid kirjutatakse. Kui te seda teete, jookseb python ja/või Matlabi kood kokku ning saadab tõrke tagasi

Kui otsustate.csv hiljem avada, märkate, et ajaveerg on lihtsalt väga suur numbrite jada. Seda seetõttu, et käsk time.time () kirjutab sekundite arvu alates 1. jaanuarist 1970.

Siinkohal peaks python printima temperatuuriandmeid, mida see jadaportist loeb. See peaks välja nägema umbes selline:

b'25.03 '/r/n

Ärge muretsege lisamärkide pärast. Matlabi kood indekseerib.csv -faili teise veeru keskmise viie väärtuse kohta.

Nüüd, kui kõik toetavad programmid töötavad ja andmeid kogutakse, saame hakata GPS -andmeid koguma varem seadistatud Matlabi mobiiliprogrammist ja käivitada Matlabi GUI -koodi. Kui olete Matlab mobile andurite vahekaardil, valige GPS ja vajutage nuppu Start.

Kui olete Matlabi mobiiltelefoni uus kasutaja, vaadake tagasi sammu 4 ja vaadake ülaltoodud ekraanipilte. Kui teil on endiselt probleeme, veenduge, et olete varem valitud arvutiga (seadete vahekaardil) ühendatud ja kasutage käsu "konnektor sisse lülitatud" linki, et kontrollida, kas Matlab on võrgus.

6. samm: programmi kasutamine

Programmi kasutamine
Programmi kasutamine

Selle süsteemi taustal toimub mitu asja. Temperatuuriandmeid koguvad ja logivad arduino ja pyton, Matlab kogub teie telefonist GPS -andmeid ja teeb arvutusi, et näha, kui kaugel te oma kodust olete, ja seadistab kogu selle teabe põhjal oma termostaadi. See, kuhu sisenete, on teie eelistuste esitamine.

Käivitage Matlabi GUI -kood. Avage.mlapp -fail ja vaadake esimest vahekaarti. Peate selle teabe ise koguma, kütte-/jahutusseadme efektiivsuse ja võimsuse reitingu leiate tavaliselt seadmest endast ning teie keskmine kiirus on vaid hea hinnang selle kohta, kui kiiresti sõidate. Kui väärtused on sisestatud, klõpsake nuppu "Käivita diagnostika" ja programm kontrollib teie termostaati, et koguda teavet teie maja kohta.

Liikuge järgmise menüü juurde.

Samm: temperatuuri reguleerimine

Temperatuuri reguleerimine
Temperatuuri reguleerimine

See menüü võimaldab valida kodus ja väljas viibides soovitud temperatuuri. Seadke temperatuur nr 1 oma mugavale temperatuurile ja temperatuur nr 2 kõrgele või madalale väärtusele, mis on teie kodu jaoks ohutu (veenduge, et te ei seadistaks seda 100 kraadini, kui teil on kodus koerad jne).

8. samm: ajaloolised andmed

Ajaloolised andmed
Ajaloolised andmed

Lõpuks saate automaatjuhtimise abil vaadata, kui palju raha säästate. See sisuliselt hindab, kui palju energiat kuluks, kui teie termostaat oleks seatud 24/7 teie eelistatud temperatuurile, ja lahutab siis teie tegeliku kasutatud energia.

Edu ehitamiseks.

Soovitan: