✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

🔥 内容介绍

摘要: 无线传感器网络(WSN)已经成为了现代科技领域中的热门话题。在许多应用领域,如环境监测、农业、医疗保健和工业自动化中,WSN都被广泛应用。其中,温度传感器网络在许多实时监测和控制应用中起着重要作用。本文将介绍一种基于XBea的连续监测无线温度传感器网络算法步骤。

引言: 随着科技的不断发展,无线传感器网络的应用范围越来越广泛。无线传感器网络由许多小型传感器节点组成,这些节点可以通过无线通信进行数据传输和交互。温度传感器网络是无线传感器网络中的一种重要类型,可以用于监测和控制环境中的温度变化。

XBea是一种常用的无线通信模块,可以用于构建无线传感器网络。它具有低功耗、低成本和易于使用的特点,非常适合于温度传感器网络的应用。本文将基于XBea模块,介绍一种连续监测无线温度传感器网络的算法步骤。

算法步骤:

  1. 部署传感器节点:首先,需要在监测区域内部署一定数量的传感器节点。这些传感器节点应该均匀分布在整个区域内,以确保温度监测的全面性和准确性。
  2. 建立通信网络:使用XBea模块建立传感器节点之间的通信网络。每个传感器节点都与周围的节点建立连接,形成一个无线传感器网络。通过这个网络,节点可以相互传输温度数据和控制命令。
  3. 数据采集和传输:每个传感器节点定期采集周围环境的温度数据,并将数据通过XBea模块传输给相邻的节点。通过这种方式,温度数据可以在整个网络中传输和共享。
  4. 数据处理和分析:接收到温度数据的节点将对数据进行处理和分析。节点可以根据预先设定的阈值进行温度异常检测,并采取相应的控制措施。同时,节点还可以将处理后的数据传输给基站或上级节点,以供进一步的分析和决策。
  5. 能量管理:为了延长网络的寿命,需要对能量进行有效的管理。节点可以根据能量消耗情况进行自适应的工作调度,以减少能量消耗并延长节点的使用寿命。此外,还可以采用能量回收和能量传输等技术,以提供节点的能量供应。

结论: 本文介绍了一种基于XBea的连续监测无线温度传感器网络的算法步骤。通过部署传感器节点、建立通信网络、数据采集和传输、数据处理和分析以及能量管理等步骤,可以实现对温度的连续监测和控制。这种算法步骤可以为温度传感器网络的设计和应用提供一种有效的解决方案,具有重要的实际意义和应用前景。

📣 部分代码

%% Introduction
% In <part1_buildingthenetwork.html part one>, <part2_gatheringdata.html
% part two>, and <part3_calibration.html part three> of this series of blog
% post I went through the process of reading voltages from a network of
% XBee(R) modules, building and testing my wireless network of temperature
% sensors, calibrating the sensors, and gathering temperature data from the
% network of sensors in my apartment. In this post I will show you some of
% the basic analyses I performed on the data. In particular, I have two
% goals:
%
% # determine how long it takes for my apartment to warm up after
% the heat has been turned on, and
% # find out what rooms in my apartment
% take the longest to heat up, so I can make the necessary adjustments to
% my radiators so that all the rooms warm up at the same rate.

%% Overview of Data
% As I mentioned in a previous post, I collected the temperature every two
% minutes over the course of 9 days. I placed 14 sensors in my apartment: 9
% located inside, 2 located outside, and 3 located in radiators. The data
% is stored in the file <../twoweekstemplog.txt |twoweekstemplog.txt|>.

[tempF,ts,location,lineSpecs] = XBeeReadLog('twoweekstemplog.txt',60);
tempF = calibrateTemperatures(tempF);
plotTemps(ts,tempF,location,lineSpecs)
legend('off')
xlabel('Date')
title('All Data Overview')

%%
% _Figure 1: All temperature data from a 9 day period._
%
% That graph is a bit too cluttered to be very meaningful. Let me remove
% the radiator data and the legend and see if that helps.

notradiator = [1 2 3 5 6 7 8 9 10 12 13];
plotTemps(ts,tempF(:,notradiator),location(notradiator),lineSpecs(notradiator,:))
legend('off')
xlabel('Date')
title('All Inside and Outside Temperature Data')

%%
% _Figure 2: Just inside and outside temperature data, with radiator data removed._
%
% Now I can see some places where one of the outdoor temperature sensors
% (blue line) gave erroneous data, so let's remove those data points. This
% data was collected in March in Massachusetts, so I can safely assume the
% outdoor temperature never reached 80 F. I replaced any values above 80 F
% with |NaN| (not-a-number) so they are ignored in further analysis.

outside = [3 10];
outsideTemps = tempF(:,outside);
toohot = outsideTemps>80;
outsideTemps(toohot) = NaN;
tempF(:,outside) = outsideTemps;

plotTemps(ts,tempF(:,notradiator),location(notradiator),lineSpecs(notradiator,:))
legend('off')
xlabel('Date')
title('Cleaned-up Inside and Outside Temperature Data')

%%
% _Figure 3: Inside and outside temperature data with erroneous data removed._
%
% I'll also remove all but one inside sensor per room, and give the
% remaining sensors shorter names, to keep the graph from getting too
% cluttered.

show = [1 5 9 12 10 3];
location(show) = ...
    {'Bedroom','Kitchen','Living Room','Office','Front Porch','Side Yard'}';

plotTemps(ts,tempF(:,show),location(show),lineSpecs(show,:))
ylim([0 90])
legend('Location','SouthEast')
xlabel('Date')
title('Summary of Temperature Data')

%%
% _Figure 4: Summary of temperature data with only one inside temperature
% sensor per room with outside temperatures._
%
% That looks much better. This data was collected over the course of 9
% days, and the first thing that stands out to me is the periodic outdoor
% temperature, which peaks every day at around noon. I also notice a sharp
% spike in the side yard (green) temperature on most days. My front porch
% (blue) is located on the north side of my apartment, and does not get
% much sun. My side yard is on the east side of my apartment, and that
% spike probably corresponds to when the sun hits the sensor from between
% my apartment and the building next door.

%% When do my radiators start to heat up?
% The radiator temperature can be used to measure how long it takes for my
% boiler and radiators to warm up after the heat has been turned on. Let's
% take a look at 1 day of data from the living room radiator:

% Grab the Living Room Radiator Temperature (index 11) from the |tempF| matrix.
radiatorTemp = tempF(:,11);

% Fill in any missing values:
validts = ts(~isnan(radiatorTemp));
validtemp = radiatorTemp(~isnan(radiatorTemp));
nants = ts(isnan(radiatorTemp));
radiatorTemp(isnan(radiatorTemp)) = interp1(validts,validtemp,nants);

% Plot the data
oneday = [ts(1) ts(1)+1];
figure
plot(ts,radiatorTemp,'k.-')
xlim(oneday)
xlabel('Time')
ylabel('Radiator Temperature (\circF)')
title('Living Room Radiator Temperature')
datetick('keeplimits')
snapnow

%%
% _Figure 5: One day of temperature data from the living room radiator._
%
% As expected, I see a sharp rise in the radiator temperature, followed by
% a short leveling off (when the radiator temperature maxes out the
% temperature sensor), and finally a gradual cooling of the radiator. Let
% me superimpose the rate of change in temperature onto the plot.

tempChange = diff([NaN; radiatorTemp]);

hold on
plot(ts,tempChange,'b.-')
legend({'Temperature', 'Temperature Change'},'Location','Best')

%%
% _Figure 6: One day of data from the living room radiator with temperature change._
%
% It looks like I can detect those peaks by looking for large jumps in the
% temperature. After some trial and error, I settled on three criteria to
% identify when the heat comes on:
%
% # Change in temperature greater than four times the previous change in temperature.
% # Change in temperature of more than 1 degree F.
% # Keep the first in a sequence of matching points (remove doubles)

fourtimes = [tempChange(2:end)>abs(4*tempChange(1:end-1)); false];
greaterthanone = [tempChange(2:end)>1; false];
heaton = fourtimes & greaterthanone;
doubles = [false; heaton(2:end) & heaton(1:end-1)];
heaton(doubles) = false;

%%
% Let's see how well I detected those peaks by superimposing red dots over
% the times I detected.

figure
plot(ts,radiatorTemp,'k.-')
hold on
plot(ts(heaton),radiatorTemp(heaton),'r.','MarkerSize',20)
xlim(oneday);
datetick('keeplimits')
xlabel('Time')
ylabel('Radiator Temperature (\circF)')
title('Heat On Event Detection')
legend({'Temperature', 'Heat On Event'},'Location','Best')

%%
% _Figure 7: Radiator temperature with heating events marked with red dots._
%
% Looks pretty good, which means now I have a list of all the times that
% the heat came on in my apartment.
heatontimes = ts(heaton);

%% How long does it take for my heat to turn on?
% I currently have a programmable 5/2 thermostat, which means I can set
% one program for weekdays (Monday through Friday) and one program for both
% Saturday and Sunday. I know my thermostat is set to go down to 62 at
% night, and back up to 68 at 6:15am Monday through Friday and 10:00am on
% Saturday and Sunday. I used that knowledge to determine how long after my
% thermostat activates that my radiators warm up.
%
% I started by creating a vector of all the days in the test period. I
% removed Monday because I manually turned on the thermostat early that day.
mornings = floor(min(ts)):floor(max(ts));
mornings(2) = []; % Remove Monday

%%
% Then I added either 6:15am or 10:00am to each day depending on whether it
% was a weekday or a weekend.
isweekend = weekday(mornings) == 1 | weekday(mornings) == 7;
mornings(isweekend) = mornings(isweekend)+10/24; % 10:00 AM
mornings(~isweekend) = mornings(~isweekend)+6.25/24; % 6:15 AM

%%
% Next I looked for the first time the heat came on after the programmed
% time each morning.
heatontimes_mat = repmat(heatontimes,1,length(mornings));
mornings_mat = repmat(mornings,length(heatontimes),1);
timelag = heatontimes_mat - mornings_mat;
timelag(timelag<=0) = NaN;
[delay, heatind] = min(timelag);
delay = round(delay*24*60);

%%
% Let's take a look at those times to make sure we found the right ones.
% In this plot, I'll circle in blue the first time the heat comes on each
% morning, and plot blue vertical lines indicating when the thermostat
% turns on each morning.

heatontemp = radiatorTemp(heaton);
onemorning = mornings(3)+[-1/24 5/24];

figure
plot(ts,radiatorTemp,'k.-')
hold on
plot(heatontimes,heatontemp,'r.','MarkerSize',20)
plot(heatontimes(heatind),heatontemp(heatind),'bo','MarkerSize',10)
plot([mornings;mornings],repmat(ylim',1,length(mornings)),'b-');
xlim(onemorning);
datetick('keeplimits')
xlabel('Time')
ylabel('Radiator Temperature (\circF)')
title('Detection of Scheduled Heat On Events')
legend({'Temperature', 'Heat On Event', 'Scheduled Heat On Event',...
    'Scheduled Event'},'Location','Best')

%%
% _Figure 8: Six hours of radiator data, with a blue line indicating when
% the thermostat turned on in the morning, and blue circle indicating the
% corresponding heat on event of the radiator._
%
% Let's look at a histogram of those delays:
figure
hist(delay,min(delay):max(delay))
xlabel('Minutes')
ylabel('Frequency')
title('How long before the radiator starts to warm up?')

%%
% _Figure 9: Histogram showing delay between thermostat activation and the
% radiators starting to warm up._
%
% It looks like the delay between the thermostat coming on in the morning
% and the radiators starting to warming up can range from 7 minutes to as
% high as 24 minutes, but on average this delay is around 12-13 minutes.
heatondelay = 12;

%% How long does it take for the radiators to warm up?
% Once the radiators start to warm up, it takes a few minutes for them to
% reach full temperature. Let's look at how long this takes. I'll look for
% times when the radiator temperature first maxes out the temperature
% sensor after having been below the maximum for at least 10 minutes (5
% samples).

maxtemp = max(radiatorTemp);
radiatorhot = radiatorTemp(6:end)==maxtemp & ...
    radiatorTemp(1:end-5)<maxtemp &...
    radiatorTemp(2:end-4)<maxtemp &...
    radiatorTemp(3:end-3)<maxtemp &...
    radiatorTemp(4:end-2)<maxtemp &...
    radiatorTemp(5:end-1)<maxtemp;
radiatorhot = [false(5,1); radiatorhot];
radiatorhottimes = ts(radiatorhot);

%%
% Let's see how well that worked:

figure
plot(ts,radiatorTemp,'k.-')
hold on
plot(ts(heaton),radiatorTemp(heaton),'r.','MarkerSize',20)
plot(ts(radiatorhot),radiatorTemp(radiatorhot),'b.','MarkerSize',20)
xlim(onemorning);
datetick('keeplimits')
xlabel('Time')
ylabel('Radiator Temperature (\circF)')
title('Radiator Hot Event Detection')
legend({'Temperature', 'Heat On Event', 'Radiator Hot Event'},...
    'Location','Best')

%%
% _Figure 10: Six hours of radiator data, with red dots indicating the heat
% coming on and blue dots indicating the radiator is hot._
%
% Now I'll match the |radiatorhottimes| to the |heatontimes| using the same
% technique I used above.
radiatorhottimes_mat = repmat(radiatorhottimes',length(heatontimes),1);
heatontimes_mat = repmat(heatontimes,1,length(radiatorhottimes));
timelag = radiatorhottimes_mat - heatontimes_mat;
timelag(timelag<=0) = NaN;
[delay, foundmatch] = min(timelag);
delay = round(delay*24*60);

%%
% Let's look at a histogram of those delays:
figure
hist(delay,min(delay):2:max(delay))
xlabel('Minutes');
ylabel('Frequency')
title('How long does the radiator take to warm up?')

%%
% _Figure 11: Histogram showing time required for the radiators to warm up._
%
% It looks like the radiators take between 4 and 8 minutes from when they
% start to warm up until they are at full temperature.
radiatorheatdelay = 6;

%%
% Later on in my analysis, I will only want to use times that the heat came
% on and the radiators reached full temperature, so I will only keep those
% values in the |heaton| vector.

heatonind = find(heaton);
heatonind = heatonind(foundmatch);

heaton = false(size(heaton));
heaton(heatonind) = true;

%% When do the radiators cool off?
% I'll use the same technique as above to detect when the radiators start
% to cool off, which must mean the heat has gone off.

heatoff = radiatorTemp(1:end-5)==maxtemp & ...
    radiatorTemp(2:end-4)<maxtemp &...
    radiatorTemp(3:end-3)<maxtemp &...
    radiatorTemp(4:end-2)<maxtemp &...
    radiatorTemp(5:end-1)<maxtemp &...
    radiatorTemp(6:end)<maxtemp;
heatoff = [heatoff; false(5,1)];
heatofftimes = ts(heatoff);
heatoffind = find(heatoff);

%%
% Let's take a look at the heat on, radiator hot, and heat off times all
% together in one graph.

figure
plot(ts,radiatorTemp,'k.-')
hold on
plot(ts(heaton),radiatorTemp(heaton),'r.','MarkerSize',20)
plot(ts(radiatorhot),radiatorTemp(radiatorhot),'b.','MarkerSize',20)
plot(ts(heatoff),radiatorTemp(heatoff),'g.','MarkerSize',20)
xlim(onemorning);
datetick('keeplimits')
xlabel('Time')
ylabel('Radiator Temperature (\circF)')
title('Radiator Cooling Event Detection')
legend({'Temperature', 'Heat On Event', 'Radiator Hot Event',...
    'Radiator Cooling Event'},'Location','Best')

%%
% _Figure 12: Six hours of radiator data, with red dots indicating the heat
% coming on, blue dots indicating the radiator is hot, and green dots
% indicating the radiator starting to cool._
%
%% How long does it take my living room to warm up?
% Now that I know it takes about 12-13 minutes from the time my thermostat
% activates in the morning until the radiators start to warm up, and
% another 4-8 minutes for the radiators themselves to warm up, let's look
% at how long it actually takes my apartment to warm up after the radiators
% heat up. I'll focus on the living room inside temperature for now.

%%
% Grab the Living Room Inside Temperature (index 9) from the |tempF| matrix.
livingroomtemp = tempF(:,9);

%%
% Let's look at one day's worth of living room inside temperatures to see
% how they compare the the living room radiator temperatures.

figure
[ax,p1,p2] = plotyy(ts,radiatorTemp,ts,livingroomtemp);
set(ax,'XLim',oneday)
set(ax(1),'YColor','k','YLim',[60 180],'YTick',60:20:180)
set(ax(2),'YColor','b','YLim',[60  72],'YTick',60:2:72,'XTick',[])
set(p1,'Color','k')
set(p2,'Color','b')
datetick(ax(1),'keeplimits')
xlabel(ax(1),'Time')
ylabel(ax(1),'Radiator Temperature (\circF)')
ylabel(ax(2),'Room Temperature (\circF)')
title('Living Room and Radiator Temperatures')
legend([p1,p2],{'Radiator Temperature','Room Temperature'},'Location','SouthEast')

%%
% _Figure 13: Living room and radiator temperatures plotted overlapping but
% with different y-axes scaling._
%
% As you would expect, once the radiator temperatures rise, so do the room
% temperatures, but I would like to find out how quickly the room
% temperatures rise. To do that, I will first break up the temperature data
% into segments delimited by the times the heat came on. I'll keep only the
% rising portion of each segment (up to the first occurrence of the maximum
% temperature in the segment, or until the heat is off). I'll also keep
% track of the minimum and maximum temperature in the segment, and at what
% time those temperatures occur. I am initializing a matrix to store the
% segments (|segmentTemps|) so that segments that are shorter than the
% maximum length are padded with |NaN| values instead of zeros.

numSegments = sum(heaton);
segmentSizes = heatoffind-heatonind+1;
segmentTemps = NaN(numSegments, max(segmentSizes));
for c = 1:numSegments
    segmentTemps(c,1:segmentSizes(c)) = livingroomtemp(heatonind(c):heatoffind(c));
    [segmentMaxTemp(c,1),segmentTimeToMax(c,1)] = max(segmentTemps(c,:));
    [segmentMinTemp(c,1),segmentTimeToMin(c,1)] = min(segmentTemps(c,1:segmentTimeToMax(c)));
    segmentTemps(c,segmentTimeToMax(c)+1:end) = NaN;
end

% Clip off columns that are all NaN at the end of the matrix.
maxSegmentSize = max(segmentTimeToMax);
segmentTemps = segmentTemps(:,1:maxSegmentSize);

% Shift from 1-based indexes to 0-based minutes.
segmentTimeToMin = (segmentTimeToMin - 1)*2;
segmentTimeToMax = (segmentTimeToMax - 1)*2;
segmentTimes = (0:(maxSegmentSize-1))*2; % Time since heat came on in minutes

%%
% Let's take a look at one of these segments:

figure
plot(segmentTimes, segmentTemps(1,:),'b.-')
hold on
plot(segmentTimeToMin(1),segmentMinTemp(1),'r.','MarkerSize',20)
legend({'Temperature','Minimum Temperature'},'Location','NorthWest')
xlabel('Minutes since radiator started to warm')
ylabel('Temperature (\circF)')
title('Room Temperature During One Heating Event')

%%
% _Figure 14: Room temperature during one heating event, time zero is when
% the radiator started to warm up._
%
% In the plot you can see that the temperature continues to decrease for a
% few minutes, then seems to rise almost linearly. Based on this
% information, let's shift the plot so that the base of the linear increase
% in temperature is at the origin.

figure
plot(segmentTimes-segmentTimeToMin(1), segmentTemps(1,:)-segmentMinTemp(1),'b.-')
legend({'Temperature Increase'},'Location','NorthWest')
xlabel('Minutes since minimum temperature')
ylabel('Temperature Increase (\circF)')
title('Shifted Room Temperature During One Heating Event')

%%
% _Figure 15: Change in room temperature during one heating event, time
% zero is when the room temperature reached its minimum value._
%
% That was just one segment, let's look at all of them, with the data
% shifted so that the lowest temperature in each segment occurs at the
% origin.

%%
% First I shift all the times based on the |segmentTimeToMin|
segmentTimes_mat = repmat(segmentTimes,length(segmentTimeToMin),1);
segmentTimeToMin_mat = repmat(segmentTimeToMin,1,length(segmentTimes));
segmentTimesShifted = segmentTimes_mat - segmentTimeToMin_mat;

%%
% Then shift all the temperatures based on the |segmentMinTemp|
segmentMinTemp_mat = repmat(segmentMinTemp,1,size(segmentTemps,2));
segmentTempsShifted = segmentTemps - segmentMinTemp_mat;

%%
% And find the total temperature change and time for each segment.
segmentRiseTime = segmentTimeToMax-segmentTimeToMin;
segmentTempRise = segmentMaxTemp-segmentMinTemp;

%%
% Now I can plot the shifted data
figure
h1 = plot(segmentTimesShifted',segmentTempsShifted','b-');
legend(h1(1),{'Temperature Increase'},'Location','NorthWest')
xlim([-10 max(segmentTimesShifted(:))])
xlabel('Minutes since minimum temperature')
ylabel('Temperature Increase (\circF)')
title('Shifted Room Temperature During All Heating Events')

%%
% _Figure 16: Change in room temperature during all heating events, time
% zero is when the room temperature reached its minimum value._
%
% Although it isn't perfect, it looks close to a linear relationship. Since
% I am interested in the time it takes to reach the desired temperature
% (what could be considered the "specific heat capacity" of the room), let
% me replot the data with time on the y-axis and temperature on the x-axis
% (swapping the axes from the previous figure). I'll also plot the data as
% individual points instead of lines, because that is how the data is going
% to be fed into |polyfit| later.

% Remove temperatures occuring before the minimum temperature.
segmentTempsShifted(segmentTimesShifted<0) = NaN;

figure
h1 = plot(segmentTempsShifted',segmentTimesShifted','k.');
xlabel('Temperature Increase (\circF)')
ylabel('Minutes since minimum temperature')
title('Time to Heat Living Room')
snapnow

%%
% _Figure 17: The time it takes to heat the living room (axes flipped from
% Figure 16)._
%
% Now let me fit a line to the data so I can get an equation for the time
% it takes to heat the living room.

%%
% First I collect all the time and temperature data into a single column
% vector and remove |NaN| values.

allTimes = segmentTimesShifted(:);
allTemps = segmentTempsShifted(:);
allTimes(isnan(allTemps)) = [];
allTemps(isnan(allTemps)) = [];

%%
% Then I can fit a line to the data.
linfit = polyfit(allTemps,allTimes,1);

%%
% Let's see how well we fit the data.

hold on
h2 = plot(xlim,polyval(linfit,xlim),'r-');
linfitstr = sprintf('Linear Fit (y = %.1f*x + %.1f)',linfit(1),linfit(2));
legend([ h1(1), h2(1) ],{'Data',linfitstr},'Location','NorthWest')

%%
% _Figure 18: The time it takes to heat the living room along with a linear fit to the data._
%
% Not a bad fit. Looking closer at the coefficients from the linear fit, it
% looks like it takes about 3 minutes after the radiators start to heat up
% for the room to start to warm up. After that, it takes about 5 minutes
% for each degree of temperature increase.

%% What room takes the longest to warm up?
% I can apply the techniques above to each room to find out how long each
% room takes to warm up. I took the code above and put it into a separate
% function called <../temperatureAnalysis.m |temperatureAnalysis|>, and
% applied that to each inside temperature sensor.

inside = [1 5 9 12];

figure
xl = [0 14];
for s = 1:size(inside,2)
    linfits(s,1:2) = temperatureAnalysis(tempF(:,inside(s)), heaton, heatoff);
    y = polyval(linfits(s,1:2),xl) + heatondelay;
    plot(xl, y, lineSpecs{inside(s),1}, 'Color',lineSpecs{inside(s),2},...
        'DisplayName',location{inside(s)})
    hold on
end
legend('Location','NorthWest')
xlabel('Desired temperature increase (\circF)')
ylabel('Estimated minutes to heat')
title('Estimated Time to Heat Each Room')

%%
% _Figure 19: The estimated time it takes to heat each room in my apartment._
%
%%
% In <part1_buildingthenetwork.html part one> of this series of blog posts,
% I mentioned that "I often find that even though the thermostat shows a
% nice and toasty 73, I'm sitting in my bedroom or the office freezing."
% Given that my thermostat is located in the living room, the data backs up
% my anecdotal observation: the office and bedroom take almost twice as
% long to warm up as the living room, while the kitchen warms up a little
% faster than the living room.

%% Conclusions
% I started this series of blog posts with the intention of using a
% wireless network of temperature sensors (built using XBee(R) modules) to
% get a better understanding of how long my heating system takes to warm up
% my apartment, and to use that knowledge to help tune my heating system to
% provide more uniform heating.
%
% The analysis above is just the start of the analysis that can be done on
% this data, but it is enough to help me to tune my heating system. I'll
% start by opening the valves on the bedroom and office radiators more, and
% maybe even close the valves on the living room and kitchen radiators a
% little. Then I'll collect data for another week and see whether that
% helps.
%
% I now also know that my heating system takes around 15-20 minutes from
% when the heat comes on until the temperature starts to rise, and at best
% it takes about 3-5 minutes for each degree of temperature increase. My
% thermostat is set to allow the temperature to drop to 62 degrees at
% night, and warm up to 68 in the morning. Looking up 6 degrees on that
% last plot, I should adjust my thermostat to come on at least 30-40
% minutes before I get up in the morning so it has enough time to warm up.
% No wonder my heating bill is so high.

⛳️ 运行结果

【WSN】基于XBea连续监测无线温度传感器网络附matlab代码_温度传感器

【WSN】基于XBea连续监测无线温度传感器网络附matlab代码_ide_02

【WSN】基于XBea连续监测无线温度传感器网络附matlab代码_Data_03

【WSN】基于XBea连续监测无线温度传感器网络附matlab代码_ide_04

【WSN】基于XBea连续监测无线温度传感器网络附matlab代码_温度传感器_05

【WSN】基于XBea连续监测无线温度传感器网络附matlab代码_Data_06

【WSN】基于XBea连续监测无线温度传感器网络附matlab代码_温度传感器_07

🔗 参考文献

[1] 肖三强,罗文广.基于无线传感器网络的智能温度测量系统的设计[J].装备制造技术, 2014(7):3.DOI:10.3969/j.issn.1672-545X.2014.07.039.

[2] 王翥,郝晓强,魏德宝.基于WSN和GPRS网络的远程水质监测系统[J].仪表技术与传感器, 2010(1).DOI:10.3969/j.issn.1002-1841.2010.01.017.

[3] 张文洋.基于WSN的铁轨监测设计与仿真[D].大连理工大学,2011.DOI:CNKI:CDMD:2.1012.276150.

🎈 部分理论引用网络文献,若有侵权联系博主删除
🎁  关注我领取海量matlab电子书和数学建模资料

👇  私信完整代码、论文复现、期刊合作、论文辅导及科研仿真定制事宜

1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面

卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

2.图像处理方面

图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

3 路径规划方面

旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

4 无人机应用方面

无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配、无人机安全通信轨迹在线优化

5 无线传感器定位及布局方面

传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

6 信号处理方面

信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

7 电力系统方面

微电网优化、无功优化、配电网重构、储能配置

8 元胞自动机方面

交通流 人群疏散 病毒扩散 晶体生长

9 雷达方面

卡尔曼滤波跟踪、航迹关联、航迹融合