Sisukord:
- Samm: pange see kõik kokku
- 2. samm: vastuvõtja
- 3. samm: saatja
- Samm: kood
- Samm 5: Pange see tööle
- 6. samm: programmi kasutamine
- Samm: temperatuuri reguleerimine
- 8. samm: ajaloolised andmed
Video: Autostat: kaugtermostaat: 8 sammu (piltidega)
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:49
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õ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
3. samm: 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
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
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
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
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:
DIY 37 LED Arduino ruleti mäng: 3 sammu (piltidega)
DIY 37 Leds Arduino rulett Mäng: Rulett on kasiinomäng, mis on nime saanud prantsuse sõna järgi, mis tähendab väikest ratast
Kuidas: Raspberry PI 4 peata (VNC) installimine RPI-pildistaja ja piltidega: 7 sammu (koos piltidega)
Kuidas: Raspberry PI 4 peata (VNC) installimine Rpi-pildistaja ja piltidega: kavatsen seda Rapsberry PI-d kasutada oma blogis hunniku lõbusate projektide jaoks. Vaadake seda julgelt. Tahtsin uuesti oma Raspberry PI kasutamist alustada, kuid mul polnud uues asukohas klaviatuuri ega hiirt. Vaarika seadistamisest oli tükk aega möödas
Atari punkkonsool beebiga 8 sammu järjestus: 7 sammu (piltidega)
Atari punkkonsool koos beebi 8-astmelise sekveneerijaga: see vaheehitus on kõik-ühes Atari punk-konsool ja beebi 8-astmeline järjestus, mida saate freesida Bantam Tools töölaua PCB-freespingis. See koosneb kahest trükkplaadist: üks on kasutajaliidese (UI) plaat ja teine on utiliit
Polt - DIY juhtmeta laadimise öökell (6 sammu): 6 sammu (piltidega)
Bolt - DIY juhtmeta laadimise öökell (6 sammu): Induktiivsed laadimised (tuntud ka kui juhtmeta laadimine või juhtmeta laadimine) on traadita jõuülekande tüüp. See kasutab kaasaskantavatele seadmetele elektrit pakkumiseks elektromagnetilist induktsiooni. Kõige tavalisem rakendus on Qi traadita laadimisst
Arvuti demonteerimine lihtsate sammude ja piltidega: 13 sammu (piltidega)
Arvuti demonteerimine lihtsate sammude ja piltidega: see on juhis arvuti demonteerimiseks. Enamik põhikomponente on modulaarsed ja kergesti eemaldatavad. Siiski on oluline, et oleksite selles osas organiseeritud. See aitab vältida osade kaotamist ja ka kokkupanekut