Talaan ng mga Nilalaman:
- Hakbang 1: Pagsasama-sama sa Lahat ng Ito
- Hakbang 2: Tagatanggap
- Hakbang 3: Transmitter
- Hakbang 4: Ang Code
- Hakbang 5: Ginagawa Ito
- Hakbang 6: Paggamit ng Program
- Hakbang 7: Pagkontrol sa Temperatura
- Hakbang 8: Makasaysayang Data
Video: Autostat: isang Remote Therostat: 8 Hakbang (na may Mga Larawan)
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:14
Ang tanong na marahil ay tinatanong mo ay "bakit ka gumagawa ng isa pang malayong termostat?"
Ang sagot sa katanungang iyon ay, kinailangan ko, at ang market smart termostat ay masyadong mahal.
Makatarungang babala, ito ang "proof-of-concept" build na mangangailangan ng ilang dagdag na output upang aktwal na makontrol ang iyong termostat, ngunit ang core ay nasa lugar at maaaring mabago depende sa iyong tukoy na pangyayari. Gayundin, gumagana pa rin ito, kaya asahan ang ilang mga pag-update at pagbabago (lalo na sa Matlab code)
Upang makapagsimula nais kong babalaan ka, nangangailangan ito ng tatlong mga programa (ang isa sa mga ito ay medyo mahal), ilang mga aklatan at mga suportang package para sa mga programa, at kailangan mong makipag-usap silang lahat sa isa't isa. Ang sakit ng ulo nito. Sa pamamagitan ng babalang iyon sa labas ng paraan ay hinahayaan na magsimula sa mga materyales.
Hardware
- arduino nano
- arduino uno (o ibang nano, ginamit ko lang ang uno dahil mayroon akong isang pagtula sa paligid)
- sari-saring jumper cables, ilang male / male at dalawang set ng tatlong sumali na lalaki / babaeng jumpers
- 433MHz radio frequency (RF) receiver, ginamit ko ang MX-05V
- 433MHz RF transmitter, ginamit ko ang MX-FS-03V
- DHT11 mataas na katumpakan thermometer at kahalumigmigan sensor (ang ginamit ko ay naka-install sa isang tatlong prong chip na may mga kinakailangang resistors na naka-install)
- breadboard (kung hindi mo nais na maghinang ito nang magkasama)
- isang telepono na may GPS (iPhone 8 sa kasong ito, ngunit gumamit din ako ng isang Galaxy S8)
- 3D na lalagyan na naka-print (hindi talaga kinakailangan, ang anumang lalagyan ay gagana o wala sa lahat)
Software
- Matlab mula sa MathWorks (Mayroon akong edisyon ng 2018a, ngunit gumamit din ako ng mga edisyon ng 2017a-b)
- Naka-install ang Matlab mobile sa iyong telepono
- package ng suporta ng arduino para sa Matlab
- Package ng sensor ng iPhone para sa Matlab
- arduino IDE
- Sinusuportahan ng RadioHead ang mga pakete at aklatan ng arduino IDE
- DHT11 library para sa arduino IDE
- python 3.7 (tiyaking naka-install ang pyserial library o serial library, na dapat para sa bersyon 3.4 o mas bago)
Hakbang 1: Pagsasama-sama sa Lahat ng Ito
Una sa lahat iminumungkahi ko sa iyo na gumawa ng ilang mga arduino tutorial na pakikitungo sa mga RF transmitter upang matiyak lamang na gumagana ang iyong mga bahagi at tama ang mga kable. Mayroong maraming mga halimbawa na magagamit, kasama ang code na kasama (para sa amin doon na walang alam tungkol sa C at C ++).
Sundin ang mga diagram ng mga kable sa ibaba upang makuha ang arduino at mga sensor na binuo. Ang isang bagay na dapat tandaan habang ang pag-kable ng mga arduino ay ang mga data port na ginamit ko ay hindi kinakailangan ngunit inirerekumenda.
KUNG magpasya kang baguhin ang mga data port na ginagamit mo, kailangan mo lamang tukuyin ang mga pin sa iyong code. Sa personal, sa palagay ko mas madaling manatili sa mga default na port na kinikilala ng mga library ng arduino.
At upang maging malinaw lamang, ang nano at uno ay mapagpapalit, ngunit ginamit ko ang nano para sa bahagi ng transmiter ng proyekto upang mabawasan ang laki ng monitor ng temperatura.
Paalala sa gilid: ang berdeng contraption na humahawak sa nano ay ang 3D na lalagyan na naka-print.
Hakbang 2: Tagatanggap
Hakbang 3: Transmitter
Hakbang 4: Ang Code
Kapag natapos na ang mga kable kailangan mong makuha ang lahat ng mga programa na tumatakbo at naka-install ang mga aklatan (kung hindi mo pa nagagawa), ipagpapalagay ko na mayroon ka, kailangan mong simulan ang Matlab at patakbuhin ang suportang iPhone package. Parehong ang iyong telepono at Matlab ay kailangang nasa parehong wifi network sa puntong ito.
Sa window ng utos ng Matlab isulat:
konektor sa
Susubukan ka nito na magpasok ng isang limang digit na password na gagamitin mo upang kumonekta sa iyong iPhone. Tiyaking naaalala mo ang password. Kapag naipasok mo na ang password ay magpapakita ang Matlab ng ilang impormasyon, kabilang ang iyong IP address. Gamitin ito sa susunod na hakbang, na nagmumula sa mga tagubilin mula sa menu ng tulong na "Pagsisimula sa mga sensor" sa Matlab mobile.
- Sundin ang mga hakbang na ito upang magpadala ng data ng sensor sa MathWorks Cloud o isang computer:
- Kung nagpapadala ka ng data ng sensor sa isang computer at kung hindi pa ito naka-install, i-download at i-install ang MATLAB Support Package para sa Apple iOS Sensors sa MATLAB.
- Ikonekta ang MATLAB Mobile sa MathWorks Cloud o isang computer gamit ang Mga Setting.
- Lumikha ng mobiledev object sa MATLAB (sa iyong computer), halimbawa: >> m = mobiledev
- Pumili ng isa o higit pang mga sensor at i-tap ang Magsimula.
Sundin ang mga hakbang na ito upang mag-log ng data ng sensor nang lokal sa iyong aparato:
- Sa screen ng Sensors, piliin ang mga sensor na nais mong kolektahin ang data.
- Piliin ang Mag-log.
- I-tap ang Start button.
- Kapag tapos ka nang mangolekta ng data, tapikin ang pindutan ng Ihinto.
- Sa pop-up, ipasok ang pangalan ng sensor log.
- Ulitin ang mga hakbang 1-5 kung kinakailangan.
Ang seksyong ito ay babanggitin sa Bahagi 4, kaya't hindi na talaga kailangang magsimulang mangolekta ng data. Panatilihing madaling gamitin ang iyong telepono at handa ang Matlab mobile.
Ngayon kailangan mong lumikha ng isang folder sa isang lugar sa iyong computer upang maipakita ang mga file ng Matlab code. Magkakaroon ka ng apat na magkakahiwalay na mga file, dalawa para sa mga pagpapaandar sa background (.m file) at isang file ng Matlab code para sa GUI (.mlapp),.
Una ay ang pagkalkula ng masa para sa hangin sa iyong bahay (ipinapaalam nito sa Matlab kung gaano katagal ang pag-init / paglamig ng iyong bahay)
pagpapaandar [Mass] = CalcMass (T_ins, P_out, Chng_dir)
runCalc = 0; Tmp_start = T_ins; time_start = orasan; time_end = 0 habang runCalc <= 1 kung T_ins == (Tmp_start + (7 * Chng_dir)) time_end = orasan; PwrCntr = 0; runCalc = 0; iba pa PwrCntr = P_out; runCalc = runCalc + 0.1 end end time_diag = time_end-time_start Mass = (P_out * time_diag) /7.035
At ang pangalawa:
pagpapaandar [timestamp, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, bilis, T_pref, masa)
AutoStat = 1; i = 1; habang AutoStat == 1 time_start = orasan; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); timestamp = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i + 1; format longg; % haversine formula para sa pagkalkula ng distansya batay sa latitude at% longintude a_hav = (sind ((m. Losity-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; Tinantya ni% ang iyong oras upang bumalik time_rtn = (Dist-r_pref)./ bilis; Kinakalkula ni% ang kinakailangang setting ng termostat batay sa power out na put ng% air conditioner at airmass ng bahay. calcTmp_set = ((- 1. * P_out. * time_rtn)./ (mass. * (1.005))) + T_pref; Tinutukoy ng% kung ang kasalukuyang setting ng termostat ay kailangang mabago kung bilog (calcTmp_set) ~ = bilog (t) timeACon = orasan; PwrCntr = P_out; timeACon = timeACon + orasan-oras_start; gastos = P_out * timeACon * rate; iba pa PwrCntr = 0 end timestamp (end + 1, [1: 6]) = orasan; pwr_usage (end + 1, 1) = PwrCntr; i-pause (5) ang dulo ng pagtatapos
Parehong mga file na ito ang mga pagpapaandar ng Matlab. Hindi mo kakailanganing i-access ang mga ito maliban kung plano mong baguhin ang mga ito para sa mga tukoy na pangangailangan, dahil tatawagin mo sila mula sa GUI. Hiwalay na nai-save ang parehong mga file, ang una bilang CalcMass.m at ang pangalawa bilang dist_cntrl.m, iyon ang mga pangalan na ginagamit ng GUI code upang tawagan ang mga pagpapaandar, kaya maliban kung nais mong i-edit ang natitirang code sa ibaba, manatili sa ang kombensiyon sa pagpapangalan.
Bago ka makapunta sa GUI code, kailangan mong buksan ang taga-disenyo ng app para sa Matlab, na maaari mong buksan sa pamamagitan ng pag-navigate sa menu ng Matlab menu, o sa pamamagitan ng aking paboritong pamamaraan na pumapasok sa sumusunod na utos sa window ng utos ng Matlab:
appdesigner
Sa sandaling bukas ang taga-disenyo ng app buksan ang isang bagong file ng app (.mlapp) at tanggalin ang lahat ng default code mula sa window ng code. Pagkatapos palitan ang lahat ng ito sa mga sumusunod at pindutin ang run button.
classdef Control_1 <matlab.apps. AppBase% Mga Katangian na tumutugma sa mga katangian ng mga bahagi ng app (Access = publiko) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnostic Button matlab.ui.control. pindutan EnergyEfficiencyRatingEditFieldLabel matlab.ui.control. Label EnergyEfficiencyRatingEditField matlab.ui.control. NumericEditField PowerOutputRatingEditFieldLabel matlab.ui.control. Label PowerOutputRatingEditField matlab.ui.control. NumericEditField AvgLocalSpeedEditFieldLabel matlab.ui.control. Label AvgLocalSpeedEditField matlab.ui.control. NumericEditField DesiredDistancefromHouseEditFieldLabel matlab.ui.control. Label DDFH matlab.ui.control. NumericEditField TemperatureDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.ui.container. Tab Temperature1SpinnerLabel control 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. sukatin 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 end
mga pamamaraan (Access = pribado)
% Binago ang halaga ng pag-andar: tempnow
pagpapaandar tempnowValueChanged (app, kaganapan) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 para sa i = haba (temp) app. Gauge. Value = temp (i) pause (1) end end
% Binago ang halaga ng pag-andar: TemperatureDirectionSwitch
pag-andar TemperatureDirectionSwitchValueChanged (app, kaganapan) paraan = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = haba (way) kung way == 4 Chng_dir = -1; iba Chng_dir = 1; tapusin ang Chng_dir; magtapos
% Binago ang pagpapaandar ng halaga: DDFH
pagpapaandar DDFHValueChanged (app, kaganapan) r_pref = app. DDFH. Value; magtapos
% Binago ang pagpapaandar na halaga: AvgLocalSpeedEditField
pagpapaandar AvgLocalSpeedEditFieldValueChanged (app, kaganapan) bilis = app. AvgLocalSpeedEditField. Value; magtapos
% Binago ang pagpapaandar na halaga: PowerOutputRatingEditField
function PowerOutputRatingEditFieldValueChanged (app, kaganapan) halaga = app. PowerOutputRatingEditField. Value; magtapos
% Binago ang halaga ng pag-andar: EnergyEfficiencyRatingEditField
pagpapaandar EnergyEfficiencyRatingEditFieldValueChanged (app, kaganapan) halaga = app. EnergyEfficiencyRatingEditField. Value; magtapos
% Button hunhon function: RunDiagnostic Button
pagpapaandar RunDiagnostic ButtonPush (app, kaganapan) paraan = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = haba (way) kung way == 4 Chng_dir = -1; iba Chng_dir = 1; tapusin ang T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)
magtapos
% Binago ang pagpapaandar na halaga: Temperatura1Spinner
function Temperature1SpinnerValueChanged (app, kaganapan) halaga = app. Temperature1Spinner. Value; magtapos
% Binago ang pagpapaandar na halaga: Temperatura2Spinner
function Temperature2SpinnerValueChanged (app, kaganapan) halaga = app. Temperature2Spinner. Value; magtapos
% Binago ang pagpapaandar ng halaga: Lumipat
pagpapaandar SwitchValueChanged (app, kaganapan) m = mobiledev; Lat_in = m. Salamat Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; bilis = m. Bilis; masa = 200; bilis = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, bilis, masa) dulo ng pagtatapos
% Initisasyon at konstruksyon ng app
mga pamamaraan (Access = pribado)
% Lumikha ng UIFigure at mga bahagi
function createComponents (app)
% Lumikha ng UIFigure
app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'UI Larawan';
% Lumikha ng TabGroup
app. TabGroup = uitabgroup (app. UIFigure); app. TabGroup. Position = [1 1 640 480];
% Lumikha ng SetupTab
app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Setup';
% Lumikha ng RunDiagnostic Button
app. RunDiagnostic Button = uibutton (app. SetupTab, 'push'); app. RunDiagnostic Button ButtonPushFcn = createCallbackFcn (app, @RunDiagnostic ButtonPush, totoo); app. RunDiagnosticButton. FontWeight = 'naka-bold'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Run Diagnostic';
% Lumikha ng EnergyEfficiencyRatingEditFieldLabel
app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'kanan'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Txt = 'Rating ng Kahusayan sa Enerhiya';
% Lumikha ng EnergyEfficiencyRatingEditField
app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numeric'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, totoo); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'center'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];
% Lumikha ng PowerOutputRatingEditFieldLabel
app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'kanan'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Txt = 'Rating ng Output ng Lakas';
% Lumikha ng PowerOutputRatingEditField
app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numeric'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, totoo); app. PowerOutputRatingEditField. HorizontalAlignment = 'center'; app. PowerOutputRatingEditField. Position = [151 328 100 22];
% Lumikha ng AvgLocalSpeedEditFieldLabel
app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'kanan'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Txt = 'Avg. Lokal na Bilis ';
% Lumikha ng AvgLocalSpeedEditField
app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'numeric'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, totoo); app. AvgLocalSpeedEditField. HorizontalAlignment = 'center'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];
% Lumikha ng DesiredDistancefromHouseEditFieldLabel
app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'kanan'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Txt = {'Nais na Distansya'; 'mula sa Bahay'};
% Lumikha ng DDFH
app. DDFH = uieditfield (app. SetupTab, 'numeric'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (app, @DDFHValueChanged, totoo); app. DDFH. HorizontalAlignment = 'gitna'; app. DDFH. Position = [139 135 100 22];
% Lumikha ng TemperatureDirectionSwitchLabel
app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Txt = 'Direksyon ng Temperatura';
% Lumikha ng TemperaturaDirectionSwitch
app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'slider'); app. TemperatureDirectionSwitch Items = {'Up', 'Down'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, totoo); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Up';
% Lumikha ng TempSettingsTab
app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Mga setting ';
% Lumikha ng Temperatura1SpinnerLabel
app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Temperatura'; '# 1'};
% Lumikha ng Temperatura1Spinner
app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (app, @ Temperature1SpinnerValueChanged, totoo); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;
% Lumikha ng Temperatura2SpinnerLabel
app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperatura'; '# 2'};
% Lumikha ng Temperatura2Spinner
app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (app, @ Temperature2SpinnerValueChanged, totoo); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Value = 60;
% Lumikha Lumipat
app. Switch = uiswitch (app. TempSettingsTab, 'slider'); app. Switch Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (app, @SwitchValueChanged, totoo); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';
% Lumikha ng EditFieldLabel
app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'kanan'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Txt = ";
% Lumikha ng tempnow
app.tempnow = uieditfield (app. TempSettingsTab, 'numeric'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (app, @tempnowValueChanged, totoo); app.tempnow. HorizontalAlignment = 'gitna'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;
% Lumikha ng GaugeLabel
app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'center'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Txt = 'Pagsukat';
% Lumikha ng Pagsukat
app. Gauge = uigauge (app. TempSettingsTab, 'pabilog'); 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;
% Lumikha ng SavingsTab
app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Mga Pag-save';
% Lumikha ng UIAxes
app. UIAxes = uiaxes (app. SavingsTab); pamagat (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];
% Lumikha ThisMonthCostEditFieldLabel
app. ItoMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ItoMonthCostEditFieldLabel. HorizontalAlignment = 'gitna'; app. ItoMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ItoMonthCostEditFieldLabel. Txt = 'Gastos sa Buwan na Ito';
% Lumikha ThisMonthCostEditField
app ThisMonthCostEditField = uieditfield (app. SavingsTab, 'numeric'); app. ItoMonthCostEditField. Limits = [0 Inf]; app. ItoMonthCostEditField. ValueDisplayFormat = '$% 7.2f'; app. ItoMonthCostEditField. HorizontalAlignment = 'gitna'; app. ItoMonthCostEditField. Position = [417 39 137 58];
% Lumikha ng TotalSavingsEditFieldLabel
app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'kanan'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Txt = 'Kabuuang Mga Pag-save';
% Lumikha ng TotalSavingsEditField
app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numeric'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$% 9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'center'; app. TotalSavingsEditField. Position = [88 39 137 58]; pagtatapos ng wakas
mga pamamaraan (Access = publiko)
% Bumuo ng app
function app = Control_1
% Lumikha at mag-configure ng mga bahagi
createComponents (app)
% Rehistro ang app sa App Designer
registerApp (app, app. UIFigure)
kung nargout == 0
malinaw na pagtatapos ng pagtatapos ng app
% Code na nagpapatupad bago ang pagtanggal ng app
pag-andar tanggalin (app)
% Tanggalin ang UIFigure kapag ang app ay tinanggal
tanggalin ang (app. UIFigure) end end end
Marahil ay makakakuha ka ng isang error, na walang problema. Isara lamang ang GUI na nabuo pagkatapos mong pindutin ang run, kukunin namin ang natitirang mga kinakailangang programa at data sa ilang sandali.
Dahil naka-set up ang Matlab maaari kaming magpatuloy sa sawa. Una, patakbuhin ang programa ng sawa alinman mula sa iyong command prompt (sa windows) o sa pamamagitan ng paggamit ng.exe file sa iyong folder ng sawa. Tiyaking naka-install ang lahat ng naaangkop na mga aklatan sa pamamagitan ng paggamit ng command na pag-import.
mag-import ng serial
pag-import ng oras import csv
Ito ang tatlong mga silid-aklatan na kakailanganin mong magsimula, bagaman gagawa kami ng aming sariling library sa lalong madaling panahon. Kung mayroong ilang uri ng error sa mga utos na ito, bumalik at tiyakin na naka-install ang mga aklatan at nasa folder ng Lib sa folder na sawa. Susunod na bubuo kami ng tinatawag kong pythonlogger library. Ang pangalan na ito ay hindi kinakailangan, maaari mo itong tawagan kahit anong gusto mo, ito ay ang pangalan lamang ng python file (.py) na iyong nilikha.
Magbukas ng isang text editor, gumagamit ako ng Sublime3 ngunit gumagana ang notepad na mabuti, at ipasok ang code na ito.
def pythonprint ():
import pythonlogger import serial import time import csv ser = serial. Serial ('COM8') # COM8 ang arduino serial port, malamang na magkakaiba ito para sa bawat gumagamit, ie suriin ang iyong serial port sa arduino IDE ser.flushInput () habang Totoo: subukan: ser_bytes = ser.readline () i-print (ser_bytes) na may bukas ("test_data.csv", "a") bilang f: manunulat = csv.writer (f, delimiter = ",") # na nagtatakda ng data sa ipinasok bilang koma-seperated na manunulat.writerow ([time.time (), ser_bytes]) #writes data to test_data.csv maliban: i-print ("Nagkaroon ng Error") break
I-save ang teksto bilang "ipasok ang pangalan ng library na gusto mo".py sa Lib folder. Tandaan din na ang linya ng def pythonprint () ay tumutukoy sa pangalan ng pagpapaandar na tatawagin mo, upang mabago mo iyon upang maipaliwanag ang "ipasok ang pangalan na gusto mo para sa iyong pagpapaandar" (). Kapag nai-save ang library maaari kaming magpatuloy sa code ng arduino.
Buksan ang arduino IDE at buksan ang dalawang bagong windows ng sketch. I-save ang dalawang mga sketch file na saanman maginhawa, ang pangalan ng mga file na ito ay hindi mahalaga. Pagkatapos tanggalin ang lahat ng default code at palitan ito ng mga sumusunod.
Para sa pagtanggap ng arduino:
# isama
#include #include #include // hindi ito ginagamit ngunit kinakailangan upang mag-compile ng RH_ASK driver; istruktura ng dataStruktura {float temp; }ang aking data; void setup () {Serial.begin (9600); // Debugging only if (! Driver.init ()) Serial.println ("init failed"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); kung (driver.recv (buf, & buflen)) // Non-block {int i; // Mensahe na may mahusay na natanggap na checkum, itapon ito. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}
P. S. ang //driver.printBuffer…. atbp linya ay test code. Hindi kailangang mag-alala tungkol dito maliban kung ang iyong paggawa ng mga diagnostic at nais mong malaman kung tumatanggap ka talaga ng data.
Para sa transmitter arduino
# isama
#include #include #include // hindi ito ginagamit ngunit kinakailangan upang mag-compile ng # isama ang #include int pin = 4; DHT11 dht11 (pin); RH_ASK driver; istruktura ng dataStruktura {float temp; }ang aking data; byte tx_buf [sizeof (myData)] = {0}; // So arguments are bitrate, transmit pin (tx), // accept pin (rx), ppt pin, isInverse. Ang huling 2 ay hindi ginamit.void setup () {Serial.begin (9600); // Debugging only if (! Driver.init ()) Serial.println ("init failed"); } void loop () {int err; float temp, humi; uint8_t msg; kung ((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 (); // ihinto ang pagpapatupad hanggang sa ang lahat ng data ay naipadala na pagkaantala (2000); // wait 2 segundo}}
Ang pagsasama ng mga utos ay dapat sapat, ngunit kung mayroon kang anumang mga isyu sa paglaon sa paglipat ng data baka gusto mong tumingin sa folder ng library ng RadioHead at isama ang natitirang mga pangalan ng file, sa parehong format.
Hakbang 5: Ginagawa Ito
Ngayon na magkasama tayong lahat ng code at tipunin ng arduino, maaari nating mai-hook up ang arduino sa iyong computer at mai-load ang code. Tiyaking naipapadala mo ang tamang code sa pagtanggap at paglilipat ng mga microcontroller. Maaari kang magkaroon ng parehong mga arduino na konektado sa iyong computer habang ito ay tumatakbo ngunit kailangan mong tiyakin na mayroon kang tamang port na napili na sumusulong, o maaari mong idiskonekta ang nagpapadala na arduino at paandarin ito mula sa ilang ibang mapagkukunan sa sandaling ang code ay na-upload
Pinag-uusapan kung saan, dapat mong piliin ang port na konektado sa iyong pagtanggap ng arduino mula sa menu ng mga tool ng IDE ngayon at patakbuhin ang sawa.
Huwag buksan ang serial monitor habang ginagawa mo ito, hindi mabasa ng sawa ang serial habang bukas ang monitor. Kapag ang python ay bukas na tawagin ang pagpapaandar ng pythonprint tulad ng sumusunod.
pythonlogger.pythonprint ()
Sisimulan nito ang koleksyon ng data mula sa serial port ng arduino. Kung buksan mo ang iyong folder ng sawa ngayon, makikita mo na ang isang bagong.csv file ay nilikha na tinatawag na "test_data.csv", na humahawak sa lahat ng impormasyon sa oras at temperatura. Ito ang magiging file na ina-access ng Matlab upang gawin ang lahat ng mga kalkulasyon at kontrol nito.
Isa pang babala: huwag buksan ang test_data.csv habang ina-access o nakasulat ang data. Kung gagawin mo ito, ang python at / o ang Matlab code ay mag-crash at magpadala ng isang error
Kung magpapasya kang buksan ang.csv sa paglaon, mapapansin mo na ang haligi ng oras ay isang napakalaking string ng mga numero lamang. Iyon ay dahil ang oras.time () na utos ay nagsusulat ng bilang ng mga segundo mula Enero 1st, 1970.
Sa puntong ito ang python ay dapat na nagpi-print ng data ng temperatura na binabasa nito mula sa serial port. Dapat magmukhang katulad nito:
b'25.03 '/ r / n
Huwag mag-alala tungkol sa labis na mga character, ang mga index ng Matlab code para sa gitnang limang halaga sa ikalawang haligi ng.csv file.
Ngayon na gumagana ang lahat ng sumusuporta sa mga programa at kinokolekta ang data maaari naming simulan ang pagkolekta ng data ng GPS mula sa Matlab mobile program na na-setup nang mas maaga at patakbuhin ang Matlab GUI code. Kapag nasa tab na sensor ka ng Matlab mobile, piliin ang GPS at pindutin ang start button.
Kung bago ka sa Matlab mobile sumangguni sa hakbang 4 at tingnan ang mga pag-shot ng screen sa itaas. Kung nagkakaroon ka pa rin ng mga isyu, tiyaking nakakonekta ka sa computer na pinili mo nang mas maaga (sa tab na mga setting) at gamitin ang link mula sa "konektor sa" utos upang suriin na ang Matlab ay online.
Hakbang 6: Paggamit ng Program
Mayroong maraming mga bagay na nangyayari sa background sa sistemang ito. Ang data ng temperatura ay kinokolekta at na-log sa pamamagitan ng arduino at pyton, Kinokolekta ng Matlab ang data ng GPS mula sa iyong telepono at tumatakbo ang mga kalkulasyon upang makita kung gaano kalayo ka mula sa iyong bahay at itinatakda ang iyong termostat batay sa lahat ng impormasyong iyon. Kung saan ka pumasok ay nagbibigay ng iyong mga kagustuhan.
Patakbuhin ang Matlab GUI code. Buksan ang.mlapp file at tingnan ang unang tab. Kakailanganin mong kolektahin ang impormasyon para sa iyong sarili, ang kahusayan at rating ng kuryente ng iyong yunit ng pag-init / paglamig ay karaniwang matatagpuan sa mismong yunit, at ang iyong average na bilis ay isang mahusay na pagtatantya kung gaano kabilis ang iyong pagmamaneho. Kapag na-input na ang mga halaga, pindutin ang pindutang "Run Diagnostic" at kinokontrol ng programa ang iyong termostat upang makalikom ng impormasyon tungkol sa iyong bahay.
Lumipat sa susunod na menu.
Hakbang 7: Pagkontrol sa Temperatura
Pinapayagan ka ng menu na ito na pumili ng ginustong temperatura habang nasa bahay at wala. Itakda ang Temperatura # 1 sa iyong komportableng temperatura, at Temperatura # 2 sa isang mataas o mababang halaga na ligtas para sa iyong tahanan (tiyakin na hindi mo ito itinatakda sa 100 degree habang mayroon kang mga aso sa bahay, atbp.).
Hakbang 8: Makasaysayang Data
Sa wakas maaari mong panoorin kung gaano karaming pera ang iyong nagse-save sa pamamagitan ng paggamit ng awtomatikong kontrol. Mahalagang tinatantya nito kung gaano karaming enerhiya ang gagamitin kung ang iyong termostat ay nakatakda sa iyong ginustong temperatura nang 24/7, pagkatapos ay binabawas ang iyong aktwal na enerhiya na ginamit.
Good luck sa pagbuo.
Inirerekumendang:
Gumawa ng Iyong Sariling Nakakonektang Heating Therostat at Gumawa ng Pagtipid Sa Pag-init: 53 Hakbang (na may Mga Larawan)
Gumawa ng Iyong Sariling Nakakonektang Heating Therostat at Gumawa ng Pagtipid Sa Pag-init: Ano ang layunin? Palakihin ang ginhawa sa pamamagitan ng pag-init ng iyong bahay nang eksakto kung nais mo Gumawa ng pagtipid at bawasan ang mga emissions ng greenhouse gas sa pamamagitan lamang ng pag-init ng iyong bahay kung kailangan mo Panatilihin ang kontrol sa iyong pag-init saan ka man maging maipagmalaki ginawa mo ito
HestiaPi Touch - Buksan ang Smart Therostat: 9 Mga Hakbang (na may Mga Larawan)
HestiaPi Touch - Buksan ang Smart Therostat: Tungkol sa HestiaPi Touch Ang HestiaPi Touch ay isang ganap na bukas na mapagkukunan ng matalinong termostat para sa iyong tahanan. Ang lahat ng mga digital na file at impormasyon ay magagamit sa ibaba at ang aming pangunahing website. Sa pamamagitan nito, maaari mong subaybayan ang temperatura ng iyong bahay, kamag-anak na kahalumigmigan, at atmo
NEST ang iyong Lumang Therostat: 4 Hakbang (na may Mga Larawan)
NEST Ang iyong Lumang Therostat: Ang sistema ng pag-init sa aking bahay ay marahil kasing edad ng bahay mismo. Ito ay mga 30 taong gulang, na kung saan ay mabuti sa mga tuntunin ng mga taon ng bahay, ngunit medyo natigil sa panahon ng yelo hanggang sa pag-aalala ng teknolohiya. Mayroong 2 pangunahing mga problema sa commerc
Pagbuo ng isang DIY Arduino sa isang PCB at Ilang Mga Tip para sa Mga Nagsisimula: 17 Mga Hakbang (na may Mga Larawan)
Pagbuo ng isang DIY Arduino sa isang PCB at Ilang Mga Tip para sa Mga Nagsisimula: Ito ay sinadya bilang isang gabay sa sinumang paghihinang ng kanilang sariling Arduino mula sa isang kit, na maaaring mabili mula sa A2D Electronics. Naglalaman ito ng maraming mga tip at trick upang matagumpay itong mabuo. Malalaman mo rin ang tungkol sa kung ano ang lahat ng iba't ibang mga sangkap
Space Heater na Kinokontrol ng Digital Therostat: 5 Hakbang (na may Mga Larawan)
Space Heater na Kinokontrol ng Digital Therostat: Ipinapakita sa iyo ng itinuturo na ito kung paano gumamit ng isang off the shelf digital programmable termostat upang makontrol ang isang murang heater sa puwang. Karamihan sa mga murang space heater ay mayroon lamang isang analog knob upang magaspang na itakda ang temperatura; kahit na ang mga fanciest na modelo ay pinapayagan lamang ang iyong