如何制作一个远程恒温器

电子说

1.4w人已加入

描述

第1步:全部放在一起

恒温器

恒温器

恒温器

首先,我建议你做一些arduino教程处理RF发射器只是为了确保您的部件正常工作且接线正确。有很多可用的例子,包括代码(对于那些对C和C ++几乎没有了解的人)。

按照下面的接线图来组装arduino和传感器。在连接arduinos时要记住的一件事是我使用的数据端口不是而是推荐的。

IF 您决定更改所使用的数据端口,只需在代码中定义引脚即可。就个人而言,我认为坚持使用arduino库识别的默认端口更容易。

为了清楚起见,纳米和uno是可以互换的,但我在项目的发射器侧使用纳米来减小温度监控器的尺寸。

旁注:持有nano的绿色装置是3D打印容器。

步骤2:接收器

恒温器

步骤3:发射器

恒温器

步骤4:代码

一次接线完成你需要运行所有程序并安装库(如果你还没有),我只是假设你有,你需要启动Matlab并运行iPhone支持包。此时你的手机和Matlab都需要在同一个wifi网络上。

在Matlab的命令窗口中写道:

connector on

这将提示你输入用于连接iPhone的五位数密码。确保记住密码。输入密码后,Matlab将显示一些信息,包括您的IP地址。在下一步中使用它,它来自Matlab mobile中“传感器入门”帮助菜单中的说明。

按照以下步骤将传感器数据发送到MathWorks Cloud或计算机:

如果要将传感器数据发送到计算机并且尚未安装,请下载并安装MATLAB支持在MATLAB中为Apple iOS传感器打包。

使用“设置”将MATLAB Mobile连接到MathWorks Cloud或计算机。

在MATLAB中(在您的计算机上)创建mobiledev对象,例如:》》 m = mobiledev

选择一个或多个传感器,然后点击开始。

按照以下步骤在设备上本地记录传感器数据:

在“传感器”屏幕上,选择要从中收集数据的传感器。

选择日志。

点按“开始”按钮。

完成数据收集后,点击“停止”按钮。

在弹出窗口中,输入传感器日志的名称。

如果需要,请重复步骤1-5。

本节将在第4部分中回顾,因此无需实际开始收集数据。只需将您的手机放在手边,就可以使用Matlab移动设备。

现在您需要在计算机的某个位置创建一个文件夹来存放Matlab代码文件。你将有四个单独的文件,两个用于后台函数(.m文件)和一个用于GUI的(.mlapp)的Matlab代码文件。

首先是你房子里空气的质量计算(这让Matlab知道加热/冷却房子需要多长时间)

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

runCalc=0;

Tmp_start=T_ins;

time_start=clock;

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

end

end

time_diag= time_end-time_start

Mass=(P_out*time_diag)/7.035

第二个:

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

AutoStat = 1;

i = 1;

while AutoStat == 1

time_start=clock;

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;

%haversine formula for calculating distance based on latitude and

%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;

%estimates your time to return

time_rtn=(Dist-r_pref)。/speed;

%calculates the necessary thermostat setting based on power out put of

%air conditioner and airmass of the home.

calcTmp_set=((-1.*P_out.*time_rtn)。/(mass.*(1.005)))+T_pref;

%determines whether the current thermostat setting needs to be changed

if round(calcTmp_set) ~= round(t)

timeACon = clock;

PwrCntr = P_out;

timeACon= timeACon + clock-time_start;

cost=P_out*timeACon*rate;

else

PwrCntr = 0

end

timestamps(end+1,[1:6]) = clock;

pwr_usage(end+1,1)= PwrCntr;

pause(5)

end

end

这两个文件都是Matlab函数。除非您计划根据特定需要修改它们,否则您无需访问它们,因为您将从GUI调用它们。分别保存两个文件,第一个作为CalcMass.m,第二个作为dist_cntrl.m,这些将是GUI代码用来调用函数的名称,所以除非你想编辑下面的其余代码,坚持下去命名惯例。

在进入GUI代码之前,您需要打开Matlab的应用程序设计器,您可以通过在Matlab菜单栏中导航打开,或者通过我最喜欢的方法打开它,该方法在Matlab命令窗口:

appdesigner

打开应用程序设计器后,打开一个新的应用程序文件(.mlapp)并从代码窗口中删除所有默认代码。然后用以下内容替换所有内容并点击运行按钮。

classdef Control_1 《 matlab.apps.AppBase

% Properties that correspond to app components

properties (Access = public)

UIFigure matlab.ui.Figure

TabGroup matlab.ui.container.TabGroup

SetupTab matlab.ui.container.Tab

RunDiagnosticButton matlab.ui.control.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.NumericEditField

TemperatureDirectionSwitchLabel matlab.ui.control.Label

TemperatureDirectionSwitch matlab.ui.control.Switch

TempSettingsTab matlab.ui.container.Tab

Temperature1SpinnerLabel matlab.ui.control.Label

Temperature1Spinner matlab.ui.control.Spinner

Temperature2SpinnerLabel matlab.ui.control.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

TotalSavingsEditFieldLabel matlab.ui.control.Label

TotalSavingsEditField matlab.ui.control.NumericEditField

end methods (Access = private) % Value changed function: 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 % Value changed function: TemperatureDirectionSwitch

function TemperatureDirectionSwitchValueChanged(app, event)

way = app.TemperatureDirectionSwitch.Value;

way= uint8(way)

way = length(way)

if way == 4

Chng_dir = -1;

else

Chng_dir = 1;

end

Chng_dir;

end % Value changed function: DDFH

function DDFHValueChanged(app, event)

r_pref = app.DDFH.Value;

end % Value changed function: AvgLocalSpeedEditField

function AvgLocalSpeedEditFieldValueChanged(app, event)

speed = app.AvgLocalSpeedEditField.Value;

end % Value changed function: PowerOutputRatingEditField

function PowerOutputRatingEditFieldValueChanged(app, event)

value = app.PowerOutputRatingEditField.Value;

end 《立方厘米= 1》 《立方厘米= 1》 《立方厘米= 1》 《立方厘米= 1》 % Value changed function: EnergyEfficiencyRatingEditField

function EnergyEfficiencyRatingEditFieldValueChanged(app, event)

value = app.EnergyEfficiencyRatingEditField.Value;

end % Button pushed function: RunDiagnosticButton

function RunDiagnosticButtonPushed(app, event)

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) end % Value changed function: Temperature1Spinner

function Temperature1SpinnerValueChanged(app, event)

value = app.Temperature1Spinner.Value;

end % Value changed function: Temperature2Spinner

function Temperature2SpinnerValueChanged(app, event)

value = app.Temperature2Spinner.Value;

end

您可能会收到错误,这没有问题。只需关闭按下运行后生成的GUI,我们马上就会收集剩余的必要程序和数据。

由于Matlab已经设置完毕,我们可以继续使用python。首先,从命令提示符(在Windows上)或使用python文件夹中的.exe文件运行python程序。确保使用import命令安装了所有相应的库。

% Value changed function: Switch

function SwitchValueChanged(app, event)

m = mobiledev;

Lat_in = m.Latitude

Lon_in = m.Longitude

P_out = 0;

r_pref = app.DDFH.Value;

T_pref = app.Temperature1Spinner.Value;

speed = m.Speed;

mass = 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

这些是您需要开始的三个库,尽管我们将要制作我们自己的图书馆很快如果这些命令出现某种错误,请返回并确保已安装库并位于python文件夹中的Lib文件夹中。接下来我们将生成我所谓的pythonlogger库。这个名称不是必需的,您可以随意调用它,它只是您创建的python文件(.py)的名称。

打开一个文本编辑器,我使用Sublime3,但记事本工作正常,并输入此代码。

% App initialization and construction

methods (Access = private)

将文本另存为“在Lib文件夹中插入所需库的名称”.py。另请注意,def pythonprint()行定义了要调用的函数的名称,因此您可以将其更改为def“为函数插入所需的名称”()。保存库后,我们可以继续使用arduino代码。

打开arduino IDE并打开两个新的草图窗口。将这两个草图文件保存在方便的地方,这些文件的名称无关紧要。然后删除所有默认代码并将其替换为以下内容。

对于接收arduino:

% Create UIFigure and components

function createComponents(app)

P.S。//driver.printBuffer 。..。 etc行是测试代码。除非你做诊断并想知道你是否真的在接收数据,否则无需担心。

对于发射器arduino

% Create UIFigure

app.UIFigure = uifigure;

app.UIFigure.Position = [100 100 640 480];

app.UIFigure.Name = ‘UI Figure’;

include命令应该是足够了,但是如果您以后在数据传输方面遇到任何问题,您可能需要查看RadioHead库文件夹并以相同的格式包含其余文件名。

步骤5 :让它工作

恒温器

恒温器

恒温器

现在我们已经将所有代码放在一起并且arduino已经组装好了,我们可以将arduino连接到您的计算机并加载代码。确保将正确的代码发送到接收和发送微控制器。您可以在运行时将两个arduinos连接到您的计算机,但是您必须确保选择正确的端口向前移动,或者您可以断开传输arduino并在代码完成后从其他来源断开电源。上传。

说到这一点,你应该从IDE工具菜单中选择连接到你的接收arduino的端口并运行python。

不要打开串行监视器这样做,python无法在显示器打开时读取序列。一旦python打开,调用pythonprint函数如下。

% Create TabGroup

app.TabGroup = uitabgroup(app.UIFigure);

app.TabGroup.Position = [1 1 640 480];

这将从arduino串口开始数据收集。如果现在打开python文件夹,您将看到创建了一个名为“test_data.csv”的新.csv文件,该文件包含所有时间和温度信息。这将是Matlab访问以执行其所有计算和控制的文件。

另一个警告:在访问或写入数据时不要打开test_data.csv。如果这样做,python和/或Matlab代码将崩溃并发回错误。

如果您决定稍后打开.csv,您会注意到时间列只是一个非常大的数字串。这是因为time.time()命令写入自1970年1月1日以来的秒数。

此时python应该打印从串口读取的温度数据。它应该类似于:

% Create SetupTab

app.SetupTab = uitab(app.TabGroup);

app.SetupTab.Title = ‘Setup’;

不要担心额外的字符,即.csv文件第二列中五个值的Matlab代码索引。

既然所有的支持程序都在工作并且正在收集数据,我们就可以开始从之前设置的Matlab移动程序中收集GPS数据并运行Matlab GUI代码。进入Matlab mobile的传感器选项卡后,选择GPS并点击开始按钮。

如果您不熟悉Matlab,请参阅步骤4并查看上面的屏幕截图。如果仍有问题,请确保已连接到之前选择的计算机(在设置选项卡中),并使用“connector on”命令中的链接检查Matlab是否在线。

步骤6:使用程序

恒温器

此系统的后台正在进行多项操作。 Arduino和pyton正在收集和记录温度数据,Matlab正在从您的手机收集GPS数据并运行计算,以查看您离家有多远,并根据所有信息设置恒温器。你进来的地方是提供你的偏好。

运行Matlab GUI代码。打开.mlapp文件并查看第一个选项卡。您需要自己收集信息,加热/冷却装置的效率和额定功率通常可以在装置上找到,而您的平均速度只是对您行驶速度的一个很好的估计。输入值后,点击“运行诊断”按钮,程序控制恒温器收集有关房屋的信息。

转到下一个菜单。

步骤7:温度控制

恒温器

此菜单允许您在家中和离开时选择您喜欢的温度。将温度#1设置为您的舒适温度,将温度#2设置为对您的家庭安全的高或低值(确保您在家中有狗等时不将其设置为100度)。

步骤8:历史数据

恒温器

最后,您可以使用自动控制来查看您节省的金额。这基本上估算了如果恒温器24/7设定为您的首选温度,然后减去实际使用的能量,将使用多少能量。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分