Cuprins:

Autostat: un termostat la distanță: 8 pași (cu imagini)
Autostat: un termostat la distanță: 8 pași (cu imagini)

Video: Autostat: un termostat la distanță: 8 pași (cu imagini)

Video: Autostat: un termostat la distanță: 8 pași (cu imagini)
Video: Top 20 Windows 10 sfaturi și trucuri 2024, Iulie
Anonim
Autostat: un termostat la distanță
Autostat: un termostat la distanță

Întrebarea pe care probabil o puneți este „de ce creați un alt termostat la distanță?”

Răspunsul la această întrebare este, a trebuit, iar termostatele inteligente de pe piață sunt prea scumpe.

Avertisment corect, aceasta este o versiune „dovadă a conceptului” care ar necesita câteva ieșiri suplimentare pentru a vă controla efectiv termostatul, dar nucleul este în poziție și poate fi modificat în funcție de circumstanțele dvs. specifice. De asemenea, aceasta este încă o lucrare în curs, așa că așteptați câteva actualizări și modificări (în special la codul Matlab)

Pentru a începe, vreau să vă avertizez, acest lucru necesită trei programe (unul dintre ele este destul de scump), destul de multe biblioteci și pachete de asistență pentru programe și trebuie să le faceți să vorbească între ele. Este o durere de cap. Cu acest avertisment, putem începe cu materialele.

Hardware

  • arduino nano
  • arduino uno (sau alt nano, tocmai l-am folosit pentru că aveam unul așezat în jur)
  • cabluri jumper asortate, unele bărbați / bărbați și două seturi de trei jumperi îmbinați bărbați / femei
  • Receptor de frecvență radio (RF) de 433 MHz, am folosit MX-05V
  • Transmițător RF de 433 MHz, am folosit MX-FS-03V
  • Termometru de înaltă precizie DHT11 și senzor de umiditate (cel pe care l-am folosit este instalat pe un cip cu trei direcții cu rezistențele necesare deja instalate)
  • breadboard (dacă nu doriți să lipiți totul împreună)
  • un telefon cu GPS (iPhone 8 în acest caz, dar am folosit și un Galaxy S8)
  • Recipient tipărit 3D (nu este cu adevărat necesar, orice container va funcționa sau deloc)

Software

  • Matlab de la MathWorks (am ediția 2018a, dar am folosit și edițiile 2017a-b)
  • Matlab mobil instalat pe telefon
  • pachet de asistență arduino pentru Matlab
  • Pachet senzor iPhone pentru Matlab
  • IDE arduino
  • Pachetele și bibliotecile de suport RadioHead ale IDE-ului arduino
  • Biblioteca DHT11 pentru IDE arduino
  • python 3.7 (asigurați-vă că este instalată biblioteca pyserial sau biblioteca serial, care ar trebui să fie pentru versiunea 3.4 sau mai recentă)

Pasul 1: Puneți totul împreună

Punând totul împreună
Punând totul împreună
Punând totul împreună
Punând totul împreună
Punând totul împreună
Punând totul împreună

În primul rând, vă sugerez să faceți câteva tutoriale arduino care să se ocupe de transmițătoarele RF doar pentru a vă asigura că piesele dvs. funcționează și că cablajul este corect. Există o mulțime de exemple disponibile, cu codul inclus (pentru cei dintre noi care știu puțin sau nimic despre C și C ++).

Urmați diagramele de cablare de mai jos pentru a monta arduino-ul și senzorii. Un lucru de reținut în timp ce conectați arduino-urile este că porturile de date pe care le-am folosit nu sunt necesare, ci recomandate.

DACĂ decideți să modificați porturile de date pe care le utilizați, trebuie doar să definiți pinii din cod. Personal, cred că este mai ușor să rămâi cu porturile implicite pe care bibliotecile arduino le recunosc.

Și, pentru a fi clar, nano și uno sunt interschimbabile, dar am folosit nano pentru partea transmițătoare a proiectului pentru a reduce dimensiunea monitorului de temperatură.

Notă laterală: dispozitivul verde care deține nano este containerul tipărit 3D.

Pasul 2: Receptor

Receptor
Receptor

Pasul 3: Transmițător

Transmiţător
Transmiţător

Pasul 4: Codul

Odată ce cablarea este terminată, trebuie să executați toate programele și să instalați bibliotecile (dacă nu ați făcut-o deja), presupun că aveți, trebuie să porniți Matlab și să rulați pachetul de asistență pentru iPhone. Atât telefonul, cât și Matlab trebuie să se afle în aceeași rețea wifi în acest moment.

În fereastra de comandă a Matlab scrieți:

conector activat

Acest lucru vă va solicita să introduceți o parolă din cinci cifre pe care o veți utiliza pentru a vă conecta pe iPhone. Asigurați-vă că vă amintiți parola. După ce ați introdus parola, Matlab va afișa câteva informații, inclusiv adresa dvs. IP. Utilizați acest lucru în pasul următor, care vine din instrucțiunile din meniul de ajutor „Noțiuni introductive despre senzori” din Matlab mobile.

  • Urmați acești pași pentru a trimite datele senzorului către MathWorks Cloud sau către un computer:
  • Dacă trimiteți date despre senzori către un computer și dacă nu sunt deja instalate, descărcați și instalați pachetul de asistență MATLAB pentru senzorii Apple iOS în MATLAB.
  • Conectați MATLAB Mobile la MathWorks Cloud sau la un computer utilizând Setări.
  • Creați obiect mobiledev în MATLAB (pe computer), de exemplu: >> m = mobiledev
  • Selectați unul sau mai mulți senzori și atingeți Start.

Urmați acești pași pentru a înregistra datele senzorului local pe dispozitiv:

  • Pe ecranul Senzori, selectați senzorii de la care doriți să colectați date.
  • Selectați Jurnal.
  • Atingeți butonul Start.
  • Când ați terminat de colectat date, atingeți butonul Stop.
  • În fereastra pop-up, introduceți numele jurnalului senzorului.
  • Repetați pașii 1-5, dacă este necesar.

Această secțiune va fi menționată înapoi în partea 4, deci nu este nevoie să începeți încă să colectați date. Păstrați telefonul la îndemână și telefonul Matlab gata.

Acum trebuie să creați un folder undeva în computerul dvs. pentru a găzdui fișierele de cod Matlab. Veți avea patru fișiere separate, două pentru funcțiile de fundal (fișiere.m) și un fișier de cod Matlab pentru GUI (.mlapp),.

Mai întâi este calculul masei pentru aerul din casa ta (acest lucru îi permite lui Matlab să știe cât durează încălzirea / răcirea casei tale)

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

runCalc = 0; Tmp_start = T_ins; time_start = ceas; time_end = 0 în timp ce 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 end end time_diag = time_end-time_start Mass = (P_out * time_diag) /7.035

Și al doilea:

function [timestamps, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; i = 1; în timp ce AutoStat == 1 start_ timp = ceas; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); timestamps = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i + 1; format longg; % formula haversină pentru calcularea distanței pe baza latitudinii și a% 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; % estimează timpul dvs. de returnare time_rtn = (Dist-r_pref)./ viteză; % calculează setarea necesară a termostatului pe baza puterii de ieșire din% a aparatului de aer condiționat și a masei de aer din casă. calcTmp_set = ((- 1. * P_out. * time_rtn)./ (mass. * (1.005))) + T_pref; % determină dacă setarea curentă a termostatului trebuie modificată dacă round (calcTmp_set) ~ = round (t) timeACon = clock; PwrCntr = P_out; timeACon = timeACon + clock-time_start; cost = P_out * timeACon * rata; else PwrCntr = 0 timestampuri de sfârșit (sfârșit + 1, [1: 6]) = ceas; pwr_usage (end + 1, 1) = PwrCntr; pauză (5) sfârșit sfârșit

Ambele fișiere sunt funcții Matlab. Nu va trebui să le accesați decât dacă intenționați să le modificați pentru nevoi specifice, deoarece le veți apela din GUI. Salvați ambele fișiere separat, primul ca CalcMass.m și al doilea ca dist_cntrl.m, acestea vor fi numele pe care le folosește codul GUI pentru a apela funcțiile, deci dacă nu doriți să editați restul codului de mai jos, rămâneți cu convenția de numire.

Înainte de a intra în codul GUI, trebuie să deschideți proiectantul de aplicații pentru Matlab, pe care îl puteți deschide navigând în bara de meniu Matlab sau prin metoda mea preferată, care introduce următoarea comandă în fereastra de comandă Matlab:

appdesigner

Odată ce proiectantul aplicației este deschis, deschideți un nou fișier de aplicație (.mlapp) și ștergeți tot codul implicit din fereastra codului. Apoi înlocuiți-l cu următorul text și apăsați pe butonul Executare.

classdef Control_1 <matlab.apps. AppBase% Proprietăți care corespund proprietăților componentelor aplicației (Acces = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Buton 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. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlab.ui.container. Tab Temperature1SpinnerLabel matlab. 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. Label Gauge matlab.ui.control. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLabelLab.

metode (Acces = privat)

% Funcția de modificare a valorii: tempnow

function tempnowValueChanged (app, event) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 for i = length (temp) app. Gauge. Value = temp (i) pause (1) end end

% Valoare modificată funcție: TemperaturăDirecțieSwitch

funcție TemperatureDirectionSwitchValueChanged (app, eveniment) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; end Chng_dir; Sfârșit

% Valoare modificată funcție: DDFH

funcția DDFHValueChanged (aplicație, eveniment) r_pref = app. DDFH. Value; Sfârșit

% Valoare modificată funcție: AvgLocalSpeedEditField

funcția AvgLocalSpeedEditFieldValueChanged (app, eveniment) speed = app. AvgLocalSpeedEditField. Value; Sfârșit

% Valoare modificată funcție: PowerOutputRatingEditField

funcția PowerOutputRatingEditFieldValueChanged (app, event) value = app. PowerOutputRatingEditField. Value; Sfârșit

% Valoare modificată funcție: EnergyEfficiencyRatingEditField

funcția EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; Sfârșit

% Funcție apăsată pe buton: RunDiagnosticButton

funcție RunDiagnosticButtonPush (app, eveniment) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

Sfârșit

% Valoare modificată funcție: Temperature1Spinner

funcție Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; Sfârșit

% Valoare modificată funcție: Temperature2Spinner

funcție Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; Sfârșit

% Valoare modificată funcție: Comutator

funcția SwitchValueChanged (aplicație, eveniment) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; viteza = m. Viteza; masa = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) end end

% Inițializarea și construcția aplicațiilor

metode (Acces = privat)

% Creați UIFigure și componente

funcția createComponents (aplicație)

% Creați UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Figura UI';

% Creați TabGroup

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

% Creați SetupTab

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

% Creați RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, adevărat); app. RunDiagnosticButton. FontWeight = 'bold'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Rulați diagnosticul';

% Creați EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'corect'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Evaluarea eficienței energetice';

% Creați EnergyEfficiencyRatingEditField

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

% Creați PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'dreapta'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Evaluarea puterii de ieșire';

% Creați PowerOutputRatingEditField

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

% Creați AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'dreapta'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Avg. Viteza locală ';

% Creați AvgLocalSpeedEditField

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

% Creați DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'dreapta'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Distanța dorită'; 'din casă'};

% Creați DDFH

app. DDFH = uieditfield (app. SetupTab, 'numeric'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (aplicație, @DDFHValueChanged, adevărat); app. DDFH. HorizontalAlignment = 'centru'; app. DDFH. Position = [139 135 100 22];

% Creați TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'centru'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Direcția temperaturii';

% Creați temperaturaDirecțieSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'glisor'); app. TemperatureDirectionSwitch. Items = {'Sus', 'Jos'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Sus';

% Creați tab-ul TempSettings

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Setări ';

% Creați Temperature1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'centru'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Temperatură'; „# 1”};

% Creați 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;

% Creați Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'centru'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperatură'; „# 2”};

% Creați 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;

% Creați comutator

app. Switch = uiswitch (app. TempSettingsTab, 'glisor'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (aplicație, @SwitchValueChanged, adevărat); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';

% Creați EditFieldLabel

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

% Creați tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'numeric'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (app, @tempnowValueChanged, adevărat); app.tempnow. HorizontalAlignment = 'centru'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% Creați GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'centru'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Calibru';

% Creați ecartament

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

% Creați fila de economii

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Economii';

% Creați UIAxes

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Economii') xlabel (app. UIAxes, 'Luna și An') ylabel (app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.60666666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Creați ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'centru'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Costul acestei luni';

% Create ThisMonthCostEditField

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

% Creați TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'dreapta'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Economii totale';

% Creați TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numeric'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$% 9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'centru'; app. TotalSavingsEditField. Position = [88 39 137 58]; sfârșit sfârșit

metode (Acces = public)

% Construiți aplicația

funcție app = Control_1

% Creați și configurați componente

createComponents (aplicație)

% Înregistrați aplicația cu App Designer

registerApp (app, app. UIFigure)

dacă nargout == 0

ștergeți sfârșitul aplicației

% Cod care se execută înainte de ștergerea aplicației

ștergere funcție (aplicație)

% Ștergeți UIFigurați când aplicația este ștearsă

delete (app. UIFigure) end end end

Probabil veți primi o eroare, ceea ce nu este nicio problemă. Închideți interfața grafică care a fost generată după ce ați apăsat rula, vom strânge restul programelor și datelor necesare într-o clipă.

Deoarece Matlab este configurat, putem trece la python. Mai întâi, rulați programul python fie din linia de comandă (pe Windows), fie utilizând fișierul.exe din folderul dvs. python. Asigurați-vă că toate bibliotecile corespunzătoare sunt instalate utilizând comanda de import.

import serial

timp de import import CSV

Acestea sunt cele trei biblioteci de care veți avea nevoie pentru a începe, deși vom crea propria noastră bibliotecă în curând. Dacă a existat un fel de eroare la aceste comenzi, reveniți înapoi și asigurați-vă că bibliotecile sunt instalate și se află în folderul Lib din folderul python. În continuare vom genera ceea ce am numit biblioteca pythonlogger. Acest nume nu este necesar, îl puteți numi oricum doriți, este doar numele fișierului python (.py) pe care îl creați.

Deschideți un editor de text, folosesc Sublime3, dar blocnotesul funcționează foarte bine și introduceți acest cod.

def pythonprint ():

import pythonlogger import serial import time csv ser = serial. Serial ('COM8') # COM8 este portul serial arduino, probabil va fi diferit pentru fiecare utilizator, adică verificați portul serial în ID-ul arduino ser.flushInput () în timp ce Adevărat: încercați: ser_bytes = ser.readline () print (ser_bytes) cu open ("test_data.csv", "a") ca f: writer = csv.writer (f, delimiter = ",") # setează datele la să fie introdus ca scriitor.

Salvați textul ca „introduceți numele bibliotecii dorite”.py în folderul Lib. De asemenea, rețineți că linia def pythonprint () definește numele funcției pe care urmează să o apelați, astfel încât să o puteți schimba în def "introduceți numele dorit pentru funcția dvs." (). Când biblioteca este salvată, putem trece la codul arduino.

Deschideți IDE-ul arduino și deschideți două noi ferestre de schiță. Salvați aceste două fișiere schițe undeva convenabil, numele acestor fișiere nu contează. Apoi ștergeți tot codul implicit și înlocuiți-l cu următorul.

Pentru arduino-ul receptor:

#include

#include #include #include // acest lucru nu este folosit, dar este necesar pentru a compila driverul RH_ASK; struct dataStruct {float temp; }datele mele; void setup () {Serial.begin (9600); // Depanare numai dacă (! Driver.init ()) Serial.println ("init a eșuat"); } bucla void () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Non-blocant {int i; // Mesaj cu o sumă de control bună primită, aruncați-l. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. etc linia este codul de testare. Nu este nevoie să vă faceți griji cu privire la aceasta, cu excepția cazului în care faceți diagnosticări și doriți să vă dați seama dacă primiți de fapt date.

Pentru emițător arduino

#include

#include #include #include // acest lucru nu este folosit, dar este necesar pentru a compila # include #include int pin = 4; DHT11 dht11 (pin); Driver RH_ASK; struct dataStruct {float temp; }datele mele; octet tx_buf [sizeof (MyData)] = {0}; // Deci argumentele sunt bitrate, transmit pin (tx), // primesc pin (rx), ppt pin, isInverse. Ultimele 2 nu sunt utilizate.void setup () {Serial.begin (9600); // Depanare numai dacă (! Driver.init ()) Serial.println ("init a eșuat"); } void loop () {int err; float temp, humi; uint8_t msg; if ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); octet zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // opriți executarea până când toate datele au fost trimise cu întârziere (2000); // așteptați 2 secunde}}

Comenzile include ar trebui să fie suficiente, dar dacă aveți probleme ulterioare cu transferul de date, vă recomandăm să căutați în folderul bibliotecii RadioHead și să includeți restul numelor de fișiere, în același format.

Pasul 5: Faceți-o să funcționeze

Făcând-o să funcționeze
Făcând-o să funcționeze
Făcând-o să funcționeze
Făcând-o să funcționeze
Făcând-o să funcționeze
Făcând-o să funcționeze

Acum că avem toate codurile împreună și arduino-ul asamblat, putem conecta arduino-ul la computerul dvs. și încărca codul. Asigurați-vă că trimiteți codul corect microcontrolerelor de recepție și de transmisie. Puteți avea ambele arduino-uri conectate la computer în timp ce acesta rulează, dar va trebui să vă asigurați că ați selectat portul corect înainte sau puteți deconecta arduino-ul de transmisie și alimenta-l de la o altă sursă odată ce codul este încărcat.

Apropo, ar trebui să selectați portul care este conectat la arduino-ul dvs. de primire din meniul de instrumente IDE acum și să rulați python.

Nu deschideți monitorul serial în timp ce faceți acest lucru, python nu poate citi serialul în timp ce monitorul este deschis. Odată ce python este deschis, apelați funcția pythonprint după cum urmează.

pythonlogger.pythonprint ()

Aceasta va începe colectarea datelor din portul serial arduino. Dacă deschideți folderul python acum, veți vedea că a fost creat un nou fișier.csv numit „test_data.csv”, care conține toate informațiile despre timp și temperatură. Acesta va fi fișierul pe care Matlab îl accesează pentru a face toate calculele și controalele sale.

Un alt avertisment: nu deschideți test_data.csv în timp ce datele sunt accesate sau scrise. Dacă faceți acest lucru, python și / sau codul Matlab se vor bloca și vor trimite înapoi o eroare

Dacă decideți să deschideți fișierul.csv mai târziu, veți observa că coloana de timp este doar un șir foarte mare de numere. Asta deoarece comanda time.time () scrie numărul de secunde de la 1 ianuarie 1970.

În acest moment python ar trebui să imprime datele de temperatură pe care le citește din portul serial. Ar trebui să arate ceva de genul:

b'25.03 '/ r / n

Nu vă faceți griji cu privire la caracterele suplimentare, codurile Matlab indexează pentru cele cinci valori din mijloc în a doua coloană a fișierului.csv.

Acum, că toate programele de sprijin funcționează și că datele sunt colectate, putem începe să colectăm date GPS din programul mobil Matlab care a fost configurat mai devreme și să rulăm codul GUI Matlab. Odată ce vă aflați în fila senzor a telefonului mobil Matlab, selectați GPS și apăsați butonul Start.

Dacă sunteți nou în Matlab mobile, consultați înapoi la pasul 4 și uitați-vă la capturile de ecran de mai sus. Dacă aveți în continuare probleme, asigurați-vă că sunteți conectat la computerul pe care l-ați selectat anterior (în fila Setări) și utilizați linkul din comanda „conector activat” pentru a verifica dacă Matlab este online.

Pasul 6: Utilizarea programului

Utilizarea programului
Utilizarea programului

Există mai multe lucruri care se întâmplă în fundal în acest sistem. Datele referitoare la temperatură sunt colectate și înregistrate de către arduino și pyton, Matlab colectează date GPS de pe telefonul dvs. și efectuează calcule pentru a vedea cât de departe sunteți de casă și vă setează termostatul pe baza acestor informații. Unde intri vă oferă preferințele.

Rulați codul GUI Matlab. Deschideți fișierul.mlapp și priviți prima filă. Va trebui să colectați singuri informațiile pentru acest lucru, eficiența și puterea unității dvs. de încălzire / răcire pot fi găsite de obicei pe unitate, iar viteza medie este doar o estimare bună a vitezei de conducere. Odată ce valorile sunt introduse, apăsați butonul „Run Diagnostic” și programul vă controlează termostatul pentru a colecta informații despre casa dvs.

Treceți la următorul meniu.

Pasul 7: Controlul temperaturii

Controlul temperaturii
Controlul temperaturii

Acest meniu vă permite să selectați temperatura preferată în timp ce sunteți acasă și departe. Setați temperatura # 1 la temperatura dvs. confortabilă și temperatura # 2 la o valoare ridicată sau scăzută, care este sigură pentru casa dvs. (asigurați-vă că nu o setați la 100 de grade în timp ce aveți câini acasă etc.).

Pasul 8: Date istorice

Date istorice
Date istorice

În cele din urmă, puteți urmări câți bani economisiți utilizând controlul automat. Aceasta estimează în esență câtă energie ar fi utilizată dacă termostatul dvs. ar fi setat la temperatura preferată 24/7, apoi va scade energia reală utilizată.

Noroc de construcție.

Recomandat: