Наконец то мои ручонки дошли до этого замечательного и халявного датчика от щедрой компании Sensirion. Напомню, что я получило его совсем бесплатно и аж в количестве двух штук, за что компании большое спасибо 🙂 Начнем обзор датчика с его внешнего вида. Датчик представляет собой крошечную козявку величиной примерно с тетрадную клеточку. Феном припаять раз плюнуть, паяли и не такое. Сверху датчика есть отверстие через которое в него поступает воздух для замера влажности и температуры, настоятельно не рекомендую его чем либо заляпывать, особенно всякими флюсами типа лти120 итд. Чтоб не быть голословным вот фотка:
Что умеет датчик
Как не удивительно это звучит но он умеет измерять влажность воздуха и его температуру 🙂 Помимо этого датчик может определить разряжена ли батарея от которой питается устройство. Севшей считается батарейка с напряжением менее 2.25 вольта. Фича в принципе полезная, если в контроллере нету ацп или компаратора, возможно заюзаю её в своем готовящемся проекте. Так же датчик имеет несколько программно переключаемых разрешений измерителя влажности и температуры. А еще внутри датчика есть (барабанная дробь) réchauffeur! Обо всём этом подробнее чуть ниже а сейчас посмотрим на основные характеристики которые я скопипастил из даташита:
Диапазоны измерений:
- Влажность: 0%RH — 100%RH (разрешение 8,10,11,12 бит)
- Температура: -40С — +125 °С (разрешение 11,12,13,14 бит)
Ток потребления:
- В режиме сна 0.15 мкА
- В процессе замера 300 мкА
Напряжение питания: 2.1 — 3.6 вольта
Точность измерений
Если верить даташиту, то она вполне не плохая. Я конечно проводил множество тестов с этим датчиком: клал его на обогреватель, запихивал в морозилку итд, но сравнить показания с каким то эталонным термометром /гигрометром не было возможности. Остаётся только поверить тому что нарисовали нам дяденьки из Sensirion:
Как видно, точность вполне хорошая, не хуже чем у популярного DS18b20, а местами и лучше. Для домашнего использования годно.
Подключение датчика
Датчик имеет 6 выводов, 2 из которых никак не используются. Для экспериментов с датчиком была сделана небольшая отладочная платка. Конденсатор 100 нф параллельно выводам питания обязателен. Подтягивающие резисторы разумеется тоже. Платка получилась такой:
Взаимодействие с датчиком
Интерфейс вполне стандартный – i2c. Но есть некоторая особенность о которой стоит сказать сразу. Измерение температуры или влажности – процесс относительно долгий. Это значит, что микроконтроллеру придётся ждать пока результаты измерений будут готовы. Самый простой и очевидный способ это сделать в программе задержку на нужное число миллисекунд, но есть и другой способ. Можно сказать датчику чтоб он удерживал ногу SCL в состоянии логического нуля пока идёт измерение. Подали датчику команду замерить температуру, и ждем пока на ноге не появится лог 1. А еще можно как-нибудь хитро настроить внешнее прерывание контроллера, и вообще будет красота — температура/влажность измерилась и возникло прерывание. Для того что-бы что-то прочитать из датчика или записать в него, существует небольшой набор команд которые нужно передать:
Команда | Комментарий | Код команды |
Измерить температуру | Удерживать SCL на время замера | 0xE3 |
Измерить влажность | 0xE5 | |
Измерить температуру | Не удерживать SCL на время замера | 0xF3 |
Измерить влажность | 0xF5 | |
Записать регистр настроек | - | 0xE6 |
Прочитать регистр настроек | - | 0xE7 |
Сброс датчика | - | 0xFE |
Обо всём по порядку. Для того чтоб считать температуру (без удерживания датчиком линии SCL) нужно передать в шину i2c следующие команды:
- Отправить стартовую посылку
- Отправить адрес устройства с битом W (0×80)
- Отправить команду измерения температуры (0xF3)
- Подождать пока завершится измерение
- Отправить стартовую посылку
- Отправить адрес устройства с битом R (0×81)
- Прочитать старший байт температуры
- Прочитать младший байт температуры
- Прочитать контрольную сумму (не отправлять ASK)
- Отправить стоповую посылку
Датчик производит измерения в течении довольно большого промежутка времени, чтоб не ждать больше чем нужно рекомендую юзать таблицу ниже:
Если заюзать мой i2c/spi/1-wire отладчик то можно увидеть такую картину после выполнения всех этих команд:
Попробуем вычислить температуру на основе данных считанных из датчика. Для этого нам потребуется страшная формула из даташита:
Подставляем в неё значение прочитанное из датчика – 0×6CD8 и получаем в результате -46.85 + 175.72 * 27864 / 65536 = 27,86 градусов цельсия (округлено). Писать программу производящую такие вычисления на ассемблере – мазохизм! Так что рекомендую юзать языки высокого уровня 🙂 Что бы прочитать влажность, последовательность команд та же самая, но вместо команды измерения температуры нужно отправить команду измерения влажности. В результате получится что-то типа такого:
Формула для вычисления влажности такая:
Подставляем считанные данные (0×4212) и получаем: -6+125 * 16 914 / 65536 = 26.26 %RH (округлено) Теперь поговорим о настойках датчика коих совсем немного. Все они хранятся в одном единственном регистре. Он устроен следующим образом:
7 | 6 | Cinq | 4 | 3 | 2 | 1 | 0 |
MRES1 | ENDOFBAT | RESERVED | RESERVED | RESERVED | HEATER | OTPR | MRES0 |
Биты 3,4,5 – зарезервированы. Постоянно читаются как единицы, запись в них ни к чему не приводит.
Биты MRESx устанавливают разрешение для термометра и измерителя влажности. Причем смена разрешения на мой взгляд сделана крайне неудачно. Невозможно поменять например разрешение у термометра, не изменив при этом разрешение измерителя влажности. Поскольку битов всего два, следовательно получается 4 комбинации:
MRES1 | MRES0 | RH | T |
0 | 0 | 12 бит | 14 бит |
0 | 1 | 8 бит | 12 бит |
1 | 0 | 10 бит | 13 бит |
1 | 1 | 11 бит | 11 бит |
По умолчанию оба эти бита обнулены, что соответствует самому высокому разрешению.
Бит ENDOFBAT – сигнализирует о том что напряжение питания датчика опустилось ниже 2.25. Если напряжение в норме, то бит обнулён. Попытка записать что-то в этот бит ни к чему не приводит.
HEATER – бит управления нагревателем. Когда в него записывается единица внутри датчика врубается нагреватель, после этого температура поднимается а влажность наоборот начинает падать. Для чего нужна эта фича можно только догадываться, моя версия заключается в том, что нагреватель можно юзать когда датчик попадает из среды с высокой влажностью в среду с гораздо более низкой влажностью. Нагреватель помогает датчику быстро высохнуть и измерять более низкие уровни влажности. Если есть другие версии, делитесь 🙂
OTPR – какой-то не нужный бит, кажется записывает в регистр настроек значение по умолчанию перед измерением температуры или влажности. В даташите рекомендуют его вообще не трогать. Говорят что для установки всех настроек по дефолту и сброса датчика использовать специальную команду сброса. О ней позже а сейчас поговорим о том как прочитать/записать регистр настроек:
Запись регистра настроек:
- Отправить стартовую посылку
- Отправить адрес датчика с битом запись (0×80)
- Отправить команду записи регистра настроек (0xE6)
- Отправить содержимое регистра
- Отправить стоповую посылку
Чтение регистра настроек:
- Отправить стартовую посылку
- Отправить адрес датчика с битом запись (0×80)
- Отправить команду чтения регистра настроек (0xE7)
- Отправить стартовую посылку
- Прочитать регистр (не передавать ASK)
- Отправить стоповую посылку
Сброс датчика
Не совсем понимаю для чего он может потребоваться, но если в даташите написано, то наверняка смысл в нем есть. Важное замечание: сброс датчика ни как не затрагивает бит HEATER в регистре настроек. Если нагреватель был включен, то после сброса он не выключится не смотря на то, что по дефолту он отключен. Для что-бы произвести сброс нужно выполнить следующие команды:
- Отправить стартовую посылку
- Отправить адрес датчика с битом W (0×80)
- Отправить команду сброса (0xFE)
- Отправить стоповую посылку
Серийный номер
У каждого датчика есть уникальный серийник. Не понятно для чего такое может понадобится, но такое есть. Причем считать этот серийник без спец. документации задача весьма непростая. Переписывать сюда весь алгоритм его получения я не буду, так как он красиво нарисован в этом документе и вообще не думаю что это может кому-либо пригодится.
Спец. софт
Для экспериментов с данным датчиком я использовал свой отладчик о котором писал в предыдущем посте. Для более удобного чтения данных из датчика и изменения его настроек я добавил в программу новую фичу:
В этом окне можно видеть все необходимые данные считанные из датчика в более дружественном для пользователя виде 🙂 Далее я планирую добавлять в программу всевозможные устройства с интерфейсами 1-wire/spi/i2c с которыми мне придётся столкнуться. Возможно это кому-то поможет хотя бы просто проверить работоспособность какого нибудь датчика итд. Всей информации написанной в данном посте должно быть достаточно для того что-бы успешно запустить датчик. В ближайшем времени я планирую рассказать о практическом применении этого датчика в реальной конструкции.