Taula de continguts:

Autostat: un termòstat remot: 8 passos (amb imatges)
Autostat: un termòstat remot: 8 passos (amb imatges)

Vídeo: Autostat: un termòstat remot: 8 passos (amb imatges)

Vídeo: Autostat: un termòstat remot: 8 passos (amb imatges)
Vídeo: 👍Thermostat Wiring for BEGINNERS !!! 2024, Juliol
Anonim
Autostat: un termòstat remot
Autostat: un termòstat remot

La pregunta que probablement us feu és "per què feu un altre termòstat remot?"

La resposta a aquesta pregunta és que ho havia de fer i els termòstats intel·ligents del mercat són massa cars.

Avís just, es tracta d’una versió de prova de concepte que requeriria unes sortides addicionals per controlar realment el termòstat, però el nucli està al seu lloc i es pot modificar en funció de la vostra circumstància específica. A més, encara és un treball en curs, així que espereu algunes actualitzacions i canvis (especialment al codi Matlab)

Per començar vull advertir-vos, això requereix tres programes (un d'ells és bastant car), força biblioteques i paquets de suport per als programes, i heu de fer-los parlar tots. És un mal de cap. Amb aquesta advertència, deixem de començar els materials.

Maquinari

  • arduino nano
  • arduino uno (o un altre nano, acabo d'utilitzar l'uno perquè en tenia un)
  • cables de pont variats, alguns homes / homes i dos conjunts de tres ponts masculins / femenins units
  • Receptor de radiofreqüència (RF) de 433 MHz, he utilitzat el MX-05V
  • Transmissor de RF de 433 MHz, he utilitzat el MX-FS-03V
  • Termòmetre d'alta precisió DHT11 i sensor d'humitat (el que he utilitzat està instal·lat en un xip de tres puntes amb les resistències necessàries ja instal·lades)
  • tauler de pa (si no voleu soldar-ho tot junt)
  • un telèfon amb GPS (iPhone 8 en aquest cas, però també he utilitzat un Galaxy S8)
  • Contenidor imprès en 3D (no és realment necessari, qualsevol contenidor funcionarà o cap)

Programari

  • Matlab de MathWorks (tinc l'edició 2018a, però també he utilitzat les edicions 2017a-b)
  • Matlab mòbil instal·lat al telèfon
  • paquet de suport arduino per a Matlab
  • Paquet de sensors per a iPhone per a Matlab
  • IDE arduino
  • Els paquets i les biblioteques de suport de RadioHead de l’IDE arduino
  • Biblioteca DHT11 per IDE arduino
  • python 3.7 (assegureu-vos que hi ha instal·lada la biblioteca pyserial o la sèrie, que hauria de ser per a la versió 3.4 o posterior)

Pas 1: ajuntar-ho tot

Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt

Primer de tot, us suggeriria que feu uns quants tutorials sobre arduino sobre els transmissors de RF només per assegurar-vos que les vostres peces funcionen i que el cablejat és correcte. Hi ha molts exemples disponibles, amb el codi inclòs (per a aquells que estem allà fora i no sabem res sobre C i C ++).

Seguiu els diagrames de cablejat següents per muntar l’arduino i els sensors. Una cosa que cal tenir en compte mentre es connecten els arduinos és que els ports de dades que he utilitzat no són obligatoris, sinó recomanables.

SI decidiu canviar els ports de dades que utilitzeu, només heu de definir els pins del vostre codi. Personalment, crec que és més fàcil quedar-se amb els ports predeterminats que reconeixen les biblioteques arduino.

I, per ser clar, el nano i l’uno són intercanviables, però he utilitzat el nano per al costat transmissor del projecte per reduir la mida del monitor de temperatura.

Nota lateral: l’article verd que conté el nano és el contenidor imprès en 3D.

Pas 2: receptor

Receptor
Receptor

Pas 3: transmissor

Emissor
Emissor

Pas 4: el codi

Un cop acabat el cablejat, heu d’executar tots els programes i instal·lar les biblioteques (si encara no ho heu fet), suposaré que teniu, haureu d’iniciar Matlab i executar el paquet de suport de l’iPhone. Tant el telèfon com el Matlab han d’estar a la mateixa xarxa wifi en aquest moment.

A la finestra d'ordres de Matlab escriviu:

connector activat

Això us demanarà que introduïu una contrasenya de cinc dígits que utilitzarà per connectar-vos al vostre iPhone. Assegureu-vos de recordar la contrasenya. Quan hàgiu introduït la contrasenya, Matlab mostrarà informació, inclosa la vostra adreça IP. Utilitzeu-lo al següent pas, que prové de les instruccions del menú d'ajuda "Introducció als sensors" del mòbil Matlab.

  • Seguiu aquests passos per enviar les dades del sensor a MathWorks Cloud o a un ordinador:
  • Si envieu dades del sensor a un ordinador i si encara no està instal·lat, descarregueu i instal·leu el paquet de suport MATLAB per a sensors Apple iOS a MATLAB.
  • Connecteu MATLAB Mobile a MathWorks Cloud o a un ordinador mitjançant Configuració.
  • Creeu un objecte mobiledev a MATLAB (al vostre ordinador), per exemple: >> m = mobiledev
  • Seleccioneu un o més sensors i toqueu Inici.

Seguiu aquests passos per registrar les dades del sensor localment al dispositiu:

  • A la pantalla Sensors, seleccioneu els sensors dels quals vulgueu recopilar dades.
  • Seleccioneu Registre.
  • Toqueu el botó Inici.
  • Quan hàgiu acabat de recopilar dades, toqueu el botó Atura.
  • A la finestra emergent, introduïu el nom del registre del sensor.
  • Repetiu els passos 1-5 si cal.

Aquesta secció es remetrà a la part 4, de manera que encara no cal començar a recollir dades. Només cal que tingueu el telèfon a mà i que el mòbil Matlab estigui a punt.

Ara heu de crear una carpeta en algun lloc de l’ordinador per allotjar els fitxers de codi Matlab. Tindreu quatre fitxers separats, dos per a les funcions de fons (fitxers.m) i un fitxer de codi Matlab per a la GUI (.mlapp),.

El primer és el càlcul de la massa de l’aire de casa (això permet a Matlab saber quant de temps triga a escalfar / refredar la vostra casa)

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

runCalc = 0; Tmp_start = T_ins; time_start = rellotge; time_end = 0 mentre executaCalc <= 1 if T_ins == (Tmp_start + (7 * Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; else PwrCntr = P_out; runCalc = runCalc + 0.1 final final time_diag = time_end-time_start Mass = (P_out * time_diag) /7.035

I el segon:

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

AutoStat = 1; i = 1; mentre AutoStat == 1 start_ time = rellotge; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); marques de temps = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i + 1; format longg; % de fórmula haversina per calcular la distància segons la latitud i el% 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; % calcula el vostre temps per retornar time_rtn = (Dist-r_pref)./ velocitat; % calcula la configuració necessària del termòstat en funció de l'apagada de% aire condicionat i la massa d'aire de la llar. calcTmp_set = ((- 1. * P_out. * time_rtn)./ (mass. * (1.005))) + T_pref; % determina si cal canviar la configuració actual del termòstat si round (calcTmp_set) ~ = round (t) timeACon = clock; PwrCntr = P_out; timeACon = timeACon + start-time-clock; cost = P_out * timeACon * rate; else PwrCntr = 0 marques de temps finals (final + 1, [1: 6]) = rellotge; pwr_usage (final + 1, 1) = PwrCntr; pausa (5) extrem final

Aquests dos fitxers són funcions Matlab. No necessitareu accedir-hi si no teniu previst modificar-los per a necessitats específiques, ja que els trucareu des de la GUI. Deseu els dos fitxers per separat, el primer com a CalcMass.m i el segon com a dist_cntrl.m, aquests seran els noms que utilitza el codi GUI per cridar a les funcions, de manera que, tret que vulgueu editar la resta del codi següent, seguiu amb la convenció de noms.

Abans d’entrar al codi GUI, heu d’obrir el dissenyador d’aplicacions per a Matlab, que podeu obrir navegant a la barra de menú de Matlab o mitjançant el meu mètode preferit, que és introduir l’ordre següent a la finestra d’ordres de Matlab:

dissenyador d’aplicacions

Un cop obert el dissenyador d'aplicacions, obriu un fitxer d'aplicació nou (.mlapp) i suprimiu tot el codi per defecte de la finestra del codi. A continuació, substituïu-ho tot pel següent i premeu el botó d'execució.

classdef Control_1 <matlab.apps. AppBase% Propietats que corresponen a les propietats dels components de l'aplicació (Accés = públic) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. botó 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.

mètodes (Accés = privat)

Funció de valor canviat: tempnow

funció tempnowValueChanged (aplicació, esdeveniment) 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

% Funció de canvi de valor: TemperatureDirectionSwitch

funció TemperatureDirectionSwitchValueChanged (app, esdeveniment) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; else Chng_dir = 1; acabar Chng_dir; final

% Funció de valor canviat: DDFH

funció DDFHValueChanged (aplicació, esdeveniment) r_pref = app. DDFH. Value; final

% Funció de valor canviat: AvgLocalSpeedEditField

funció AvgLocalSpeedEditFieldValueChanged (app, esdeveniment) speed = app. AvgLocalSpeedEditField. Value; final

% Valor de la funció canviat: PowerOutputRatingEditField

funció PowerOutputRatingEditFieldValueChanged (aplicació, esdeveniment) valor = app. PowerOutputRatingEditField. Value; final

% Funció de valor canviat: EnergyEfficiencyRatingEditField

funció EnergyEfficiencyRatingEditFieldValueChanged (app, esdeveniment) value = app. EnergyEfficiencyRatingEditField. Value; final

% Funció de botó: RunDiagnosticButton

funció RunDiagnosticButtonPush (app, esdeveniment) 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)

final

% Funció de valor canviat: Temperature1Spinner

funció Temperature1SpinnerValueChanged (app, esdeveniment) value = app. Temperature1Spinner. Value; final

% Funció de canvi de valor: Temperature2Spinner

funció Temperature2SpinnerValueChanged (app, esdeveniment) value = app. Temperature2Spinner. Value; final

% Funció de canvi de valor: commutador

funció SwitchValueChanged (aplicació, esdeveniment) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; velocitat = m. Velocitat; massa = 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

% Inicialització i construcció d'aplicacions

mètodes (Accés = privat)

% Creeu UIFigure i components

funció createComponents (aplicació)

% Crea UIFigure

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

% Crea TabGroup

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

% Crea SetupTab

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Configuració';

% Crea RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'negreta'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Executa el diagnòstic';

% Crea EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'correcte'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Classificació d'eficiència energètica';

% Creeu EnergyEfficiencyRatingEditField

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

% Crea PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'correcte'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Potència de sortida de potència';

% Crea PowerOutputRatingEditField

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

% Crea AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'correcte'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Mitjana Velocitat local ';

% Crea AvgLocalSpeedEditField

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

% Creeu DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'dret'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Distància desitjada'; 'de casa'};

% Crea DDFH

app. DDFH = uieditfield (app. SetupTab, 'numèric'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (aplicació, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'centre'; app. DDFH. Position = [139 135 100 22];

% Crea TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'centre'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Direcció de temperatura';

% Creeu TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'control lliscant'); app. TemperatureDirectionSwitch. Items = {'Pujar', 'Baixar}}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Pujar';

% Crea TempSettingsTab

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

% Crea Temperature1SpinnerLabel

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

% Crea 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 Temperature2SpinnerLabel

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

% Crea 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 commutador

app. Switch = uiswitch (app. TempSettingsTab, 'control lliscant'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (aplicació, @SwitchValueChanged, true); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';

% Crea EditFieldLabel

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

% Crea tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'numèric'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (app, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'centre'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% Crea GaugeLabel

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

% Crea un indicador

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 una fitxa d'estalvi

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = "Estalvi";

% Creeu UIAxes

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Estalvi') xlabel (app. UIAxes, 'Mes i Any') ylabel (app. UIAxes, 'Diners') 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 ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'centre'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Cost d'aquest mes';

% Crea ThisMonthCostEditField

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

% Crea TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'correcte'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Estalvi total';

% Crea TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numèric'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$% 9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'centre'; app. TotalSavingsEditField. Position = [88 39 137 58]; fi final

mètodes (Accés = públic)

% Construeix l'aplicació

app de funció = Control_1

% Creeu i configureu components

createComponents (aplicació)

% Registreu l'aplicació amb App Designer

registerApp (app, app. UIFigure)

si nargout == 0

neteja el final de l'aplicació

% Codi que s'executa abans de suprimir l'aplicació

funció de supressió (aplicació)

% Suprimeix UIFigureu quan se suprimeixi l'aplicació

delete (app. UIFigure) end end end

Probablement obtindreu un error, que no és cap problema. Només heu de tancar la interfície gràfica d’usuari que es va generar després d’haver premut Executar, en un moment recopilarem la resta de programes i dades necessaris.

Des que Matlab està configurat, podem passar a Python. En primer lloc, executeu el programa Python des del vostre símbol del sistema (a Windows) o mitjançant el fitxer.exe de la carpeta Python. Assegureu-vos que s’instal·len totes les biblioteques adequades mitjançant l’ordre import.

importació de sèries

temps d'importació d'importació CSV

Aquestes són les tres biblioteques que necessiteu per començar, tot i que aviat farem la nostra pròpia biblioteca. Si hi ha hagut algun tipus d'error amb aquestes ordres, torneu enrere i assegureu-vos que les biblioteques estan instal·lades i que es troben a la carpeta Lib de la carpeta Python. A continuació, generarem el que he anomenat biblioteca pythonlogger. Aquest nom no és necessari, podeu anomenar-lo com vulgueu, és només el nom del fitxer python (.py) que creeu.

Obriu un editor de text, faig servir Sublime3, però el bloc de notes funciona molt bé i introduïu aquest codi.

def pythonprint ():

importació de pythonlogger importació de temps d'importació sèrie importació csv ser = serial. Serial ('COM8') # COM8 és el port sèrie arduino, probablement serà diferent per a cada usuari, és a dir, comproveu el vostre port sèrie a l'IDE arduino ser.flushInput () Cert: proveu: ser_bytes = ser.readline () print (ser_bytes) amb open ("test_data.csv", "a") com a f: writer = csv.writer (f, delimiter = ",") # estableix les dades a s'introdueix com a writer.writerow separat per comes ([time.time (), ser_bytes]) #writes data to test_data.csv exceptuant: print ("Error ocorregut") break

Deseu el text com a "inseriu el nom de la biblioteca que vulgueu".py a la carpeta Lib. Tingueu en compte també que la línia def pythonprint () defineix el nom de la funció a la qual cridareu, de manera que podeu canviar-la per definir "inseriu el nom que vulgueu per a la vostra funció" (). Quan es guarda la biblioteca, podem passar al codi arduino.

Obriu l'IDE arduino i obriu dues noves finestres d'esbós. Deseu aquests dos fitxers d'esbós en un lloc convenient, el nom d'aquests fitxers no importa. A continuació, suprimiu tot el codi per defecte i substituïu-lo pel següent.

Per a l'arduino receptor:

#incloure

#include #include #include // això no s'utilitza, però és necessari per compilar el controlador RH_ASK; struct dataStruct {float temp; } myData; configuració nul·la () {Serial.begin (9600); // Depuració només si (! Driver.init ()) Serial.println ("init ha fallat"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // No bloqueja {int i; // Missatge amb una bona suma de comprovació rebuda, bolqueu-lo. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. el //driver.printBuffer…. etc línia és un codi de prova. No cal que us preocupeu, tret que feu diagnòstics i vulgueu esbrinar si realment rebeu dades.

Per al transmissor arduino

#incloure

#include #include #include // això no s'utilitza, però és necessari per compilar # include #include int pin = 4; DHT11 dht11 (pin); Controlador RH_ASK; struct dataStruct {float temp; } myData; byte tx_buf [sizeof (myData)] = {0}; // Per tant, els arguments són bitrate, pin de transmissió (tx), // pin de recepció (rx), pin de ppt, isInverse. No s’utilitzen els 2 darrers.void setup () {Serial.begin (9600); // Depuració només si (! Driver.init ()) Serial.println ("init ha fallat"); } 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)); byte zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // aturar l'execució fins que s'enviïn totes les dades amb retard (2000); // espera 2 segons}}

Les ordres d’inclusió haurien de ser suficients, però si teniu algun problema més endavant amb la transferència de dades, és possible que vulgueu buscar a la carpeta de la biblioteca RadioHead i incloure la resta de noms de fitxers, en el mateix format.

Pas 5: fer que funcioni

Fent que funcioni
Fent que funcioni
Fent que funcioni
Fent que funcioni
Fent que funcioni
Fent que funcioni

Ara que tenim tot el codi junt i que l’arduino està muntat, podem connectar-lo a l’ordinador i carregar-lo. Assegureu-vos que envieu el codi correcte als microcontroladors de recepció i transmissió. Podeu tenir els dos arduinos connectats a l’ordinador mentre s’està executant, però haureu d’assegurar-vos que teniu el port correcte seleccionat per avançar o bé podeu desconnectar l’arduino transmissor i alimentar-lo d’alguna altra font un cop el codi estigui activat. carregat.

Parlant d’això, hauríeu de seleccionar el port connectat al vostre arduino receptor des del menú d’eines IDE i executar python.

No obriu el monitor sèrie mentre ho feu, python no pot llegir el serial mentre el monitor està obert. Un cop obert Python, crideu a la funció pythonprint de la següent manera.

pythonlogger.pythonprint ()

Això iniciarà la recopilació de dades des del port sèrie arduino. Si obriu la carpeta Python ara, veureu que s'ha creat un fitxer.csv nou anomenat "test_data.csv", que conté tota la informació de temps i temperatura. Aquest serà el fitxer al qual accedeix Matlab per fer tots els seus càlculs i controls.

Una altra advertència: no obriu test_data.csv mentre s’accedeix o s’escriu a les dades. Si ho feu, el python i / o el codi Matlab es bloquejaran i tornaran a enviar un error

Si decidiu obrir el fitxer.csv més tard, notareu que la columna horària és només una cadena de números molt gran. Això es deu al fet que l'ordre time.time () escriu el nombre de segons des de l'1 de gener de 1970.

En aquest moment, Python hauria d'imprimir les dades de temperatura que està llegint des del port sèrie. Ha de semblar:

b'25.03 '/ r / n

No us preocupeu pels caràcters addicionals, els codis Matlab indexen els cinc valors centrals de la segona columna del fitxer.csv.

Ara que tots els programes de suport funcionen i es recopilen dades, podem començar a recollir dades GPS del programa mòbil Matlab que es va configurar anteriorment i executar el codi GUI Matlab. Un cop esteu a la pestanya del sensor del mòbil Matlab, seleccioneu GPS i premeu el botó d'inici.

Si no coneixeu el mòbil Matlab, torneu al pas 4 i mireu les captures de pantalla anteriors. Si encara teniu problemes, assegureu-vos que esteu connectat a l'ordinador que heu seleccionat anteriorment (a la pestanya Configuració) i utilitzeu l'enllaç de l'ordre "connector activat" per comprovar que Matlab està en línia.

Pas 6: utilitzar el programa

Utilitzant el programa
Utilitzant el programa

Hi ha diverses coses que passen en segon pla en aquest sistema. Arduino i Pyton recopilen i registren dades de temperatura, Matlab està recopilant dades GPS del telèfon i realitzant càlculs per veure quina distància teniu de casa i configurant el termòstat en funció de tota aquesta informació. El lloc on vingueu és proporcionar les vostres preferències.

Executeu el codi GUI de Matlab. Obriu el fitxer.mlapp i mireu la primera pestanya. Haureu de recollir la informació per a vosaltres mateixos, l’eficiència i la potència nominal de la vostra unitat de calefacció / refrigeració solen trobar-se a la mateixa unitat i la vostra velocitat mitjana és només una bona estimació de la velocitat amb què conduïu. Un cop introduïts els valors, premeu el botó "Executa el diagnòstic" i el programa controla el termòstat per recopilar informació sobre la vostra casa.

Aneu al menú següent.

Pas 7: control de la temperatura

Control de temperatura
Control de temperatura

Aquest menú us permet seleccionar la temperatura preferida a casa i fora. Establiu la temperatura núm. 1 a la vostra temperatura còmoda i la temperatura núm. 2 a un valor alt o baix que sigui segur per a la vostra llar (assegureu-vos que no la configureu a 100 graus mentre tingueu gossos a casa, etc.).

Pas 8: dades històriques

Dades històriques
Dades històriques

Finalment, podeu veure quants diners estalvieu mitjançant el control automàtic. Això bàsicament calcula la quantitat d'energia que s'utilitzaria si el termòstat estigués configurat a la temperatura preferida 24/7 i, a continuació, resta la vostra energia real utilitzada.

Bona sort edificant.

Recomanat: