The question you are probably asking is "why are you making another remote thermostat?"
The answer to that question is, I had to, and the market smart thermostats are too expensive.
Fair warning, this is "proof-of-concept" build that would require a few extra outputs to actually control your thermostat, but the core is in place and can be modified depending on your specific circumstance. Also, this is still a work in progress, so expect a few updates and changes (especially to the Matlab code)
To get started I want to warn you, this requires three programs (one of them is pretty expensive), quite a few libraries and support packages for the programs, and you need to have them all speak to each other. Its a headache. With that warning out of the way lets get started with the materials.
First of all I would suggest you do a few arduino tutorials dealing with the RF transmitters just to make sure that your parts are working and the wiring is correct. There are plenty of examples available, with the code included (for those of us out there that know little to nothing about C and C++).
Follow the wiring diagrams below to get the arduino and sensors assembled. One thing to keep in mind while wiring up the arduinos is that the data ports I used are not required but recommended.
IF you do decide to change the data ports you use, you just need to define the pins in your code. Personally, I think it's easier to stick with the default ports that the arduino libraries recognize.
And just to be clear, the nano and uno are interchangeable, but I used the nano for the transmitter side of the project to reduce the size of the temperature monitor.
Side note: the green contraption holding the nano is the 3D printed container.
Once the wiring is finished you need to get all the programs running and the libraries installed (if you haven't already), I'll just assume you have, you need to start up Matlab and run the iPhone support package. Both your phone and Matlab need to be on the same wifi network at this point.
In the command window of Matlab write:
connector on
This will prompt you to enter a five digit password that you will use to connect on your iPhone. Make sure you remember the password. When you have entered the password Matlab will display some information, including your IP address. Use this in the next step, which comes from the instructions from the "Getting started with sensors" help menu in Matlab mobile.
Follow these steps to log sensor data locally on your device:
This section will be referred back to in Part 4, so no need to actually start collecting data yet. Just keep your phone handy and Matlab mobile ready.
Now you need to create a folder somewhere in you computer to house the Matlab code files. You'll have four separate files, two for the background functions (.m files) and one Matlab code file for the GUI (.mlapp),.
First is the mass calculation for the air in your house (this lets Matlab know how long it takes to heat/cool your house)
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.035And the second one:
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
endBoth of these files are Matlab functions. You will not need to access them unless you plan on modifying them for specific needs, since you will be calling them from the GUI. Save both files separately, the first one as CalcMass.m and the second as dist_cntrl.m, those will be the names that the GUI code uses to call the functions, so unless you want to edit the rest of the code below, stick with the naming convention.
Before you get into the GUI code, you need to open the app designer for Matlab, which you can open by navigating in the Matlab menu bar, or by my favorite method which is entering the following command in the Matlab command window:
appdesigner
Once the app designer is open open a new app file (.mlapp) and delete all of the default code from the code window. Then replace all of it with the following and hit the run button.
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
endmethods (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 % 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 % 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 % App initialization and construction
methods (Access = private) % Create UIFigure and components
function createComponents(app) % Create UIFigure
app.UIFigure = uifigure;
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'UI Figure'; % Create TabGroup
app.TabGroup = uitabgroup(app.UIFigure);
app.TabGroup.Position = [1 1 640 480]; % Create SetupTab
app.SetupTab = uitab(app.TabGroup);
app.SetupTab.Title = 'Setup'; % Create RunDiagnosticButton
app.RunDiagnosticButton = uibutton(app.SetupTab, 'push');
app.RunDiagnosticButton.ButtonPushedFcn = createCallbackFcn(app, @RunDiagnosticButtonPushed, true);
app.RunDiagnosticButton.FontWeight = 'bold';
app.RunDiagnosticButton.Position = [465 78 103 23];
app.RunDiagnosticButton.Text = 'Run Diagnostic'; % Create EnergyEfficiencyRatingEditFieldLabel
app.EnergyEfficiencyRatingEditFieldLabel = uilabel(app.SetupTab);
app.EnergyEfficiencyRatingEditFieldLabel.HorizontalAlignment = 'right';
app.EnergyEfficiencyRatingEditFieldLabel.Position = [8 425 135 22];
app.EnergyEfficiencyRatingEditFieldLabel.Text = 'Energy Efficiency Rating'; % Create EnergyEfficiencyRatingEditField
app.EnergyEfficiencyRatingEditField = uieditfield(app.SetupTab, 'numeric');
app.EnergyEfficiencyRatingEditField.Limits = [0 100];
app.EnergyEfficiencyRatingEditField.ValueChangedFcn = createCallbackFcn(app, @EnergyEfficiencyRatingEditFieldValueChanged, true);
app.EnergyEfficiencyRatingEditField.HorizontalAlignment = 'center';
app.EnergyEfficiencyRatingEditField.Position = [158 425 100 22]; % Create PowerOutputRatingEditFieldLabel
app.PowerOutputRatingEditFieldLabel = uilabel(app.SetupTab);
app.PowerOutputRatingEditFieldLabel.HorizontalAlignment = 'right';
app.PowerOutputRatingEditFieldLabel.Position = [18 328 118 22];
app.PowerOutputRatingEditFieldLabel.Text = 'Power Output Rating'; % Create PowerOutputRatingEditField
app.PowerOutputRatingEditField = uieditfield(app.SetupTab, 'numeric');
app.PowerOutputRatingEditField.Limits = [0 Inf];
app.PowerOutputRatingEditField.ValueChangedFcn = createCallbackFcn(app, @PowerOutputRatingEditFieldValueChanged, true);
app.PowerOutputRatingEditField.HorizontalAlignment = 'center';
app.PowerOutputRatingEditField.Position = [151 328 100 22]; % Create AvgLocalSpeedEditFieldLabel
app.AvgLocalSpeedEditFieldLabel = uilabel(app.SetupTab);
app.AvgLocalSpeedEditFieldLabel.HorizontalAlignment = 'right';
app.AvgLocalSpeedEditFieldLabel.Position = [27 231 100 22];
app.AvgLocalSpeedEditFieldLabel.Text = 'Avg. Local Speed'; % Create AvgLocalSpeedEditField
app.AvgLocalSpeedEditField = uieditfield(app.SetupTab, 'numeric');
app.AvgLocalSpeedEditField.Limits = [0 70];
app.AvgLocalSpeedEditField.ValueChangedFcn = createCallbackFcn(app, @AvgLocalSpeedEditFieldValueChanged, true);
app.AvgLocalSpeedEditField.HorizontalAlignment = 'center';
app.AvgLocalSpeedEditField.Position = [142 231 100 22]; % Create DesiredDistancefromHouseEditFieldLabel
app.DesiredDistancefromHouseEditFieldLabel = uilabel(app.SetupTab);
app.DesiredDistancefromHouseEditFieldLabel.HorizontalAlignment = 'right';
app.DesiredDistancefromHouseEditFieldLabel.Position = [24 129 100 28];
app.DesiredDistancefromHouseEditFieldLabel.Text = {'Desired Distance '; 'from House'}; % Create DDFH
app.DDFH = uieditfield(app.SetupTab, 'numeric');
app.DDFH.Limits = [0 50];
app.DDFH.ValueChangedFcn = createCallbackFcn(app, @DDFHValueChanged, true);
app.DDFH.HorizontalAlignment = 'center';
app.DDFH.Position = [139 135 100 22]; % Create TemperatureDirectionSwitchLabel
app.TemperatureDirectionSwitchLabel = uilabel(app.SetupTab);
app.TemperatureDirectionSwitchLabel.HorizontalAlignment = 'center';
app.TemperatureDirectionSwitchLabel.Position = [410 343 124 22];
app.TemperatureDirectionSwitchLabel.Text = 'Temperature Direction'; % Create TemperatureDirectionSwitch
app.TemperatureDirectionSwitch = uiswitch(app.SetupTab, 'slider');
app.TemperatureDirectionSwitch.Items = {'Up', 'Down'};
app.TemperatureDirectionSwitch.ValueChangedFcn = createCallbackFcn(app, @TemperatureDirectionSwitchValueChanged, true);
app.TemperatureDirectionSwitch.Position = [449 380 45 20];
app.TemperatureDirectionSwitch.Value = 'Up'; % Create TempSettingsTab
app.TempSettingsTab = uitab(app.TabGroup);
app.TempSettingsTab.Title = 'Temp. Settings'; % Create Temperature1SpinnerLabel
app.Temperature1SpinnerLabel = uilabel(app.TempSettingsTab);
app.Temperature1SpinnerLabel.HorizontalAlignment = 'center';
app.Temperature1SpinnerLabel.Position = [66 363 76 28];
app.Temperature1SpinnerLabel.Text = {'Temperature '; '#1'}; % Create 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; % Create Temperature2SpinnerLabel
app.Temperature2SpinnerLabel = uilabel(app.TempSettingsTab);
app.Temperature2SpinnerLabel.HorizontalAlignment = 'center';
app.Temperature2SpinnerLabel.Position = [66 248 76 28];
app.Temperature2SpinnerLabel.Text = {'Temperature '; '#2'}; % Create 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; % Create Switch
app.Switch = uiswitch(app.TempSettingsTab, 'slider');
app.Switch.Items = {'1', '0'};
app.Switch.ValueChangedFcn = createCallbackFcn(app, @SwitchValueChanged, true);
app.Switch.FontName = 'Nyala';
app.Switch.FontSize = 28;
app.Switch.Position = [522 21 74 32];
app.Switch.Value = '0'; % Create EditFieldLabel
app.EditFieldLabel = uilabel(app.TempSettingsTab);
app.EditFieldLabel.HorizontalAlignment = 'right';
app.EditFieldLabel.Position = [374 291 25 22];
app.EditFieldLabel.Text = ''; % Create tempnow
app.tempnow = uieditfield(app.TempSettingsTab, 'numeric');
app.tempnow.Limits = [60 89];
app.tempnow.ValueChangedFcn = createCallbackFcn(app, @tempnowValueChanged, true);
app.tempnow.HorizontalAlignment = 'center';
app.tempnow.FontSize = 26;
app.tempnow.Position = [409 230 133 117];
app.tempnow.Value = 60; % Create GaugeLabel
app.GaugeLabel = uilabel(app.TempSettingsTab);
app.GaugeLabel.HorizontalAlignment = 'center';
app.GaugeLabel.Position = [225 32 42 22];
app.GaugeLabel.Text = 'Gauge'; % Create Gauge
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; % Create SavingsTab
app.SavingsTab = uitab(app.TabGroup);
app.SavingsTab.Title = 'Savings'; % Create UIAxes
app.UIAxes = uiaxes(app.SavingsTab);
title(app.UIAxes, 'Savings')
xlabel(app.UIAxes, 'Month and Year')
ylabel(app.UIAxes, 'Money')
app.UIAxes.PlotBoxAspectRatio = [1 0.606666666666667 0.606666666666667];
app.UIAxes.Color = [0.9412 0.9412 0.9412];
app.UIAxes.Position = [146 219 348 237]; % Create ThisMonthCostEditFieldLabel
app.ThisMonthCostEditFieldLabel = uilabel(app.SavingsTab);
app.ThisMonthCostEditFieldLabel.HorizontalAlignment = 'center';
app.ThisMonthCostEditFieldLabel.Position = [439 96 94 22];
app.ThisMonthCostEditFieldLabel.Text = 'This Month Cost'; % Create ThisMonthCostEditField
app.ThisMonthCostEditField = uieditfield(app.SavingsTab, 'numeric');
app.ThisMonthCostEditField.Limits = [0 Inf];
app.ThisMonthCostEditField.ValueDisplayFormat = '$%7.2f';
app.ThisMonthCostEditField.HorizontalAlignment = 'center';
app.ThisMonthCostEditField.Position = [417 39 137 58]; % Create TotalSavingsEditFieldLabel
app.TotalSavingsEditFieldLabel = uilabel(app.SavingsTab);
app.TotalSavingsEditFieldLabel.HorizontalAlignment = 'right';
app.TotalSavingsEditFieldLabel.Position = [111 96 77 22];
app.TotalSavingsEditFieldLabel.Text = 'Total Savings'; % Create TotalSavingsEditField
app.TotalSavingsEditField = uieditfield(app.SavingsTab, 'numeric');
app.TotalSavingsEditField.Limits = [0 Inf];
app.TotalSavingsEditField.ValueDisplayFormat = '$%9.2f';
app.TotalSavingsEditField.HorizontalAlignment = 'center';
app.TotalSavingsEditField.Position = [88 39 137 58];
end
endmethods (Access = public)
% Construct app
function app = Control_1 % Create and configure components
createComponents(app) % Register the app with App Designer
registerApp(app, app.UIFigure) if nargout == 0
clear app
end
end % Code that executes before app deletion
function delete(app) % Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
endYou'll probably get an error, which is no problem. Just close the GUI that was generated after you pressed run, we'll be gathering the rest of the necessary programs and data in a moment.
Since Matlab is set up we can move on to python. First, run the python program either from your command prompt (on windows) or by using the .exe file in your python folder. Make sure that all the appropriate libraries are installed by using the import command.
import serial import time import csv
These are the three libraries you'll need to start off, though we'll be making our own library soon. If there was some sort of error with these commands, go back and make sure the libraries are installed and are in the Lib folder in the python folder. Next we'll be generating what I have called pythonlogger library. This name is not necessary, you can call it whatever you want, its just the name of the python file (.py) that you create.
Open a text editor, I use Sublime3 but notepad works just fine, and enter this code.
def pythonprint():
import pythonlogger
import serial
import time
import csv
ser = serial.Serial('COM8') # COM8 is the arduino serial port, this will likely be different for each user, i.e. check your serial port in the arduino IDE
ser.flushInput()
while True:
try: ser_bytes = ser.readline() print(ser_bytes)
with open("test_data.csv","a") as f:
writer = csv.writer(f,delimiter=",") # sets the data to be entered as comma-seperated
writer.writerow([time.time(),ser_bytes]) #writes data to test_data.csv
except:
print("Error Occured")
breakSave the text as "insert the name of the library you want".py in the Lib folder. Also note that the def pythonprint() line defines the name of the function you are going to call, so you can change that to def "insert name you want for your function"(). When the library is saved we can move on to the arduino code.
Open up the arduino IDE and open two new sketch windows. Save those two sketch files somewhere convenient, the name of these files doesn't matter. Then delete all the default code and replace it with the following.
For the receiving arduino:
#include <RadioHead.h>
#include <RH_ASK.h>
#include <RH_Serial.h>
#include <SPI.h> // this is not used but needed to compile
RH_ASK driver;
struct dataStruct{ float temp;
}myData;
void setup()
{
Serial.begin(9600); // Debugging only
if (!driver.init())
Serial.println("init failed"); }
void loop()
{
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen)) // Non-blocking
{
int i;
// Message with a good checksum received, dump it.
//driver.printBuffer("Got:", buf, buflen);
memcpy(&myData, buf, sizeof(myData));
Serial.println("");
Serial.print(myData.temp);
}
}P.S. the //driver.printBuffer.... etc line is test code. No need to worry about it unless your doing diagnositcs and want to figure out if you are actually receiving data.
For the transmitter arduino
#include <RadioHead.h>
#include <RH_Serial.h>
#include <RH_ASK.h>
#include <SPI.H> // this is not used but needed to compile<br>#include
#include <DHT11.h>
int pin=4;
DHT11 dht11(pin);
RH_ASK driver;
struct dataStruct{
float temp;
}myData;
byte tx_buf[sizeof(myData)] = {0};
//So arguments are bitrate, transmit pin (tx),
//receive pin (rx), ppt pin, isInverse. The last 2 are not used.void setup()
{
Serial.begin(9600); // Debugging only
if (!driver.init())
Serial.println("init failed");
}
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(); //halt execution until all data has been sent
delay(2000); //wait 2 seconds
}
}The include commands should be enough, but if you have any issues later with the data transfer you might want to look in the RadioHead library folder and include the remainder of the file names, in the same format.
Now that we have all the code together and the arduino's assembled, we can hook up the arduino to your computer and load the code. Make sure you send the correct code to the receiving and transmitting microcontrollers. You can have both of the arduinos connected to your computer while this is running but you'll have to make sure you have the correct port selected moving forward, or you can disconnect the transmitting arduino and power it from some other source once the code is uploaded.
Speaking of which, you should select the port which is connected to your receiving arduino from the IDE tools menu now and run python.
Don't open the serial monitor while you're doing this, python can't read the serial while the monitor is open. Once python is open call the pythonprint function as follows.
pythonlogger.pythonprint()
This will start the data collection from the arduino serial port. If you open your python folder now, you'll see that a new .csv file has been created called "test_data.csv", that holds all of the time and temperature information. This will be the file that Matlab accesses to do all of its calculations and controls.
Another warning: don't open test_data.csv while the data is being accessed or written. If you do, the python and/or the Matlab code will crash and send back an error.
If you do decide to open the .csv later, you'll notice that the time column is just a very large string of numbers. That is because the time.time() command writes the number of seconds since January 1st, 1970.
At this point python should be printing the temperature data it is reading from the serial port. It should look something like:
b'25.03'/r/n
Don't worry about the extra characters, the Matlab code indexes for the middle five values in the second column of the .csv file.
Now that all of the supporting programs are working and data is being collected we can start collecting GPS data from the Matlab mobile program that was setup earlier and run the Matlab GUI code. Once you are in the sensor tab of Matlab mobile, select GPS and hit the start button.
If you are new to Matlab mobile refer back to step 4 and look at the screen shots above. If you are still having issues, make sure that you are connected to the computer you selected earlier (in the settings tab) and use the link from the "connector on" command to check that Matlab is online.
There are multiple things going on in the background in this system. Temperature data is being collected and logged by arduino and pyton, Matlab is collecting GPS data from your phone and running calculations to see how far away you are from your house and setting your thermostat based off of all that information. Where you come in is providing your preferences.
Run the Matlab GUI code. Open the .mlapp file and look at the first tab. You'll need to gather the information for this yourself, the efficiency and power rating of your heating/cooling unit can usually be found on the unit itself, and your average speed is just a good estimate of how fast you drive. Once the values are inputted, hit the "Run Diagnostic" button and the program controls your thermostat to gather information about your house.
Move on to the next menu.