Съдържание:

Автостат: дистанционен термостат: 8 стъпки (със снимки)
Автостат: дистанционен термостат: 8 стъпки (със снимки)

Видео: Автостат: дистанционен термостат: 8 стъпки (със снимки)

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

Въпросът, който вероятно задавате, е "защо правите друг дистанционен термостат?"

Отговорът на този въпрос е, че трябваше, а пазарните интелигентни термостати са твърде скъпи.

Честно предупреждение, това е "доказателство за концепция", което ще изисква няколко допълнителни изхода, за да контролирате термостата си, но ядрото е на място и може да бъде променено в зависимост от конкретните ви обстоятелства. Освен това това все още се работи, така че очаквайте няколко актуализации и промени (особено в кода на Matlab)

За да започнете, искам да ви предупредя, това изисква три програми (едната от тях е доста скъпа), доста библиотеки и пакети за поддръжка на програмите и трябва всички да говорят помежду си. Това е главоболие. След като предупреждението не е на път, нека започнем с материалите.

Хардуер

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

Софтуер

  • Matlab от MathWorks (имам изданието за 2018а, но използвах и изданията за 2017а-б)
  • Matlab mobile е инсталиран на вашия телефон
  • пакет за поддръжка на arduino за Matlab
  • iPhone сензорен пакет за Matlab
  • arduino IDE
  • Пакети за поддръжка на RadioHead и библиотеки на arduino IDE
  • Библиотека DHT11 за arduino IDE
  • python 3.7 (уверете се, че pyserial библиотеката или серийната библиотека е инсталирана, каквато трябва да бъде за версия 3.4 или по -нова)

Стъпка 1: Съберете всичко заедно

Събирайки всичко заедно
Събирайки всичко заедно
Събирайки всичко заедно
Събирайки всичко заедно
Събирайки всичко заедно
Събирайки всичко заедно

На първо място бих ви предложил да направите няколко arduino урока, занимаващи се с радиочестотни предаватели, само за да се уверите, че вашите части работят и кабелите са правилни. Има много примери с включен код (за тези от нас, които знаят малко или нищо за C и C ++).

Следвайте електрическите схеми по -долу, за да сглобите arduino и сензорите. Едно нещо, което трябва да имате предвид, докато свързвате arduinos, е, че използваните от мен портове за данни не са задължителни, но препоръчителни.

АКО решите да промените портовете за данни, които използвате, просто трябва да дефинирате пиновете във вашия код. Лично аз мисля, че е по -лесно да се придържаме към портовете по подразбиране, които библиотеките на arduino разпознават.

И за да е ясно, nano и uno са взаимозаменяеми, но използвах nano за предавателната страна на проекта, за да намаля размера на температурния монитор.

Странична бележка: зелената конструкция, която държи нано, е 3D отпечатаният контейнер.

Стъпка 2: Приемник

Приемник
Приемник

Стъпка 3: Предавател

Предавател
Предавател

Стъпка 4: Кодът

След като окабеляването приключи, трябва да стартирате всички програми и инсталираните библиотеки (ако все още не сте го направили), просто предполагам, че имате, трябва да стартирате Matlab и да стартирате пакета за поддръжка на iPhone. В този момент телефонът и Matlab трябва да са в една и съща wifi мрежа.

В командния прозорец на Matlab напишете:

конектор включен

Това ще ви подкани да въведете петцифрена парола, която ще използвате за свързване на вашия iPhone. Уверете се, че сте запомнили паролата. След като въведете паролата, Matlab ще покаже известна информация, включително вашия IP адрес. Използвайте това в следващата стъпка, която идва от инструкциите от помощното меню „Първи стъпки със сензори“в Matlab mobile.

  • Следвайте тези стъпки, за да изпратите сензорни данни до MathWorks Cloud или компютър:
  • Ако изпращате сензорни данни към компютър и ако още не е инсталиран, изтеглете и инсталирайте пакета за поддръжка на MATLAB за сензори Apple iOS в MATLAB.
  • Свържете MATLAB Mobile към MathWorks Cloud или компютър, като използвате Настройки.
  • Създайте обект mobiledev в MATLAB (на вашия компютър), например: >> m = mobiledev
  • Изберете един или повече сензори и докоснете Старт.

Следвайте тези стъпки, за да регистрирате локално данните на сензора на вашето устройство:

  • На екрана Сензори изберете сензорите, от които искате да събирате данни.
  • Изберете Дневник.
  • Докоснете бутона Старт.
  • Когато приключите със събирането на данни, докоснете бутона Стоп.
  • В изскачащия прозорец въведете името на регистрационния файл на сензора.
  • Повторете стъпки 1-5, ако е необходимо.

Този раздел ще бъде върнат в Част 4, така че все още няма нужда да започнете да събирате данни. Просто дръжте телефона си удобен и мобилния мобилен Matlab.

Сега трябва да създадете папка някъде във вашия компютър, за да поместите кодовите файлове на Matlab. Ще имате четири отделни файла, два за фоновите функции (.m файлове) и един файл с код на Matlab за графичния интерфейс (.mlapp),.

Първо е изчислението на масата за въздуха във вашата къща (това позволява на Matlab да знае колко време отнема да се затопли/охлади къщата ви)

функция [Mass] = 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; иначе PwrCntr = P_out; runCalc = runCalc+0.1 крайно време_diag = time_end-time_start Mass = (P_out*time_diag) /7.035

И второто:

функция [времеви марки, 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)).^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 + часовник-time_start; цена = P_out*време ACon*курс; else PwrCntr = 0 крайни времеви марки (end+1, [1: 6]) = часовник; pwr_usage (край+1, 1) = PwrCntr; пауза (5) край край

И двата файла са функции на Matlab. Няма да имате нужда от достъп до тях, освен ако не планирате да ги модифицирате за конкретни нужди, тъй като ще ги извиквате от GUI. Запазете двата файла поотделно, първият като CalcMass.m, а вторият като dist_cntrl.m, това ще бъдат имената, които кодът на GUI използва за извикване на функциите, така че освен ако не искате да редактирате останалата част от кода по -долу, се придържайте към конвенцията за именуване.

Преди да влезете в GUI кода, трябва да отворите дизайнера на приложения за Matlab, който можете да отворите, като навигирате в лентата с менюта на Matlab или чрез любимия ми метод, който въвежда следната команда в командния прозорец на Matlab:

дизайнер на приложения

След като дизайнерът на приложения е отворен, отворете нов файл с приложения (.mlapp) и изтрийте целия код по подразбиране от прозореца на кода. След това заменете всичко със следното и натиснете бутона за стартиране.

classdef Control_1 <matlab.apps. AppBase % Свойства, които отговарят на свойствата на компонентите на приложението (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton.labs Бутон 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.control. Spinner Temperature2SpinnerLabel matlab.ui.cont rol. Label Температура2Spinner matlab.ui.control. Spinner Switch matlab.ui.control. Switch EditFieldLabel matlab.ui.control. Label tempnow matlab.ui.control. NumericEditField GaugeLabel matlab.ui.control. Label matlab.ui.control. Gauge 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 край

методи (Access = private)

% Функция за промяна на стойността: tempnow

функция tempnowValueChanged (приложение, събитие) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 за i = дължина (temp) app. Gauge. Value = temp (i) pause (1) end end

% Функция за промяна на стойността: TemperatureDirectionSwitch

функция TemperatureDirectionSwitchValueChanged (приложение, събитие) начин = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; край Chng_dir; край

% Функция за промяна на стойността: DDFH

функция DDFHValueChanged (приложение, събитие) r_pref = app. DDFH. Value; край

% Функция за промяна на стойността: AvgLocalSpeedEditField

функция AvgLocalSpeedEditFieldValueChanged (приложение, събитие) скорост = app. AvgLocalSpeedEditField. Value; край

% Функция за промяна на стойността: PowerOutputRatingEditField

функция PowerOutputRatingEditFieldValueChanged (приложение, събитие) стойност = app. PowerOutputRatingEditField. Value; край

% Функция за промяна на стойността: EnergyEfficiencyRatingEditField

функция EnergyEfficiencyRatingEditFieldValueChanged (приложение, събитие) стойност = app. EnergyEfficiencyRatingEditField. Value; край

% Бутон натисната функция: RunDiagnosticButton

функция RunDiagnosticButtonPushed (приложение, събитие) начин = 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)

край

% Функция за промяна на стойността: Temperature1Spinner

функция Temperature1SpinnerValueChanged (приложение, събитие) стойност = app. Temperature1Spinner. Value; край

% Функция за промяна на стойността: Temperature2Spinner

функция Temperature2SpinnerValueChanged (приложение, събитие) стойност = app. Temperature2Spinner. Value; край

% Функция за промяна на стойността: Превключване

функция SwitchValueChanged (приложение, събитие) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Logitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; скорост = м. Скорост; маса = 200; скорост = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, скорост, маса) краен край

% Инициализиране и изграждане на приложение

методи (Access = private)

% Създайте UIFigure и компоненти

функция createComponents (приложение)

% Създаване на UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Фигура на потребителския интерфейс';

% Създайте 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 (приложение, @RunDiagnosticButtonPushed, вярно); 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, 'numeric'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (приложение, @EnergyEfficiencyRatingEditFieldValueChanged, вярно); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'center'; 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 = 'Рейтинг на изходната мощност';

% Създаване на PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numeric'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (приложение, @PowerOutputRatingEditFieldValueChanged, вярно); app. PowerOutputRatingEditField. HorizontalAlignment = 'center'; 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 (приложение, @AvgLocalSpeedEditFieldValueChanged, вярно); app. AvgLocalSpeedEditField. HorizontalAlignment = 'center'; 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 (приложение, @DDFHValueChanged, вярно); app. DDFH. HorizontalAlignment = 'център'; app. DDFH. Position = [139 135 100 22];

% Създаване на TemperatureDirectionSwitchLabel

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

% Създаване на TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'плъзгач'); app. TemperatureDirectionSwitch. Items = {'Нагоре', 'Надолу'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (приложение, @TemperatureDirectionSwitchValueChanged, вярно); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Нагоре';

% Създаване на раздел TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Настройки';

% Създаване на Temperature1SpinnerLabel

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

% Създаване на Temperature1Spinner

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

% Създаване на Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'center'; 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, вярно); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Value = 60;

% Създаване на превключвател

app. Switch = uiswitch (app. TempSettingsTab, 'плъзгач'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (приложение, @SwitchValueChanged, вярно); app. Switch. FontName = 'Nyala'; 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 = '';

% Създаване на tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'числов'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (приложение, @tempnowValueChanged, вярно); 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 = 'Gauge';

% Създаване на габарит

app. Gauge = uigauge (app. TempSettingsTab, 'кръгъл'); 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;

% Създаване на раздел Спестявания

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Спестявания';

% Създаване на UIAx

app. UIAxes = uiaxes (app. SavingsTab); заглавие (app. UIAxes, 'Спестявания') xlabel (app. UIAxes, 'Месец и година') ylabel (app. UIAxes, 'Пари') app. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.606666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Създаване на тозиMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'center'; 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 = 'center'; 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 = 'center'; app. TotalSavingsEditField. Position = [88 39 137 58]; край край

методи (Access = public)

% Изграждане на приложение

функция app = Control_1

% Създаване и конфигуриране на компоненти

createComponents (приложение)

% Регистрирайте приложението с App Designer

registerApp (приложение, приложение. UIFigure)

ако nargout == 0

изчистване на края на приложението

% Код, който се изпълнява преди изтриване на приложение

функция изтриване (приложение)

% Изтриване на UIFigure, когато приложението се изтрие

изтриване (app. UIFigure) край край край

Вероятно ще получите грешка, което не е проблем. Просто затворете графичния потребителски интерфейс, генериран след натискане на run, след малко ще съберем останалите необходими програми и данни.

Тъй като Matlab е настроен, можем да преминем към python. Първо, стартирайте програмата python или от командния ред (в Windows), или като използвате.exe файла във вашата папка python. Уверете се, че всички подходящи библиотеки са инсталирани с помощта на командата import.

внос сериен

време за импортиране импортиране на csv

Това са трите библиотеки, които ще ви трябват, за да започнете, макар че скоро ще създадем своя собствена библиотека. Ако имаше някаква грешка с тези команди, върнете се и се уверете, че библиотеките са инсталирани и са в папката Lib в папката python. След това ще генерираме това, което нарекох библиотека на pythonlogger. Това име не е необходимо, можете да го наричате както искате, това е само името на файла python (.py), който създавате.

Отворете текстов редактор, използвам Sublime3, но бележникът работи отлично и въведете този код.

def pythonprint ():

импортиране на pythonlogger импортиране на серийно време за импортиране csv ser = serial. Serial ('COM8') # COM8 е серийният порт на arduino, това вероятно ще бъде различно за всеки потребител, т.е. проверете вашия сериен порт в arduino IDE ser.flushInput () while Вярно: опитайте: ser_bytes = ser.readline () print (ser_bytes) с отворен ("test_data.csv", "a") като f:riter = csv.writer (f, delimiter = ",") # задава данните на се въвежда като писател, разделен със запетая.writerow ([time.time (), ser_bytes]) #пише данни в test_data.csv, с изключение на: print ("Грешка възникна") break

Запазете текста като „вмъкнете името на библиотеката, която искате“.py в папката Lib. Също така имайте предвид, че редът py pythonprint () определя името на функцията, която ще извикате, така че можете да промените това, за да определите „вмъкване на името, което искате за вашата функция“(). Когато библиотеката е запазена, можем да преминем към кода на arduino.

Отворете arduino IDE и отворете два нови прозореца за скици. Запазете тези два файла с скици някъде удобно, името на тези файлове няма значение. След това изтрийте целия код по подразбиране и го заменете със следното.

За приемащия arduino:

#включва

#include #include #include // това не се използва, но е необходимо за компилиране на драйвера RH_ASK; struct dataStruct {плаваща температура; } myData; void setup () {Serial.begin (9600); // Отстраняване на грешки само ако (! Driver.init ()) Serial.println ("init failed"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Не блокиращ {int i; // Съобщение с получена добра контролна сума, изхвърлете го. //driver.printBuffer(" Получих: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer ……. и т.н. редът е тестовият код. Няма нужда да се притеснявате за това, освен ако не правите диагностика и не искате да разберете дали всъщност получавате данни.

За предавателя arduino

#включва

#include #include #include // това не се използва, но е необходимо за компилиране #include #include int pin = 4; DHT11 dht11 (щифт); RH_ASK драйвер; struct dataStruct {плаваща температура; } myData; байт tx_buf [sizeof (myData)] = {0}; // Значи аргументите са битрейт, предаване на щифт (tx), // получаване на щифт (rx), ppt щифт, isInverse. Последните 2 не се използват.void setup () {Serial.begin (9600); // Отстраняване на грешки само ако (! Driver.init ()) Serial.println ("init failed"); } void loop () {int err; плаваща температура, хуми; uint8_t съобщение; 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: Направете го работещ

Осъществяване на работа
Осъществяване на работа
Осъществяване на работа
Осъществяване на работа
Осъществяване на работа
Осъществяване на работа

Сега, когато имаме целия код заедно и arduino е сглобен, можем да свържем arduino към вашия компютър и да заредим кода. Уверете се, че изпращате правилния код на приемащите и предаващите микроконтролери. Можете да имате и двата arduinos свързани към компютъра, докато той работи, но ще трябва да се уверите, че сте избрали правилния порт, който се движи напред, или можете да изключите предаващия arduino и да го захранвате от друг източник, след като кодът е качени.

Говорейки за това, сега трябва да изберете порта, който е свързан с вашия arduino за получаване от менюто с инструменти на IDE и да стартирате python.

Не отваряйте серийния монитор, докато правите това, python не може да прочете серийния, докато мониторът е отворен. След като python е отворен, извикайте функцията pythonprint, както следва.

pythonlogger.pythonprint ()

Това ще започне събирането на данни от серийния порт на arduino. Ако отворите папка python сега, ще видите, че е създаден нов.csv файл, наречен "test_data.csv", който съдържа цялата информация за времето и температурата. Това ще бъде файлът, до който Matlab има достъп, за да извърши всички свои изчисления и контроли.

Друго предупреждение: не отваряйте test_data.csv, докато се осъществява достъп или запис на данните. Ако го направите, кодът на python и/или Matlab ще се срине и ще изпрати грешка обратно

Ако все пак решите да отворите.csv по -късно, ще забележите, че колоната за време е само много голям низ от числа. Това е така, защото командата time.time () записва броя секунди от 1 януари 1970 г.

В този момент python трябва да отпечата температурните данни, които чете от серийния порт. Трябва да изглежда нещо като:

b'25.03 '/r/n

Не се притеснявайте за допълнителните знаци, индексите на кода на Matlab за средните пет стойности във втората колона на.csv файла.

Сега, когато всички поддържащи програми работят и се събират данни, можем да започнем да събираме GPS данни от мобилната програма Matlab, която беше настроена по -рано, и да стартираме кода на Matlab GUI. След като сте в раздела сензор на Matlab mobile, изберете GPS и натиснете бутона за стартиране.

Ако сте нов в Matlab mobile, върнете се към стъпка 4 и погледнете екранните снимки по -горе. Ако все още имате проблеми, уверете се, че сте свързани с компютъра, който сте избрали по -рано (в раздела с настройки) и използвайте връзката от командата "конектор на", за да проверите дали Matlab е онлайн.

Стъпка 6: Използване на програмата

Използване на програмата
Използване на програмата

Във фонов режим в тази система се случват множество неща. Данните за температурата се събират и регистрират от arduino и pyton, Matlab събира GPS данни от телефона ви и провежда изчисления, за да види колко далеч сте от къщата си и да настроите термостата си въз основа на цялата тази информация. Там, където влизате, предоставяте вашите предпочитания.

Стартирайте GUI кода на Matlab. Отворете.mlapp файла и погледнете първия раздел. Ще трябва сами да съберете информацията за това, ефективността и мощността на вашия отоплителен/охлаждащ агрегат обикновено могат да бъдат намерени на самия уред, а средната ви скорост е само добра оценка за това колко бързо шофирате. След като стойностите бъдат въведени, натиснете бутона "Run Diagnostic" и програмата контролира вашия термостат, за да събере информация за вашия дом.

Преминете към следващото меню.

Стъпка 7: Контрол на температурата

Контрол на температурата
Контрол на температурата

Това меню ви позволява да изберете предпочитаната от вас температура, докато сте у дома и далеч. Задайте Температура #1 на вашата комфортна температура, а Температура #2 на висока или ниска стойност, която е безопасна за вашия дом (уверете се, че не сте я настроили на 100 градуса, докато имате кучета у дома и т.н.).

Стъпка 8: Исторически данни

Исторически данни
Исторически данни

Накрая можете да наблюдавате колко пари пестите, като използвате автоматичното управление. Това по същество изчислява колко енергия би била използвана, ако термостатът ви е настроен на предпочитаната от вас температура 24/7, след което изважда действително използваната ви енергия.

Успех в изграждането.

Препоръчано: