Taula de continguts:
- Pas 1: ajuntar-ho tot
- Pas 2: receptor
- Pas 3: transmissor
- Pas 4: el codi
- Pas 5: fer que funcioni
- Pas 6: utilitzar el programa
- Pas 7: control de la temperatura
- Pas 8: dades històriques
Vídeo: Autostat: un termòstat remot: 8 passos (amb imatges)
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:15
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
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
Pas 3: transmissor
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
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
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
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
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:
IRduino: control remot Arduino: imiteu un control remot perdut: 6 passos
IRduino: control remot Arduino: imiteu un control remot perdut: si alguna vegada heu perdut el comandament a distància del vostre reproductor de TV o DVD, sabeu el frustrant que és haver d’anar, trobar i utilitzar els botons del propi dispositiu. De vegades, aquests botons ni tan sols ofereixen la mateixa funcionalitat que el comandament a distància. Rebre
Com controlar els electrodomèstics amb control remot de TV amb funció de temporitzador: 7 passos (amb imatges)
Com controlar els electrodomèstics amb control remot de TV amb funció de temporitzador: fins i tot després de 25 anys de la seva introducció al mercat de consum, la comunicació per infrarrojos continua sent molt rellevant els darrers dies. Tant si es tracta del televisor 4K de 55 polzades com del sistema de so del cotxe, tot necessita un comandament a distància IR per respondre al nostre
Controleu-vos els aparells elèctrics amb el vostre control remot de televisió (control remot ir) amb pantalla de temperatura i humitat: 9 passos
Controleu-vos els aparells elèctrics amb el vostre control remot de televisió (control remot ir) amb pantalla de temperatura i humitat: hola, sóc Abhay i és el meu primer bloc sobre Instructables i avui us mostraré com controlar els vostres electrodomèstics amb el vostre control remot de TV construint aquest projecte senzill. gràcies al laboratori atl per obtenir suport i proporcionar el material
Liberació del cable remot Olympus Evolt E510 (versió 2 amb enfocament automàtic al control remot): 6 passos (amb imatges)
Liberació del cable remot Olympus Evolt E510 (versió 2 amb enfocament automàtic al control remot): ahir vaig construir un comandament senzill amb un botó per al meu Olympus E510. La majoria de càmeres tenen un botó de disparador (el que premeu per fer una foto) que té dos modes. Si es prem el botó suaument, la càmera enfocarà automàticament i mesurarà la llum
Control remot remot: 11 passos (amb imatges)
Control remot a distància: tinc un nadó acabat de néixer i no creu que hagi de dormir el temps que la meva dona i jo també ho desitgem. Una cosa que el manté feliç al bressol és el mòbil que li penja. Així que quan es desperti si necessitem uns 25 minuts més o menys de sl