Përmbajtje:

Autostat: një termostat në distancë: 8 hapa (me fotografi)
Autostat: një termostat në distancë: 8 hapa (me fotografi)

Video: Autostat: një termostat në distancë: 8 hapa (me fotografi)

Video: Autostat: një termostat në distancë: 8 hapa (me fotografi)
Video: 20 лучших советов по Windows 10 2024, Nëntor
Anonim
Autostat: një termostat në distancë
Autostat: një termostat në distancë

Pyetja që ndoshta po bëni është "pse po bëni një termostat tjetër në distancë?"

Përgjigja për atë pyetje është, unë duhej, dhe termostatët e zgjuar të tregut janë shumë të shtrenjtë.

Paralajmërim i drejtë, kjo është një ndërtim "provë-koncepti" që do të kërkojë disa rezultate shtesë për të kontrolluar në të vërtetë termostatin tuaj, por thelbi është në vend dhe mund të modifikohet në varësi të rrethanave tuaja specifike. Gjithashtu, kjo është ende një punë në progres, kështu që prisni disa përditësime dhe ndryshime (veçanërisht në kodin Matlab)

Për të filluar, dua t'ju paralajmëroj, kjo kërkon tre programe (njëri prej tyre është mjaft i shtrenjtë), mjaft biblioteka dhe pako mbështetëse për programet, dhe ju duhet t'i bëni të gjitha të flasin me njëri -tjetrin. Itsshtë dhimbje koke. Me atë paralajmërim jashtë rrugës, le të fillojmë me materialet.

Hardware

  • arduino nano
  • arduino uno (ose një nano tjetër, sapo përdor uno sepse kisha një të shtrirë përreth)
  • kabllo të ndryshme kërcyesi, disa meshkuj/meshkuj dhe dy grupe prej tre kërcyesish të bashkuar meshkuj/femra
  • Marrësi i frekuencës radio 433MHz (RF), kam përdorur MX-05V
  • Transmetues RF 433MHz, kam përdorur MX-FS-03V
  • Termometër DHT11 me saktësi të lartë dhe sensor lagështie (ai që kam përdorur është instaluar në një çip me tre kunja me rezistorët e kërkuar tashmë të instaluar)
  • dërrasë buke (nëse nuk doni ta lidhni të gjithë së bashku)
  • një telefon me GPS (iPhone 8 në këtë rast, por kam përdorur edhe një Galaxy S8)
  • Kontejner i printuar 3D (nuk është vërtet i nevojshëm, çdo enë do të funksionojë ose aspak)

Softuer

  • Matlab nga MathWorks (Unë kam edicionin 2018a, por kam përdorur edhe botimet 2017a-b)
  • Matlab celular i instaluar në telefonin tuaj
  • paketë mbështetëse arduino për Matlab
  • Paketa e sensorit iPhone për Matlab
  • arduino IDE
  • Pakot mbështetëse të RadioHead dhe bibliotekat e arduino IDE
  • Biblioteka DHT11 për arduino IDE
  • python 3.7 (sigurohuni që biblioteka pyserial ose biblioteka serike është e instaluar, e cila duhet të jetë për versionin 3.4 ose më të ri)

Hapi 1: Vendosja e të gjitha së bashku

Vendosja e të gjitha së bashku
Vendosja e të gjitha së bashku
Vendosja e të gjitha së bashku
Vendosja e të gjitha së bashku
Vendosja e të gjitha së bashku
Vendosja e të gjitha së bashku

Para së gjithash, unë do t'ju sugjeroja të bëni disa mësime arduino që kanë të bëjnë me transmetuesit RF vetëm për t'u siguruar që pjesët tuaja po punojnë dhe instalimet elektrike janë të sakta. Ka shumë shembuj në dispozicion, me kodin e përfshirë (për ata prej nesh që nuk dinë shumë pak për asgjë për C dhe C ++).

Ndiqni diagramet e instalimeve elektrike më poshtë për të montuar arduinon dhe sensorët. Një gjë që duhet mbajtur parasysh gjatë instalimit të arduinos është se portet e të dhënave që kam përdorur nuk kërkohen, por rekomandohen.

Nëse vendosni të ndryshoni portet e të dhënave që përdorni, ju vetëm duhet të përcaktoni kunjat në kodin tuaj. Personalisht, mendoj se është më e lehtë të qëndrosh me portat e paracaktuar që bibliotekat arduino njohin.

Dhe thjesht për të qenë të qartë, nano dhe uno janë të këmbyeshëm, por unë përdor nano për anën e transmetuesit të projektit për të zvogëluar madhësinë e monitorit të temperaturës.

Shënim anësor: përbërja e gjelbër që mban nano është ena e printuar 3D.

Hapi 2: Marrësi

Marrësi
Marrësi

Hapi 3: Transmetues

Transmetues
Transmetues

Hapi 4: Kodi

Pasi të keni përfunduar instalimet elektrike, duhet të ekzekutoni të gjitha programet dhe të instaloni bibliotekat (nëse nuk e keni bërë tashmë), unë thjesht supozoj se keni, ju duhet të filloni Matlab dhe të ekzekutoni paketën mbështetëse të iPhone. Telefoni juaj dhe Matlab duhet të jenë në të njëjtin rrjet wifi në këtë pikë.

Në dritaren e komandave të Matlab shkruani:

lidhësja e ndezur

Kjo do t'ju nxisë të futni një fjalëkalim pesë shifror që do të përdorni për t'u lidhur në iPhone tuaj. Sigurohuni që të mbani mend fjalëkalimin. Kur të keni futur fjalëkalimin Matlab do të shfaqë disa informacione, përfshirë adresën tuaj IP. Përdoreni këtë në hapin tjetër, i cili vjen nga udhëzimet nga menyja e ndihmës "Fillimi me sensorë" në celularin Matlab.

  • Ndiqni këto hapa për të dërguar të dhëna të sensorit në MathWorks Cloud ose një kompjuter:
  • Nëse po dërgoni të dhëna të sensorit në një kompjuter dhe nëse nuk janë instaluar tashmë, shkarkoni dhe instaloni Paketën Mbështetëse MATLAB për Sensorët Apple iOS në MATLAB.
  • Lidhni MATLAB Mobile me MathWorks Cloud ose një kompjuter duke përdorur Cilësimet.
  • Krijoni objekt mobiledev në MATLAB (në kompjuterin tuaj), për shembull: >> m = mobiledev
  • Zgjidhni një ose më shumë sensorë dhe trokitni lehtë mbi Start.

Ndiqni këto hapa për të regjistruar të dhënat e sensorit në vend në pajisjen tuaj:

  • Në ekranin e Sensorëve, zgjidhni sensorët nga të cilët dëshironi të mblidhni të dhëna.
  • Zgjidhni Regjistri.
  • Prekni butonin Start.
  • Kur të keni mbaruar mbledhjen e të dhënave, prekni butonin Stop.
  • Në dritaren që shfaqet, futni emrin e regjistrit të sensorit.
  • Përsëritni hapat 1-5 nëse është e nevojshme.

Ky seksion do t'i referohet përsëri në Pjesën 4, kështu që nuk ka nevojë të filloni akoma mbledhjen e të dhënave akoma. Thjesht mbajeni telefonin tuaj të përdorshëm dhe gati celularin Matlab.

Tani ju duhet të krijoni një dosje diku në kompjuterin tuaj për të vendosur skedarët e kodit Matlab. Do të keni katër skedarë të veçantë, dy për funksionet e sfondit (skedarët.m) dhe një skedar kodi Matlab për GUI (.mlapp),.

Së pari është llogaritja e masës për ajrin në shtëpinë tuaj (kjo i bën të ditur Matlab se sa kohë duhet për të ngrohur/ftohur shtëpinë tuaj)

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

runCalc = 0; Tmp_start = T_ins; koha_fillimi = ora; koha_fund = 0 gjatë drejtimitKalc <= 1 nëse T_ins == (Tmp_start+(7*Chng_dir)) koha_fund = ora; PwrCntr = 0; runCalc = 0; tjetër PwrCntr = P_out; runCalc = runCalc+0.1 koha e fundit e përfundimit_diag = koha_fund-koha_fillimi = = (P_out*time_diag) /7.035

Dhe e dyta:

funksioni [vulat kohore, pwr_përdorimi] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, shpejtësia, T_pref, masa)

AutoStat = 1; i = 1; ndërsa AutoStat == 1 kohë_fillim = orë; m = mobiledev; t = csvread ('vlerat.csv', 0, 1); t = t (i); kohore = [0, 0, 0, 0, 0, 0]; pwr_përdorimi = 0; i = i+1; format longg; %formulë haversine për llogaritjen e distancës bazuar në gjerësinë gjeografike dhe %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m.latitude).*(sind ((m. Gjatësia-Lon_in)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %vlerëson kohën tuaj për t'u kthyer time_rtn = (Dist-r_pref)./ shpejtësia; %llogarit cilësimin e nevojshëm të termostatit bazuar në fuqinë e fikur të %kondicionerit dhe masës së ajrit të shtëpisë. calcTmp_set = ((--1.*P_out.*time_rtn)./ (masa.*(1.005)))+T_pref; %përcakton nëse cilësimi aktual i termostatit duhet të ndryshohet nëse raundi (calcTmp_set) ~ = koha e rrumbullakët (t)ACon = ora; PwrCntr = P_out; timeACon = timeACon + ora-koha_fillimi; kosto = P_out*timeACon*norma; tjetër PwrCntr = 0 vija kohore përfundimtare (fund+1, [1: 6]) = orë; pwr_usage (fund+1, 1) = PwrCntr; pauzë (5) fund fund

Të dyja këto skedarë janë funksione Matlab. Ju nuk do të keni nevojë t'i përdorni ato nëse nuk planifikoni t'i modifikoni ato për nevoja të veçanta, pasi do t'i telefononi nga GUI. Ruani të dy skedarët veç e veç, të parin si CalcMass.m dhe të dytin si dist_cntrl.m, ata do të jenë emrat që përdor kodi GUI për të thirrur funksionet, kështu që nëse nuk doni të redaktoni pjesën tjetër të kodit më poshtë, qëndroni konventa e emërtimit.

Para se të futeni në kodin GUI, duhet të hapni projektuesin e aplikacionit për Matlab, të cilin mund ta hapni duke lundruar në shiritin e menusë Matlab, ose me metodën time të preferuar e cila po fut komandën e mëposhtme në dritaren e komandës Matlab:

dizenjues aplikacioni

Pasi projektuesi i aplikacionit të jetë i hapur, hapni një skedar të ri të aplikacionit (.mlapp) dhe fshini të gjithë kodin e paracaktuar nga dritarja e kodit. Pastaj zëvendësoni të gjitha me sa vijon dhe shtypni butonin e drejtimit.

classdef Control_1 <matlab.apps. AppBase % Karakteristikat që korrespondojnë me vetitë e komponentëve të aplikacionit (Qasja = publike) 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 matlaben Temabel1LabelLabelLabelLabelCabelLabel.in. Control. Liberi. Control. Liberi.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli.kontroli. ui.control. Spinner Temperatura2SpinnerLabel 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.abontrol.abontrol.abontrolLabel.abi.control.abontrolLabel.abi.control.abontrolLabel.abi.control.abontrolLabel.abi.control.abontrolLabel.abi.control.abl. matës fund SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLabel matlab.ui.control. Label TotalSavingsEditField matlab.ui.control. NumericEditField

metodat (Qasja = private)

% Funksioni i funksionit të ndryshuar: tempnow

funksioni tempnowValueChanged (aplikacion, ngjarje) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 për i = gjatësinë (temp) app. Gauge. Value = temp (i) pauzë (1) fundi përfundimtar

% Vlera ndryshoi funksionin: TemperatureDirectionSwitch

funksioni TemperatureDirectionSwitchValueChanged (aplikacion, ngjarje) mënyrë = app. TemperatureDirectionSwitch. Value; mënyrë = uint8 (mënyrë) mënyrë = gjatësi (rrugë) nëse mënyra == 4 Chng_dir = -1; tjetër Chng_dir = 1; fund Chng_dir; fund

% Funksioni i vlerës së ndryshuar: DDFH

funksioni DDFHValueChanged (aplikacion, ngjarje) r_pref = app. DDFH. Vlera; fund

% Funksioni i funksionit të ndryshuar: AvgLocalSpeedEditField

funksioni AvgLocalSpeedEditFieldValueChanged (aplikacion, ngjarje) shpejtësia = app. AvgLocalSpeedEditField. Value; fund

% Funksioni i vlerës së ndryshuar: PowerOutputRatingEditField

funksioni PowerOutputRatingEditFieldValueChanged (aplikacioni, ngjarja) vlera = app. PowerOutputRatingEditField. Value; fund

% Funksioni i vlerës së ndryshuar: EnergyEfficiencyRatingEditField

funksioni EnergyEfficiencyRatingEditFieldValueChanged (aplikacioni, ngjarja) vlera = app. EnergyEfficiencyRatingEditField. Value; fund

% Funksioni i butonit të shtyrë: RunDiagnosticButton

funksioni RunDiagnosticButtonPushed (aplikacion, ngjarje) mënyrë = app. TemperatureDirectionSwitch. Value; mënyrë = uint8 (mënyrë) mënyrë = gjatësi (rrugë) nëse mënyra == 4 Chng_dir = -1; tjetër Chng_dir = 1; fund T_ins = app.tempnow. Vlera P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

fund

% Funksioni i vlerës së ndryshuar: Temperature1Spinner

funksioni Temperature1SpinnerValueChanged (aplikacioni, ngjarja) vlera = app. Temperature1Spinner. Vlera; fund

% Funksioni i vlerës së ndryshuar: Temperature2Spinner

funksioni Temperature2SpinnerValueChanged (aplikacioni, ngjarja) vlera = app. Temperature2Spinner. Vlera; fund

% Funksioni i vlerës së ndryshuar: Ndërroni

funksioni SwitchValueChanged (aplikacion, ngjarje) m = mobiledev; Lat_in = m. Gjerësia gjeografike Lin_in = m. Gjatësia P_out = 0; r_pref = app. DDFH. Vlera; T_pref = app. Temperature1Spinner. Vlera; shpejtësia = m. Shpejtësia; masë = 200; shpejtësia = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, shpejtësia, masa) fundi i fundit

% Fillimi dhe ndërtimi i aplikacionit

metodat (Qasja = private)

% Krijo UIFigure dhe komponentë

funksioni i krijuar Komponentët (aplikacioni)

% Krijo UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Figura e UI';

% Krijo TabGroup

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

% Krijo SetupTab

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

% Krijo butonin RunDiagnostic

app. RunDiagnosticButton = uibutton (app. SetupTab, 'shtytje'); app. RunDiagnosticButton. ButtonPushedFcn = krijoCallbackFcn (aplikacion, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'bold'; app. RunDiagnosticButton. Pozicioni = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Drejto Diagnostikimin';

% Krijo EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'djathtas'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Vlerësimi i Efiçiencës së Energjisë';

% Krijo EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numerike'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = krijoCallbackFcn (aplikacion, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'qendër'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% Krijo PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'djathtas'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Vlerësimi i daljes së energjisë';

% Krijo PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numerike'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = krijoCallbackFcn (aplikacion, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'qendër'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Krijo AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'djathtas'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Mes. Shpejtësia Lokale ';

% Krijo AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'numerike'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = krijoCallbackFcn (aplikacion, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'qendra'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Krijo DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'djathtas'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Distanca e dëshiruar'; 'nga Shtëpia'};

% Krijo DDFH

app. DDFH = uieditfield (app. SetupTab, 'numerike'); app. DDFH. Kufijtë = [0 50]; app. DDFH. ValueChangedFcn = krijoCallbackFcn (aplikacion, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'qendra'; app. DDFH. Pozita = [139 135 100 22];

% Krijo TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'qendër'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Drejtimi i Temperaturës';

% Krijo Ndërprerësin e TemperatureDirection

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'rrëshqitës'); app. TemperatureDirectionSwitch. Items = {'Lart', 'Poshtë'}; app. TemperatureDirectionSwitch. ValueChangedFcn = krijoCallbackFcn (aplikacion, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Lart';

% Krijo TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Cilësimet ';

% Krijo Temperature1SpinnerLabel

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

% Krijo Temperature1Spinner

app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = krijoCallbackFcn (aplikacion, @Temperature1SpinnerValueChanged, true); app. Temperature1Spinner. Pozicioni = [157 346 100 68]; app. Temperature1Spinner. Vlera = 60;

% Krijo Temperature2SpinnerLabel

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

% Krijo Temperature2Spinner

app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = krijoCallbackFcn (aplikacion, @Temperature2SpinnerValueChanged, true); app. Temperature2Spinner. Pozicioni = [157 230 100 70]; app. Temperature2Spinner. Vlera = 60;

% Krijo Ndërprerës

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

% Krijo EditFieldLabel

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

% Krijo tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'numerike'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = krijoCallbackFcn (aplikacion, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'qendra'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Vlera = 60;

% Krijo GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'qendër'; app. GaugeLabel. Pozicioni = [225 32 42 22]; app. GaugeLabel. Text = 'Matës';

% Krijo matës

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

% Krijo SavingsTab

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

% Krijo UIAxes

app. UIAxes = uiaxes (app. SavingsTab); titulli (app. UIAxes, 'Kursimet') xlabel (app. UIAxes, 'Muaji dhe Viti') ylabel (app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.606666666666667]; app. UIAxes. Ngjyra = [0.9412 0.9412 0.9412]; app. UIAxes. Pozicioni = [146 219 348 237];

% Krijo ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'qendra'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Kostoja e këtij Muaji';

% Krijo ThisMonthCostEditField

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

% Krijo TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'djathtas'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Kursimet totale';

% Krijo TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numerike'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'qendra'; app. TotalSavingsEditField. Position = [88 39 137 58]; fund fund

metodat (Qasja = publike)

% Ndërto aplikacionin

aplikacioni i funksionit = Kontrolli_1

% Krijo dhe konfiguro komponentët

krijo Komponentët (aplikacioni)

% Regjistroni aplikacionin me Projektuesin e Aplikacioneve

registerApp (aplikacioni, aplikacioni. UIFigura)

nëse nargout == 0

fundi i qartë i përfundimit të aplikacionit

% Kodi që ekzekutohet para fshirjes së aplikacionit

fshirja e funksionit (aplikacioni)

% Fshi UIFigura kur fshihet aplikacioni

fshini (app. UIFigure) fund fund end end

Ju ndoshta do të merrni një gabim, i cili nuk është problem. Thjesht mbyllni GUI që u krijua pasi shtypni run, ne do të mbledhim pjesën tjetër të programeve dhe të dhënave të nevojshme në një moment.

Meqenëse Matlab është ngritur, ne mund të kalojmë në python. Së pari, ekzekutoni programin python ose nga komanda juaj (në Windows) ose duke përdorur skedarin.exe në dosjen tuaj python. Sigurohuni që të gjitha bibliotekat e duhura janë instaluar duke përdorur komandën import.

serial importi

koha e importit import csv

Këto janë tre bibliotekat që do t'ju duhen për të filluar, megjithëse së shpejti do të krijojmë bibliotekën tonë. Nëse ka pasur një lloj gabimi me këto komanda, kthehuni dhe sigurohuni që bibliotekat janë të instaluara dhe janë në dosjen Lib në dosjen python. Tjetra ne do të krijojmë atë që unë e kam quajtur bibliotekë pythonlogger. Ky emër nuk është i nevojshëm, mund ta quani si të doni, është vetëm emri i skedarit python (.py) që krijoni.

Hapni një redaktues teksti, unë përdor Sublime3 por fletore funksionon mirë, dhe shkruani këtë kod.

def pythonprint ():

import pythonlogger import serial kohë import import csv ser = serial. Serial ('COM8') # COM8 është porti serial arduino, kjo ka të ngjarë të jetë e ndryshme për secilin përdorues, dmth kontrolloni portën tuaj serike në arduino IDE ser.flushInput () ndërsa E vërtetë: provo: ser_bytes = ser.readline () print (ser_bytes) me hapur ("test_data.csv", "a") si f: writer = csv.writer (f, delimiter = ",") # i vendos të dhënat në të futet si shkrimtar i ndarë me presje.writerow ([time.time (), ser_bytes]) #shkruan të dhëna në test_data.csv përveç: print (pushim ("Gabim ndodhi")

Ruani tekstin si "futni emrin e bibliotekës që dëshironi".py në dosjen Lib. Gjithashtu vini re se linja def pythonprint () përcakton emrin e funksionit që do të thërrisni, kështu që ju mund ta ndryshoni atë në def "futni emrin që dëshironi për funksionin tuaj" (). Kur biblioteka të ruhet, mund të kalojmë në kodin arduino.

Hapni arduino IDE dhe hapni dy dritare të reja skicash. Ruani ato dy skedarë skicë diku të përshtatshëm, emri i këtyre skedarëve nuk ka rëndësi. Pastaj fshini të gjithë kodin e paracaktuar dhe zëvendësojeni atë me sa vijon.

Për arduinon marrëse:

#përfshi

#include #include #include // kjo nuk përdoret por nevojitet për të përpiluar drejtuesin RH_ASK; strukturo dataStruct {temperatura e notimit; } myData; void setup () {Serial.begin (9600); // Debugging vetëm nëse (! Driver.init ()) Serial.println ("init dështoi"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = madhësia (buf); if (driver.recv (buf, & buflen)) // Jo-bllokues {int i; // Mesazhi me një kontroll të mirë të marrë, hidhni atë. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. etj linja është kodi i provës. Nuk ka nevojë të shqetësoheni për këtë nëse nuk bëni diagnozë dhe dëshironi të kuptoni nëse jeni duke marrë të dhëna.

Për transmetuesin arduino

#përfshi

#include #include #include // kjo nuk përdoret por nevojitet për të përpiluar #include #include int pin = 4; DHT11 dht11 (pin); Shoferi RH_ASK; strukturo dataStruct {temperatura e notimit; } myData; byte tx_buf [sizeof (myData)] = {0}; // Pra, argumentet janë bitrate, transmetojnë pin (tx), // marrin pin (rx), pin ppt, është I kundërt. 2 të fundit nuk përdoren. Void setup () {Serial.begin (9600); // Debugging vetëm nëse (! Driver.init ()) Serial.println ("init dështoi"); } void loop () {int gaboj; float temp, humi; uint8_t msg; nëse ((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 (); // ndalojë ekzekutimin derisa të gjitha të dhënat të jenë dërguar me vonesë (2000); // prit 2 sekonda}}

Komandat e përfshira duhet të jenë të mjaftueshme, por nëse keni ndonjë problem më vonë me transferimin e të dhënave, mund të dëshironi të shikoni në dosjen e bibliotekës RadioHead dhe të përfshini pjesën e mbetur të emrave të skedarëve, në të njëjtin format.

Hapi 5: Për ta bërë atë të funksionojë

Duke e bërë atë punë
Duke e bërë atë punë
Duke e bërë atë punë
Duke e bërë atë punë
Duke e bërë atë punë
Duke e bërë atë punë

Tani që kemi të gjithë kodin së bashku dhe arduino është mbledhur, ne mund ta lidhim arduinon në kompjuterin tuaj dhe të ngarkojmë kodin. Sigurohuni që të dërgoni kodin e duhur te mikrokontrolluesit marrës dhe transmetues. Mund të keni të dy arduinos të lidhur me kompjuterin tuaj ndërkohë që funksionon, por do të duhet të siguroheni që porti i saktë i zgjedhur të lëvizë përpara, ose mund të shkëputni arduinon transmetuese dhe ta aktivizoni atë nga ndonjë burim tjetër pasi kodi të jetë ngarkuar

Duke folur për këtë, ju duhet të zgjidhni portën e lidhur me arduino -në tuaj marrëse nga menyja e mjeteve IDE tani dhe të ekzekutoni python.

Mos e hapni monitorin serik ndërsa jeni duke e bërë këtë, python nuk mund ta lexojë serialin ndërsa monitori është i hapur. Pasi python është i hapur thërrisni funksionin e pythonprint si më poshtë.

pythonlogger.pythonprint ()

Kjo do të fillojë mbledhjen e të dhënave nga porta serike arduino. Nëse hapni dosjen tuaj python tani, do të shihni që është krijuar një skedar i ri.csv i quajtur "test_data.csv", që mban të gjithë informacionin e kohës dhe temperaturës. Ky do të jetë skedari në të cilin Matlab hyn për të bërë të gjitha llogaritjet dhe kontrollet e tij.

Një paralajmërim tjetër: mos e hapni test_data.csv ndërsa të dhënat po qasen ose shkruhen. Nëse e bëni këtë, python dhe/ose kodi Matlab do të rrëzohen dhe do të kthejnë një gabim

Nëse vendosni të hapni.csv më vonë, do të vini re se kolona e kohës është vetëm një varg shumë i madh numrash. Kjo ndodh sepse komanda time.time () shkruan numrin e sekondave që nga 1 janari 1970.

Në këtë pikë pitoni duhet të printojë të dhënat e temperaturës që po lexon nga porti serik. Duhet të duket diçka si:

b'25.03 '/r/n

Mos u shqetësoni për karakteret shtesë, kodi Matlab indeksohet për pesë vlerat e mesme në kolonën e dytë të skedarit.csv.

Tani që të gjithë programet mbështetëse janë duke punuar dhe të dhënat po grumbullohen, ne mund të fillojmë të mbledhim të dhëna GPS nga programi celular Matlab që ishte konfiguruar më herët dhe të ekzekutojmë kodin GUI të Matlab. Pasi të jeni në skedën e sensorit të Matlab celular, zgjidhni GPS dhe shtypni butonin e fillimit.

Nëse jeni fillestar në Matlab celular referojuni hapit 4 dhe shikoni pamjet e ekranit më lart. Nëse keni ende probleme, sigurohuni që jeni lidhur me kompjuterin që keni zgjedhur më herët (në skedën e cilësimeve) dhe përdorni lidhjen nga komanda "lidhës i ndezur" për të kontrolluar që Matlab është në internet.

Hapi 6: Përdorimi i Programit

Duke përdorur Programin
Duke përdorur Programin

Ka shumë gjëra që po ndodhin në sfond në këtë sistem. Të dhënat e temperaturës po mblidhen dhe regjistrohen nga arduino dhe pyton, Matlab po mbledh të dhëna GPS nga telefoni juaj dhe po kryen llogaritjet për të parë se sa larg jeni nga shtëpia juaj dhe vendos termostatin tuaj bazuar në të gjithë atë informacion. Aty ku hyni po jep preferencat tuaja.

Drejtoni kodin GUI Matlab. Hapni skedarin.mlapp dhe shikoni skedën e parë. Ju do të duhet të mblidhni informacionin për këtë vetë, efikasiteti dhe fuqia e njësisë tuaj të ngrohjes/ftohjes zakonisht mund të gjenden në vetë njësinë, dhe shpejtësia juaj mesatare është vetëm një vlerësim i mirë se sa shpejt vozitni. Pasi të futen vlerat, shtypni butonin "Run Diagnostic" dhe programi kontrollon termostatin tuaj për të mbledhur informacione për shtëpinë tuaj.

Kaloni në menunë tjetër.

Hapi 7: Kontrolli i temperaturës

Kontrolli i temperaturës
Kontrolli i temperaturës

Kjo menu ju lejon të zgjidhni temperaturën e preferuar kur jeni në shtëpi dhe jashtë. Vendosni Temperaturën #1 në temperaturën tuaj të rehatshme, dhe Temperaturën #2 në një vlerë të lartë ose të ulët që është e sigurt për shtëpinë tuaj (sigurohuni që të mos e vendosni në 100 gradë ndërsa keni qen në shtëpi, etj.).

Hapi 8: Të dhënat historike

Data historike
Data historike

Më në fund mund të shikoni sa para kurseni duke përdorur kontrollin automatik. Kjo në thelb vlerëson se sa energji do të përdoret nëse termostati juaj do të vendoset në temperaturën tuaj të preferuar 24/7, pastaj zbret energjinë tuaj aktuale të përdorur.

Fat i mirë ndërtimi.

Recommended: