Sadržaj:

Autostat: daljinski termostat: 8 koraka (sa slikama)
Autostat: daljinski termostat: 8 koraka (sa slikama)

Video: Autostat: daljinski termostat: 8 koraka (sa slikama)

Video: Autostat: daljinski termostat: 8 koraka (sa slikama)
Video: 20 лучших советов по Windows 10 2024, Studeni
Anonim
Autostat: daljinski termostat
Autostat: daljinski termostat

Pitanje koje vjerojatno postavljate je "zašto pravite još jedan daljinski termostat?"

Odgovor na to pitanje je, morao sam, a tržišni pametni termostati su preskupi.

Pošteno upozorenje, ovo je konstrukcija "proof-of-concept" koja bi zahtijevala nekoliko dodatnih izlaza za stvarnu kontrolu vašeg termostata, ali jezgra je na mjestu i može se mijenjati ovisno o vašim specifičnim okolnostima. Također, ovo je još uvijek u tijeku, pa očekujte nekoliko ažuriranja i izmjena (posebno u Matlab kodu)

Želim vas upozoriti za početak, za to su potrebna tri programa (jedan od njih je prilično skup), dosta biblioteka i paketa podrške za programe, a morate ih natjerati da međusobno razgovaraju. To je glavobolja. S tim upozorenjem, krenimo s materijalima.

Hardver

  • arduino nano
  • arduino uno (ili neki drugi nano, upravo sam upotrijebio uno jer sam imao jedan u blizini)
  • razni kablovi za spajanje, neki muški/muški i dva seta od tri spojena muško/ženska kratkospojnika
  • Radiofrekvencijski (RF) prijemnik 433MHz, koristio sam MX-05V
  • 433MHz RF odašiljač, koristio sam MX-FS-03V
  • DHT11 termometar i osjetnik vlažnosti visoke preciznosti (onaj koji sam koristio instaliran je na trostrukom čipu s već instaliranim potrebnim otpornicima)
  • matična ploča (ako ne želite sve ovo lemiti)
  • telefon s GPS -om (u ovom slučaju iPhone 8, ali koristio sam i Galaxy S8)
  • 3D tiskani spremnik (nije nužno, bilo koji spremnik će raditi ili uopće neće raditi)

Softver

  • Matlab iz MathWorksa (imam izdanje 2018a, ali sam koristio i izdanja 2017a-b)
  • Matlab mobile instaliran na vašem telefonu
  • arduino paket podrške za Matlab
  • Paket iPhone senzora za Matlab
  • arduino IDE
  • Paketi i biblioteke podrške za RadioHead arduino IDE -a
  • Knjižnica DHT11 za arduino IDE
  • python 3.7 (provjerite je li instalirana knjižnica pyserial ili serijska knjižnica, što bi trebalo biti za verziju 3.4 ili noviju)

Korak 1: Sve spojite

Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno

Prije svega, predložio bih vam da napravite nekoliko arduino vodiča o RF odašiljačima samo kako biste bili sigurni da vaši dijelovi rade i da je ožičenje ispravno. Dostupno je mnogo primjera, uključujući i kôd (za one od nas koji ne znamo ništa o C i C ++).

Slijedite donje sheme ožičenja za sastavljanje arduina i senzora. Jednu stvar koju treba imati na umu prilikom povezivanja arduina je da podatkovni portovi koje sam koristio nisu potrebni, ali se preporučuju.

AKO odlučite promijeniti podatkovne portove koje koristite, trebate samo definirati pinove u svom kodu. Osobno mislim da se lakše držati zadanih portova koje arduino knjižnice prepoznaju.

I da budemo jasni, nano i uno su međusobno zamjenjivi, ali ja sam koristio nano za odašiljač na projektu kako bih smanjio veličinu monitora temperature.

Napomena: zelena konstrukcija koja drži nano je 3D tiskani spremnik.

Korak 2: Prijemnik

Prijamnik
Prijamnik

Korak 3: Odašiljač

Odašiljač
Odašiljač

Korak 4: Kôd

Nakon što ožičenje završi, morate pokrenuti sve programe i instalirati knjižnice (ako već niste), samo ću pretpostaviti da imate, morate pokrenuti Matlab i pokrenuti paket podrške za iPhone. U ovom trenutku i vaš telefon i Matlab moraju biti na istoj WiFi mreži.

U naredbeni prozor Matlaba napišite:

priključak uključen

To će od vas zatražiti da unesete peteroznamenkastu lozinku koju ćete koristiti za povezivanje na svom iPhoneu. Zapamtite lozinku. Kada unesete lozinku, Matlab će prikazati neke podatke, uključujući vašu IP adresu. Upotrijebite ovo u sljedećem koraku, koji dolazi iz uputa iz izbornika pomoći "Početak rada sa senzorima" u Matlab mobile.

  • Slijedite ove korake za slanje podataka senzora u MathWorks Cloud ili računalo:
  • Ako šaljete podatke senzora na računalo i ako već nisu instalirani, preuzmite i instalirajte MATLAB paket za podršku za Apple iOS senzore u MATLAB.
  • Povežite MATLAB Mobile s MathWorks Cloudom ili računalom pomoću Postavki.
  • Izradite mobiledev objekt u MATLAB -u (na svom računalu), na primjer: >> m = mobiledev
  • Odaberite jedan ili više senzora i dodirnite Start.

Slijedite ove korake za lokalno bilježenje podataka senzora na vašem uređaju:

  • Na zaslonu Senzori odaberite senzore s kojih želite prikupljati podatke.
  • Odaberite Dnevnik.
  • Dodirnite gumb Start.
  • Kada završite s prikupljanjem podataka, dodirnite gumb Zaustavi.
  • U skočnom prozoru unesite naziv dnevnika senzora.
  • Po potrebi ponovite korake 1-5.

Ovaj će se odjeljak vratiti u dio 4, tako da još nema potrebe zapravo početi prikupljati podatke. Samo držite telefon pri ruci, a Matlab mobilni telefon spreman.

Sada morate stvoriti mapu negdje na svom računalu za smještaj datoteka Matlab koda. Imat ćete četiri zasebne datoteke, dvije za pozadinske funkcije (.m datoteke) i jednu datoteku Matlab koda za grafičko sučelje (.mlapp),.

Prvo je izračun mase zraka u vašoj kući (ovo omogućuje Matlabu da zna koliko je potrebno za zagrijavanje/hlađenje vaše kuće)

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

runCalc = 0; Tmp_start = T_ins; time_start = sat; time_end = 0 while runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; else PwrCntr = P_out; runCalc = runCalc+0,1 završetak time_diag = time_end-time_start Mass = (P_out*time_diag) /7,035

I druga:

funkcija [vremenske oznake, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, brzina, T_pref, masa)

Automatsko postavljanje = 1; i = 1; dok je AutoStat == 1 time_start = sat; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); vremenske oznake = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; format longg; %haversin formula za izračunavanje udaljenosti na temelju zemljopisne širine i %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m. Latitude).*(sind ((m. Longitude-Lon_in)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %procjenjuje vaše vrijeme za povratak time_rtn = (Dist-r_pref)./ brzina; %izračunava potrebnu postavku termostata na temelju isključene energije %klima uređaja i zračne mase doma. calcTmp_set = ((-1.*P_out.*time_rtn)./ (masa.*(1.005)))+T_pref; %određuje treba li trenutnu postavku termostata promijeniti ako je okruglo (calcTmp_set) ~ = okruglo (t) vrijemeACon = sat; PwrCntr = P_out; timeACon = timeACon + start-time_start; trošak = P_out*vrijemeACon*stopa; else PwrCntr = 0 krajnjih vremenskih oznaka (kraj+1, [1: 6]) = sat; pwr_usage (kraj+1, 1) = PwrCntr; pause (5) kraj end

Obje ove datoteke su funkcije Matlab. Nećete im morati pristupiti ako ih ne namjeravate izmijeniti za posebne potrebe, budući da ćete ih pozivati s grafičkog sučelja. Spremite obje datoteke zasebno, prvu kao CalcMass.m, a drugu kao dist_cntrl.m, to će biti nazivi koje GUI kôd koristi za pozivanje funkcija, pa ako ne želite urediti ostatak koda u nastavku, držite se konvencija imenovanja.

Prije nego što uđete u GUI kôd, morate otvoriti dizajner aplikacija za Matlab, koji možete otvoriti navigacijom u traci izbornika Matlab ili mojom omiljenom metodom koja unosi sljedeću naredbu u naredbeni prozor Matlab:

dizajner aplikacije

Nakon što je dizajner aplikacija otvoren, otvorite novu datoteku aplikacije (.mlapp) i izbrišite sav zadani kôd iz prozora koda. Zatim zamijenite sve sljedećim i pritisnite gumb za pokretanje.

classdef Control_1 <matlab.apps. AppBase % Svojstva koja odgovaraju svojstvima komponenti aplikacije (Pristup = Javno) UIFigure matlab.ui. Figuracija TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton.tab. gumb 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. Prebacivanje TempSettingsTab matlab.ula.kontrolna tabla. 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. Mjerač 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 kraj

metode (Pristup = privatno)

% Vrijednost promijenjena funkcija: tempnow

funkcija tempnowValueChanged (aplikacija, događaj) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 za i = length (temp) app. Gauge. Value = temp (i) pause (1) end end

% Vrijednost promijenjena funkcija: TemperatureDirectionSwitch

funkcija TemperatureDirectionSwitchValueChanged (aplikacija, događaj) način = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; kraj Chng_dir; kraj

% Vrijednost promijenjena funkcija: DDFH

funkcija DDFHValueChanged (aplikacija, događaj) r_pref = app. DDFH. Value; kraj

% Vrijednost promijenjena funkcija: AvgLocalSpeedEditField

funkcija AvgLocalSpeedEditFieldValueChanged (aplikacija, događaj) speed = app. AvgLocalSpeedEditField. Value; kraj

% Promijenjena vrijednost: PowerOutputRatingEditField

funkcija PowerOutputRatingEditFieldValueChanged (aplikacija, događaj) vrijednost = app. PowerOutputRatingEditField. Value; kraj

% Vrijednost promijenjena funkcija: EnergyEfficiencyRatingEditField

funkcija EnergyEfficiencyRatingEditFieldValueChanged (aplikacija, događaj) vrijednost = app. EnergyEfficiencyRatingEditField. Value; kraj

% Gumb pritisnuta funkcija: RunDiagnosticButton

funkcija RunDiagnosticButtonPushed (aplikacija, događaj) način = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; kraj T_ins = app.tempnow. Vrijednost P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

kraj

% Vrijednost promijenjena funkcija: Temperature1Spinner

funkcija Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; kraj

% Vrijednost promijenjena funkcija: Temperature2Spinner

funkcija Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; kraj

% Vrijednost promijenjena funkcija: Prekidač

funkcija SwitchValueChanged (aplikacija, događaj) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Dužina P_out = 0; r_pref = app. DDFH. Vrijednost; T_pref = app. Temperature1Spinner. Value; brzina = m.brzina; masa = 200; brzina = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, brzina, masa) end end

% Inicijalizacija i izrada aplikacije

metode (Pristup = privatno)

% Stvorite UIFigure i komponente

funkcija createComponents (aplikacija)

% Stvorite UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Slika korisničkog sučelja';

% Stvorite TabGroup

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

% Kreirajte karticu Setup Setup

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Postavljanje';

% Kreirajte RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (aplikacija, @RunDiagnosticButtonPushed, istina); app. RunDiagnosticButton. FontWeight = 'podebljano'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Pokreni dijagnostiku';

% Kreirajte EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'desno'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Ocjena energetske učinkovitosti';

% Stvorite polje EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numerički'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'centar'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% Stvorite PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'desno'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Ocjena izlazne snage';

% Stvorite PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numerički'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'centar'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Stvorite AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'desno'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Prosj. Lokalna brzina ';

% Stvorite AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'numerički'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (aplikacija, @AvgLocalSpeedEditFieldValueChanged, istina); app. AvgLocalSpeedEditField. HorizontalAlignment = 'centar'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Stvori željenu udaljenost odHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'desno'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Željena udaljenost'; 'from House'};

% Stvorite DDFH

app. DDFH = uieditfield (app. SetupTab, 'numerički'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (aplikacija, @DDFHValueChanged, istina); app. DDFH. HorizontalAlignment = 'centar'; app. DDFH. Position = [139 135 100 22];

% Stvori TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'centar'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Smjer temperature';

% Stvorite TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'klizač'); app. TemperatureDirectionSwitch. Items = {'Gore', 'Dolje'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Gore';

% Izradite karticu TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Postavke ';

% Stvori Temperature1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'centar'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Temperatura'; '#1'};

% Stvorite Spinner za temperaturu1

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;

% Stvori Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'centar'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperatura'; '#2'};

% Kreirajte 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;

% Stvori prekidač

app. Switch = uiswitch (app. TempSettingsTab, 'klizač'); 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';

% Napravite EditFieldLabel

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

% Stvori tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'numerički'); app.tempnow. Ograničenja = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (app, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'centar'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% Napravite GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'centar'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Mjerač';

% Stvori mjerač

app. Gauge = uigauge (app. TempSettingsTab, 'kružni'); 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;

% Napravite karticu štednje

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Štednja';

% Stvorite UIAxe

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (app. UIAxes, 'Mjesec i godina') ylabel (app. UIAxes, 'Novac') app. UIAxes. PlotBoxAspectRatio = [1 0.60666666666666767 0.6066666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Stvorite ovu oznaku MjesecKontrolePolje

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'centar'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Trošak ovog mjeseca';

% Stvorite ovoMonthCostEditField

app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'numerički'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'centar'; app. ThisMonthCostEditField. Position = [417 39 137 58];

% Stvorite TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'desno'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Ukupna ušteda';

% Stvorite polje TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numerički'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'centar'; app. TotalSavingsEditField. Position = [88 39 137 58]; kraj kraj

metode (Pristup = javni)

% Konstruiraj aplikaciju

funkcija app = Control_1

% Stvaranje i konfiguriranje komponenti

createComponents (aplikacija)

% Registrirajte aplikaciju s App Designerom

registerApp (app, app. UIFigure)

ako je nargout == 0

očisti kraj aplikacije

% Kôd koji se izvršava prije brisanja aplikacije

funkcija brisanja (aplikacija)

% Izbriši UIFigure kad se aplikacija izbriše

delete (app. UIFigure) kraj kraj kraj

Vjerojatno ćete dobiti pogrešku, što nije problem. Samo zatvorite GUI koji je generiran nakon što ste pritisnuli run, za trenutak ćemo prikupiti ostale potrebne programe i podatke.

Budući da je Matlab postavljen, možemo prijeći na python. Prvo pokrenite program python iz naredbenog retka (u sustavu Windows) ili pomoću.exe datoteke u mapi Python. Provjerite jesu li sve odgovarajuće knjižnice instalirane pomoću naredbe import.

serijski uvoz

vrijeme uvoza import csv

Ovo su tri knjižnice koje ćete trebati započeti, iako ćemo uskoro napraviti vlastitu knjižnicu. Ako je došlo do neke vrste pogreške s ovim naredbama, vratite se i provjerite jesu li knjižnice instalirane i nalaze li se u mapi Lib u mapi python. Zatim ćemo generirati ono što sam nazvao knjižnica pythonlogger. Ovo ime nije potrebno, možete ga zvati kako god želite, to je samo naziv python datoteke (.py) koju kreirate.

Otvorite uređivač teksta, koristim Sublime3, ali bilježnica radi sasvim u redu i unesite ovaj kôd.

def pythonprint ():

import pythonlogger import serijsko vrijeme uvoza import csv ser = serial. Serial ('COM8') # COM8 je arduino serijski port, to će vjerojatno biti različito za svakog korisnika, tj. provjerite svoj serijski port u arduino IDE ser.flushInput () while Istina: pokušajte: ser_bytes = ser.readline () print (ser_bytes) s otvorenim ("test_data.csv", "a") kao f:riter = csv.writer (f, delimiter = ",") # postavlja podatke na biti uneseni kao zapisivač odijeljen zarezima.writerow ([time.time (), ser_bytes]) #zapisuje podatke u test_data.csv osim: print ("Greška prikupljena") break

Spremite tekst kao "umetnite naziv biblioteke koju želite".py u mapu Lib. Također imajte na umu da linija def pythonprint () definira naziv funkcije koju ćete pozvati, pa je možete promijeniti tako da definirate "umetnite ime koje želite za svoju funkciju" (). Kad je knjižnica spremljena, možemo prijeći na arduino kod.

Otvorite arduino IDE i otvorite dva nova prozora za skice. Spremite te dvije skice na prikladno mjesto, naziv tih datoteka nije bitan. Zatim izbrišite sav zadani kôd i zamijenite ga sljedećim.

Za arduino koji prima:

#uključi

#include #include #include // ovo se ne koristi, ali je potrebno za kompajliranje upravljačkog programa RH_ASK; struct dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // Otklanjanje pogrešaka samo ako (! Driver.init ()) Serial.println ("init nije uspio"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Bez blokiranja {int i; // Poruka s dobrim kontrolnim zbrojem primljena, ispišite je. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serijski.ispis (myData.temp); }}

p.s. //driver.printBuffer…. itd. linija je testni kod. Ne morate se brinuti zbog toga ako ne radite dijagnostiku i ne želite saznati primate li podatke.

Za odašiljač arduino

#uključi

#include #include #include // ovo se ne koristi, ali je potrebno za kompajliranje #include #include int pin = 4; DHT11 dht11 (pin); Vozač RH_ASK; struct dataStruct {float temp; } myData; bajt tx_buf [sizeof (myData)] = {0}; // Dakle, argumenti su bitrate, prijenos pin (tx), // prijem pin (rx), ppt pin, isInverse. Posljednja 2 se ne koriste.void setup () {Serial.begin (9600); // Otklanjanje pogrešaka samo ako (! Driver.init ()) Serial.println ("init nije uspio"); } void loop () {int greška; plutajuća temp, humi; uint8_t poruka; 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 (); // zaustavlja izvršenje sve dok se ne pošalju svi podaci delay (2000); // pričekajte 2 sekunde}}

Naredbe include bi trebale biti dovoljne, ali ako kasnije budete imali problema s prijenosom podataka, možda biste htjeli pogledati u mapu knjižnice RadioHead i uključiti ostatak naziva datoteka u istom formatu.

Korak 5: Neka to funkcionira

Učiniti to uspješnim
Učiniti to uspješnim
Učiniti to uspješnim
Učiniti to uspješnim
Učiniti to uspješnim
Učiniti to uspješnim

Sada kada smo sve kodove zajedno i arduino sastavili, možemo spojiti arduino na vaše računalo i učitati kôd. Pošaljite točan kôd prijemnim i odašiljačkim mikrokontrolerima. Možete pokrenuti oba arduina na svoje računalo dok ovo radi, ali morate se pobrinuti da odaberete ispravan port prema naprijed ili možete odspojiti odašiljajući arduino i napajati ga iz nekog drugog izvora nakon što je kôd postavljen učitano.

Kad smo već kod toga, sad s izbornika IDE alata odaberite port koji je spojen na vaš prijemni arduino i pokrenite python.

Ne otvarajte serijski monitor dok to radite, python ne može čitati serijski dio dok je monitor otvoren. Nakon što je python otvoren, pozovite funkciju pythonprint na sljedeći način.

pythonlogger.pythonprint ()

Ovo će pokrenuti prikupljanje podataka s arduino serijskog porta. Ako sada otvorite svoju mapu python, vidjet ćete da je stvorena nova.csv datoteka pod nazivom "test_data.csv", koja sadrži sve podatke o vremenu i temperaturi. To će biti datoteka kojoj Matlab pristupa kako bi obavio sve svoje proračune i kontrole.

Još jedno upozorenje: ne otvarajte test_data.csv dok se pristupa podacima ili se upisuje. Ako to učinite, python i/ili Matlab kôd će se srušiti i poslati pogrešku

Odlučite li kasnije otvoriti.csv, primijetit ćete da je vremenski stupac samo vrlo veliki niz brojeva. To je zato što naredba time.time () zapisuje broj sekundi od 1. siječnja 1970.

U ovom trenutku python bi trebao ispisivati podatke o temperaturi koje čita s serijskog porta. To bi trebalo izgledati otprilike ovako:

b'25.03 '/r/n

Ne brinite o dodatnim znakovima, indeksima Matlab koda za srednjih pet vrijednosti u drugom stupcu.csv datoteke.

Sada kada svi pomoćni programi rade i prikupljaju se podaci, možemo početi prikupljati GPS podatke iz mobilnog programa Matlab koji je postavljen ranije i pokrenuti Matlab GUI kod. Nakon što ste na kartici senzora Matlab mobile, odaberite GPS i pritisnite gumb za pokretanje.

Ako ste tek počeli koristiti Matlab mobile, vratite se na korak 4 i pogledajte gornje snimke zaslona. Ako i dalje imate problema, provjerite jeste li povezani s računalom koje ste ranije odabrali (na kartici postavki) i upotrijebite vezu iz naredbe "priključak na" da biste provjerili je li Matlab na mreži.

Korak 6: Korištenje programa

Korištenje programa
Korištenje programa

U pozadini se u ovom sustavu događa više stvari. Arduino i pyton prikupljaju i bilježe podatke o temperaturi, Matlab prikuplja GPS podatke s vašeg telefona i izvodi proračune kako bi vidio koliko ste udaljeni od svoje kuće i postavio termostat na temelju svih tih podataka. Tamo gdje dolazite nudite svoje želje.

Pokrenite Matlab GUI kod. Otvorite.mlapp datoteku i pogledajte prvu karticu. Za to ćete morati prikupiti podatke, a učinkovitost i snaga vaše jedinice za grijanje/hlađenje obično se mogu pronaći na samoj jedinici, a vaša prosječna brzina samo je dobra procjena brzine koju vozite. Nakon unosa vrijednosti, pritisnite gumb "Pokreni dijagnostiku" i program kontrolira vaš termostat kako bi prikupio podatke o vašoj kući.

Prijeđite na sljedeći izbornik.

Korak 7: Kontrola temperature

Kontrola temperature
Kontrola temperature

Ovaj izbornik omogućuje vam odabir željene temperature dok ste kod kuće i vani. Postavite Temperaturu #1 na svoju ugodnu temperaturu, a Temperaturu #2 na visoku ili nisku vrijednost koja je sigurna za vaš dom (pazite da je ne postavite na 100 stupnjeva dok imate pse kod kuće itd.).

Korak 8: Povijesni podaci

Povijesni podaci
Povijesni podaci

Konačno, možete vidjeti koliko novca štedite pomoću automatskog upravljanja. Ovo u biti procjenjuje koliko bi se energije utrošilo da je termostat postavljen na željenu temperaturu 24 sata dnevno, a zatim se oduzima vaša stvarna potrošena energija.

Sretno u izgradnji.

Preporučeni: