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, Juli
Anonim
Autostat: daljinski termostat
Autostat: daljinski termostat

Pitanje koje vjerovatno 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 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)

Za početak, želim vas upozoriti, za to su potrebna tri programa (jedan je prilično skup), poprilično biblioteka i paketa podrške za programe i 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 koristio uno jer sam imao jedan u blizini)
  • razni kablovi za spajanje, neki muški/muški i dva kompleta od tri spojena muško/ženska kratkospojnika
  • 433MHz radio frekvencijski (RF) prijemnik, koristio sam MX-05V
  • 433MHz RF predajnik, koristio sam MX-FS-03V
  • DHT11 termometar i senzor vlažnosti visoke preciznosti (onaj koji sam koristio instaliran je na trostrukom čipu sa već instaliranim potrebnim otpornicima)
  • matična ploča (ako ne želite sve ovo lemiti)
  • telefon sa GPS -om (u ovom slučaju iPhone 8, ali koristio sam i Galaxy S8)
  • 3D štampani kontejner (nije potrebno, bilo koji kontejner će raditi ili nikakav)

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 podrške za RadioHead i biblioteke arduino IDE -a
  • Biblioteka DHT11 za arduino IDE
  • python 3.7 (provjerite je li instalirana biblioteka pyserial ili serijska biblioteka, što bi trebalo biti za verziju 3.4 ili noviju)

Korak 1: Spojite sve zajedno

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 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, samo trebate definirati pinove u svom kodu. Osobno mislim da se lakše držati zadanih portova koje arduino knjižnice prepoznaju.

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

Sa strane: zelena konstrukcija koja drži nano je 3D štampani kontejner.

Korak 2: Prijemnik

Prijemnik
Prijemnik

Korak 3: Odašiljač

Odašiljač
Odašiljač

Korak 4: Kôd

Kada se ožičenje završi, morate pokrenuti sve programe i instalirati biblioteke (ako već niste), samo ću pretpostaviti da jeste, 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 komandni prozor Matlaba napišite:

konektor uključen

Ovo će od vas zatražiti da unesete petocifrenu lozinku koju ćete koristiti za povezivanje na vašem 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 podrške za Apple iOS senzore u MATLAB.
  • Povežite MATLAB Mobile na MathWorks Cloud ili računalo pomoću Postavki.
  • Napravite mobiledev objekt u MATLAB -u (na svom računaru), 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 ekranu senzora odaberite senzore s kojih želite prikupljati podatke.
  • Odaberite Dnevnik.
  • Dodirnite dugme Start.
  • Kada završite sa prikupljanjem podataka, dodirnite dugme Stop.
  • U skočnom prozoru unesite naziv dnevnika senzora.
  • Ponovite korake 1-5 ako je potrebno.

Ovaj odjeljak će se vratiti u dio 4, tako da još nema potrebe da se započinje sa prikupljanjem podataka. Samo držite telefon pri ruci, a Matlab mobilni telefon spreman.

Sada morate stvoriti mapu negdje na računaru 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 proračun mase zraka u vašoj kući (ovo omogućava 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)

AutoStat = 1; i = 1; dok je AutoStat == 1 time_start = clock; 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; %formula za izračunavanje udaljenosti na osnovu zemljopisne širine i %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m. Latitude).*(sin (((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 potrebno podešavanje termostata na osnovu isključene snage %klima uređaja i mase prostora. calcTmp_set = ((-1.*P_out.*time_rtn)./ (masa.*(1.005)))+T_pref; %određuje da li je potrebno promijeniti trenutnu postavku termostata ako je okruglo (calcTmp_set) ~ = okruglo (t) vrijemeACon = sat; PwrCntr = P_out; timeACon = timeACon + clock-time_start; cijena = P_out*vrijemeACon*stopa; else PwrCntr = 0 krajnjih vremenskih oznaka (kraj+1, [1: 6]) = sat; pwr_usage (kraj+1, 1) = PwrCntr; pause (5) end end

Obje ove datoteke su Matlab funkcije. Nećete im morati pristupiti ako ih ne namjeravate izmijeniti za posebne potrebe, jer ćete ih pozivati s grafičkog sučelja. Spremite obje datoteke odvojeno, 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 Matlab traci izbornika ili mojom omiljenom metodom koja unosi sljedeću naredbu u prozor naredbe Matlab:

appdesigner

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

classdef Control_1 <matlab.apps. AppBase % Svojstva koja odgovaraju svojstvima komponenti aplikacije (Pristup = Javno) UIFigure matlab.ui. Figuriraj TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton.lab. 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. NumericEditPolje TemperatureDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.ula.kontrol. 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. Gauge kraju 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

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 = dužina (temp) app. Gauge. Value = temp (i) pauza (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

% Funkcija promjene vrijednosti: DDFH

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

% Funkcija promjene vrijednosti: AvgLocalSpeedEditField

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

% Funkcija promjene vrijednosti: PowerOutputRatingEditField

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

% Promijenjena vrijednost: EnergyEfficiencyRatingEditField

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

% Funkcija pritiska gumba: 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. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

kraj

% Vrijednost promijenjena funkcija: Temperature1Spinner

funkcija Temperature1SpinnerValueChanged (aplikacija, događaj) vrijednost = app. Temperature1Spinner. Value; kraj

% Vrijednost promijenjena funkcija: Temperature2Spinner

funkcija Temperature2SpinnerValueChanged (aplikacija, događaj) vrijednost = app. Temperature2Spinner. Value; kraj

% Funkcija promjene vrijednosti: Prebacivanje

funkcija SwitchValueChanged (aplikacija, događaj) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Dužina P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; brzina = m.brzina; masa = 200; speed = 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 konstrukcija aplikacije

metode (Pristup = privatno)

% Kreirajte UIFigure i komponente

funkcija createComponents (aplikacija)

% Kreirajte UIFigure

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

% Kreirajte 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 (app, @RunDiagnosticButtonPushed, true); 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 efikasnosti';

% Kreirajte EnergyEfficiencyRatingEditField

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

% Kreirajte PowerOutputRatingEditFieldLabel

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

% Kreirajte PowerOutputRatingEditField

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

% Kreirajte AvgLocalSpeedEditFieldLabel

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

% Kreirajte AvgLocalSpeedEditField

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

% Kreirajte DesiredDistancefromHouseEditFieldLabel

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

% Kreirajte DDFH

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

% Kreirajte TemperatureDirectionSwitchLabel

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

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

% Kreirajte karticu TempSettingsTab

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

% Kreirajte Temperature1SpinnerLabel

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

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

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

% Kreiraj 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';

% Kreirajte EditFieldLabel

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

% Kreiraj tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'numeric'); app.tempnow. Limits = [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;

% Kreirajte GaugeLabel

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

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

% Kreirajte karticu štednje

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

% Kreirajte UIAxe

app. UIAxes = uiaxes (app. SavingsTab); naslov (app. UIAxes, 'Štednja') xlabel (app. UIAxes, 'Mjesec i godina') ylabel (app. UIAxes, 'Novac') app. UIAxes. PlotBoxAspectRatio = [1 0,60666666666666667 0,60666666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Kreirajte ovuMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'centar'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Ovaj mjesec košta';

% Kreirajte ovoMonthCostEditField

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

% Kreirajte TotalSavingsEditFieldLabel

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

% Kreirajte TotalSavingsEditField

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

metode (Pristup = javni)

% Konstruiraj aplikaciju

funkcija app = Control_1

% Kreirajte i konfigurirajte komponente

createComponents (aplikacija)

% Registrirajte aplikaciju kod App Designer -a

registerApp (app, app. UIFigure)

ako je nargout == 0

očisti kraj aplikacije

% Kod koji se izvršava prije brisanja aplikacije

funkcija brisanja (aplikacija)

% Izbriši UIFigure kada se aplikacija izbriše

delete (app. UIFigure) kraj kraj kraj

Vjerovatno ćete dobiti greš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 bilo iz naredbenog retka (na Windowsima) ili pomoću.exe datoteke u mapi python. Uvjerite se da su sve odgovarajuće biblioteke instalirane pomoću naredbe import.

uvoz serijske

vrijeme uvoza import csv

Ovo su tri biblioteke koje ćete trebati započeti, iako ćemo uskoro napraviti vlastitu biblioteku. Ako je došlo do neke greške s ovim naredbama, vratite se i provjerite jesu li biblioteke instalirane i nalaze li se u mapi Lib u mapi python. Zatim ćemo generirati ono što sam nazvao pythonlogger biblioteka. Ovo ime nije potrebno, možete ga zvati kako god želite, to je samo ime 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, koji će se vjerojatno razlikovati za svakog korisnika, tj. provjerite vaš serijski port u arduino IDE ser.flushInput () while Tačno: pokušajte: ser_bytes = ser.readline () print (ser_bytes) sa otvorenim ("test_data.csv", "a") kao f:riter = csv.writer (f, delimiter = ",") # postavlja podatke na biti uneseni kao pisac odvojen zarezima.writerow ([time.time (), ser_bytes]) #zapisuje podatke u test_data.csv osim: print ("Greška pribavljena") break

Sačuvajte tekst kao "umetnite naziv biblioteke koju želite".py u fasciklu 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" (). Kada je biblioteka spremljena, možemo prijeći na arduino kod.

Otvorite arduino IDE i otvorite dva nova prozora za skice. Sačuvajte te dvije skice na prikladnom mjestu, naziv ovih datoteka nije bitan. Zatim izbrišite sav zadani kôd i zamijenite ga sljedećim.

Za arduino koji prima:

#include

#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 greš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)) // Ne blokira {int i; // Poruka s dobrim kontrolnim zbrojem primljena, ispišite je. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. itd linija je testni kod. Ne morate brinuti o tome osim ako radite dijagnostiku i ne želite saznati primate li podatke.

Za odašiljač arduino

#include

#include #include #include // ovo se ne koristi, ali je potrebno za kompajliranje #include #include int pin = 4; DHT11 dht11 (pin); Upravljački program 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 grešaka samo ako (! Driver.init ()) Serial.println ("init nije uspio"); } void loop () {int greška; plutajuća temperatura, humi; uint8_t msg; 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); // čekajte 2 sekunde}}

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

Korak 5: Neka to funkcionira

Neka to funkcionira
Neka to funkcionira
Neka to funkcionira
Neka to funkcionira
Neka to funkcionira
Neka to funkcionira

Sada kada imamo sav kôd zajedno i arduino je sastavljen, možemo spojiti arduino na vaše računalo i učitati kôd. Pošaljite ispravan kôd prijemnim i odašiljačkim mikrokontrolerima. Možete imati oba arduina spojena na računalo dok ovo radi, ali morate se pobrinuti da odaberete ispravan port za kretanje 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, sada iz izbornika IDE alata odaberite port koji je povezan s vašim prijemnim arduinom i pokrenite python.

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

pythonlogger.pythonprint ()

Ovo će započeti prikupljanje podataka sa 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. Ovo ć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 podacima pristupa ili upisuje. Ako to učinite, python i/ili Matlab kôd će se srušiti i poslati grešku

Ako ipak odlučite 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. januara 1970. godine.

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

b'25.03 '/r/n

Ne brinite o dodatnim znakovima, Matlab kod indeksira za srednjih pet vrijednosti u drugoj koloni.csv datoteke.

Sada kada svi pomoćni programi rade i podaci se prikupljaju, možemo početi prikupljati GPS podatke iz mobilnog programa Matlab koji je ranije postavljen 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 ekrana. Ako i dalje imate problema, provjerite jeste li povezani s računalom koje ste ranije odabrali (na kartici postavki) i upotrijebite vezu iz naredbe "konektor na" da provjerite je li Matlab na mreži.

Korak 6: Korištenje programa

Korišćenje programa
Korišćenje programa

U pozadini ovog sistema dešava se 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 gde dolazite nudite svoje želje.

Pokrenite Matlab GUI kod. Otvorite.mlapp datoteku i pogledajte prvu karticu. Za to ćete morati sami prikupiti podatke, efikasnost 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.

Pređite na sljedeći meni.

Korak 7: Kontrola temperature

Kontrola temperature
Kontrola temperature

Ovaj meni vam omogućava da odaberete željenu temperaturu 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: Historijski podaci

Historijski podaci
Historijski podaci

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

Sretno u izgradnji.

Preporučuje se: