Sadržaj:
- Korak 1: Spojite sve zajedno
- 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: Historijski podaci
Video: Autostat: daljinski termostat: 8 koraka (sa slikama)
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:08
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
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
Korak 3: 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
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
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
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
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:
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 tačno onako kako želite. Uštedite i smanjite emisiju 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 dugmeta na daljinskom upravljaču televizora. Hajde da počnemo
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 tipke 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 Instructable -u pokazat ću vam kako možete koristiti generički RF modul bez mikrokontrolera što će nas na kraju dovesti do izgradnje projekta u kojem možete pretvoriti IR daljinski upravljač bilo kojeg uređaja u RF Daljinski. Glavna prednost pretvaranja
Daljinski video daljinski upravljač za računare Video player: 6 koraka
Video daljinski upravljač za malu djecu za PC Video player: Izrađujem daljinski upravljač koji se povezuje s računarom putem USB -a. Veliki daljinski upravljač omogućuje mom djetetu odabir i reprodukciju videozapisa na starom računaru. Ovo je relativno jednostavan projekt. Osnovna komponenta je ili USB tastatura ili bežična USB tastatura. Zatim