Turinys:

Autostatas: nuotolinis termostatas: 8 žingsniai (su nuotraukomis)
Autostatas: nuotolinis termostatas: 8 žingsniai (su nuotraukomis)

Video: Autostatas: nuotolinis termostatas: 8 žingsniai (su nuotraukomis)

Video: Autostatas: nuotolinis termostatas: 8 žingsniai (su nuotraukomis)
Video: АВТОСТАТ Оперативка. Оперативная информация по авторынку России. Итоги декабря 2023 г. 2024, Lapkritis
Anonim
Autostatas: nuotolinis termostatas
Autostatas: nuotolinis termostatas

Tikriausiai užduosite klausimą „kodėl gaminate kitą nuotolinį termostatą?

Aš turėjau atsakyti į šį klausimą, o rinkoje esantys išmanieji termostatai yra per brangūs.

Sąžiningas įspėjimas, tai yra „koncepcijos įrodymas“, kuriam reikės kelių papildomų išėjimų, kad būtų galima valdyti jūsų termostatą, tačiau šerdis yra vietoje ir gali būti pakeista priklausomai nuo jūsų konkrečių aplinkybių. Be to, tai vis dar nebaigtas darbas, todėl tikėkitės kelių atnaujinimų ir pakeitimų (ypač „Matlab“kodo)

Norėdami pradėti, noriu jus įspėti, tam reikia trijų programų (viena iš jų yra gana brangi), nemažai bibliotekų ir programų palaikymo paketų, ir jums reikia, kad jie visi kalbėtų vienas su kitu. Tai galvos skausmas. Su tokiu įspėjimu galite pradėti dirbti su medžiagomis.

Techninė įranga

  • arduino nano
  • arduino uno (arba kitas nano, aš tiesiog naudojau uno, nes turėjau vieną)
  • įvairių jungiamųjų kabelių, kai kurie vyriški/vyriški ir du komplektai iš trijų sujungtų vyrų/moterų džemperių
  • 433MHz radijo dažnio (RF) imtuvas, naudojau MX-05V
  • 433MHz RF siųstuvas, naudojau MX-FS-03V
  • DHT11 didelio tikslumo termometras ir drėgmės jutiklis (tas, kurį naudojau, yra sumontuotas ant trijų šakų lusto, kuriame jau yra sumontuoti reikalingi rezistoriai)
  • duonos lenta (jei nenorite to lituoti kartu)
  • telefonas su GPS (šiuo atveju „iPhone 8“, bet aš taip pat naudoju „Galaxy S8“)
  • 3D spausdintas konteineris (tikrai nebūtinas, bet koks konteineris veiks arba visai neveiks)

Programinė įranga

  • „Matlab“iš „MathWorks“(turiu 2018a leidimą, bet naudoju ir 2017a-b leidimus)
  • Jūsų telefone įdiegta „Matlab mobile“
  • arduino palaikymo paketas „Matlab“
  • „iPhone“jutiklių paketas, skirtas „Matlab“
  • arduino IDE
  • „RadioHead“palaikymo paketai ir „arduino IDE“bibliotekos
  • DHT11 biblioteka, skirta „arduino IDE“
  • python 3.7 (įsitikinkite, kad įdiegta nuolatinė biblioteka arba serijinė biblioteka, kuri turėtų būti 3.4 ar naujesnės versijos)

1 žingsnis: surinkite viską kartu

Viską sujungti
Viską sujungti
Viską sujungti
Viską sujungti
Viską sujungti
Viską sujungti

Pirmiausia siūlau jums atlikti keletą „arduino“pamokų, susijusių su RF siųstuvais, kad įsitikintumėte, jog jūsų dalys veikia ir laidai yra teisingi. Yra daug pavyzdžių, įskaitant kodą (tiems iš mūsų, kurie mažai arba nieko nežino apie C ir C ++).

Norėdami surinkti arduino ir jutiklius, vadovaukitės žemiau pateiktomis prijungimo schemomis. Prijungiant arduinos reikia nepamiršti vieno dalyko - mano naudojami duomenų prievadai nėra būtini, bet rekomenduojami.

Jei nuspręsite pakeisti naudojamus duomenų prievadus, jums tereikia apibrėžti smeigtukus savo kode. Asmeniškai manau, kad lengviau laikytis numatytųjų prievadų, kuriuos atpažįsta arduino bibliotekos.

Kad būtų aišku, nano ir uno yra keičiami, tačiau aš panaudojau nano projekto siųstuvo pusei, kad sumažintų temperatūros monitoriaus dydį.

Šoninė pastaba: žalias prietaisas, turintis nano, yra 3D spausdintas konteineris.

2 žingsnis: imtuvas

Imtuvas
Imtuvas

3 žingsnis: siųstuvas

Siųstuvas
Siųstuvas

4 žingsnis: Kodas

Kai laidai bus baigti, turite paleisti visas programas ir įdiegti bibliotekas (jei to dar nepadarėte), manau, kad turite, turite paleisti „Matlab“ir paleisti „iPhone“palaikymo paketą. Tiek jūsų telefonas, tiek „Matlab“šiuo metu turi būti tame pačiame „Wi -Fi“tinkle.

„Matlab“komandų lange parašykite:

jungtis įjungta

Tai paragins įvesti penkių skaitmenų slaptažodį, kurį naudosite prisijungdami prie „iPhone“. Įsitikinkite, kad atsimenate slaptažodį. Kai įvesite slaptažodį, „Matlab“parodys tam tikrą informaciją, įskaitant jūsų IP adresą. Naudokite tai kitame veiksme, kuris pateikiamas iš „Matlab mobile“pagalbos meniu „Darbo su jutikliais“instrukcijų.

  • Norėdami siųsti jutiklio duomenis į „MathWorks Cloud“arba kompiuterį, atlikite šiuos veiksmus:
  • Jei siunčiate jutiklio duomenis į kompiuterį ir jei jis dar neįdiegtas, atsisiųskite ir įdiekite „MATLAB“palaikymo paketą „Apple iOS“jutikliams MATLAB.
  • Prijunkite „MATLAB Mobile“prie „MathWorks Cloud“arba kompiuterio naudodami nustatymus.
  • Sukurkite „mobiledev“objektą MATLAB (savo kompiuteryje), pavyzdžiui: >> m = mobiledev
  • Pasirinkite vieną ar daugiau jutiklių ir bakstelėkite Pradėti.

Norėdami lokaliai savo įrenginyje užregistruoti jutiklių duomenis, atlikite šiuos veiksmus:

  • Ekrane Jutikliai pasirinkite jutiklius, iš kurių norite rinkti duomenis.
  • Pasirinkite Žurnalas.
  • Bakstelėkite mygtuką Pradėti.
  • Baigę rinkti duomenis, bakstelėkite mygtuką Sustabdyti.
  • Iššokančiajame lange įveskite jutiklio žurnalo pavadinimą.
  • Jei reikia, pakartokite 1–5 veiksmus.

Šis skyrius bus nurodytas 4 dalyje, todėl dar nereikia pradėti rinkti duomenų. Tiesiog laikykite savo telefoną po ranka ir paruoškite „Matlab“mobiliesiems.

Dabar kažkur savo kompiuteryje turite sukurti aplanką, kuriame būtų „Matlab“kodo failai. Turėsite keturis atskirus failus, du fono funkcijoms (.m failai) ir vieną „Matlab“kodo failą GUI (.mlapp),.

Pirmasis yra jūsų namo oro masės apskaičiavimas (tai leidžia „Matlab“žinoti, kiek laiko reikia jūsų namui šildyti/vėsinti)

funkcija [masė] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = laikrodis; time_end = 0 while runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; kitaip PwrCntr = P_out; runCalc = runCalc+0,1 pabaigos pabaiga time_diag = time_end-time_start Mass = (P_out*time_diag)/7.035

Ir antras:

funkcija [laiko žymos, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; i = 1; o AutoStat == 1 time_start = laikrodis; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); laiko žymos = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; formatas longg; %hasrsine formulė atstumui apskaičiuoti pagal platumą ir %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m. platuma).*(sind ((m. Ilguma-Lon_in)./2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %įvertina jūsų laiką grįžti time_rtn = (Dist-r_pref)./ greitis; %apskaičiuoja reikiamą termostato nustatymą, atsižvelgdamas į %oro kondicionieriaus ir namų oro masės išjungimą. calcTmp_set = ((-1.*P_out.*time_rtn)./ (masė.*(1.005)))+T_pref; %nustato, ar reikia keisti dabartinį termostato nustatymą, jei apvalus (calcTmp_set) ~ = apvalus (t) timeACon = laikrodis; PwrCntr = P_out; timeACon = timeACon + clock-time_start; kaina = P_out*timeACon*norma; else PwrCntr = 0 pabaigos laiko žymų (pabaiga+1, [1: 6]) = laikrodis; pwr_usage (pabaiga+1, 1) = PwrCntr; pauzė (5) pabaiga pabaiga

Abu šie failai yra „Matlab“funkcijos. Jums nereikės prie jų prieiti, nebent planuojate juos keisti pagal konkrečius poreikius, nes skambinsite jiems iš GUI. Išsaugokite abu failus atskirai, pirmąjį kaip „CalcMass.m“, o antrąjį - kaip „dist_cntrl.m“, tai bus pavadinimai, kuriuos GUI kodas naudoja funkcijoms iškviesti, taigi, jei nenorite redaguoti likusio kodo žemiau, laikykitės pavadinimo konvencija.

Prieš pradėdami naudotis GUI kodu, turite atidaryti „Matlab“programų dizainerį, kurį galite atidaryti naršydami „Matlab“meniu juostoje arba naudodamiesi mano mėgstamiausiu metodu, kuris įveskite šią komandą „Matlab“komandų lange:

programuotojas

Atidarę programų dizainerį, atidarykite naują programos failą (.mlapp) ir ištrinkite visą numatytąjį kodą iš kodo lango. Tada pakeiskite visa tai ir paspauskite paleidimo mygtuką.

classdef Control_1 <matlab.apps. AppBase % Ypatybės, atitinkančios programos komponentų ypatybes (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. mygtukas 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 Temperatūra1SpinnerLabel mat. Labet. 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.lab.ield.lab.

metodai (prieiga = privatus)

% Vertė pakeista funkcija: tempnow

funkcija tempnowValueChanged (programa, įvykis) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0, kai i = ilgis (temp) app. Gauge. Value = temp (i) pause (1) end end

% Vertė pakeista funkcija: TemperatureDirectionSwitch

funkcija TemperatureDirectionSwitchValueChanged (programa, įvykis) way = app. TemperatureDirectionSwitch. Value; būdas = uint8 (būdas) būdas = ilgis (būdas), jei kelias == 4 Chng_dir = -1; kitaip Chng_dir = 1; pabaiga Chng_dir; galas

% Vertė pakeista funkcija: DDFH

funkcija DDFHValueChanged (programa, įvykis) r_pref = app. DDFH. Value; galas

% Reikšmės pakeista funkcija: AvgLocalSpeedEditField

funkcija AvgLocalSpeedEditFieldValueChanged (programa, įvykis) greitis = app. AvgLocalSpeedEditField. Value; galas

% Vertė pakeista funkcija: PowerOutputRatingEditField

funkcija PowerOutputRatingEditFieldValueChanged (programa, įvykis) vertė = app. PowerOutputRatingEditField. Value; galas

% Vertė pakeista funkcija: EnergyEfficiencyRatingEditField

funkcija EnergyEfficiencyRatingEditFieldValueChanged (programa, įvykis) vertė = app. EnergyEfficiencyRatingEditField. Value; galas

% Mygtuko paspaudimo funkcija: „RunDiagnosticButton“

funkcija RunDiagnosticButtonPushed (programa, įvykis) way = app. TemperatureDirectionSwitch. Value; būdas = uint8 (būdas) būdas = ilgis (būdas), jei kelias == 4 Chng_dir = -1; kitaip Chng_dir = 1; pabaiga T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

galas

% Vertė pakeista funkcija: Temperature1Spinner

funkcija Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; galas

% Vertė pakeista funkcija: Temperature2Spinner

funkcija Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; galas

% Vertė pakeista funkcija: jungiklis

funkcija SwitchValueChanged (programa, įvykis) m = mobiledev; Lat_in = m. Platuma Lon_in = m. Ilguma P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; greitis = m. Greitis; masė = 200; greitis = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) pabaiga

% Programos inicijavimas ir kūrimas

metodai (prieiga = privatus)

% Sukurkite UIFigure ir komponentus

funkcija createComponents (programa)

% Sukurkite UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'UI paveikslėlis';

% Sukurti skirtukų grupę

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

% Sukurti sąrankos skirtuką

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Sąranka';

% Sukurkite „RunDiagnosticButton“

app. RunDiagnosticButton = uibutton (app. SetupTab, 'stumti'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (programa, @RunDiagnosticButtonPushed, tiesa); app. RunDiagnosticButton. FontWeight = 'paryškinta'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Vykdyti diagnostiką';

% Sukurkite EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'teisinga'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energijos efektyvumo įvertinimas';

% Sukurkite EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numerinis'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (programa, @EnergyEfficiencyRatingEditFieldValueChanged, tiesa); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'centras'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% Sukurkite „PowerOutputRatingEditFieldLabel“

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'teisinga'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Galios išvesties įvertinimas';

% Sukurkite „PowerOutputRatingEditField“

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'skaitinis'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (programa, @PowerOutputRatingEditFieldValueChanged, tiesa); app. PowerOutputRatingEditField. HorizontalAlignment = 'centras'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Sukurkite „AvgLocalSpeedEditFieldLabel“

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'teisinga'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Vid. Vietinis greitis “;

% Sukurti „AvgLocalSpeedEditField“

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

% Sukurkite DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'teisinga'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Norimas atstumas'; 'iš namų'};

% Sukurti DDFH

app. DDFH = uieditfield (app. SetupTab, 'skaitinis'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (programa, @DDFHValueChanged, tiesa); app. DDFH. HorizontalAlignment = 'centras'; app. DDFH. Position = [139 135 100 22];

% Sukurkite TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'centras'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Temperatūros kryptis';

% Sukurti „TemperatureDirectionSwitch“

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'slankiklis'); app. TemperatureDirectionSwitch. Items = {'Aukštyn', 'Žemyn'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (programa, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Aukštyn';

% Sukurti TempSettingsTab

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

% Sukurkite Temperature1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'centras'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Temperatūra'; '#1'};

% Sukurkite „Temperature1Spinner“

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

% Sukurkite Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'centras'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperatūra'; '#2'};

% Sukurkite „Temperature2Spinner“

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

% Sukurti jungiklį

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

% Sukurkite EditFieldLabel

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

% Sukurti tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'skaitinis'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (programa, @tempnowValueChanged, tiesa); app.tempnow. HorizontalAlignment = 'centras'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% Sukurti „GaugeLabel“

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

% Sukurti matuoklį

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

% Sukurti taupymo skirtuką

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

% Sukurkite UIAx

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (app. UIAxes, 'Mėnuo ir metai') 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];

% Sukurkite „ThisMonthCostEditFieldLabel“

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'centras'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Šio mėnesio kaina';

% Sukurkite „ThisMonthCostEditField“

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

% Sukurkite „TotalSavingsEditFieldLabel“

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'teisinga'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Bendra santaupų suma';

% Sukurkite „TotalSavingsEditField“

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'skaitinis'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'centras'; app. TotalSavingsEditField. Position = [88 39 137 58]; pabaiga galas

metodai (prieiga = vieša)

% Konstruoti programą

funkcija app = Control_1

% Sukurkite ir sukonfigūruokite komponentus

createComponents (programa)

% Užregistruokite programą naudodami „App Designer“

registerApp (programa, programa. UIFigure)

jei nargoras == 0

išvalyti programos pabaigą

% Kodas, vykdomas prieš ištrinant programą

funkcija ištrinti (programa)

% Ištrinti UIFigure, kai programa ištrinama

ištrinti (app. UIFigure) pabaigos pabaigą

Tikriausiai gausite klaidą, kuri nėra problema. Tiesiog uždarykite GUI, sugeneruotą paspaudus „Vykdyti“, mes akimirksniu surinksime likusias reikalingas programas ir duomenis.

Kadangi „Matlab“yra sukurtas, galime pereiti prie „python“. Pirmiausia paleiskite „python“programą naudodami komandų eilutę („Windows“) arba naudodami.exe failą aplanke „python“. Įsitikinkite, kad visos tinkamos bibliotekos yra įdiegtos naudojant komandą importas.

importuoti serialą

importo laikas importuoti csv

Tai yra trys bibliotekos, kurias turėsite pradėti, nors netrukus sukursime savo biblioteką. Jei su šiomis komandomis įvyko klaida, grįžkite atgal ir įsitikinkite, kad bibliotekos yra įdiegtos ir yra aplanko „Lib“aplanke „python“. Toliau sukursime tai, ką aš pavadinau „pythonlogger“biblioteka. Šis vardas nebūtinas, jį galite vadinti kaip norite, tai tik jūsų sukurto „python“failo (.py) pavadinimas.

Atidarykite teksto rengyklę, naudoju „Sublime3“, bet užrašų knygelė veikia puikiai, ir įveskite šį kodą.

def pythonprint ():

importuoti pythonlogger importuoti serijinio importo laiką importuoti csv ser = serial. Serial ('COM8') # COM8 yra arduino nuoseklusis prievadas, tai tikriausiai bus skirtingas kiekvienam vartotojui, ty patikrinkite savo nuoseklųjį prievadą arduino IDE ser.flushInput (), kol Tiesa: pabandykite: ser_bytes = ser.readline () print (ser_bytes) su atidarytu ("test_data.csv", "a"), nes f: rašytojas = csv.writer (f, delimiter = ",") # nustato duomenis į būti įvestas kaip kableliais atskirtas rašytojas.writerow ([laikas.laikas (), ser_bytes]) #rašo duomenis į test_data.csv, išskyrus: print („Įvyko klaida“) pertrauka

Išsaugokite tekstą kaip „įterpkite norimos bibliotekos pavadinimą“.py aplanke „Lib“. Taip pat atkreipkite dėmesį, kad def pythonprint () eilutė apibrėžia funkcijos, kurią ketinate iškviesti, pavadinimą, todėl galite pakeisti tai į def "įterpti norimą savo funkcijos pavadinimą" (). Kai biblioteka išsaugoma, galime pereiti prie arduino kodo.

Atidarykite arduino IDE ir atidarykite du naujus eskizų langus. Išsaugokite tuos du eskizų failus patogioje vietoje, šių failų pavadinimas nesvarbus. Tada ištrinkite visą numatytąjį kodą ir pakeiskite jį taip.

Priimančiam arduino:

#įtraukti

#include #include #include // tai nenaudojama, bet reikalinga norint sudaryti RH_ASK tvarkyklę; structure dataStruct {plūdės temp; } myData; void setup () {Serial.begin (9600); // Derinimas tik jei (! Driver.init ()) Serial.println ("init nepavyko"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Neblokuojantis {int i; // Gautas pranešimas su gera kontroline suma, išmeskite. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer ……. ir tt eilutė yra bandymo kodas. Nereikia dėl to jaudintis, nebent atliekate diagnostiką ir norite išsiaiškinti, ar iš tikrųjų gaunate duomenis.

Siųstuvui arduino

#įtraukti

#include #include #include // tai nenaudojama, bet reikalinga kompiliuoti #include #include int pin = 4; DHT11 dht11 (kaištis); RH_ASK vairuotojas; structure dataStruct {plūdės temp; } myData; baitas tx_buf [sizeof (mano duomenys)] = {0}; // Taigi argumentai yra pralaidumas, perduoda PIN (tx), // gauna PIN (rx), ppt PIN, isInverse. Paskutiniai 2 nenaudojami. Void setup () {Serial.begin (9600); // Derinimas tik jei (! Driver.init ()) Serial.println ("init nepavyko"); } void loop () {int err; plūdės temperatūra, humi; žinutė uint8_t; if ((klaida = dht11. skaitymas (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); baitas zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // sustabdyti vykdymą, kol bus išsiųsti visi duomenys delsa (2000); // palaukite 2 sekundes}}

Įtraukimo komandų turėtų pakakti, tačiau jei vėliau kyla problemų dėl duomenų perdavimo, galbūt norėsite ieškoti „RadioHead“bibliotekos aplanke ir įtraukti to paties formato likusius failų pavadinimus.

5 žingsnis: priverskite jį veikti

Kad tai veiktų
Kad tai veiktų
Kad tai veiktų
Kad tai veiktų
Kad tai veiktų
Kad tai veiktų

Dabar, kai turime visą kodą ir arduino yra surinktas, galime prijungti arduino prie jūsų kompiuterio ir įkelti kodą. Įsitikinkite, kad priimančiam ir siunčiamam mikrovaldikliui siunčiate teisingą kodą. Abu kompiuteriai gali būti prijungti prie kompiuterio, kol jis veikia, tačiau turėsite įsitikinti, kad pasirinktas teisingas prievadas, arba galite atjungti perduodantįjį arduino ir įjungti jį iš kito šaltinio, kai kodas bus įkeltas.

Kalbant apie tai, dabar iš IDE įrankių meniu turėtumėte pasirinkti prievadą, prijungtą prie jūsų gaunančio arduino, ir paleisti „python“.

Neatidarykite serijinio monitoriaus, kol tai darote, „python“negali skaityti serijos, kai monitorius yra atidarytas. Kai python yra atidarytas, iškvieskite pythonprint funkciją taip.

pythonlogger.pythonprint ()

Tai pradės rinkti duomenis iš arduino nuoseklaus prievado. Jei dabar atidarysite savo „python“aplanką, pamatysite, kad buvo sukurtas naujas.csv failas „test_data.csv“, kuriame yra visa laiko ir temperatūros informacija. Tai bus failas, kurį pasiekia „Matlab“, kad atliktų visus skaičiavimus ir valdymus.

Kitas įspėjimas: neatidarykite test_data.csv, kol duomenys pasiekiami ar rašomi. Jei tai padarysite, „python“ir (arba) „Matlab“kodas suges ir grąžins klaidą

Jei nuspręsite vėliau atidaryti.csv, pastebėsite, kad laiko stulpelis yra tik labai didelė skaičių seka. Taip yra todėl, kad komanda time.time () užrašo sekundžių skaičių nuo 1970 m. Sausio 1 d.

Šiuo metu „python“turėtų spausdinti temperatūros duomenis, kuriuos skaito iš nuoseklaus prievado. Tai turėtų atrodyti maždaug taip:

b'25.03 '/r/n

Nesijaudinkite dėl papildomų simbolių, „Matlab“kodas indeksuoja penkias vidurines reikšmes, esančias antrame.csv failo stulpelyje.

Dabar, kai visos palaikančios programos veikia ir duomenys renkami, galime pradėti rinkti GPS duomenis iš anksčiau nustatytos „Matlab“mobiliosios programos ir paleisti „Matlab“GUI kodą. Kai būsite „Matlab mobile“jutiklių skirtuke, pasirinkite GPS ir paspauskite pradžios mygtuką.

Jei esate naujas „Matlab mobile“naudotojas, grįžkite prie 4 veiksmo ir peržiūrėkite aukščiau pateiktas ekrano kopijas. Jei vis tiek kyla problemų, įsitikinkite, kad esate prisijungę prie kompiuterio, kurį pasirinkote anksčiau (nustatymų skirtuke), ir naudokite nuorodą iš „jungties įjungimo“komandos, kad patikrintumėte, ar „Matlab“yra prisijungęs.

6 veiksmas: programos naudojimas

Programos naudojimas
Programos naudojimas

Šios sistemos fone vyksta daugybė dalykų. Temperatūros duomenis renka ir registruoja „arduino“ir „pyton“, „Matlab“renka GPS duomenis iš jūsų telefono ir atlieka skaičiavimus, kad pamatytų, kiek toli esate nuo jūsų namų, ir nustato visą termostatą, remdamasis visa šia informacija. Kur atvykstate, pateikia savo pageidavimus.

Paleiskite „Matlab“GUI kodą. Atidarykite.mlapp failą ir peržiūrėkite pirmąjį skirtuką. Norėdami tai padaryti, turėsite patys surinkti informaciją, jūsų šildymo/aušinimo įrenginio efektyvumą ir galią paprastai galima rasti pačiame įrenginyje, o jūsų vidutinis greitis yra tik geras jūsų greičio įvertinimas. Įvedę reikšmes, paspauskite mygtuką „Vykdyti diagnostiką“ir programa valdys jūsų termostatą, kad surinktų informaciją apie jūsų namus.

Pereikite prie kito meniu.

7 žingsnis: temperatūros valdymas

Temperatūros kontrolė
Temperatūros kontrolė

Šis meniu leidžia jums pasirinkti norimą temperatūrą namuose ir išvykus. Nustatykite 1 temperatūrą į savo patogią temperatūrą, o 2 temperatūrą į aukštą arba žemą vertę, kuri yra saugi jūsų namams (įsitikinkite, kad nenustatėte jos iki 100 laipsnių, kai namuose yra šunų ir pan.).

8 žingsnis: istoriniai duomenys

Istorinė data
Istorinė data

Galiausiai galite stebėti, kiek sutaupote pinigų naudodami automatinį valdymą. Tai iš esmės įvertina, kiek energijos būtų sunaudota, jei jūsų termostatas būtų nustatytas į pageidaujamą temperatūrą 24 valandas per parą, tada atimama jūsų faktinė sunaudota energija.

Sėkmės statant.

Rekomenduojamas: