Satura rādītājs:

Autostat: tālvadības termostats: 8 soļi (ar attēliem)
Autostat: tālvadības termostats: 8 soļi (ar attēliem)

Video: Autostat: tālvadības termostats: 8 soļi (ar attēliem)

Video: Autostat: tālvadības termostats: 8 soļi (ar attēliem)
Video: Насколько надёжна 20-клапанная "чётверка"? Все слабые места легендарного 1.8 20v (без турбо). 2024, Jūlijs
Anonim
Autostats: tālvadības termostats
Autostats: tālvadības termostats

Jautājums, kuru jūs, iespējams, uzdodat, ir "kāpēc jūs izgatavojat citu tālvadības termostatu?"

Atbilde uz šo jautājumu ir tāda, ka man vajadzēja, un tirgus viedie termostati ir pārāk dārgi.

Godīgs brīdinājums, šī ir koncepcijas pierādījuma konstrukcija, kurai būtu vajadzīgas dažas papildu izejas, lai faktiski kontrolētu jūsu termostatu, bet kodols ir vietā un to var mainīt atkarībā no jūsu konkrētajiem apstākļiem. Turklāt tas joprojām ir darbs, tāpēc gaidiet dažus atjauninājumus un izmaiņas (īpaši Matlab kodā)

Lai sāktu, vēlos jūs brīdināt. Tam ir vajadzīgas trīs programmas (viena no tām ir diezgan dārga), diezgan daudz bibliotēku un programmu atbalsta pakotnes, un jums ir jāliek tām savstarpēji runāt. Tās ir galvassāpes. Ar šo brīdinājumu jūs varat sākt ar materiāliem.

Aparatūra

  • arduino nano
  • arduino uno (vai cits nano, es vienkārši izmantoju uno, jo man bija viens, kas atrodas apkārt)
  • dažādi džemperu kabeļi, daži vīriešu/vīriešu un divi trīs vīriešu/sieviešu džemperu komplekti
  • 433 MHz radiofrekvences (RF) uztvērējs, es izmantoju MX-05V
  • 433MHz RF raidītājs, es izmantoju MX-FS-03V
  • DHT11 augstas precizitātes termometrs un mitruma sensors (tas, ko izmantoju, ir uzstādīts uz trīs zaru mikroshēmas ar jau uzstādītiem nepieciešamajiem rezistoriem)
  • maizes dēlis (ja nevēlaties to visu lodēt kopā)
  • tālrunis ar GPS (šajā gadījumā iPhone 8, bet esmu izmantojis arī Galaxy S8)
  • 3D drukāts konteiners (nav īsti nepieciešams, jebkurš konteiners darbosies vai vispār nebūs)

Programmatūra

  • Matlab no MathWorks (man ir izdevums 2018a, bet esmu izmantojis arī 2017a-b izdevumus)
  • Jūsu tālrunī ir instalēts Matlab mobile
  • arduino atbalsta pakotne Matlab
  • iPhone sensora pakete Matlab
  • arduino IDE
  • RadioHead atbalsta pakotnes un arduino IDE bibliotēkas
  • DHT11 bibliotēka arduino IDE
  • python 3.7 (pārliecinieties, vai ir instalēta pastāvīgā bibliotēka vai sērijveida bibliotēka, kādai tai jābūt versijai 3.4 vai jaunākai)

1. solis: salieciet to visu kopā

Visu saliekot kopā
Visu saliekot kopā
Visu saliekot kopā
Visu saliekot kopā
Visu saliekot kopā
Visu saliekot kopā

Vispirms es ieteiktu jums veikt dažas arduino apmācības, kas saistītas ar RF raidītājiem, lai pārliecinātos, ka jūsu daļas darbojas un vadi ir pareizi. Ir pieejami daudzi piemēri, ieskaitot kodu (tiem no mums, kuri par C un C ++ maz vai neko nezina).

Izpildiet zemāk redzamās elektroinstalācijas shēmas, lai saliktu arduino un sensorus. Vienu lietu, kas jāpatur prātā, savienojot arduinos, ir tas, ka izmantotie datu porti nav nepieciešami, bet ieteicami.

JA jūs nolemjat mainīt izmantotos datu portus, jums vienkārši jānosaka tapas savā kodā. Personīgi es domāju, ka ir vieglāk ievērot noklusējuma portus, kurus atpazīst arduino bibliotēkas.

Un, lai būtu skaidrs, nano un uno ir savstarpēji aizvietojami, bet es izmantoju nano projekta raidītāja pusē, lai samazinātu temperatūras monitora izmēru.

Sānu piezīme: zaļā konstrukcija, kas satur nano, ir 3D drukāts konteiners.

2. solis: uztvērējs

Uztvērējs
Uztvērējs

3. solis: raidītājs

Raidītājs
Raidītājs

4. solis: kods

Kad elektroinstalācija ir pabeigta, jums ir jāieslēdz visas programmas un jāinstalē bibliotēkas (ja vēl neesat to izdarījis), es tikai pieņemu, ka jums tas ir, jums jāuzsāk Matlab un jāpalaiž iPhone atbalsta pakotne. Gan tālrunim, gan Matlab pašlaik ir jābūt vienā wifi tīklā.

Matlab komandu logā ierakstiet:

savienotājs ir ieslēgts

Tas liks jums ievadīt piecu ciparu paroli, kuru izmantosit, lai izveidotu savienojumu ar savu iPhone. Noteikti atcerieties paroli. Kad esat ievadījis paroli, Matlab parādīs kādu informāciju, ieskaitot jūsu IP adresi. Izmantojiet to nākamajā darbībā, kas nāk no Matlab mobile palīdzības izvēlnes "Darba sākšana ar sensoriem" norādījumiem.

  • Lai nosūtītu sensoru datus uz MathWorks Cloud vai datoru, rīkojieties šādi:
  • Ja sūtāt sensora datus uz datoru un ja tas vēl nav instalēts, lejupielādējiet un instalējiet MATLAB atbalsta pakotni Apple iOS sensoriem MATLAB.
  • Savienojiet MATLAB Mobile ar MathWorks Cloud vai datoru, izmantojot iestatījumus.
  • Izveidojiet mobiledev objektu MATLAB (datorā), piemēram: >> m = mobiledev
  • Atlasiet vienu vai vairākus sensorus un pieskarieties Sākt.

Lai lokāli reģistrētu sensoru datus savā ierīcē, rīkojieties šādi:

  • Ekrānā Sensori atlasiet sensorus, no kuriem vēlaties apkopot datus.
  • Izvēlieties Žurnāls.
  • Pieskarieties pogai Sākt.
  • Kad esat pabeidzis datu vākšanu, pieskarieties pogai Apturēt.
  • Uznirstošajā logā ievadiet sensora žurnāla nosaukumu.
  • Ja nepieciešams, atkārtojiet 1. līdz 5. darbību.

Šī sadaļa tiks atsaukta 4. daļā, tāpēc vēl nav jāsāk datu vākšana. Vienkārši turiet tālruni pie rokas un sagatavojiet Matlab mobilo.

Tagad jums kaut kur datorā ir jāizveido mape, kurā var ievietot Matlab koda failus. Jums būs četri atsevišķi faili, divi fona funkcijām (.m faili) un viens Matlab koda fails GUI (.mlapp),.

Pirmais ir jūsu mājas gaisa masas aprēķins (tas ļauj Matlab uzzināt, cik ilgs laiks nepieciešams jūsu mājas sildīšanai/atdzesēšanai)

funkcija [masa] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = pulkstenis; time_end = 0, kamēr runCalc <= 1, ja T_ins == (Tmp_start+(7*Chng_dir)) time_end = pulkstenis; PwrCntr = 0; runCalc = 0; cits PwrCntr = P_out; runCalc = runCalc+0.1 beigu beigu laiks_diag = time_end-time_start Mass = (P_out*time_diag)/7.035

Un otrais:

funkcija [laika zīmogi, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; i = 1; kamēr AutoStat == 1 time_start = pulkstenis; m = mobiledev; t = csvread ('vērtības.csv', 0, 1); t = t (i); laika zīmogi = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; formāts longg; %hasrsine formula attāluma aprēķināšanai, pamatojoties uz platumu un %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m.latitude).*(sind ((m. Longitude-Lon_in)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %aprēķina jūsu laiku atgriezties time_rtn = (Dist-r_pref)./ ātrums; %aprēķina vajadzīgo termostata iestatījumu, pamatojoties uz %gaisa kondicionētāja un mājas masas strāvas padeves pārtraukumu. calcTmp_set = ((-1.*P_out.*time_rtn)./ (masa.*(1.005)))+T_pref; %nosaka, vai pašreizējais termostata iestatījums ir jāmaina, ja apaļš (calcTmp_set) ~ = apaļš (t) timeACon = pulkstenis; PwrCntr = P_out; timeACon = timeACon + pulkstenis-laika_starts; izmaksas = P_out*timeACon*likme; cits PwrCntr = 0 beigu laika zīmogi (beigas+1, [1: 6]) = pulkstenis; pwr_usage (beigas+1, 1) = PwrCntr; pauze (5) beigas beigas

Abi šie faili ir Matlab funkcijas. Jums nebūs tiem jāpiekļūst, ja vien neplānojat tos modificēt īpašām vajadzībām, jo zvanīsit no GUI. Saglabājiet abus failus atsevišķi, pirmo kā CalcMass.m un otro kā dist_cntrl.m, tie būs nosaukumi, kurus GUI kods izmanto, lai izsauktu funkcijas, tādēļ, ja nevēlaties rediģēt atlikušo kodu zemāk, nosaukšanas konvencija.

Pirms nokļūstat GUI kodā, jums ir jāatver Matlab lietotņu noformētājs, kuru varat atvērt, pārvietojoties izvēlnes joslā Matlab, vai ar manu iecienītāko metodi, kas Matlab komandu logā ievada šādu komandu:

appdesigner

Kad lietotņu noformētājs ir atvērts, atveriet jaunu lietotnes failu (.mlapp) un koda logā izdzēsiet visu noklusējuma kodu. Pēc tam to visu nomainiet ar sekojošo un nospiediet palaist pogu.

classdef Control_1 <matlab.apps. AppBase % Rekvizīti, kas atbilst lietotnes komponentu īpašībām (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Poga 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 matlabLabel. ui.control. Spinner temperatūra2SpinnerLabel 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.

metodes (piekļuve = privāta)

% Mainīta vērtība: tempnow

funkcija tempnowValueChanged (lietotne, notikums) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0, ja i = garums (temp) app. Gauge. Value = temp (i) pause (1) end end

% Mainīta vērtība: TemperatureDirectionSwitch

funkcija TemperatureDirectionSwitchValueChanged (lietotne, notikums) way = app. TemperatureDirectionSwitch. Value; veids = uint8 (ceļš) ceļš = garums (ceļš), ja ceļš == 4 Chng_dir = -1; cits Chng_dir = 1; beigas Chng_dir; beigas

% Mainīta vērtība: DDFH

funkcija DDFHValueChanged (lietotne, notikums) r_pref = app. DDFH. Value; beigas

Funkcija % mainīta vērtība: AvgLocalSpeedEditField

funkcija AvgLocalSpeedEditFieldValueChanged (lietotne, notikums) ātrums = app. AvgLocalSpeedEditField. Value; beigas

% Mainīta vērtība: PowerOutputRatingEditField

funkcija PowerOutputRatingEditFieldValueChanged (lietotne, notikums) vērtība = app. PowerOutputRatingEditField. Value; beigas

% Vērtības mainītā funkcija: EnergyEfficiencyRatingEditField

funkcija EnergyEfficiencyRatingEditFieldValueChanged (lietotne, notikums) vērtība = app. EnergyEfficiencyRatingEditField. Value; beigas

% Pogas nospiesta funkcija: RunDiagnosticButton

funkcija RunDiagnosticButtonPushed (lietotne, notikums) way = app. TemperatureDirectionSwitch. Value; veids = uint8 (ceļš) ceļš = garums (ceļš), ja ceļš == 4 Chng_dir = -1; cits Chng_dir = 1; beigas T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

beigas

% Vērtības mainītā funkcija: Temperature1Spinner

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

% Vērtības mainītā funkcija: Temperature2Spinner

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

% Mainīta vērtība: slēdzis

funkcija SwitchValueChanged (lietotne, notikums) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; ātrums = m. Ātrums; masa = 200; ātrums = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, ātrums, masa) beigas beigas

% Lietotnes inicializēšana un uzbūve

metodes (piekļuve = privāta)

% Izveidot UIFigure un komponentus

funkcija createComponents (lietotne)

% Izveidot UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'UI attēls';

% Izveidot cilņu grupu

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

% Izveidot SetupTab

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Iestatīšana';

% Izveidot pogu RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (lietotne, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'treknraksts'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Palaist diagnostiku';

% Izveidot EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'labi'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energoefektivitātes novērtējums';

% Izveidot EnergyEfficiencyRatingEditField

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

% Izveidojiet PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'labi'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Jaudas jauda';

% Izveidojiet PowerOutputRatingEditField

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

% Izveidot AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'labi'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Vid. Vietējais ātrums”;

% Izveidot AvgLocalSpeedEditField

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

% Izveidojiet DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'labi'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Vēlamais attālums'; 'no mājas'};

% Izveidot DDFH

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

% Izveidot TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'centrs'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Temperatūras virziens';

% Izveidot TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'slider'); app. TemperatureDirectionSwitch. Items = {'Up', 'Down'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (lietotne, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Uz augšu';

% Izveidot cilni TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Iestatījumi';

% Izveidot Temperature1SpinnerLabel

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

% Izveidot Temperature1Spinner

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

% Izveidot Temperature2SpinnerLabel

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

% Izveidot Temperature2Spinner

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

% Izveidot slēdzi

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

% Izveidot EditFieldLabel

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

% Izveidot tempnow

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

% Izveidot GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'centrs'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Mērītājs';

% Izveidot mērierīci

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

% Izveidot SavingsTab

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Ietaupījumi';

% Izveidot 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];

% Izveidot ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'centrs'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Šī mēneša izmaksas';

% Izveidot ThisMonthCostEditField

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

% Izveidojiet TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'labi'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Kopējais ietaupījums';

% Izveidojiet TotalSavingsEditField

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

metodes (piekļuve = publiska)

% Konstruēt lietotni

funkcija app = Control_1

% Izveidot un konfigurēt komponentus

createComponents (lietotne)

% Reģistrējiet lietotni lietotņu noformētājā

registerApp (lietotne, lietotne. UIFigūra)

ja nargout == 0

skaidrs lietotnes beigas

% Kods, kas tiek izpildīts pirms lietotnes dzēšanas

funkcija dzēst (lietotne)

% Dzēst UIFigure, kad lietotne tiek dzēsta

dzēst (app. UIFigure) beigu beigas

Jūs, iespējams, saņemsit kļūdu, kas nav problēma. Vienkārši aizveriet GUI, kas tika ģenerēts pēc nospiešanas, mēs pēc brīža apkoposim pārējās nepieciešamās programmas un datus.

Tā kā Matlab ir iestatīts, mēs varam pāriet uz python. Vispirms palaidiet python programmu, izmantojot komandu uzvedni (operētājsistēmā Windows) vai izmantojot.exe failu savā python mapē. Pārliecinieties, vai ir instalētas visas atbilstošās bibliotēkas, izmantojot komandu importēt.

importēt sēriju

importēšanas laiks importēt csv

Šīs ir trīs bibliotēkas, kas jums jāsāk, lai gan drīz mēs izveidosim savu bibliotēku. Ja ar šīm komandām radās kāda veida kļūda, atgriezieties un pārliecinieties, vai bibliotēkas ir instalētas un atrodas mapē Lib mapē python. Tālāk mēs izveidosim to, ko es saucu par pythonlogger bibliotēku. Šis nosaukums nav nepieciešams, jūs to varat saukt, kā vien vēlaties, tas ir tikai jūsu izveidotā python faila (.py) nosaukums.

Atveriet teksta redaktoru, es izmantoju Sublime3, bet piezīmju grāmatiņa darbojas lieliski, un ievadiet šo kodu.

def pythonprint ():

importēt pythonlogger importēt sērijas importēšanas laiku importēt csv ser = serial. Serial ('COM8') # COM8 ir arduino seriālais ports, iespējams, katram lietotājam tas būs atšķirīgs, ti, pārbaudiet savu seriālo portu arduino IDE ser.flushInput (), kamēr Taisnība: mēģiniet: ser_bytes = ser.readline () print (ser_bytes) ar atvērtu ("test_data.csv", "a"), jo f: írnieks = csv.writer (f, norobežotājs = ",") # nosaka datus uz jāievada kā komatu atdalīts rakstnieks.rakstītājs ([laiks.laiks (), ser_bytes]) #raksta datus uz testa_data.csv, izņemot: print ("Kļūda") pārtraukums

Saglabājiet tekstu kā "ievietojiet vajadzīgās bibliotēkas nosaukumu".py Lib mapē. Ņemiet vērā arī to, ka def pythonprint () rinda definē tās funkcijas nosaukumu, kurai zvanīsit, tāpēc varat to mainīt, lai definētu def "ievietojiet savai funkcijai vajadzīgo nosaukumu" (). Kad bibliotēka ir saglabāta, mēs varam pāriet uz arduino kodu.

Atveriet arduino IDE un atveriet divus jaunus skices logus. Saglabājiet šos divus skiču failus ērtā vietā, šo failu nosaukumam nav nozīmes. Pēc tam izdzēsiet visu noklusējuma kodu un nomainiet to ar šādu.

Saņemošajam arduino:

#iekļaut

#include #include #include // tas netiek izmantots, bet nepieciešams, lai apkopotu RH_ASK draiveri; structure dataStruct {pludiņa temp; } myData; void setup () {Serial.begin (9600); // Atkļūdošana tikai tad, ja (! Driver.init ()) Serial.println ("init neizdevās"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Nebloķēšana {int i; // Ziņojums ar labu kontrolsummu ir saņemts, izmetiet to. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Sērijas nospiedums (myData.temp); }}

P. S. //driver.printBuffer…. utt rinda ir testa kods. Jums par to nav jāuztraucas, ja vien jūs neveicat diagnostiku un nevēlaties noskaidrot, vai jūs faktiski saņemat datus.

Raidītājam arduino

#iekļaut

#include #include #include // tas netiek izmantots, bet nepieciešams, lai apkopotu #include #include int pin = 4; DHT11 dht11 (tapa); RH_ASK vadītājs; structure dataStruct {pludiņa temp; } myData; baits tx_buf [sizeof (myData)] = {0}; // Tātad argumenti ir bitu pārraides ātrums, pārraida pin (tx), // saņem pin (rx), ppt pin, isInverse. Pēdējie 2 netiek izmantoti.void setup () {Serial.begin (9600); // Atkļūdošana tikai tad, ja (! Driver.init ()) Serial.println ("init neizdevās"); } void loop () {int err; pludiņa temperatūra, humi; ziņa uint8_t; ja ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); baits zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // apturēt izpildi, līdz visi dati ir nosūtīti kavēšanās (2000); // pagaidiet 2 sekundes}}

Ar iekļaušanas komandām vajadzētu pietikt, taču, ja vēlāk rodas problēmas ar datu pārsūtīšanu, iespējams, vēlēsities meklēt RadioHead bibliotēkas mapē un iekļaut atlikušos failu nosaukumus tādā pašā formātā.

5. solis: lai tas darbotos

Lai tas darbotos
Lai tas darbotos
Lai tas darbotos
Lai tas darbotos
Lai tas darbotos
Lai tas darbotos

Tagad, kad mums ir viss kods kopā un arduino ir samontēts, mēs varam savienot arduino ar datoru un ielādēt kodu. Pārliecinieties, vai saņēmēja un pārraides mikrokontrolleriem esat nosūtījis pareizo kodu. Jūs varat pieslēgt abus arduinos datoram, kamēr tas darbojas, taču jums ir jāpārliecinās, vai uz priekšu ir izvēlēts pareizais ports, vai arī varat atvienot pārraidošo arduino un barot to no cita avota, tiklīdz kods ir augšupielādēts.

Runājot par to, tagad IDE rīku izvēlnē jāizvēlas ports, kas ir savienots ar jūsu saņemto arduino, un palaidiet python.

Neatveriet seriālo monitoru, kamēr to darāt, python nevar nolasīt sēriju, kamēr monitors ir atvērts. Kad python ir atvērts, izsauciet pythonprint funkciju šādi.

pythonlogger.pythonprint ()

Tas sāks datu vākšanu no arduino seriālā porta. Ja tagad atverat mapi python, redzēsit, ka ir izveidots jauns.csv fails ar nosaukumu “test_data.csv”, kurā ir visa informācija par laiku un temperatūru. Šis būs fails, kuram Matlab piekļūst, lai veiktu visus aprēķinus un vadīklas.

Vēl viens brīdinājums: neatveriet test_data.csv, kamēr dati tiek piekļūti vai rakstīti. Ja to darīsit, pitons un/vai Matlab kods avarēs un nosūtīs atpakaļ kļūdu

Ja tomēr nolemjat atvērt.csv vēlāk, pamanīsit, ka laika sleja ir tikai ļoti liela skaitļu virkne. Tas ir tāpēc, ka komanda time.time () raksta sekunžu skaitu kopš 1970. gada 1. janvāra.

Šajā brīdī python vajadzētu drukāt temperatūras datus, ko tā nolasa no seriālā porta. Tam vajadzētu izskatīties apmēram šādi:

b'25.03 '/r/n

Neuztraucieties par papildu rakstzīmēm. Matlab kods indeksē vidējās piecas vērtības.csv faila otrajā kolonnā.

Tagad, kad visas atbalsta programmas darbojas un dati tiek apkopoti, mēs varam sākt vākt GPS datus no iepriekš iestatītās Matlab mobilās programmas un palaist Matlab GUI kodu. Kad esat Matlab mobile sensora cilnē, atlasiet GPS un nospiediet sākuma pogu.

Ja esat jauns Matlab Mobile lietotājs, skatiet 4. darbību un apskatiet iepriekš redzamos ekrānuzņēmumus. Ja jums joprojām ir problēmas, pārliecinieties, vai esat pievienojies datoram, kuru izvēlējāties iepriekš (iestatījumu cilnē), un izmantojiet saiti no komandas "savienotājs ieslēgts", lai pārbaudītu, vai Matlab ir tiešsaistē.

6. darbība: programmas lietošana

Programmas izmantošana
Programmas izmantošana

Šajā sistēmā fonā notiek vairākas lietas. Arduino un Pyton vāc un reģistrē temperatūras datus, Matlab apkopo GPS datus no jūsu tālruņa un veic aprēķinus, lai redzētu, cik tālu jūs esat no savas mājas, un iestatot termostatu, pamatojoties uz visu šo informāciju. Tas, kur jūs ieradāties, sniedz jūsu vēlmes.

Palaidiet Matlab GUI kodu. Atveriet.mlapp failu un apskatiet pirmo cilni. Jums pašam būs jāapkopo informācija, apkures/dzesēšanas iekārtas efektivitātes un jaudas novērtējumu parasti var atrast pašā iekārtā, un jūsu vidējais ātrums ir tikai labs aprēķins, cik ātri jūs braucat. Kad vērtības ir ievadītas, nospiediet pogu "Palaist diagnostiku", un programma kontrolē jūsu termostatu, lai apkopotu informāciju par jūsu māju.

Pārejiet uz nākamo izvēlni.

7. solis: temperatūras kontrole

Temperatūras kontrole
Temperatūras kontrole

Šī izvēlne ļauj jums izvēlēties vēlamo temperatūru, atrodoties mājās un prom. Iestatiet 1. temperatūru savai komfortablajai temperatūrai un 2. temperatūrai augstu vai zemu vērtību, kas ir droša jūsu mājām (pārliecinieties, ka neesat iestatījis to līdz 100 grādiem, kamēr mājās ir suņi utt.).

8. darbība. Vēsturiskie dati

Vēsturiskie dati
Vēsturiskie dati

Visbeidzot, izmantojot automātisko vadību, varat noskatīties, cik daudz naudas ietaupāt. Tas būtībā novērtē, cik daudz enerģijas tiktu patērēts, ja jūsu termostats būtu iestatīts uz vēlamo temperatūru 24 stundas diennaktī, pēc tam atņemtu faktisko izmantoto enerģiju.

Lai veicas celtniecībā.

Ieteicams: