В этой статье будет продемонстрирован процесс калибровки датчиков.
В первом и втором посте был показан процесс чтения данных из сети модулей XBee, построения и тестирования беспроводной сети датчиков температуры, а также метод сбора и визуализации показаний датчиков температуры в квартире. Однако, основываясь на полученных данных, становиться очевидным, что для получения более точных результатов, требуется калибровка датчиков. В этой статье будет продемонстрирован процесс калибровки датчиков.
Что бы откалибровать датчики температуры, их требуется разместить рядом друг с другом, так что бы измерялась одна и та же температура.
Рисунок 1. Размещение датчиков |
Данные собирались в течении часа, для того что бы получить представление о точности измерений температуры. Полученные данные находятся в файле onehourtemplog.txt (см. FileExchange). Посмотрим на результаты:
s = [1 6 7 9 12];
location = {'Sensor 1','Sensor 2',
'Sensor 3', 'Sensor 4', 'Sensor 5'};
[tempF, ts] =
XBeeReadLog('onehourtemplog.txt',60);
plotTemps(ts,tempF(:,s),location)
legend('Location','SouthEast')
ylim([71 77])
title('Uncorrected Temperature Readings')
Рисунок 2. Результаты часового сбора данных неоткалиброванными датчиками |
Так как разброс не слишком большой, то достаточно построить график только для некоторых датчиков. Видно, что, как и в прошлой статье, у датчиков, которые должны показывать одно и тоже значение существует разброс примерно в 5 градусов. Такая ошибка неприемлема, так как термостат считает, что температура 73F, а реальная температура может быть 68F.
Существует два метода калибровки датчиков, которые можно было бы опробовать:
1. Поместить датчики в среду с известной температурой, например, ледяную ванну или кипящую воду. Однако кипящая вода не может быть использована, так как измеренное напряжения будет 1,5В, что превышает диапазон допустимых входных значений аналогового входа XBee
2. Сравнение показаний датчиков с измерениями «доверенного» инструмента – термометра
Так как измерения в кипящей воде недоступны, то следует комбинировать подходы: использовать ледяную ванну и измерения термометра. Поэтому, используются 2 набора калибровочных данных:
1. Показания датчиков в ледяной воде
2. Измерения датчиков при комнатной температуре, сравненные с показаниями термометра
1. Заготовьте лед
2. Заполните глубокую миску льдом
3. Добавьте воду, так, чтобы лед не начал плавать
4. Поставьте миску в морозилку, держите ее там пока вода не начнет замерзать
5. Выньте миску из морозилки, разбейте все куски льда
6. Сложите все датчики в пучок, оберните в пластик для герметичности
7. Поместите пучок датчиков в лед
8. Медленно помешивайте ледяную массу во время сбора данных. Рекомендуется повысить частоту измерений. В примере дискрет измерений – 20 секунд
Данные сохранены в файле icetemplog.txt (см. File Exchange).
Рисунок 3. Связка датчиков завернутая в пластиковую
упаковку для исключения затеканий |
Рисунок 4. Связка датчиков в ледяной ванне |
[obsIceTempF, obsIceTimes] = XBeeReadLog('icetemplog.txt',10);
plotTemps(obsIceTimes,obsIceTempF(:,s),location)
title('Uncorrected Ice Bath Temperature Readings')
hold on
ylim([31 50])
timerange = obsIceTimes([1 end]);
plot(timerange,[32 32],'k:','DisplayName','Freezing (32F)')
legend('Location','NorthWest')
Рисунок 5. Показания неоткалиброванных датчиков в ледяной воде |
Был использован обычный настольный термометр. Его показания сравнивались с показаниями датчиков температуры в сети XBee.
Рисунок 6. Беспроводной термометр |
1. Датчики собираются располагаются рядом друг с другом и цифровым датчиком температуры
2. Данные собираются из сети XBee в MATLAB
3. Данные термометра записывались время от времени в течении дня, для того что бы получить диапазон температуры. Если снаружи холодно или жарко, можно замерять температуру на улице, чтобы расширить измеренный диапазон. Единственным важным моментом является то, что датчики в сети XBee и датчик термометра должны находиться рядом и измерения должны устоятся перед любыми измерениями
Данные измеренные этим методом доступны в файле roomtemplog.txt, доступном на FileExchange
[roomTempF, roomTimes] = XBeeReadLog('roomtemplog.txt',60);
plotTemps(roomTimes,roomTempF(:,s),location)
title('Uncorrected Room Temperature Readings')
load('ReferenceTemperatures.mat','refRoomTempF','refRoomTimes');
hold on
plot(refRoomTimes, refRoomTempF, 'kx','DisplayName','Reference Temperature');
legend('Location','NorthWest');
Рисунок 7. Значения температуры в комнате в сравнении с опорными показаниями термометра |
Для калибровки датчиков, сначала был построен график показаний датчиков в сети XBee как функции от вручную записанных температур. Записанные вручную температуры сохранены в MAT-файле ReferenceTemperatures.mat, доступном на File Exchange, для облегчения доступа.
load('ReferenceTemperatures.mat');
Была использована функция ismember() для сопоставления временных отметок в данных, записанных сетью датчиков в комнате и опорных данных термометра:
[keep,ind] = ismember(roomTimes,refRoomTimes);
ind = ind(keep);
Затем переменные keep и ind были использованы для того, чтобы выбрать временные метки и значения температуры только для тех случаев, когда имелись и показания датчиков, и значения опорной температуры, для того что бы совместить эти значения:
obsRoomTempF = roomTempF(keep,:); % Оставляем показания датчиков, соответствующие опорной температуре.
refRoomTempF = refRoomTempF(ind); % Выбираем значения опорной теипературы соответствующей показаниям дачтика.
refRoomTimes = refRoomTimes(ind); % Выбираем опорные метки времени с соответсвующими измерениями датчиков.
Эта же операция была проделана и для измерений в ледяной ванне:
[keep,ind] = ismember(obsIceTimes,refIceTimes);
ind = ind(keep);
obsIceTempF = obsIceTempF(keep,:);
refIceTempF = refIceTempF(ind);
Затем, был построен график опорной температуры как функция показаний датчиков. Как пример, ниже расположен график для кухни:
kit = 5;
figure
plot(obsRoomTempF(:,kit), refRoomTempF, 'r.',obsIceTempF(:,kit), refIceTempF, 'b.')
xlabel('Sensor Readings (\circF)')
ylabel('Reference Temperature (\circF)')
title('Calibration Data from One Sensor (Kitchen)')
legend({'Room Temperature','Ice Bath'},'Location','NorthWest')
snapnow
Рисунок 8. График опорной температура как функции показаний датчиков температуры |
Как и ожидалось, график оказался почти линейным, поэтому можно построить линию тренда при помощи функции polyfit() и добавить ее на график.
obsTempF = [obsRoomTempF(:,kit); obsIceTempF(:,kit)];
refTempF = [refRoomTempF; refIceTempF];
p = polyfit(obsTempF, refTempF,1);
fitx = xlim;
fity = polyval(p,fitx);
hold on
plot(fitx, fity,'k')
hold off
legend({'Room Temperature','Ice
Bath','Fit Line'},'Location','NorthWest')
Snapnow
Рисунок 9. Калибровочные данные с линией тренда |
Видно, что точность тренда достаточно высока, однако график был масштабирован так, чтобы лучше видеть значения датчиков температуры:
plot(obsRoomTempF(:,kit), refRoomTempF, 'r.')
hold on
plot(xlim, polyval(p,xlim),'k')
hold off
xlabel('Sensor Readings (\circF)')
ylabel('Reference Temperature (\circF)')
title('Calibration Data - Just Room Temperature')
legend({'Room Temperature','Fit Line'},'Location','NorthWest')
snapnow
Рисунок 10. Калибровочные данные для комнатной температуры с линией тренда |
Так как алгоритм достаточно хорошо работает для одного датчика, он (алгоритм) может быть отмасштабирован на все датчики:
for sen = 1:14
obsTempF = [obsRoomTempF(:,sen);
obsIceTempF(:,sen)];
refTempF = [refRoomTempF;
refIceTempF];
p = polyfit(obsTempF, refTempF,1);
adjTempF(:,sen) =
polyval(p,roomTempF(:,sen));
end
plotTemps(roomTimes,adjTempF(:,s),location)
title('Calibrated Room Temperature Readings')
hold on
plot(refRoomTimes, refRoomTempF, 'kx','DisplayName','Reference Temperature');
legend(gca, 'Location','NorthWest')
Рисунок 11. Откалиброванные показания датчиков в комнате и опорная температура |
После калибровки, все датчики показывали почти одинаковые значения. Данные для калибровки сохранены в MAT-файле calibration.mat (доступен на File Exchange), а сам алгоритм калибровки записан в функцию calibrateTemperatures.m для дальнейшего переиспользования.
После калибровки датчиков можно приступать к анализу реальных данных, собранных за 9 дней
Публикации по данной теме:
Постоянное наблюдение за температурой при помощи беспроводной сети датчиков. Часть 1
Постоянное наблюдение за температурой при помощи беспроводной сети датчиков. Часть 2
Постоянное наблюдение за температурой при помощи беспроводной сети датчиков. Часть 4