31 марта 2017

В этой статье будет продемонстрирован процесс калибровки датчиков.

Вступление

В первом и втором посте был показан процесс чтения данных из сети модулей XBee, построения и тестирования беспроводной сети датчиков температуры, а также метод сбора и визуализации показаний датчиков температуры в квартире. Однако, основываясь на полученных данных, становиться очевидным, что для получения более точных результатов, требуется калибровка датчиков. В этой статье будет продемонстрирован процесс калибровки датчиков.



Сбор калибровочных данных

Что бы откалибровать датчики температуры, их требуется разместить рядом друг с другом, так что бы измерялась одна и та же температура.

pic-2017-nablud-za-temp-3-01.jpg
Рисунок 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')

pic-2017-nablud-za-temp-3-02.png
Рисунок 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).

pic-2017-nablud-za-temp-3-03.jpg
Рисунок 3. Связка датчиков завернутая в пластиковую
упаковку для исключения затеканий


pic-2017-nablud-za-temp-3-04.jpg
Рисунок 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')


pic-2017-nablud-za-temp-3-05.png
Рисунок 5. Показания неоткалиброванных датчиков в ледяной воде


Метод «комнатная температура»

Был использован обычный настольный термометр. Его показания сравнивались с показаниями датчиков температуры в сети XBee.

pic-2017-nablud-za-temp-3-06.jpg
Рисунок 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');


pic-2017-nablud-za-temp-3-07.png
Рисунок 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


pic-2017-nablud-za-temp-3-08.png
Рисунок 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


pic-2017-nablud-za-temp-3-09.png
Рисунок 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



pic-2017-nablud-za-temp-3-10.png
Рисунок 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')

pic-2017-nablud-za-temp-3-11.png
Рисунок 11. Откалиброванные показания датчиков в комнате и опорная температура



После калибровки, все датчики показывали почти одинаковые значения. Данные для калибровки сохранены в MAT-файле calibration.mat (доступен на File Exchange), а сам алгоритм калибровки записан в функцию calibrateTemperatures.m для дальнейшего переиспользования.



Следующие шаги

После калибровки датчиков можно приступать к анализу реальных данных, собранных за 9 дней


Скачать код


Публикации по данной теме:

Постоянное наблюдение за температурой при помощи беспроводной сети датчиков. Часть 1

Постоянное наблюдение за температурой при помощи беспроводной сети датчиков. Часть 2

Постоянное наблюдение за температурой при помощи беспроводной сети датчиков. Часть 4

Новость
Экспонента приняла участие в выставке-форуме «РЕЛАВЭКСПО» в Чебоксарах
04.05.2023
Новость
Комплекс полунатурного моделирования РИТМ
19.04.2021
Новость
Решение для электроэнергетических систем
17.02.2021
Новость
Сборник материалов VI всероссийской научно-практической конференции "Технологии разработки и отладки сложных технических систем"
03.04.2020
Новость
Внимание! Изменение формата конференции “Технологии разработки и отладки сложных технических систем” на online
18.03.2020
Видео
Взаимодействие MATLAB с оборудованием
22.11.2019
Видео
Автоматизация тестирования моделей с Simulink Test
21.11.2019
Видео
Автоматизация тестирования моделей с Simulink Test: 06. Simulink Test и непрерывная интеграция
04.10.2019
Видео
Автоматизация тестирования моделей с Simulink Test: 05. Создание пользовательских отчетов
27.09.2019
Видео
Автоматизация тестирования моделей с Simulink Test: 04. Программные средства автоматизации тестирования
20.09.2019
Видео
Автоматизация тестирования моделей с Simulink Test: 03. Организация тестов
12.09.2019
Видео
Автоматизация тестирования моделей с Simulink Test: 02. Тестирование систем и компонентов
04.09.2019