INHOUDSOPGAWE:

Autostat: 'n afstandtermostaat: 8 stappe (met foto's)
Autostat: 'n afstandtermostaat: 8 stappe (met foto's)

Video: Autostat: 'n afstandtermostaat: 8 stappe (met foto's)

Video: Autostat: 'n afstandtermostaat: 8 stappe (met foto's)
Video: 30 лучших советов и рекомендаций по Windows 10 на 2020 год 2024, Julie
Anonim
Autostat: 'n afstandtermostaat
Autostat: 'n afstandtermostaat

Die vraag wat u waarskynlik vra, is "hoekom maak u nog 'n afgeleë termostaat?"

Die antwoord op die vraag is: ek moes, en die slimtermostate op die mark is te duur.

Eerlike waarskuwing, dit is 'n 'proof-of-concept'-konstruksie wat 'n paar ekstra uitsette benodig om u termostaat werklik te beheer, maar die kern is op sy plek en kan aangepas word na gelang van u spesifieke omstandighede. Dit is ook nog steeds aan die gang, so verwag 'n paar opdaterings en veranderinge (veral aan die Matlab -kode)

Om te begin, wil ek u waarsku, dit vereis drie programme (een daarvan is redelik duur), 'n hele paar biblioteke en ondersteuningspakkette vir die programme, en u moet almal met mekaar laat praat. Dit is 'n hoofpyn. Met die waarskuwing uit die weg, kan ons met die materiaal begin.

Hardeware

  • arduino nano
  • arduino uno (of 'n ander nano, ek het net die uno gebruik omdat ek een gehad het)
  • verskillende springkabels, 'n paar manlike/mannetjies en twee stelle van drie saamgevoegde manlike/vroulike springers
  • 433MHz radiofrekwensie (RF) ontvanger, ek het die MX-05V gebruik
  • 433MHz RF-sender, ek het die MX-FS-03V gebruik
  • DHT11 termometer en humiditeitsensor met 'n hoë akkuraatheid (die een wat ek gebruik het, is geïnstalleer op 'n driepuntskyfie met die nodige weerstande reeds geïnstalleer)
  • broodbord (as u nie alles saam wil soldeer nie)
  • 'n telefoon met GPS (iPhone 8 in hierdie geval, maar ek het ook 'n Galaxy S8 gebruik)
  • 3D -gedrukte houer (nie regtig nodig nie, enige houer werk of glad nie)

Sagteware

  • Matlab van MathWorks (ek het die 2018a-uitgawe, maar ek het ook 2017a-b-uitgawes gebruik)
  • Matlab -selfoon is op u telefoon geïnstalleer
  • arduino -ondersteuningspakket vir Matlab
  • iPhone -sensorpakket vir Matlab
  • arduino IDE
  • RadioHead -ondersteuningspakkette en biblioteke van die arduino IDE
  • DHT11 -biblioteek vir arduino IDE
  • python 3.7 (maak seker dat die pyseriale biblioteek of seriële biblioteek geïnstalleer is, wat dit moet wees vir weergawe 3.4 of nuwer)

Stap 1: Alles saamvoeg

Om alles bymekaar te sit
Om alles bymekaar te sit
Om alles bymekaar te sit
Om alles bymekaar te sit
Om alles bymekaar te sit
Om alles bymekaar te sit

Eerstens stel ek voor dat u 'n paar arduino -tutoriale doen oor die RF -senders, net om seker te maak dat u onderdele werk en dat die bedrading korrek is. Daar is baie voorbeelde beskikbaar, met die kode ingesluit (vir ons wat daar min of niks van C en C ++ weet nie).

Volg die bedradingsdiagramme hieronder om die arduino en sensors saam te stel. Een ding om in gedagte te hou tydens die aansluiting van die arduino's, is dat die data -poorte wat ek gebruik het nie nodig is nie, maar word aanbeveel.

As u besluit om die datapoorte wat u gebruik te verander, hoef u net die penne in u kode te definieer. Persoonlik dink ek dat dit makliker is om by die standaardpoort te bly wat die arduino -biblioteke herken.

En net om duidelik te wees, die nano en uno is uitruilbaar, maar ek het die nano vir die sender se kant van die projek gebruik om die grootte van die temperatuurmonitor te verminder.

Kantopmerking: die groen item wat die nano bevat, is die 3D -gedrukte houer.

Stap 2: Ontvanger

Ontvanger
Ontvanger

Stap 3: Sender

Sender
Sender

Stap 4: Die kode

Sodra die bedrading klaar is, moet u alle programme aan die gang kry en die biblioteke geïnstalleer word (as u dit nog nie gedoen het nie). Beide u telefoon en Matlab moet tans op dieselfde wifi -netwerk wees.

Skryf in die opdragvenster van Matlab:

aansluiting aan

Dit sal u vra om 'n vyf -syfer wagwoord in te voer wat u sal gebruik om op u iPhone aan te sluit. Maak seker dat u die wagwoord onthou. As u die wagwoord ingevoer het, sal Matlab 'n paar inligting vertoon, insluitend u IP -adres. Gebruik dit in die volgende stap, afkomstig van die instruksies in die hulpprogram "Aan die gang met sensors" in Matlab mobile.

  • Volg hierdie stappe om sensordata na MathWorks Cloud of 'n rekenaar te stuur:
  • As u sensordata na 'n rekenaar stuur en dit nog nie geïnstalleer is nie, laai en installeer die MATLAB -ondersteuningspakket vir Apple iOS -sensors in MATLAB.
  • Koppel MATLAB Mobile aan MathWorks Cloud of 'n rekenaar met behulp van Instellings.
  • Skep mobiledev -voorwerp in MATLAB (op u rekenaar), byvoorbeeld: >> m = mobiledev
  • Kies een of meer sensors en tik op Start.

Volg hierdie stappe om sensordata plaaslik op u toestel aan te meld:

  • Kies op die Sensors -skerm die sensors waarvan u data wil versamel.
  • Kies Log.
  • Tik op die Start -knoppie.
  • As u klaar is met die versameling van data, tik op die Stop -knoppie.
  • Voer die naam van die sensorlogboek in die pop-up in.
  • Herhaal stappe 1-5 indien nodig.

Daar sal na hierdie afdeling in Deel 4 verwys word, dus hoef u nog nie eintlik data te versamel nie. Hou net u telefoon byderhand en Matlab -selfoon gereed.

U moet nou êrens in u rekenaar 'n gids skep om die Matlab -kode lêers te huisves. U het vier afsonderlike lêers, twee vir die agtergrondfunksies (.m -lêers) en een Matlab -kode -lêer vir die GUI (.mlapp),.

Eerstens is die massa -berekening vir die lug in u huis (dit laat Matlab weet hoe lank dit neem om u huis te verhit/af te koel)

funksie [Massa] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = klok; time_end = 0 terwyl runCalc <= 1 as T_ins == (Tmp_start+(7*Chng_dir)) time_end = klok; PwrCntr = 0; runCalc = 0; anders PwrCntr = P_out; runCalc = runCalc+0.1 end end time_diag = time_end-time_start Mass = (P_out*time_diag) /7.035

En die tweede een:

funksie [tydstempel, pwr_gebruik] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, massa)

AutoStat = 1; ek = 1; terwyl AutoStat == 1 time_start = klok; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); tydstempels = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; formaat longg; %haversine formule vir die berekening van afstand gebaseer op breedtegraad en %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m.breedte).*(sind ((m. Lengtegraad-Lon_in)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %skat jou tyd om terug te keer time_rtn = (Dist-r_pref)./ speed; %bereken die nodige termostaatinstelling op grond van die uitset van %lugversorger en lugmassa van die huis. calcTmp_set = ((-1.*P_out.*time_rtn)./ (massa.*(1.005))))+T_pref; %bepaal of die huidige termostaatinstelling verander moet word as rond (calcTmp_set) ~ = rondte (t) tydACon = klok; PwrCntr = P_out; timeACon = timeACon + klok-time_start; koste = P_uit*tydACon*koers; anders PwrCntr = 0 eindtydstempels (einde+1, [1: 6]) = klok; pwr_usage (end+1, 1) = PwrCntr; pouse (5) einde einde

Albei hierdie lêers is Matlab -funksies. U hoef nie toegang daartoe te kry nie, tensy u van plan is om dit aan te pas vir spesifieke behoeftes, aangesien u dit vanaf die GUI sal bel. Stoor albei lêers afsonderlik, die eerste een as CalcMass.m en die tweede as dist_cntrl.m, dit is die name wat die GUI -kode gebruik om die funksies te noem, dus as u nie die res van die onderstaande kode wil wysig nie, hou by die naamkonvensie.

Voordat u by die GUI -kode ingaan, moet u die app -ontwerper vir Matlab oopmaak, wat u kan oopmaak deur te navigeer in die Matlab -menubalk, of volgens my gunsteling metode wat die volgende opdrag in die Matlab -opdragvenster invoer:

appdesigner

Sodra die app -ontwerper oopgemaak is, maak 'n nuwe programlêer (.mlapp) oop en verwyder al die standaardkode uit die kodevenster. Vervang dit dan alles met die volgende en druk op die run -knoppie.

classdef Control_1 <matlab.apps. AppBase % Eienskappe wat ooreenstem met app -komponenteienskappe (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. knoppie 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. Label. Tab. 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 TotalSavl. Ellit. Field. Server. Edit. Field. Server. Elite. Tel. Elite. Tel. Elite. Tel. Elite. Tel. Elite. Tel. Elite.

metodes (Toegang = privaat)

% Waardeveranderde funksie: tydelik

funksie tempnowValueChanged (app, gebeurtenis) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 vir i = lengte (temp) app. Gauge. Value = temp (i) pouse (1) einde einde

% Waardeveranderde funksie: TemperatureDirectionSwitch

funksie TemperatureDirectionSwitchValueChanged (app, event) manier = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; anders Chng_dir = 1; eindig Chng_dir; einde

% Waardeveranderde funksie: DDFH

funksie DDFHValueChanged (app, gebeurtenis) r_pref = app. DDFH. Value; einde

% Waarde verander funksie: AvgLocalSpeedEditField

funksie AvgLocalSpeedEditFieldValueChanged (app, gebeurtenis) speed = app. AvgLocalSpeedEditField. Value; einde

% Waardeveranderde funksie: PowerOutputRatingEditField

funksie PowerOutputRatingEditFieldValueChanged (app, gebeurtenis) waarde = app. PowerOutputRatingEditField. Value; einde

% Waardeveranderde funksie: EnergyEfficiencyRatingEditField

funksie EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; einde

% Knoppie gedruk funksie: RunDiagnosticButton

funksie RunDiagnosticButtonPushed (app, gebeurtenis) manier = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; anders Chng_dir = 1; einde T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

einde

% Waardeveranderde funksie: Temperature1Spinner

funksie Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; einde

% Waardeveranderde funksie: Temperature2Spinner

funksie Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; einde

% Waardeveranderde funksie: Skakelaar

funksie SwitchValueChanged (app, gebeurtenis) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Lengtegraad P_out = 0; r_pref = app. DDFH. Waarde; T_pref = app. Temperature1Spinner. Value; spoed = m. Spoed; massa = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, massa) einde einde

% Inisialisering en konstruksie van app

metodes (Toegang = privaat)

% Skep UIFigure en komponente

funksie createComponents (app)

% Skep UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'UI -figuur';

% Skep TabGroup

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

% Skep SetupTab

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

% Skep RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, waar); app. RunDiagnosticButton. FontWeight = 'vet'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Diagnose uitvoer';

% Skep EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'regs'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energie -doeltreffendheidsgradering';

% Skep EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numeries'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, waar); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'sentrum'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% Skep PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'regs'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Power Output Rating';

% Skep PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numeries'); app. PowerOutputRatingEditField. Limits = [0 inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, waar); app. PowerOutputRatingEditField. HorizontalAlignment = 'sentrum'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Skep AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'regs'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Gem. Plaaslike spoed ';

% Skep AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'numeries'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, waar); app. AvgLocalSpeedEditField. HorizontalAlignment = 'sentrum'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Skep DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'regs'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Gewenste afstand'; 'uit die huis'};

% Skep DDFH

app. DDFH = uieditfield (app. SetupTab, 'numeries'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (app, @DDFHValueChanged, waar); app. DDFH. HorizontalAlignment = 'sentrum'; app. DDFH. Position = [139 135 100 22];

% Skep TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'middel'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Temperatuur rigting';

% Skep TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'slider'); app. TemperatureDirectionSwitch. Items = {'Up', 'Down'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, waar); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Op';

% Skep TempSettingsTab

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

% Skep Temperature1SpinnerLabel

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

% Skep Temperature1Spinner

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

% Skep Temperature2SpinnerLabel

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

% Skep Temperature2Spinner

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

% Skakel skakelaar

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

% Skep EditFieldLabel

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

% Skep tyd

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

% Skep GaugeLabel

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

% Skep maat

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

% Skep SavingsTab

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

% Skep UIAxes

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

% Skep ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'sentrum'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Koste hierdie maand';

% Skep ThisMonthCostEditField

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

% Skep TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'regs'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Totale besparings';

% Skep TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numeries'); app. TotalSavingsEditField. Limits = [0 inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'sentrum'; app. TotalSavingsEditField. Position = [88 39 137 58]; einde einde

metodes (Toegang = publiek)

Konstrueer app

funksie -app = Control_1

% Skep en konfigureer komponente

createComponents (app)

% Registreer die app by App Designer

registerApp (app, app. UIFigure)

as nargout == 0

maak die einde van die app duidelik

% Kode wat uitgevoer word voordat app uitgevee word

verwydering van funksies (app)

Vee UIF -figuur uit wanneer die program uitgevee word

verwyder (app. UIFigure) einde einde einde

U sal waarskynlik 'n fout kry, wat geen probleem is nie. Sluit net die GUI wat gegenereer is nadat u op run gedruk het, ons versamel die res van die nodige programme en data binne 'n oomblik.

Aangesien Matlab opgestel is, kan ons na python oorgaan. Begin eers die python -program vanaf u opdragprompt (op Windows) of deur die.exe -lêer in u python -lêergids te gebruik. Maak seker dat al die toepaslike biblioteke geïnstalleer is deur die invoeropdrag te gebruik.

invoer reeks

invoer tyd invoer csv

Dit is die drie biblioteke wat u moet begin, alhoewel ons binnekort ons eie biblioteek gaan maak. As daar 'n fout was met hierdie opdragte, gaan terug en maak seker dat die biblioteke geïnstalleer is en in die Lib -lêer in die python -lêergids is. Vervolgens genereer ons wat ek pythonlogger -biblioteek genoem het. Hierdie naam is nie nodig nie; u kan dit noem wat u wil; dit is net die naam van die python -lêer (.py) wat u skep.

Maak 'n teksredakteur oop, ek gebruik Sublime3, maar notepad werk goed, en voer hierdie kode in.

def pythonprint ():

invoer pythonlogger invoer seriële invoer tyd invoer csv ser = serial. Serial ('COM8') # COM8 is die arduino seriële poort, dit sal waarskynlik vir elke gebruiker anders wees, dws kyk na u seriële poort in die arduino IDE ser.flushInput () terwyl Waar: probeer: ser_bytes = ser.readline () print (ser_bytes) met open ("test_data.csv", "a") as f: writer = csv.writer (f, delimiter = ",") # stel die data in ingevoer word as 'n komma-geskeide writer.writerow ([time.time (), ser_bytes]) #skryf data in test_data.csv behalwe: druk ("fout opgetree") breek

Stoor die teks as "voeg die naam van die biblioteek in wat u wil".py in die Lib -lêergids. Let ook daarop dat die def pythonprint () -lyn die naam definieer van die funksie wat u gaan bel, sodat u dit kan verander na "voeg naam in wat u vir u funksie wil hê" (). As die biblioteek gestoor is, kan ons na die arduino -kode gaan.

Maak die arduino IDE oop en maak twee nuwe sketsvensters oop. Stoor die twee sketslêers op 'n gerieflike plek; die naam van hierdie lêers maak nie saak nie. Vee dan al die standaardkode uit en vervang dit met die volgende.

Vir die ontvangende arduino:

#insluit

#include #include #include // dit word nie gebruik nie, maar is nodig om RH_ASK -bestuurder saam te stel; struct dataStruct {float temp; } myData; ongeldige opstelling () {Serial.begin (9600); // Ontfout slegs as (! Driver.init ()) Serial.println ("init misluk"); } leemte -lus () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Nie-blokkerend {int i; // Boodskap met 'n goeie kontrolesom ontvang, gooi dit weg. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. die //driver.printBuffer…. ens reël is toets kode. U hoef u nie daaroor te bekommer nie, tensy u diagnoses doen en wil uitvind of u werklik data ontvang.

Vir die sender arduino

#insluit

#include #include #include // dit word nie gebruik nie, maar benodig om saam te stel #include #include int pin = 4; DHT11 dht11 (pen); RH_ASK bestuurder; struct dataStruct {float temp; } myData; byte tx_buf [sizeof (myData)] = {0}; // Argumente is dus bitrate, stuur pin (tx), // ontvang pin (rx), ppt pin, isInverse. Die laaste 2 word nie gebruik nie.void setup () {Serial.begin (9600); // Ontfout slegs as (! Driver.init ()) Serial.println ("init misluk"); } leemte lus () {int err; vlot temp, humi; uint8_t msg; as ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); byte zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // die uitvoering stop totdat alle data vertraag is (2000); // wag 2 sekondes}}

Die opdragte insluit moet genoeg wees, maar as u later probleme ondervind met die data -oordrag, wil u moontlik in die RadioHead -biblioteekmap kyk en die res van die lêernaam in dieselfde formaat insluit.

Stap 5: Laat dit werk

Dit laat werk
Dit laat werk
Dit laat werk
Dit laat werk
Dit laat werk
Dit laat werk

Noudat ons al die kode bymekaar het en die arduino's saamgestel is, kan ons die arduino aan u rekenaar koppel en die kode laai. Maak seker dat u die korrekte kode na die ontvangende en versendende mikrobeheerders stuur. U kan beide die arduino's aan u rekenaar koppel terwyl dit aan die gang is, maar u moet seker maak dat u die korrekte poort vorentoe gekies het, of u kan die arduino wat uitgestuur word, ontkoppel en dit van 'n ander bron af skakel sodra die kode is opgelaai.

As u hiervan praat, moet u die poort wat gekoppel is aan u ontvangende arduino in die IDE -gereedskapskieslys kies, en python uitvoer.

Moenie die reeksmonitor oopmaak terwyl u dit doen nie; python kan nie die reeks lees terwyl die monitor oop is nie. Sodra die luislang oop is, skakel die luislangafdrukfunksie soos volg.

pythonlogger.pythonprint ()

Dit sal die data -insameling vanaf die arduino -seriële poort begin. As u u python -lêergids nou oopmaak, sal u sien dat 'n nuwe.csv -lêer geskep is met die naam 'test_data.csv', wat alle inligting oor tyd en temperatuur bevat. Dit is die lêer waartoe Matlab toegang het om al sy berekeninge en kontroles uit te voer.

Nog 'n waarskuwing: moenie test_data.csv oopmaak terwyl toegang tot die data verkry of geskryf word nie. As u dit doen, val die luislang en/of die Matlab -kode neer en stuur 'n fout terug

As u besluit om die.csv later oop te maak, sal u agterkom dat die tydkolom slegs 'n baie groot aantal getalle is. Dit is omdat die opdrag time.time () die aantal sekondes sedert 1 Januarie 1970 skryf.

Op hierdie punt moet die luislang die temperatuurdata wat dit lees, vanaf die seriële poort druk. Dit moet so lyk:

b'25.03 '/r/n

Moenie bekommerd wees oor die ekstra karakters nie, die Matlab -kode -indekse vir die middelste vyf waardes in die tweede kolom van die CSV -lêer.

Noudat al die ondersteunende programme werk en data versamel word, kan ons begin om GPS -data te versamel uit die Matlab -mobiele program wat vroeër opgestel is en die Matlab GUI -kode uit te voer. Sodra u op die sensor -oortjie van Matlab mobile is, kies GPS en druk op die startknoppie.

As u nog nie 'n nuwe Matlab -selfoon is nie, verwys dan na stap 4 en kyk na die skermkiekies hierbo. As u nog steeds probleme ondervind, moet u seker maak dat u gekoppel is aan die rekenaar wat u vroeër gekies het (op die oortjie met instellings) en gebruik die skakel vanaf die "connector on" -opdrag om te kyk of Matlab aanlyn is.

Stap 6: Gebruik die program

Die gebruik van die program
Die gebruik van die program

Daar is verskeie dinge wat op die agtergrond in hierdie stelsel aangaan. Temperatuurdata word deur arduino en pyton versamel en geregistreer, Matlab versamel GPS -data van u telefoon en maak berekeninge om te sien hoe ver u van u huis af is en stel u termostaat gebaseer op al die inligting. Waar u inkom, bied u u voorkeure aan.

Begin die Matlab GUI -kode. Maak die.mlapp -lêer oop en kyk na die eerste oortjie. U sal self die inligting hieroor moet versamel; die doeltreffendheid en kragopbrengs van u verwarmings-/verkoelingseenheid kan gewoonlik op die eenheid self gevind word, en u gemiddelde snelheid is slegs 'n goeie skatting van hoe vinnig u ry. Sodra die waardes ingevoer is, druk die "Run Diagnostic" knoppie en die program beheer u termostaat om inligting oor u huis te versamel.

Gaan na die volgende spyskaart.

Stap 7: Temperatuurbeheer

Temperatuurbeheer
Temperatuurbeheer

Met hierdie spyskaart kan u die gewenste temperatuur kies terwyl u tuis en weg is. Stel temperatuur #1 op u gemaklike temperatuur en temperatuur #2 op 'n hoë of lae waarde wat veilig is vir u huis (maak seker dat u dit nie op 100 grade stel terwyl u honde tuis het nie, ens.).

Stap 8: Historiese data

Historiese gegewens
Historiese gegewens

Uiteindelik kan u kyk hoeveel geld u spaar deur die outomatiese beheer te gebruik. Dit skat in wese hoeveel energie gebruik sou word as u termostaat 24/7 op u voorkeurtemperatuur was, en trek dan u werklike energie af.

Sterkte met die bou.

Aanbeveel: