•  

    Новостная рассылка

    Подпишитесь и получайте самые свежие новости.
    Подписаться на новостную рассылку
    • Главная
    • >
    • Публикации
    • >
    • Постоянное наблюдение за температурой при помощи беспроводной сети датчиков. Часть 3

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

    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