Tartalomjegyzék:

Autostat: távoli termosztát: 8 lépés (képekkel)
Autostat: távoli termosztát: 8 lépés (képekkel)

Videó: Autostat: távoli termosztát: 8 lépés (képekkel)

Videó: Autostat: távoli termosztát: 8 lépés (képekkel)
Videó: Битва Титанов: МАЗ или КамАЗ? Что лучше? Легендарные грузовики СССР | Автоистория | ПАО КАМАЗ 2024, Július
Anonim
Autostat: távoli termosztát
Autostat: távoli termosztát

A kérdés, amit valószínűleg feltesz, "miért csinál egy másik távoli termosztátot?"

A válasz erre a kérdésre az, hogy muszáj volt, és a piacon elérhető intelligens termosztátok túl drágák.

Tisztességes figyelmeztetés, ez a "koncepció-bizonyítás" konstrukció, amely néhány extra kimenetet igényel a termosztát tényleges vezérléséhez, de a mag a helyén van, és az adott körülményektől függően módosítható. Ezenkívül ez még folyamatban van, ezért várjon néhány frissítést és módosítást (különösen a Matlab kódban)

A kezdéshez szeretném figyelmeztetni Önt, ehhez három programra van szükség (az egyik meglehetősen drága), jó néhány könyvtárra és a programok támogatási csomagjaira, és mindegyiknek beszélnie kell egymással. Fejfájása van. Ezzel a figyelmeztetéssel el lehet indulni az anyagokkal.

Hardver

  • arduino nano
  • arduino uno (vagy egy másik nano, csak az uno -t használtam, mert volt egy fekvésem)
  • vegyes jumper kábelek, néhány férfi/férfi és két készlet három csatlakozó férfi/női jumper
  • 433 MHz-es rádiófrekvenciás (RF) vevő, én az MX-05V-t használtam
  • 433MHz RF adó, az MX-FS-03V-t használtam
  • DHT11 nagy pontosságú hőmérő és páratartalom -érzékelő (az általam használt egy háromágú chipre van felszerelve, a szükséges ellenállások már telepítve vannak)
  • kenyeretábla (ha nem akarja ezt az egészet összeforrasztani)
  • telefon GPS -el (ebben az esetben iPhone 8, de Galaxy S8 -at is használtam)
  • 3D nyomtatott konténer (nem igazán szükséges, bármely tároló működni fog, vagy egyáltalán nem működik)

Szoftver

  • Matlab a MathWorks-ból (van 2018a kiadásom, de használtam 2017a-b kiadásokat is)
  • Matlab mobile telepítve van a telefonjára
  • arduino támogatási csomag a Matlab számára
  • iPhone szenzorcsomag a Matlab számára
  • arduino IDE
  • A RadioHead támogató csomagjai és az arduino IDE könyvtárai
  • DHT11 könyvtár az arduino IDE számára
  • python 3.7 (győződjön meg arról, hogy a pyserial könyvtár vagy a soros könyvtár telepítve van, ami a 3.4 vagy újabb verzió esetén kell)

1. lépés: Összerakni

Összerakni
Összerakni
Összerakni
Összerakni
Összerakni
Összerakni

Először is azt javaslom, hogy végezzen néhány arduino oktatóanyagot az RF -adókkal kapcsolatban, csak hogy megbizonyosodjon arról, hogy az alkatrészek működnek és a kábelezés megfelelő. Rengeteg példa áll rendelkezésre, a kóddal együtt (azok számára, akik keveset vagy semmit nem tudnak a C -ről és a C ++ -ról).

Kövesse az alábbi kapcsolási rajzokat az arduino és az érzékelők összeszereléséhez. Egy dolgot szem előtt kell tartani az arduinók bekötése közben, hogy az általam használt adatportok nem kötelezőek, de ajánlottak.

HA úgy dönt, hogy megváltoztatja a használt adatportokat, akkor csak meg kell határoznia a csapokat a kódban. Személy szerint azt hiszem, könnyebb betartani az arduino könyvtárak által felismert alapértelmezett portokat.

És hogy egyértelmű legyen, a nano és az uno felcserélhető, de én a projektor adóoldalához használtam a nanót, hogy csökkentsem a hőmérséklet -monitor méretét.

Mellékjegyzet: a nano tartó zöld szerkezet a 3D nyomtatott tartály.

2. lépés: Vevő

Vevő
Vevő

3. lépés: Adó

Adó
Adó

4. lépés: A kód

Miután a kábelezés befejeződött, el kell indítania az összes programot és telepítenie kell a könyvtárakat (ha még nem tette meg), feltételezem, hogy már elindította a Matlabot, és futtatnia kell az iPhone támogatási csomagot. A telefonnak és a Matlabnak ugyanabban a wifi -hálózatban kell lennie ezen a ponton.

A Matlab parancsablakába írja be:

csatlakozó bekapcsolva

Ez kéri, hogy adjon meg egy ötjegyű jelszót, amelyet az iPhone -on való csatlakozáshoz használ. Ügyeljen arra, hogy emlékezzen a jelszóra. A jelszó megadása után a Matlab megjelenít néhány információt, beleértve az IP -címet. Használja ezt a következő lépésben, amely a Matlab mobile "Első lépések az érzékelőkkel" súgó menüjének utasításaiból származik.

  • Kövesse az alábbi lépéseket az érzékelőadatok MathWorks Cloudba vagy számítógépre küldéséhez:
  • Ha az érzékelő adatait számítógépre küldi, és ha még nincs telepítve, töltse le és telepítse a MATLAB támogatási csomagot az Apple iOS érzékelőkhöz a MATLAB -ban.
  • Csatlakoztassa a MATLAB Mobile -t a MathWorks Cloudhoz vagy egy számítógéphez a Beállítások segítségével.
  • Hozzon létre mobiledev objektumot a MATLAB -ban (számítógépén), például: >> m = mobiledev
  • Válasszon ki egy vagy több érzékelőt, majd koppintson a Start gombra.

Kövesse az alábbi lépéseket az érzékelőadatok naplózásához a készüléken:

  • Az Érzékelők képernyőn válassza ki azokat az érzékelőket, amelyekből adatokat szeretne gyűjteni.
  • Válassza a Napló lehetőséget.
  • Koppintson a Start gombra.
  • Ha befejezte az adatgyűjtést, érintse meg a Stop gombot.
  • Az előugró ablakban adja meg az érzékelőnapló nevét.
  • Szükség esetén ismételje meg az 1-5. Lépést.

Erre a szakaszra a 4. részben hivatkozunk, így még nem kell ténylegesen elkezdeni az adatgyűjtést. Csak tartsa kéznél telefonját, és készen áll a Matlab mobilra.

Most létre kell hoznia egy mappát valahol a számítógépében a Matlab kódfájlok tárolására. Négy külön fájlja lesz, kettő a háttérfunkciókhoz (.m fájlok) és egy Matlab kódfájl a grafikus felhasználói felülethez (.mlapp),.

Az első a házban lévő levegő tömegének kiszámítása (ez lehetővé teszi a Matlab számára, hogy mennyi ideig tart a ház fűtése/hűtése)

function [Mass] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = óra; time_end = 0 while runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; egyébként PwrCntr = P_out; runCalc = runCalc+0,1 befejezési idő_diag = time_end-time_start Mass = (P_out*time_diag)/7.035

És a második:

function [időbélyegek, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; i = 1; míg az AutoStat == 1 time_start = óra; m = mobildev; t = csvread ('values.csv', 0, 1); t = t (i); időbélyegek = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; formátum longg; %hasrsine képlet a távolság kiszámításához a szélességi és %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m.latitude).*(sind ((m. hosszúság-hosszú)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %becsli a visszatérési időt time_rtn = (Dist-r_pref)./ speed; A %kiszámítja a szükséges termosztát -beállítást a klímaberendezés %-os kimenete és az otthon légtömege alapján. calcTmp_set = ((-1.*P_out.*time_rtn)./ (tömeg.*(1.005)))+T_pref; %határozza meg, hogy meg kell -e változtatni a termosztát aktuális beállítását, ha kerek (calcTmp_set) ~ = forduló (t) timeACon = óra; PwrCntr = P_out; timeACon = timeACon + clock-time_start; költség = P_out*timeACon*arány; else PwrCntr = 0 végidőbélyeg (vége+1, [1: 6]) = óra; pwr_usage (vége+1, 1) = PwrCntr; szünet (5) vége vége

Mindkét fájl Matlab függvény. Nem kell hozzájuk férnie, hacsak nem tervezi, hogy speciális igények szerint módosítja őket, mivel a GUI -ból fogja hívni őket. Mentse el külön -külön mindkét fájlt, az elsőt CalcMass.m néven, a másodikat pedig dist_cntrl.m néven, ezek lesznek azok a nevek, amelyeket a GUI -kód használ a funkciók meghívásához, ezért ha nem szeretné szerkeszteni az alábbi kód többi részét, tartsa be a névadási egyezmény.

Mielőtt belépne a GUI kódba, meg kell nyitnia a Matlab alkalmazástervezőjét, amelyet a Matlab menüsorban való navigálással, vagy a kedvenc módszeremmel nyithat meg, amely a következő parancsot írja be a Matlab parancsablakban:

appdesigner

Az alkalmazástervező megnyitása után nyisson meg egy új alkalmazásfájlt (.mlapp), és törölje az összes alapértelmezett kódot a kódablakból. Ezután cserélje ki az összeset a következővel, és nyomja meg a futtatás gombot.

classdef Control_1 <matlab.apps. AppBase % Az alkalmazás összetevőinek tulajdonságainak megfelelő tulajdonságok (Access = public) UIFigure matlab.ui. Figura TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. gomb 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 matlab.lab. 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. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLieldcontrol.lab.

metódusok (Hozzáférés = privát)

% Érték megváltozott függvény: tempnow

függvény tempnowValueChanged (app, event) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 az i = hossz (temp) app. Gauge. Value = temp (i) pause (1) end end

% Érték megváltozott függvény: TemperatureDirectionSwitch

function TemperatureDirectionSwitchValueChanged (app, event) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; más Chng_dir = 1; vége Chng_dir; vége

% Érték megváltozott függvény: DDFH

függvény DDFHValueChanged (app, event) r_pref = app. DDFH. Value; vége

% Érték megváltozott függvény: AvgLocalSpeedEditField

function AvgLocalSpeedEditFieldValueChanged (app, event) speed = app. AvgLocalSpeedEditField. Value; vége

% Érték megváltozott függvény: PowerOutputRatingEditField

function PowerOutputRatingEditFieldValueChanged (app, event) value = app. PowerOutputRatingEditField. Value; vége

% Érték megváltozott függvény: EnergyEfficiencyRatingEditField

függvény EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; vége

% Gombnyomott funkció: RunDiagnosticButton

function RunDiagnosticButtonPushed (app, event) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; más Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

vége

% Érték megváltozott funkció: Temperature1Spinner

function Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; vége

% Érték megváltozott funkció: Temperature2Spinner

function Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; vége

% Érték megváltozott funkció: Kapcsoló

függvény SwitchValueChanged (alkalmazás, esemény) m = mobiledev; Szélesség = m r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; sebesség = m. Speed; tömeg = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) vége

% App inicializálása és felépítése

metódusok (Hozzáférés = privát)

% UIFigure és összetevők létrehozása

function createComponents (alkalmazás)

% UIFigure létrehozása

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

% TabGroup létrehozása

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

% SetupTab létrehozása

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Beállítás';

% Létrehozása RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'félkövér'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Diagnosztika futtatása';

% EnergyEfficiencyRatingEditFieldLabel létrehozása

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'jobb'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energiahatékonysági besorolás';

% EnergyEfficiencyRatingEditField létrehozása

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numerikus'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'központ'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% PowerOutputRatingEditFieldLabel létrehozása

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'jobb'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Teljesítményminőség';

% PowerOutputRatingEditField létrehozása

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numerikus'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'központ'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Hozz létre AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'jobb'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Átl. Helyi sebesség”;

% AvgLocalSpeedEditField létrehozása

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'numerikus'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'központ'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Create DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'jobb'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Kívánt távolság'; 'Házból'};

% DDFH létrehozása

app. DDFH = uieditfield (app. SetupTab, 'numerikus'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (app, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'központ'; app. DDFH. Position = [139 135 100 22];

% Create TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Hőmérsékletirány';

% Create TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'csúszka'); app. TemperatureDirectionSwitch. Items = {'Fel', 'Le'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Fel';

% TempSettingsTab létrehozása

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Hőm. Beállítások';

% Create Temperature1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Hőmérséklet'; '#1'};

% Create Temperature1Spinner

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;

% Create Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Hőmérséklet'; '#2'};

% Create 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 létrehozása

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

% EditFieldLabel létrehozása

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

% Tempnow létrehozása

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

% GaugeLabel létrehozása

app. GaugeLabel = uilabel (kb. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'center'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Mérőóra';

% Mérőeszköz létrehozása

app. Gauge = uigauge (app. TempSettingsTab, 'körkörös'); 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 létrehozása

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Takarék';

% UIAx -ek létrehozása

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (kb. UIAxes, 'Hónap és év') ylabel (kb. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0.60666666666666 0.606666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Create ThisMonthCostEditFieldLabel

app. This havi költségEditFieldLabel = uilabel (app. SavingsTab); app. This MonthCostEditFieldLabel. HorizontalAlignment = 'center'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'E havi költség';

% Create ThisMonthCostEditField

app. This havi költségEditField = uieditfield (app. SavingsTab, 'numeric'); app. This havi költségEditField. Limits = [0 Inf]; app. This MonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'center'; app. This havi költségEditField. Position = [417 39 137 58];

% TotalSavingsEditFieldLabel létrehozása

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'jobb'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Összes megtakarítás';

% TotalSavingsEditField létrehozása

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numerikus'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'központ'; app. TotalSavingsEditField. Position = [88 39 137 58]; vége vége

módszerek (Hozzáférés = nyilvános)

% Alkalmazás létrehozása

függvény app = Control_1

% Alkotóelemek létrehozása és konfigurálása

createComponents (alkalmazás)

% Regisztrálja az alkalmazást az App Designer alkalmazásban

registerApp (app, app. UIFigure)

ha nargout == 0

tiszta az alkalmazás vége

% Kód, amely az alkalmazás törlése előtt fut

funkció törlése (alkalmazás)

% UIFigure törlése az alkalmazás törlésekor

törlés (app. UIFigure) vége vége

Valószínűleg hibaüzenetet kap, ami nem probléma. Csak zárja be a GUI -t, amelyet a futás megnyomása után generált, egy pillanat alatt összegyűjtjük a többi szükséges programot és adatot.

Mivel a Matlab fel van állítva, továbbléphetünk a pythonra. Először futtassa a python programot a parancssorból (Windows rendszeren) vagy a.exe fájl használatával a python mappában. Győződjön meg arról, hogy az összes megfelelő könyvtár telepítve van az import parancs használatával.

sorozat importálása

import idő import csv

Ezt a három könyvtárat kell kezdenie, bár hamarosan saját könyvtárat készítünk. Ha valamilyen hiba történt ezekkel a parancsokkal, menjen vissza, és győződjön meg arról, hogy a könyvtárak telepítve vannak, és a python mappa Lib mappájában vannak. Ezután létrehozunk egy ún. Pythonlogger könyvtárat. Ez a név nem szükséges, bármikor hívhatja, csak a létrehozott python fájl (.py) neve.

Nyisson meg egy szövegszerkesztőt, én Sublime3 -at használok, de a jegyzettömb jól működik, és írja be ezt a kódot.

def pythonprint ():

import pythonlogger import soros import idő import csv ser = serial. Serial ('COM8') # COM8 az arduino soros port, ez valószínűleg minden felhasználónál más lesz, azaz ellenőrizze soros portját az arduino IDE ser.flushInput () Igaz: try: ser_bytes = ser.readline () print (ser_bytes) open ("test_data.csv", "a"), mint f: író = csv.writer (f, határoló = ",") # beállítja az adatokat vesszővel elválasztott íróként kell megadni.writerow ([time.time (), ser_bytes]) #adatokat ír a test_data.csv fájlba, kivéve: print ("Hiba történt") break

Mentse el a szöveget "illessze be a kívánt könyvtár nevét".py a Lib mappába. Azt is vegye figyelembe, hogy a def pythonprint () sor határozza meg a meghívni kívánt függvény nevét, így megváltoztathatja azt úgy, hogy def "illessze be a kívánt funkció nevét" (). A könyvtár mentése után áttérhetünk az arduino kódra.

Nyissa meg az arduino IDE -t, és nyisson meg két új vázlatablakot. Mentse el ezt a két vázlatfájlt kényelmes helyre, e fájlok neve nem számít. Ezután törölje az összes alapértelmezett kódot, és cserélje le a következővel.

A fogadó arduino számára:

#befoglalni

#include #include #include // ezt nem használják, de szükséges az RH_ASK illesztőprogram fordításához; structure dataStruct {float temp; }adataim; void setup () {Serial.begin (9600); // Hibakeresés csak akkor, ha (! 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)) // Nem blokkoló {int i; // Jó ellenőrző összegű üzenet érkezett, dobja ki. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. a //driver.printBuffer ……. stb. sor tesztkód. Nem kell aggódnia miatta, ha nem diagnosztizál, és ki szeretné deríteni, hogy valóban adatokat kap -e.

Az arduino adó számára

#befoglalni

#include #include #include // ezt nem használják, de a fordításhoz szükséges #include #include int pin = 4; DHT11 dht11 (csap); RH_ASK illesztőprogram; structure dataStruct {float temp; }adataim; bájt tx_buf [sizeof (myData)] = {0}; // Tehát az argumentumok bitráta, továbbító pin (tx), // fogadó pin (rx), ppt pin, isInverse. Az utolsó 2 nem használható.void setup () {Serial.begin (9600); // Hibakeresés csak akkor, ha (! Driver.init ()) Serial.println ("init failed"); } void loop () {int err; lebegési hőmérséklet, humi; uint8_t msg; if ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); bájt zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // a végrehajtás leállítása az összes adat elküldéséig késleltetés (2000); // várjon 2 másodpercet}}

Az include parancsoknak elegendőnek kell lenniük, de ha később bármilyen problémája adódik az adatátvitel során, érdemes megnézni a RadioHead könyvtár mappáját, és a fájlnevek többi részét is feltüntetni ugyanabban a formátumban.

5. lépés: Működjön

Működés
Működés
Működés
Működés
Működés
Működés

Most, hogy az összes kód együtt van, és az arduino össze van szerelve, csatlakoztathatjuk az arduino -t a számítógéphez, és betölthetjük a kódot. Győződjön meg arról, hogy a megfelelő kódot küldi a fogadó és az adó mikrovezérlőknek. Mindkét arduinót csatlakoztathatja a számítógéphez futás közben, de meg kell győződnie arról, hogy a megfelelő port van kiválasztva, vagy leválaszthatja az átvivő arduino -t, és a kód bekapcsolása után más forrásból táplálhatja azt feltöltve.

Ennek apropóján most válassza ki a portot, amely a fogadó arduino -hoz van csatlakoztatva az IDE eszközök menüjéből, és futtassa a python -t.

Ne nyissa ki a soros monitort, miközben ezt teszi, a python nem tudja olvasni a sorozatot, amíg a monitor nyitva van. Miután a python megnyílt, hívja meg a pythonprint függvényt az alábbiak szerint.

pythonlogger.pythonprint ()

Ezzel elindul az adatgyűjtés az arduino soros portról. Ha most megnyitja a python mappáját, látni fogja, hogy egy új.csv -fájl jött létre, "test_data.csv" néven, amely tartalmazza az összes idő- és hőmérsékletinformációt. Ez lesz az a fájl, amelyhez a Matlab hozzáfér minden számításhoz és vezérléshez.

Egy másik figyelmeztetés: ne nyissa meg a test_data.csv fájlt, amíg az adatokhoz hozzáférnek vagy írnak. Ha így tesz, a python és/vagy a Matlab kód összeomlik, és hibát küld vissza

Ha mégis úgy dönt, hogy később megnyitja a.csv fájlt, akkor észre fogja venni, hogy az időoszlop csak egy nagyon nagy számsor. Ez azért van, mert a time.time () parancs 1970. január 1 -je óta írja a másodpercek számát.

Ezen a ponton a pythonnak ki kell nyomtatnia a hőmérséklet adatokat, amelyeket a soros portról olvas. Valahogy így kellene kinéznie:

b'25.03 '/r/n

Ne aggódjon az extra karakterek miatt, a Matlab kód indexeli a.csv fájl második oszlopának középső öt értékét.

Most, hogy az összes támogató program működik, és az adatokat gyűjtjük, elkezdhetjük a GPS -adatok gyűjtését a korábban beállított Matlab mobilprogramból, és futtathatjuk a Matlab GUI -kódját. Miután belépett a Matlab mobile érzékelő fülébe, válassza a GPS lehetőséget, és nyomja meg a start gombot.

Ha még nem ismeri a Matlab mobilkészüléket, olvassa el a 4. lépést, és nézze meg a fenti képernyőképeket. Ha továbbra is problémái vannak, győződjön meg arról, hogy csatlakozik a korábban kiválasztott számítógéphez (a beállítások lapon), és használja a "csatlakozó be" parancs linkjét, hogy ellenőrizze, hogy a Matlab online -e.

6. lépés: A program használata

A Program használata
A Program használata

Ebben a rendszerben több dolog is zajlik a háttérben. A hőmérséklet adatokat az arduino és a pyton gyűjti és naplózza, a Matlab GPS adatokat gyűjt a telefonjáról és számításokat végez, hogy lássa, milyen messze van a házától, és beállítja a termosztátot ezen információk alapján. Ahol belépsz, megadod a preferenciáidat.

Futtassa a Matlab GUI kódot. Nyissa meg a.mlapp fájlt, és nézze meg az első lapot. Ehhez maga kell gyűjtenie az információkat, a fűtési/hűtési egység hatékonysága és teljesítménye általában magán a készüléken található, és az átlagos sebesség csak egy jó becslés arra vonatkozóan, hogy milyen gyorsan vezet. Az értékek megadása után nyomja meg a "Diagnosztika futtatása" gombot, és a program vezérli a termosztátot, hogy információkat gyűjtsön a házáról.

Lépjen a következő menüre.

7. lépés: Hőmérséklet -szabályozás

Hőmérséklet szabályozás
Hőmérséklet szabályozás

Ez a menü lehetővé teszi a kívánt hőmérséklet kiválasztását otthon és távol. Állítsa az 1. hőmérsékletet a kényelmes hőmérsékletre, a 2. hőmérsékletet pedig magas vagy alacsony értékre, amely biztonságos az Ön otthona számára (ügyeljen arra, hogy ne állítsa 100 fokra, amíg kutyája van otthon, stb.).

8. lépés: Történelmi adatok

Történelmi adat
Történelmi adat

Végül megnézheti, hogy mennyi pénzt takarít meg az automatikus vezérlés segítségével. Ez lényegében megbecsüli, hogy mennyi energiát használna fel, ha a termosztátot 24 órában a kívánt hőmérsékletre állította, majd levonja a ténylegesen felhasznált energiát.

Sok sikert az építéshez.

Ajánlott: