Kazalo:
- Korak: Združite vse skupaj
- Korak: Sprejemnik
- 3. korak: Oddajnik
- 4. korak: Koda
- 5. korak: Naj bo delo
- 6. korak: Uporaba programa
- 7. korak: Nadzor temperature
- 8. korak: Zgodovinski podatki
Video: Autostat: daljinski termostat: 8 korakov (s slikami)
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:06
Vprašanje, ki ga verjetno postavljate, je "zakaj izdelujete drug daljinski termostat?"
Odgovor na to vprašanje je, da sem moral, tržni pametni termostati pa so predragi.
Pošteno opozorilo, to je konstrukcija "proof-of-concept", ki bi zahtevala nekaj dodatnih izhodov za dejansko upravljanje vašega termostata, vendar je jedro na mestu in ga je mogoče spremeniti glede na vaše posebne okoliščine. Tudi to še vedno poteka, zato pričakujte nekaj posodobitev in sprememb (zlasti kode Matlab)
Za začetek vas želim opozoriti, da so za to potrebni trije programi (eden od njih je precej drag), kar nekaj knjižnic in podpornih paketov za programe, zato morajo vsi govoriti med seboj. To je glavobol. S tem opozorilom ne moremo začeti z materiali.
Strojna oprema
- arduino nano
- arduino uno (ali drug nano, ravnokar sem uporabil uno, ker sem imel enega naokoli)
- različni skakalni kabli, nekaj moških/moških in dva kompleta treh združenih moško/ženskih skakalcev
- 433MHz radijski frekvenčni (RF) sprejemnik, uporabil sem MX-05V
- 433MHz RF oddajnik, uporabljal sem MX-FS-03V
- DHT11 visoko natančen termometer in senzor vlažnosti (tisti, ki sem ga uporabil, je nameščen na tropolnem čipu z že nameščenimi potrebnimi upori)
- plošča (če tega ne želite spajkati skupaj)
- telefon z GPS -om (v tem primeru iPhone 8, uporabljal pa sem tudi Galaxy S8)
- 3D natisnjen vsebnik (ni nujno, kateri koli vsebnik bo deloval ali pa ga sploh ne bo)
Programska oprema
- Matlab iz MathWorksa (imam izdajo 2018a, vendar sem uporabil tudi izdaji 2017a-b)
- Mobilni telefon Matlab je nameščen na vašem telefonu
- Podporni paket arduino za Matlab
- Paket senzorjev iPhone za Matlab
- arduino IDE
- Podporni paketi RadioHead in knjižnice arduino IDE
- Knjižnica DHT11 za arduino IDE
- python 3.7 (preverite, ali je nameščena knjižnica pyserial ali serijska knjižnica, kar bi moralo biti za različico 3.4 ali novejšo)
Korak: Združite vse skupaj
Najprej vam predlagam, da naredite nekaj arduino vaj, ki obravnavajo RF oddajnike, samo da se prepričate, ali vaši deli delujejo in je ožičenje pravilno. Na voljo je veliko primerov, vključno s kodo (za tiste od nas, ki o C in C ++ vemo malo ali nič).
Sledite spodnjim shemam ožičenja, da sestavite arduino in senzorje. Pri ožičenju arduinosov je treba upoštevati, da podatkovna vrata, ki sem jih uporabila, niso obvezna, ampak priporočljiva.
Če se odločite spremeniti podatkovna vrata, ki jih uporabljate, morate le določiti zatiče v kodi. Osebno menim, da se je lažje držati privzetih vrat, ki jih knjižnice arduino prepoznajo.
Da bi bilo jasno, sta nano in uno zamenljiva, vendar sem nano uporabil za oddajno stran projekta, da bi zmanjšal velikost monitorja temperature.
Stranska opomba: zelena naprava, ki drži nano, je 3D natisnjena posoda.
Korak: Sprejemnik
3. korak: Oddajnik
4. korak: Koda
Ko je ožičenje končano, morate zagnati vse programe in namestiti knjižnice (če tega še niste storili). Predvidevam, da jih imate, morate zagnati Matlab in zagnati paket za podporo iPhone. Tako vaš telefon kot Matlab morata biti na istem omrežju WiFi.
V ukazno okno Matlaba napišite:
priključek vklopljen
To vas bo pozvalo, da vnesete petmestno geslo, ki ga boste uporabili za povezavo na svojem iPhoneu. Zapomnite si geslo. Ko vnesete geslo, bo Matlab prikazal nekaj podatkov, vključno z vašim naslovom IP. Uporabite to v naslednjem koraku, ki izhaja iz navodil v meniju za pomoč "Prvi koraki s senzorji" v Matlab mobile.
- Če želite podatke senzorja poslati v oblak MathWorks ali v računalnik, sledite tem korakom:
- Če podatke o senzorju pošiljate v računalnik in če še niso nameščeni, prenesite in namestite paket podpore MATLAB za senzorje Apple iOS v MATLAB.
- Z nastavitvami povežite MATLAB Mobile z oblakom MathWorks ali računalnikom.
- Ustvarite objekt mobiledev v programu MATLAB (v računalniku), na primer: >> m = mobiledev
- Izberite enega ali več senzorjev in pritisnite Start.
Za lokalno beleženje podatkov tipala sledite tem korakom:
- Na zaslonu senzorjev izberite senzorje, iz katerih želite zbirati podatke.
- Izberite Dnevnik.
- Dotaknite se gumba Start.
- Ko končate z zbiranjem podatkov, tapnite gumb Ustavi.
- V pojavnem oknu vnesite ime dnevnika senzorja.
- Po potrebi ponovite korake 1-5.
Ta razdelek se bo vrnil v 4. del, zato še ni treba dejansko začeti zbirati podatkov. Telefon imejte pri roki, mobilni telefon Matlab pa pripravljen.
Zdaj morate nekje v računalniku ustvariti mapo za shranjevanje kodnih datotek Matlab. Imeli boste štiri ločene datoteke, dve za funkcije v ozadju (datoteke.m) in eno datoteko kode Matlab za grafični vmesnik (.mlapp),.
Najprej je izračun mase zraka v vaši hiši (s tem Matlab ve, koliko časa traja za ogrevanje/hlajenje vaše hiše)
funkcija [Mass] = CalcMass (T_ins, P_out, Chng_dir)
runCalc = 0; Tmp_start = T_ins; časovni_start = ura; time_end = 0 while runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; drugače PwrCntr = P_out; runCalc = runCalc+0,1 končni čas_diag = time_end-time_start Mass = (P_out*time_diag)/7,035
In drugo:
funkcija [časovni žigi, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, hitrost, T_pref, masa)
AutoStat = 1; i = 1; medtem ko je AutoStat == 1 time_start = ura; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); časovne oznake = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; format longg; %formula haversine za izračun razdalje na podlagi zemljepisne širine in %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m. širina).*(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; %ocenjuje vaš čas za vrnitev time_rtn = (Dist-r_pref)./ hitrost; %izračuna potrebno nastavitev termostata glede na izklop električne energije %klimatske naprave in zračne mase doma. calcTmp_set = ((-1.*P_out.*time_rtn)./ (masa.*(1.005)))+T_pref; %določa, ali je treba spremeniti trenutno nastavitev termostata, če je okrogel (calcTmp_set) ~ = okrogel (t) čas ACon = ura; PwrCntr = P_out; timeACon = timeACon + start-time_start; cena = P_out*čas ACon*stopnja; else PwrCntr = 0 končnih časovnih žigov (konec+1, [1: 6]) = ura; pwr_usage (konec+1, 1) = PwrCntr; premor (5) konec konca
Obe datoteki sta funkciji Matlab. Do njih vam ne bo treba dostopati, razen če jih nameravate spremeniti za posebne potrebe, saj jih boste klicali iz grafičnega vmesnika. Obe datoteki shranite ločeno, prvo kot CalcMass.m in drugo kot dist_cntrl.m, to bosta imena, ki jih koda grafičnega vmesnika uporablja za klicanje funkcij, zato, če ne želite urediti preostale kode spodaj, se držite konvencijo o poimenovanju.
Preden vnesete kodo grafičnega vmesnika, morate odpreti oblikovalca aplikacij za Matlab, ki ga lahko odprete s krmarjenjem v menijski vrstici Matlab ali z mojo najljubšo metodo, ki v ukazno okno Matlab vnese naslednji ukaz:
oblikovalec aplikacij
Ko je oblikovalec aplikacij odprt, odprite novo datoteko aplikacije (.mlapp) in izbrišite vso privzeto kodo iz okna za kodo. Nato vse zamenjajte z naslednjim in pritisnite gumb za zagon.
classdef Control_1 <matlab.apps. AppBase % Lastnosti, ki ustrezajo lastnostim komponent aplikacije (Dostop = javno) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton.tab. Button 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. Nalepka TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.uni.kontrol. ui.control. Spinner Temperature2SpinnerLabel matlab.ui.cont rol. Label Temperature2Spinner matlab.ui.control. Spinner Stikalo matlab.ui.control. Switch EditFieldLabel matlab.ui.control. Label tempnow matlab.ui.control. NumericEditField GaugeLabel matlab.ui.control. Label matlab.ui.control. Label matlab.ui.control. Label Tir 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 konec
metode (Access = zasebno)
% Funkcija spremenjene vrednosti: tempnow
funkcija tempnowValueChanged (aplikacija, dogodek) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 za i = dolžina (temp) app. Gauge. Value = temp (i) pause (1) end end
% Funkcija spremenjene vrednosti: TemperatureDirectionSwitch
funkcija TemperatureDirectionSwitchValueChanged (aplikacija, dogodek) način = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; konec Chng_dir; konec
% Funkcija spremenjene vrednosti: DDFH
funkcija DDFHValueChanged (aplikacija, dogodek) r_pref = app. DDFH. Value; konec
% Funkcija spremenjene vrednosti: AvgLocalSpeedEditField
funkcija AvgLocalSpeedEditFieldValueChanged (aplikacija, dogodek) speed = app. AvgLocalSpeedEditField. Value; konec
% Funkcija spremenjene vrednosti: PowerOutputRatingEditField
funkcija PowerOutputRatingEditFieldValueChanged (aplikacija, dogodek) vrednost = app. PowerOutputRatingEditField. Value; konec
% Funkcija spremenjene vrednosti: EnergyEfficiencyRatingEditField
funkcija EnergyEfficiencyRatingEditFieldValueChanged (aplikacija, dogodek) = app. EnergyEfficiencyRatingEditField. Value; konec
% Funkcija potiska gumba: RunDiagnosticButton
funkcija RunDiagnosticButtonPushed (aplikacija, dogodek) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; konec T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)
konec
% Funkcija spremenjene vrednosti: Temperatura1Spiner
funkcija Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; konec
% Funkcija spremenjene vrednosti: Temperatura2Spiner
funkcija Temperature2SpinnerValueChanged (aplikacija, dogodek) vrednost = app. Temperature2Spinner. Value; konec
% Funkcija spremenjene vrednosti: Stikalo
funkcija SwitchValueChanged (aplikacija, dogodek) m = mobiledev; Lat_in = m. Zemljepisna širina Lon_in = m. Dolžina P_out = 0; r_pref = app. DDFH. Vrednost; T_pref = app. Temperature1Spinner. Value; hitrost = m.hitrost; masa = 200; hitrost = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, hitrost, masa) end end
% Inicializacija in izdelava aplikacije
metode (Access = zasebno)
% Ustvarite sliko UIF in komponente
funkcija createComponents (aplikacija)
% Ustvari UIFigure
app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Slika uporabniškega vmesnika';
% Ustvari TabGroup
app. TabGroup = uitabgroup (app. UIFigure); app. TabGroup. Position = [1 1 640 480];
% Ustvarite SetupTab
app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Nastavitev';
% Ustvari RunDiagnosticButton
app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'krepko'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Zaženi diagnostiko';
% Ustvari oznako EnergyEfficiencyRatingEditFieldLabel
app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'desno'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Ocena energetske učinkovitosti';
% Ustvarite EnergyEfficiencyRatingEditField
app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numeric'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'center'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];
% Ustvarite PowerOutputRatingEditFieldLabel
app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'desno'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Ocena izhodne moči';
% Ustvarite PowerOutputRatingEditField
app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numeric'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'center'; app. PowerOutputRatingEditField. Position = [151 328 100 22];
% Ustvari oznako AvgLocalSpeedEditFieldLabel
app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'desno'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Povpr. Lokalna hitrost ';
% Ustvari AvgLocalSpeedEditField
app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'numeric'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, res); app. AvgLocalSpeedEditField. HorizontalAlignment = 'center'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];
% Ustvari DesiredDistancefromHouseEditFieldLabel
app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'desno'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Želena razdalja'; 'from House'};
% Ustvari DDFH
app. DDFH = uieditfield (app. SetupTab, 'numeric'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (aplikacija, @DDFHValueChanged, res); app. DDFH. HorizontalAlignment = 'center'; app. DDFH. Position = [139 135 100 22];
% Ustvari oznako TemperatureDirectionSwitchLabel
app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Temperaturna smer';
% Ustvari TemperatureDirectionSwitch
app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'drsnik'); app. TemperatureDirectionSwitch. Items = {'Gor', 'Dol'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Gor';
% Ustvari zavihek TempSettingsTab
app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Nastavitve ';
% Ustvari oznako Temperature1SpinnerLabel
app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Temperatura'; '#1'};
% Ustvari temperaturni vrtalnik
app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (app, @Temperature1SpinnerValueChanged, res); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;
% Ustvari oznako Temperature2SpinnerLabel
app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperatura'; '#2'};
% Ustvarite temperaturni spinner
app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (aplikacija, @Temperature2SpinnerValueChanged, res); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Value = 60;
% Ustvari stikalo
app. Switch = uiswitch (app. TempSettingsTab, 'drsnik'); 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';
% Ustvari EditFieldLabel
app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'desno'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = '';
% Ustvari tempnow
app.tempnow = uieditfield (app. TempSettingsTab, 'numeric'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (app, @tempnowValueChanged, res); app.tempnow. HorizontalAlignment = 'center'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;
% Ustvari GaugeLabel
app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'center'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Merilnik';
% Ustvari merilnik
app. Gauge = uigauge (app. TempSettingsTab, 'krožno'); 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;
% Ustvari kartico Varčevanje
app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Prihranki';
% Ustvarite oksi UIA
app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (app. UIAxes, 'Mesec in leto') ylabel (app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0,60666666666666667 0,60666666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];
% Ustvari to oznako MonthCostEditFieldLabel
app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'center'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Ta mesečni strošek';
% Ustvari to poljeMonthCostEditField
app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'numeric'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'center'; app. ThisMonthCostEditField. Position = [417 39 137 58];
% Ustvari oznako TotalSavingsEditFieldLabel
app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'desno'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Skupni prihranki';
% Ustvari TotalSavingsEditField
app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numeric'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'center'; app. TotalSavingsEditField. Position = [88 39 137 58]; konec konec
metode (dostop = javni)
% Konstruiraj aplikacijo
funkcija app = Control_1
% Ustvarite in konfigurirajte komponente
createComponents (aplikacija)
% Registrirajte aplikacijo pri App Designerju
registerApp (app, app. UIFigure)
če je nargout == 0
počisti konec aplikacije
% Koda, ki se izvede pred brisanjem aplikacije
funkcija brisanje (aplikacija)
% Delete UIFigure, ko je aplikacija izbrisana
delete (app. UIFigure) konec konec konec
Verjetno boste dobili napako, kar ni problem. Samo zaprite grafični vmesnik, ki je bil ustvarjen po pritisku na run, v trenutku bomo zbrali preostale potrebne programe in podatke.
Ker je Matlab nastavljen, lahko preidemo na python. Najprej zaženite program python iz ukaznega poziva (v sistemu Windows) ali z uporabo datoteke.exe v mapi python. Prepričajte se, da so vse ustrezne knjižnice nameščene z ukazom import.
uvozi serijsko
čas uvoza uvoz csv
To so tri knjižnice, ki jih boste morali začeti, čeprav bomo kmalu ustvarili svojo knjižnico. Če je pri teh ukazih prišlo do kakšne napake, se vrnite in se prepričajte, da so knjižnice nameščene in da so v mapi Lib v mapi python. Nato bomo ustvarili knjižnico pythonlogger. To ime ni potrebno, lahko ga pokličete, kot želite, samo ime datoteke python (.py), ki jo ustvarite.
Odprite urejevalnik besedil, uporabljam Sublime3, vendar beležnica deluje v redu, in vnesite to kodo.
def pythonprint ():
import pythonlogger import serijski čas uvoza import csv ser = serial. Serial ('COM8') # COM8 je serijsko vrata arduino, to bo verjetno različno za vsakega uporabnika, tj. preverite svoja serijska vrata v arduino IDE ser.flushInput () medtem ko Res: poskusite: ser_bytes = ser.readline () print (ser_bytes) z odprtimi ("test_data.csv", "a") kot f:riter = csv.writer (f, razmejevalnik = ",") # nastavi podatke na biti vnesen kot zapisovalec, ločen z vejicami.writerow ([time.time (), ser_bytes]) #zapisuje podatke v test_data.csv, razen: print ("Napaka prišlo") prelom
Besedilo shranite kot "vstavite ime knjižnice, ki jo želite".py v mapo Lib. Upoštevajte tudi, da vrstica def pythonprint () določa ime funkcije, ki jo boste poklicali, zato jo lahko spremenite tako, da definirate "vnesite ime, ki ga želite za svojo funkcijo" (). Ko je knjižnica shranjena, lahko preidemo na kodo arduino.
Odprite arduino IDE in odprite dve novi okni za skice. Ti dve datoteki skic shranite na primerno mesto, ime teh datotek ni pomembno. Nato izbrišite vso privzeto kodo in jo zamenjajte z naslednjo.
Za sprejemni arduino:
#vključi
#include #include #include // to se ne uporablja, ampak je potrebno za sestavljanje gonilnika RH_ASK; struct dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // Odpravljanje napak le, če (! 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)) // Ne blokira {int i; // Sporočilo z dobro prejeto kontrolno vsoto, ga dump. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}
P. S. //driver.printBuffer…. vrstica etc je preskusna koda. Ni vam treba skrbeti, razen če opravljate diagnostične postopke in želite ugotoviti, ali dejansko prejemate podatke.
Za oddajnik arduino
#vključi
#include #include #include // to se ne uporablja, ampak je potrebno za sestavljanje #include #include int pin = 4; DHT11 dht11 (pin); Gonilnik RH_ASK; struct dataStruct {float temp; } myData; bajt tx_buf [sizeof (myData)] = {0}; // Torej so argumenti bitna hitrost, oddajni pin (tx), // sprejemni pin (rx), ppt pin, isInverse. Zadnji 2 se ne uporabljata.void setup () {Serial.begin (9600); // Odpravljanje napak le, če (! Driver.init ()) Serial.println ("init failed"); } void loop () {int err; plavajoča temp, humi; uint8_t sporočilo; if ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); bajt zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // zaustavitev izvajanja, dokler niso poslani vsi podatki delay (2000); // počakajte 2 sekundi}}
Ukazov za vključitev bi moralo biti dovolj, če pa imate pozneje težave s prenosom podatkov, boste morda želeli pogledati v mapo knjižnice RadioHead in vključiti preostanek imen datotek v isti obliki.
5. korak: Naj bo delo
Zdaj, ko imamo vso kodo skupaj in je arduino sestavljen, lahko arduino priključimo na vaš računalnik in naložimo kodo. Poskrbite, da pošljete pravilno kodo sprejemnemu in oddajnemu mikrokrmilniku. Med izvajanjem lahko imate oba arduina povezana z računalnikom, vendar se morate prepričati, da ste izbrali pravilna vrata, ki se premikajo naprej, ali pa odklopite oddajni arduino in ga napajate iz drugega vira, ko je koda naložen.
Ko smo že pri tem, v meniju orodij IDE izberite vrata, ki so povezana z vašim sprejemnim arduinom, in zaženite python.
Ne odpirajte serijskega monitorja, medtem ko to počnete, python ne more prebrati zaporedja, medtem ko je monitor odprt. Ko je python odprt, pokličite funkcijo pythonprint na naslednji način.
pythonlogger.pythonprint ()
To bo začelo zbiranje podatkov iz serijskih vrat arduino. Če zdaj odprete mapo python, boste videli, da je bila ustvarjena nova datoteka.csv z imenom "test_data.csv", ki vsebuje vse podatke o času in temperaturi. To bo datoteka, do katere Matlab dostopa za vse svoje izračune in kontrole.
Še eno opozorilo: med dostopom ali zapisom do podatkov ne odpirajte test_data.csv. Če to storite, se bo koda python in/ali Matlab zrušila in poslala napako
Če se odločite odpreti.csv pozneje, boste opazili, da je časovni stolpec le zelo velik niz številk. To je zato, ker ukaz time.time () zapiše število sekund od 1. januarja 1970.
Na tej točki bi moral python natisniti podatke o temperaturi, ki jih bere iz serijskih vrat. Izgledati bi moralo takole:
b'25.03 '/r/n
Ne skrbite za dodatne znake, indekse kode Matlab za srednjih pet vrednosti v drugem stolpcu datoteke.csv.
Zdaj, ko vsi podporni programi delujejo in se podatki zbirajo, lahko začnemo zbirati podatke GPS iz mobilnega programa Matlab, ki je bil nastavljen prej, in zaženemo kodo Matlab GUI. Ko ste na zavihku senzorja Matlab mobile, izberite GPS in pritisnite gumb za zagon.
Če ste novi v Matlab mobile, se vrnite na korak 4 in si oglejte zgornje posnetke zaslona. Če imate še vedno težave, se prepričajte, da ste povezani z računalnikom, ki ste ga izbrali prej (na zavihku z nastavitvami), in s povezavo iz ukaza "priključek na" preverite, ali je Matlab na spletu.
6. korak: Uporaba programa
V ozadju se v tem sistemu dogaja več stvari. Podatke o temperaturi zbirajo in beležijo arduino in pyton, Matlab zbira podatke GPS iz vašega telefona in izvaja izračune, da bi videl, kako daleč ste od hiše, ter nastavil termostat na podlagi vseh teh podatkov. Kjer pridete, podajte svoje želje.
Zaženite kodo Matlab GUI. Odprite datoteko.mlapp in poglejte prvi zavihek. Za to boste morali zbrati podatke, učinkovitost in moč vaše grelne/hladilne enote običajno najdete na sami enoti, vaša povprečna hitrost pa je le dobra ocena, kako hitro vozite. Ko vnesete vrednosti, pritisnite gumb "Zaženi diagnostiko" in program nadzira vaš termostat, da zbere podatke o vaši hiši.
Premaknite se na naslednji meni.
7. korak: Nadzor temperature
Ta meni vam omogoča, da izberete želeno temperaturo, ko ste doma in zunaj. Nastavite temperaturo #1 na svojo udobno temperaturo in temperaturo #2 na visoko ali nizko vrednost, ki je varna za vaš dom (pazite, da je ne nastavite na 100 stopinj, medtem ko imate doma pse itd.).
8. korak: Zgodovinski podatki
Končno si lahko ogledate, koliko denarja prihranite z uporabo samodejnega upravljanja. To v bistvu ocenjuje, koliko energije bi porabili, če bi bil termostat nastavljen na želeno temperaturo 24 ur na dan, nato pa odšteje dejansko porabljeno energijo.
Srečno pri gradnji.
Priporočena:
Naredite svoj termostat za ogrevanje in prihranite pri ogrevanju: 53 korakov (s slikami)
Naredite svoj priključen ogrevalni termostat in prihranite pri ogrevanju: kaj je namen? Povečajte udobje tako, da ogrevate hišo točno tako, kot želite. Prihranite in zmanjšajte emisije toplogrednih plinov tako, da ogrevate hišo le, kadar to potrebujete. Ohranite nadzor nad ogrevanjem, kjer koli že ste. Ponosni ste, da ste to storili leta
Pametni termostat ESP8266: 6 korakov (s slikami)
Pametni termostat ESP8266: Bienvenue sur ce nouvel članek. 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é offeré par mon père, en effet il vient de déménager dans une vieille maison et l
Kako narediti avtomatski termostat za peč na drva: 5 korakov (s slikami)
Kako narediti avtomatski termostat na peči na drva: Za projekt Mechatronics Class sem se odločil, da bom zasnoval in ustvaril avtomatski termostat na štedilniku na drva z uporabo Arduina, ki podpira WiFi, s krmilnikom PID, ki poganja koračni motor za nadzor položaja lopute na moji peči na drva. To je bilo zelo vojno
HestiaPi Touch - Odprite pametni termostat: 9 korakov (s slikami)
HestiaPi Touch - Odprti pametni termostat: O HestiaPi TouchHestiaPi Touch je popolnoma odprtokodni pametni termostat za vaš dom. Vse digitalne datoteke in informacije so na voljo spodaj in na našem glavnem spletnem mestu. Z njim lahko spremljate temperaturo vašega doma, relativno vlažnost in atmosfero
Priključeni termostat: 6 korakov (s slikami)
Priključeni termostat: natančno spremljanje temperature v vašem domu je zagotovo eden najboljših načinov za prihranek pri računu za energijo. Hkrati se želite v toplem domu v zimskem času dobro počutiti. Moj trenutni termostat omogoča samo statično programiranje: I