Sadržaj:
- Korak 1: Sve spojite
- Korak 2: Prijemnik
- Korak 3: Odašiljač
- Korak 4: Kôd
- Korak 5: Neka to funkcionira
- Korak 6: Korištenje programa
- Korak 7: Kontrola temperature
- Korak 8: Povijesni podaci
Video: Autostat: daljinski termostat: 8 koraka (sa slikama)
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:36
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
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
Korak 3: 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
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
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
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
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:
Napravite vlastiti povezani termostat za grijanje i uštedite na grijanju: 53 koraka (sa slikama)
Napravite vlastiti termostat za grijanje i uštedite na grijanju: koja je svrha? Povećajte udobnost zagrijavajući svoju kuću točno onako kako želite. Uštedite i smanjite emisije stakleničkih plinova zagrijavajući svoju kuću samo kad vam je potrebno. Zadržite kontrolu nad svojim grijanjem gdje god da ste. Budite ponosni što ste to učinili
TV daljinski upravljač postaje RF daljinski -- NRF24L01+ Vodič: 5 koraka (sa slikama)
TV daljinski upravljač postaje RF daljinski || Vodič za NRF24L01+: U ovom projektu ću vam pokazati kako sam koristio popularni nRF24L01+ RF IC za bežično podešavanje svjetline LED trake putem tri beskorisna gumba na daljinskom upravljaču televizora. Započnimo
IRduino: Arduino daljinski upravljač - oponašajte izgubljeni daljinski upravljač: 6 koraka
IRduino: Arduino daljinski upravljač - oponašajte izgubljeni daljinski upravljač: Ako ste ikada izgubili daljinski upravljač za televizor ili DVD uređaj, znate koliko je frustrirajuće morati hodati do, pronaći i koristiti gumbe na samom uređaju. Ponekad ti gumbi čak ne nude istu funkcionalnost kao daljinski. Primiti
Pretvorite svoj IR daljinski u RF daljinski: 9 koraka (sa slikama)
Pretvorite svoj IR daljinski u RF daljinski: U današnjem Instructableu pokazat ću vam kako možete koristiti generički RF modul bez mikrokontrolera što će nas na kraju dovesti do izgradnje projekta u kojemu možete pretvoriti IR daljinski upravljač bilo kojeg uređaja u RF Daljinski. Glavna prednost pretvaranja
Daljinski video daljinski upravljač za računalo Video player: 6 koraka
Daljinski video daljinski upravljač za računalo Video player: Izrađujem daljinski upravljač koji se povezuje s računalom putem USB -a. Veliki daljinski upravljač omogućuje mom djetetu odabir i reprodukciju videozapisa na starom računalu. Ovo je relativno jednostavan projekt. Osnovna komponenta je ili USB tipkovnica ili bežična USB tipkovnica. Zatim