Мазмуну:

Автостат: Алыскы термостат: 8 кадам (Сүрөттөр менен)
Автостат: Алыскы термостат: 8 кадам (Сүрөттөр менен)

Video: Автостат: Алыскы термостат: 8 кадам (Сүрөттөр менен)

Video: Автостат: Алыскы термостат: 8 кадам (Сүрөттөр менен)
Video: АВТОСТАТ Оперативка. Оперативная информация по авторынку России. Итоги декабря 2023 г. 2024, Ноябрь
Anonim
Автостат: Алыскы термостат
Автостат: Алыскы термостат

Балким сиз сурап жаткан суроо "эмнеге башка алыстан термостатты жасап жатасыз?"

Бул суроого жооп берүү керек болчу, жана базардагы акылдуу термостаттар өтө кымбат.

Адилеттүү эскертүү, бул "түшүнүктүн далили", ал термостатты иш жүзүндө көзөмөлдөө үчүн бир нече кошумча чыгымдарды талап кылат, бирок өзөгү ордунда жана сиздин конкреттүү жагдайыңызга жараша өзгөртүлүшү мүмкүн. Ошондой эле, бул дагы эле уланып жаткан жумуш, андыктан бир нече жаңыртууларды жана өзгөрүүлөрдү күтүңүз (өзгөчө Matlab кодексине)

Баштоо үчүн мен сизге эскертип кетким келет, бул үчүн үч программа (алардын бири абдан кымбат), бир нече китепканалар жана программалар үчүн колдоо пакеттери талап кылынат жана алардын баардыгы бири -бири менен сүйлөшүүсү керек. Анын баш оорусу. Бул эскертүү менен материалдарды баштайлы.

Аппараттык

  • arduino nano
  • arduino uno (же башка нано, мен жөн эле унону колдондум, анткени менде бирөө жатты)
  • ар кандай секирүүчү кабелдер, кээ бир эркек/эркек жана үч эркек/ургаачы секирген эки комплект
  • 433MHz радио жыштыгын (RF) кабыл алуучу, мен MX-05V колдондум
  • 433MHz RF өткөргүч, мен MX-FS-03V колдондум
  • DHT11 жогорку тактык термометр жана нымдуулук сенсору (мен колдонгон үч резинке чипке орнотулган, буга чейин керектүү резисторлор орнотулган)
  • нан
  • GPS менен телефон (бул учурда iPhone 8, бирок мен дагы Galaxy S8 колдонгом)
  • 3D басылган контейнер (чынында эле зарыл эмес, кандайдыр бир контейнер иштейт же такыр жок)

Программалык камсыздоо

  • MathWorksтон Matlab (менде 2018a чыгарылышы бар, бирок мен 2017a-b басылмаларын да колдонгом)
  • Телефонуңузга Matlab mobile орнотулган
  • Matlab үчүн arduino колдоо пакети
  • Matlab үчүн iPhone сенсордук пакети
  • arduino IDE
  • RadioHead arduino IDE пакеттерин жана китепканаларын колдойт
  • Arduino IDE үчүн DHT11 китепканасы
  • python 3.7 (pyserial китепканасынын же сериялык китепкананын орнотулгандыгын текшериңиз, ал 3.4 же андан кийинки версия үчүн болушу керек)

1 -кадам: Бардыгын бириктирүү

Баарын бир жерге коюу
Баарын бир жерге коюу
Баарын бир жерге коюу
Баарын бир жерге коюу
Баарын бир жерге коюу
Баарын бир жерге коюу

Биринчиден, мен сизге сиздин бөлүктөрүңүздүн иштеп жатканына жана зымдардын туура экенине ынануу үчүн RF өткөргүчтөрү менен иштеген бир нече ардуино үйрөткүчтөрүн жасоону сунуштайт элем. Жеткиликтүү көптөгөн мисалдар бар, код камтылган (ал жерде биз үчүн C жана C ++ жөнүндө эч нерсе билбегендер үчүн).

Ардуино менен сенсорлорду чогултуу үчүн төмөндөгү электр схемаларын аткарыңыз. Ардуинолорду туташтыруу учурунда эстен чыгарбоо керек болгон нерсе, мен колдонгон маалымат порттору талап кылынбайт, бирок сунушталат.

ЭГЕР сиз колдонгон маалымат портторун өзгөртүүнү чечсеңиз, анда кодуңуздагы төөнөгүчтөрдү аныктап алышыңыз керек. Жеке менимче, arduino китепканалары тааныган демейки портторго жабышуу оңой.

Жөн эле түшүнүктүү болуш үчүн, нано менен уно бири -бирин алмаштырат, бирок мен температуранын мониторунун өлчөмүн азайтуу үчүн долбоордун өткөргүч тарабы үчүн нанону колдондум.

Кошумча эскертүү: нанону кармап турган жашыл түстөгү контейнер 3D басылган контейнер.

2 -кадам: Алуучу

Алуучу
Алуучу

3 -кадам: өткөргүч

Бергич
Бергич

4 -кадам: Код

Зымдарды бүтүргөндөн кийин, бардык программаларды иштетип, китепканаларды орнотушуңуз керек (эгер сизде жок болсо), мен сизде бар деп ойлойм, сиз Matlabти иштетип, iPhone колдоо пакетин иштетишиңиз керек. Телефонуңуз да, Матлабыңыз дагы ушул убакта бир wifi тармагында болушу керек.

Matlabтин командалык терезесине жазыңыз:

туташтыргычы күйүк

Бул сизден iPhone'уңузга туташуу үчүн колдонула турган беш орундуу сырсөздү киргизүүнү талап кылат. Сырсөздү унутпаганыңызды текшериңиз. Сырсөздү киргизгенден кийин Matlab сиздин IP дарегиңизди камтыган кээ бир маалыматты көрсөтөт. Муну кийинки кадамда колдонуңуз, ал Matlab mobileдагы "Сенсорлор менен иштөө" жардам менюсунун көрсөтмөлөрүнөн келип чыгат.

  • Сенсордук маалыматтарды MathWorks Cloud же компьютерге жөнөтүү үчүн бул кадамдарды аткарыңыз:
  • Эгерде сиз сенсордук маалыматтарды компьютерге жөнөтүп жатсаңыз жана ал орнотула элек болсо, MATLABдагы Apple iOS сенсорлору үчүн MATLAB колдоо пакетин жүктөп алып орнотуңуз.
  • Орнотуулар аркылуу MATLAB Mobile'ди MathWorks Cloud же компьютерге туташтырыңыз.
  • MATLABда (сиздин компьютерде) mobiledev объектисин түзүңүз, мисалы: >> m = mobiledev
  • Бир же бир нече сенсорду тандап, Старт басыңыз.

Сенсор дайындарын түзмөгүңүзгө локалдык түрдө каттоо үчүн бул кадамдарды аткарыңыз:

  • Сенсорлор экранында маалыматтарды чогултууну каалаган сенсорлорду тандаңыз.
  • Журналды тандаңыз.
  • Баштоо баскычын басыңыз.
  • Маалымат чогултуп бүткөндөн кийин, Stop баскычын басыңыз.
  • Калкыма терезеге сенсор журналынын атын киргизиңиз.
  • Керек болсо 1-5 кадамдарды кайталаңыз.

Бул бөлүм 4 -бөлүккө кайрылат, андыктан азырынча маалыматтарды чогултууну баштоонун кажети жок. Телефонуңузду колуңузда кармап туруңуз жана Matlab mobile даяр.

Эми сиз Matlab код файлдарын сактоо үчүн компьютериңиздин кайсы бир жеринде папка түзүшүңүз керек. Сизде төрт башка файл болот, экөө фондук функциялар үчүн (.m файлдары) жана GUI (.mlapp) үчүн бир Matlab код файлы,.

Биринчиден, үйүңүздөгү абанын массалык эсеби (бул Matlabке үйүңүздү жылытууга/муздатууга канча убакыт кетерин билүүгө мүмкүндүк берет)

функция [Массасы] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = саат; time_end = 0 while runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = саат; PwrCntr = 0; runCalc = 0; else PwrCntr = P_out; runCalc = runCalc+0.1 аяктоо убактысы_diag = time_end-time_start Mass = (P_out*time_diag) /7.035

Ал эми экинчиси:

функция [timestamps, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, ылдамдык, T_pref, массалык)

AutoStat = 1; i = 1; ал эми AutoStat == 1 time_start = саат; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); убакыт белгилери = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; формат longg; Узундуктун жана %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)) негизинде аралыкты эсептөө үчүн %haversine формуласы.^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; %сиздин убактыңызды кайтарат time_rtn = (Dist-r_pref)./ ылдамдык; %үйдүн кондиционеринин жана аба массасынын өчүрүлүшүнүн негизинде керектүү термостат жөндөөсүн эсептейт. calcTmp_set = ((-1.*P_out.*time_rtn)./ (масс.*(1.005)))+T_pref; %тегерек (calcTmp_set) ~ = тегерек (t) timeACon = саат болсо, учурдагы термостаттын жөндөөсүн өзгөртүү керекпи же жокпу аныктайт; PwrCntr = P_out; timeACon = timeACon + clock-time_start; наркы = P_out*timeACon*чен; else PwrCntr = 0 аяктоочу убакыт белгилери (аягы+1, [1: 6]) = саат; pwr_usage (аягы+1, 1) = PwrCntr; тыным (5) аягы аягы

Бул файлдардын экөө тең Matlab функциялары. Атайын муктаждыктар үчүн аларды өзгөртүүнү пландабасаңыз, аларга кирүүнүн кажети жок болот, анткени сиз аларды GUIден чакырасыз. Эки файлды да өзүнчө сактаңыз, биринчиси CalcMass.m жана экинчиси dist_cntrl.m, бул GUI коду функцияларды чакыруу үчүн колдонгон аттар болот, андыктан төмөнкү коддун калган бөлүгүн түзөткүңүз келбесе, ат коюу конвенциясы.

GUI кодуна кирүүдөн мурун, Matlab үчүн колдонмо дизайнерин ачышыңыз керек, аны Matlab меню тилкесинде чабыттоо менен же Matlab буйрук терезесине төмөнкү буйрукту киргизген менин сүйүктүү ыкма менен ачуу керек:

appdesigner

Колдонмо дизайнери ачык болгондон кийин, жаңы колдонмо файлын ачыңыз (.mlapp) жана код терезесинен демейки коддун баарын жок кылыңыз. Андан кийин анын бардыгын төмөнкүлөр менен алмаштырыңыз жана иштетүү баскычын басыңыз.

classdef Control_1 <matlab.apps. AppBase % Колдонмо компоненттеринин касиеттерине дал келген касиеттери (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Баттон 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.container. 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. Сактоо табчасы matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField

ыкмалар (Кирүү = купуя)

% Мааниси өзгөргөн функция: tempnow

милдети tempnowValueChanged (колдонмо, окуя) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 for i = length (temp) app. Gauge. Value = temp (i) pause (1) end end

% Мааниси өзгөргөн функция: TemperatureDirectionSwitch

функция TemperatureDirectionSwitchValueChanged (app, event) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; end Chng_dir; аяктоо

% Мааниси өзгөргөн функция: DDFH

DDFHValueChanged функциясы (колдонмо, окуя) r_pref = app. DDFH. Value; аяктоо

% Мааниси өзгөргөн функция: AvgLocalSpeedEditField

милдети AvgLocalSpeedEditFieldValueChanged (app, event) speed = app. AvgLocalSpeedEditField. Value; аяктоо

% Мааниси өзгөргөн функция: PowerOutputRatingEditField

функция PowerOutputRatingEditFieldValueChanged (app, event) value = app. PowerOutputRatingEditField. Value; аяктоо

% Мааниси өзгөргөн функция: EnergyEfficiencyRatingEditField

милдети EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; аяктоо

% Button басылган функция: RunDiagnosticButton

функция RunDiagnosticButtonPushed (app, event) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; аягында T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

аяктоо

% Мааниси өзгөргөн функция: Температура1Спиннер

функция Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; аяктоо

% Мааниси өзгөргөн функция: Temperature2Spinner

функция Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; аяктоо

% Мааниси өзгөргөн функция: Которуу

SwitchValueChanged функциясы (колдонмо, окуя) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; ылдамдык = m. Speed; массасы = 200; ылдамдык = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, ылдамдык, массалык) аягы

% Колдонмонун башталышы жана курулушу

ыкмалар (Кирүү = купуя)

% UIFigure жана компоненттерди түзүү

createComponents функциясы (колдонмо)

% UIFigure түзүү

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

% TabGroup түзүү

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

% SetupTab түзүү

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Орнотуу';

RunDiagnosticButton түзүү

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'жоон'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Диагностиканы иштетүү';

% EnergyEfficiencyRatingEditFieldLabel түзүү

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'оң'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Энергия натыйжалуулугунун рейтинги';

% EnergyEfficiencyRatingEditField түзүү

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'сандык'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'борбор'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% PowerOutputRatingEditFieldLabel түзүү

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

% PowerOutputRatingEditField түзүү

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'сандык'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'борбор'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% AvgLocalSpeedEditFieldLabel түзүү

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'оңго'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Орточо. Жергиликтүү ылдамдык ';

% AvgLocalSpeedEditField түзүү

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'сандык'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'борбор'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% DesiredDistancefromHouseEditFieldLabel түзүү

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'оң'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Каалаган аралык'; 'үйдөн'};

% DDFH түзүү

app. DDFH = uieditfield (app. SetupTab, 'сандык'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (app, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'борбор'; app. DDFH. Position = [139 135 100 22];

% TemperatureDirectionSwitchLabel түзүү

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'борбор'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Температуранын багыты';

% TemperatureDirectionSwitch түзүү

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'slider'); app. TemperatureDirectionSwitch. Items = {'Өйдө', 'Ылдый'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Өйдө';

% TempSettingsTab түзүү

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Темп. Жөндөөлөр ';

Температураны түзүү1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'борбор'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Температура'; '#1'};

% Температураны түзүү1Спиннер

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

% Temperature2SpinnerLabel түзүү

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'борбор'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Температура'; '#2'};

% Temperature2Spinner түзүү

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

% Switch түзүү

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

% EditFieldLabel түзүү

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

% Temnow түзүү

app.tempnow = uieditfield (app. TempSettingsTab, 'сандык'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (app, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'борбор'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

GaugeLabel түзүү

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'борбор'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Габарит';

% Габаритти түзүү

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

% SavingsTab түзүү

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Үнөмдөө';

% UIAxes түзүү

app. UIAxes = uiaxes (app. SavingsTab); титул (app. UIAxes, 'Аманат') xlabel (app. UIAxes, 'Ай жана Жыл') ylabel (app. UIAxes, 'Акча') колдонмо. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.606666666666667] app. UIAxes. Color = [0.9412 0.9412 0.9412]; app. UIAxes. Position = [146 219 348 237];

% ThisMonthCostEditFieldLabel түзүңүз

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'борбор'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Бул айдын баасы';

% ThisMonthCostEditField түзүңүз

app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'сандык'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'борбор'; app. ThisMonthCostEditField. Position = [417 39 137 58];

% TotalSavingsEditFieldLabel түзүү

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'оң'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Жалпы үнөмдөө';

% TotalSavingsEditField түзүү

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'сандык'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'борбор'; app. TotalSavingsEditField. Position = [88 39 137 58]; аягы аягы

ыкмалар (Кирүү = коомдук)

% Колдонмо куруу

app app = Control_1

% Компоненттерди түзүү жана конфигурациялоо

createComponents (колдонмо)

% Колдонмону App Designer менен каттаңыз

registerApp (app, app. UIFigure)

эгер nargout == 0

колдонмонун аягы ачык

% Колдонмо жок кылынардан мурун аткарылган код

функцияны жок кылуу (колдонмо)

Колдонмо жок кылынганда % UIFigure жок кылынат

жок кылуу (app. UIFigure) аягы аягы

Сиз, балким, ката аласыз, бул эч кандай көйгөй эмес. Сиз иштетүүнү баскандан кийин түзүлгөн GUIди жаап коюңуз, биз калган программаларды жана маалыматтарды бир заматта чогултабыз.

Matlab орнотулгандыктан, биз питонго өтө алабыз. Биринчиден, python программасын командалык кеңешиңизден (терезелерде) же python папкаңыздагы.exe файлын колдонуу менен иштетиңиз. Бардык тиешелүү китепканалар импорттук буйрукту колдонуу менен орнотулганын текшериңиз.

серияны импорттоо

импорттоо убактысы импорт csv

Бул сиз баштооңуз керек болгон үч китепкана, бирок биз жакында өзүбүздүн китепканабызды түзөбүз. Эгерде бул буйруктарда кандайдыр бир ката болсо, кайра барып, китепканалар орнотулгандыгын жана python папкасындагы Lib папкасында экенин текшериңиз. Кийинки, мен pythonlogger китепканасы деп аталган нерсени түзөбүз. Бул аталыштын кереги жок, аны каалаган нерсеңиз деп атасаңыз болот, бул сиз түзгөн питон файлынын аталышы (.py).

Текст редакторун ачыңыз, мен Sublime3 колдоном, бирок блокнот жакшы иштейт жана бул кодду киргизиңиз.

def pythonprint ():

pythonlogger импорттук сериялык импорттоо убактысын импорттоо csv ser = serial. Serial ('COM8') # COM8 - бул ардуино сериялык порту, бул ар бир колдонуучу үчүн башкача болот, б.а. serdu портуңузду arduino IDE ser.flushInput () ичинде текшериңиз Ырас: аракет кылыңыз: ser_bytes = ser.readline () print (ser_bytes) with open ("test_data.csv", "a") as f: жазуучу = csv.writer (f, delimiter = ",") # дайындарды орнотот үтүр менен ажыратылган жазуучу катары жазылат.writerow ([time.time (), ser_bytes]) #маалыматтарды test_data.csv жазат, башкасынан: print ("Error Occured") break

Тексти "каалаган китепкананын атын киргизиңиз".py деп Lib папкасына сактаңыз. Ошондой эле def pythonprint () линиясы сиз чакыра турган функциянын аталышын аныктай турганын эске алыңыз, андыктан сиз муну def "функцияңызга каалаган атын киргизүү" () үчүн өзгөртө аласыз. Китепкана сакталганда, биз arduino кодуна өтө алабыз.

Arduino IDEди ачыңыз жана эки жаңы эскиз терезесин ачыңыз. Бул эки эскиз файлды ыңгайлуу жерге сактаңыз, бул файлдардын аталышы маанилүү эмес. Андан кийин бардык демейки кодду жок кылып, аны төмөнкүлөр менен алмаштырыңыз.

Ардуино алуу үчүн:

#кошуу

#include #include #include // бул колдонулбайт, бирок RH_ASK драйверин түзүү үчүн керек; struct dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // Мүчүлүштүктөрдү оңдоо (! Driver.init ()) Serial.println ("init ишке ашпай калды"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Блокировкаланбаган {int i; // Жакшы текшерүү суммасы бар билдирүү алынды, таштаңыз. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. ж.б сыноо коду. Эгерде диагнозуңузду аткарбасаңыз жана чындыгында маалыматтарды алып жатканыңызды билгиңиз келбесе, бул жөнүндө тынчсыздануунун кажети жок.

Ардуино өткөргүч үчүн

#кошуу

#include #include #include // бул колдонулбайт, бирок компиляциялоо үчүн керек #кошуу #include int pin = 4; DHT11 dht11 (пин); RH_ASK айдоочу; struct dataStruct {float temp; } myData; байт tx_buf [sizeof (myData)] = {0}; // Ошентип, аргументтер бит ылдамдыгы, өткөргүч пин (tx), // алуу пин (rx), ppt пин, isInverse. Акыркы 2 колдонулбайт.void setup () {Serial.begin (9600); // Мүчүлүштүктөрдү оңдоо (! Driver.init ()) Serial.println ("init ишке ашпай калды"); } void loop () {int err; сүзүү темп, humi; uint8_t msg; if ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); байт zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // бардык маалыматтар кечиктирилгенге чейин аткарууну токтотуу (2000); // 2 секунд күтө тур}}

Кошуу буйруктары жетиштүү болушу керек, бирок кийинчерээк маалымат берүү менен кандайдыр бир көйгөйлөр пайда болсо, RadioHead китепканасынын папкасынан издеп, файлдын аталыштарынын калганын ошол эле форматта кошууну каалашыңыз мүмкүн.

5 -кадам: Аны иштетүү

Иштетүү
Иштетүү
Иштетүү
Иштетүү
Иштетүү
Иштетүү

Эми бизде бардык коддор чогулуп, ардуино чогултулгандыктан, биз ардуинону сиздин компьютерге туташтырып, кодду жүктөй алабыз. Туура кодду кабыл алуучу жана жөнөтүүчү микроконтроллерлерге жөнөткөнүңүздү текшериңиз. Сиз иштеп турганда ардуиноңузду компьютериңизге туташтырсаңыз болот, бирок сиз алдыга жылып жаткан туура портуңуз бар экенине ынанууңуз керек, же кодду чыгаргандан кийин, берүүчү ардуинону ажыратып, башка булактан кубаттай аласыз. жүктөлдү.

Бул жөнүндө айта турган болсок, азыр IDE куралдар менюсунан кабыл алуучу arduinoңузга туташкан портту тандап, python иштетишиңиз керек.

Муну аткарып жатканда сериялык мониторду ачпаңыз, монитор ачык кезде python сериалды окуй албайт. Python ачык болгондон кийин pythonprint функциясын төмөнкүдөй чакырыңыз.

pythonlogger.pythonprint ()

Бул arduino сериялык портунан маалыматтарды чогултууну баштайт. Эгерде сиз азыр питон папкаңызды ачсаңыз, анда "test_data.csv" деп аталган жаңы.csv файлы түзүлгөнүн көрөсүз, ал бардык убакыт жана температура маалыматын камтыйт. Бул Matlab бардык эсептөөлөрүн жана көзөмөлдөрүн жүргүзүү үчүн кире турган файл болот.

Дагы бир эскертүү: маалыматтарга жетүү же жазуу учурунда test_data.csv ачпаңыз. Эгер андай кылсаңыз, python жана/же Matlab коду бузулуп, ката жиберет

Эгерде сиз.csv файлын кийинчерээк ачууну чечсеңиз, анда убакыт мамычасы сандардын абдан чоң сабы экенин байкайсыз. Себеби time.time () буйругу 1970 -жылдын 1 -январынан бери секунда санын жазат.

Бул учурда python сериялык порттон окуп жаткан температура маалыматын басып чыгарышы керек. Бул окшош болушу керек:

b'25.03 '/r/n

Кошумча белгилер жөнүндө кабатыр болбоңуз.csv файлынын экинчи тилкесиндеги Matlab коду орто беш баалуулуктун индекстери.

Эми бардык колдоочу программалар иштеп жатат жана маалыматтар чогултулуп жатат, биз мурда орнотулган Matlab мобилдик программасынан GPS маалыматын чогултууну баштай алабыз жана Matlab GUI кодун иштете алабыз. Matlab mobile'дын сенсордук өтмөгүндө болгондон кийин, GPSти тандап, баштоо баскычын басыңыз.

Эгерде сиз Matlab mobile үчүн жаңы болсоңуз, 4 -кадамга кайрылып, жогорудагы скриншотторду караңыз. Эгерде сизде дагы эле көйгөйлөр болсо, сиз мурда тандаган компьютериңизге (орнотуулар өтмөгүндө) туташып турганыңызды текшериңиз жана Matlab онлайнда экенин текшерүү үчүн "туташтыргыч" командасынын шилтемесин колдонуңуз.

6 -кадам: Программаны колдонуу

Программаны колдонуу
Программаны колдонуу

Бул системада фондо көптөгөн нерселер болуп жатат. Температура маалыматтары arduino жана pyton тарабынан чогултулуп жана катталып жатат, Matlab телефонуңуздан GPS маалыматын чогултуп, үйүңүздөн канчалык алыс экениңизди көрүү үчүн эсептөөлөрдү жүргүзүп жатат жана термостатты ошол маалыматтын негизинде орнотуп жатат. Кирген жериңиз сиздин каалоолоруңузду камсыз кылат.

Matlab GUI кодун иштетүү.. Mlapp файлын ачыңыз жана биринчи өтмөктү караңыз. Бул үчүн маалыматты өзүңүз чогултууңуз керек, жылытуу/муздатуучу агрегаттын эффективдүүлүгүн жана кубаттуулугун көбүнчө агрегаттын өзүнөн табууга болот, жана сиздин орточо ылдамдыгыңыз канчалык тез айдаганыңызды жакшы баалоо. Маанилер киргизилгенден кийин, "Диагностиканы иштетүү" баскычын басыңыз жана программа сиздин үй жөнүндө маалымат чогултуу үчүн термостатты көзөмөлдөйт.

Кийинки менюга өтүңүз.

7 -кадам: Температураны көзөмөлдөө

Температураны көзөмөлдөө
Температураны көзөмөлдөө

Бул меню сизге үйдө жана алыс жерде каалаган температураны тандоого мүмкүндүк берет. Температура #1ди өзүңүздүн ыңгайлуу температураңызга, ал эми Температураңызды #2 үйүңүз үчүн коопсуз болгон жогорку же төмөн баага коюңуз (үйдө иттер бар болгондо аны 100 градуска койбогула.).

8 -кадам: Тарыхый маалыматтар

Тарыхый дата
Тарыхый дата

Акыр -аягы, автоматтык башкарууну колдонуу менен канча акча үнөмдөп жатканыңызды көрө аласыз. Бул сиздин термостатыңыз 24/7 каалаган температурага коюлса, канча энергия керектелээрин болжолдойт, андан кийин чыныгы энергияңызды алып салат.

Ишинерге ийгилик.

Сунушталууда: