Kazalo:

Autostat: daljinski termostat: 8 korakov (s slikami)
Autostat: daljinski termostat: 8 korakov (s slikami)

Video: Autostat: daljinski termostat: 8 korakov (s slikami)

Video: Autostat: daljinski termostat: 8 korakov (s slikami)
Video: 20 лучших советов по Windows 10 2024, November
Anonim
Autostat: daljinski termostat
Autostat: daljinski termostat

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

Vse skupaj
Vse skupaj
Vse skupaj
Vse skupaj
Vse skupaj
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

Sprejemnik
Sprejemnik

3. korak: Oddajnik

Oddajnik
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

Naj dela
Naj dela
Naj dela
Naj dela
Naj dela
Naj dela

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

Uporaba programa
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

Nadzor temperature
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

Zgodovinski podatki
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: