Tartalomjegyzék:
- 1. lépés: Összerakni
- 2. lépés: Vevő
- 3. lépés: Adó
- 4. lépés: A kód
- 5. lépés: Működjön
- 6. lépés: A program használata
- 7. lépés: Hőmérséklet -szabályozás
- 8. lépés: Történelmi adatok
Videó: Autostat: távoli termosztát: 8 lépés (képekkel)
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:42
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
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ő
3. lépés: 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
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
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
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
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:
Intelligens ESP8266 termosztát: 6 lépés (képekkel)
Intelligens termosztát ESP8266: Bienvenue sur ce nouvel cikk. On se retrouve aujourd'hui pour un projet que j'ai réalisé durant tout ce temps libre que m'a offert le confinement. Ce projet m'a été proposé par mon père, en effet il vient de déménager dans une vieille maison et l
HestiaPi Touch - nyitott intelligens termosztát: 9 lépés (képekkel)
HestiaPi Touch - Nyitott intelligens termosztát: A HestiaPi Touch -ról A HestiaPi Touch egy teljesen nyílt forráskódú intelligens termosztát otthona számára. Minden digitális fájl és információ elérhető az alábbiakban és a fő weboldalunkon. Ezzel nyomon követheti otthonának hőmérsékletét, relatív páratartalmát és légkörét
A hőcserélő ventilátor termosztát vezérlése: 7 lépés (képekkel)
Egy hőcserélő ventilátor termosztát vezérlése: Sziasztok! Ebben az utasításban megmutatom, hogyan lehet automatizálni a hőcserélő ventilátort egy olcsó termosztát modul segítségével. Figyelmeztetés: Ez a projekt hálózati feszültséget használ, és megfelelően kell kezelni. Nem tudom, mit csinál, ne próbálja
Nest termosztát előzmények adatgyűjtője: 6 lépés (képekkel)
Nest termosztát előzmények adatgyűjtője: A Nest termosztát nyomon követi a hőmérsékletet, a páratartalmat és a kemence/váltakozó áramú felhasználást, és a felhasználók csak 10 napig láthatják a korábbi adatokat. Szerettem volna előzetes adatokat gyűjteni (> 10 nap), és rábukkantam a Google táblázatkezelő szkriptjére, amely a pingeket minden meghatározott időpontban beágyazja
Csatlakoztatott termosztát: 6 lépés (képekkel)
Csatlakoztatott termosztát: Az otthoni hőmérséklet pontos figyelése határozottan az egyik legjobb módja az energiaszámla megtakarításának. Ugyanakkor szeretne jól érezni magát egy meleg otthonban télen. A jelenlegi termosztátom csak statikus programozást tesz lehetővé: I