Satura rādītājs:
- 1. solis: salieciet to visu kopā
- 2. solis: uztvērējs
- 3. solis: raidītājs
- 4. solis: kods
- 5. solis: lai tas darbotos
- 6. darbība: programmas lietošana
- 7. solis: temperatūras kontrole
- 8. darbība. Vēsturiskie dati
Video: Autostat: tālvadības termostats: 8 soļi (ar attēliem)
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:57
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ā
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
3. solis: 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
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
Š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
Šī 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
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:
Tālvadības pults slēdža tālvadības pults + palaidējs: 6 soļi (ar attēliem)
Tālvadības pults slēdža tālvadības pults + aktivizētājs: šī pedāļa tālvadības pults ir lieliski piemērota, lai apturētu animatorus, fotoattēlu arhivētājus, emuāru autorus un profesionāļus, kuri visu laiku nevar sasniegt savas kameras aizvara pogu vai kuriem ātri jāstrādā pie galda ar pievienotu kameru. augstas virs galvas. 2020. gada decembra atjauninājums: E
Televizora tālvadības pults kļūst par RF tālvadības pulti -- NRF24L01+ apmācība: 5 soļi (ar attēliem)
TV tālvadības pults kļūst par RF tālvadības pulti || NRF24L01+ apmācība: Šajā projektā es jums parādīšu, kā es izmantoju populāro nRF24L01+ RF IC, lai bezvadu režīmā pielāgotu LED sloksnes spilgtumu, izmantojot trīs bezjēdzīgas TV tālvadības pults pogas. Sāksim
Viedais termostats ESP8266: 6 soļi (ar attēliem)
Viedais termostats ESP8266: Bienvenue sur ce nouvel raksts. On se retrouve aujourd'hui pour un projet que j'ai réalisé durant tout ce temps libre que m'a offert le encinement. Ce projet m'a été proposé par mon père, en effet il vient de déménager dans une vieille maison et l
HestiaPi Touch - atvērts viedais termostats: 9 soļi (ar attēliem)
HestiaPi Touch - atvērts viedais termostats: Par HestiaPi Touch HestiaPi Touch ir pilnīgi atvērtā pirmkoda viedais termostats jūsu mājām. Visi digitālie faili un informācija ir pieejami zemāk un mūsu galvenajā vietnē. Ar to jūs varat kontrolēt savas mājas temperatūru, relatīvo mitrumu un atmosfēru
Olympus Evolt E510 tālvadības kabeļa atbrīvošana (2. versija ar automātisko fokusēšanu uz tālvadības pulti): 6 soļi (ar attēliem)
Olympus Evolt E510 tālvadības kabeļa atbrīvošana (2. versija ar automātisko fokusēšanu uz tālvadības pulti): Vakar es uzbūvēju vienkāršu vienas pogas tālvadības pulti savam Olympus E510. Lielākajai daļai kameru ir aizvara atbrīvošanas poga (tā, kuru nospiežat, lai uzņemtu attēlu), kurai ir divi režīmi. Ja poga tiek viegli nospiesta, kamera automātiski fokusējas un mēra gaismu