Есть очень хороший (если не поддельный) датчик BME280. Он умеет мерять температуру, давление и влажность (есть его собрат в "бомж"-комплектации - BMP280 - он влажность не умеет).
Датчик - 8-ногая букашка, умеет общаться с внешним миром как по SPI-интерфейсу, так и по I2C.
Сам датчик мелкий, не очень паябельный. Но китайские бизнесмены просекли фишку и продают этот датчик уже припаянный к плате. Причем в двух вариантах:
Платка об 6 выводах - там сразу 2 интерфейса доступны - SPI и I2C. Но нет стабилизатора напряжения. А у датчика напряжение питания - 3.3 вольта.
А на 4-выводной плате выведен только I2C-интерфейс. Но на плате сразу есть подтягивающие резисторы, LDO и преобразователь уровней для I2C. Т.е. его можно гонять при любом напряжении питания от 3 до 5 вольт.
Очень удобный датчик для построения всяких термометров, барометров и прочих показометров.
Но используемые интерфейсы не предусматривают вынос датчика от управляющего микроконтроллера на сколь-либо значимое расстояние.
Соответственно, возле датчика нужно поставить свой небольшой микроконтроллер, считывающий показания датчика и отправляющий эти данные на головное устройство по какому-либо каналу связи.
Вариант такого датчика я уже делал, там используется радиоканал на капризных JDY-40. И памятуя пляски с бубном вокруг этого радиоканала, в этот раз я остановился на варианте 1-Wire.
1-Wire - или OneWire - достаточно прикольный протокол подключения устройств, в т.ч. и отнесенных от головного устройства на значительное расстояние - десятки метров.
Вопреки названию минимально для работы 1-Wire-устройства нужно два провода: сигнальный и общий. "Один Провод" тут означает, что и питание, и данные могут передаваться по одному и тому же проводу.
Хотя часть 1-Wire-устройств поддерживает трехпроводное подключение - питание, данные и общий провод.
К таким устройствам относится и термометр DS18B20, а так же его клоны. DS18B20 прекрасно общается с головным устройством по двум проводам, однако для непосредственного измерения температуры (и для еще пары операций) ему не хватает того паразитного питания, которое он может получить от линии питания/данных. И термометр требует либо усиленную подтяжку к питанию линии питания/данных, либо питание по отдельному проводу - трехпроводная схема.
Вот, взяв за основу принцип DS18B20, я сделал на ATMEGA8A "обертку" для ВМЕ/ВМР280, реализующую общение с головным устройством по 2/3-проводному интерфейсу 1-Wire.
- 4-проводной модуль BME/BMP280 (со встроенным LDO)
- Потребление в ждущем режиме до 10 мка
- 256 вариантов адреса
- необходимость усиленной подтяжки в 2-проводном режиме на время преобразования
- время преобразования - не менее 200 мс
- контрольный светодиод (работает только в трехпроводном режиме)
- Температура -40..+85°С, при этом наилучшая точность обеспечивается в диапазоне 0..60°С
- Давление 225..825 мм рт.ст.
- Влажность 0..100%
Схема.
Побольше - в PDF.
Схема простая. Модуль BME подключен к МК, питается тоже от МК, в дежурном режиме обесточен. Так же на свободные биты портов подключено 8 перемычек, с их помощью можно задавать до 256 различных адресов устройства 1-Wire.
Питание и подключение к шине 1-Wire. Питание от головного устройства (не важно, 2 или 3 провода) через диоды D1,D2 и резистор R5 поступает на МК и накопительный конденсатор С4.
Резистор R5 нужен, что бы не было броска тока в первый момент зарядки конденсатора. Питание от программатора при заливке прошивки так же подается в точку соединения этих диодов и резистора.
Состояние сигнальной линии контролируется микроконтроллером через резистор R3.
R1 - подтяжка сигнальной линии к общему проводу.
Q1 - транзистор для отправки данных в линию.
LED1 - контрольный светодиод. Работает только в случае трехпроводного питания. Светится во время измерения метеоданных.
Печатная плата.
Печатная плата разработана под корпус BMW50026. Да-да, это не кузов от баварского автомобиля, а всего лишь маленькая пластиковая коробочка размером 51x36x20 мм производства BAHAR.
Печатка получилась односторонняя и без перемычек. Весь монтаж - SMD, кроме светодиода, модуля ВМЕ и отверстий для проводов. (У меня на моей плате еще были просверлены отверстия и впаяны PLS-штыри для подключения к программатору, но мне это нужно было для удобства многократного подключения к программатору).
В корпусе напротив датчика сверлится отверстие. Можно еще в отверстие вставить пластиковую трубочку, второй конец которой отформовать по корпусу датчика (например, слегка разогрев трубку), тем самым хоть слегка отделив внутренний мир устройства от внешнего мира. А у датчика будет наоборот, персональный канал в окружающую среду.
Под светодиод я отверстие не сверлил, его свечение прекрасно видно через пластик корпуса.
Прошивка и фьюзы
Фьюзы:
High: 0xD9
Low: 0xC4
Протокол и поддерживаемые команды
Адрес или ROM-код.
ROM-код. восемь байт, из них один байт - код семейства, я выбрал 0xDE, далее шесть байт "серийного" номера и один байт контрольной суммы.
"Серийный" номер содержит шесть байт - четыре фиксированных, один байт определяется перемычками на плате (замкнутая перемычка дает единичный бит, разомкнутая - нулевой) и один принимает одно из трех фиксированных значений в зависимости от подключенного сенсора :
0xBE - подключен ВМЕ280,
0xB0 - подключен ВМР280,
0x00 - сенсор не обнаружен.
Полностью ROM-код имеет вот такой вид:
DE AD C0 FF EE xx yy cs
xx - определяется перемычками
yy - тип подключенного датчика
cs - контрольная сумма
Поддерживаемые ROM-команды:
0x33 - READ_ROM
0xF0 - SEARCH_ROM*
0x55 - MATCH_ROM
0xCC - SKIP_ROM
*Как утверждают интернеты, после выполнения команды поиска ROM оригинальный (не поддельный) датчик DS18B20, чей адрес был найден, остается в адресованном режиме и может выполнить функциональную команду, например, чтения RAM. Может датчик и остается в адресованном режиме, но в документации сказано, что после поиска ROM датчик надо заново адресовать через RESET и ROM-команду: "After every Search ROM cycle, the bus master must return to Step 1 (Initialization) in the transaction sequence."
Поведение данного устройства идентично описанному в даташите на DS. Т.е. после Search ROM устройство не остается адресованным.
Функциональные команды:
0x44 - CONVERT
0xBE - READ_RAM, она же READ_SCRATCHPAD
Здесь совершеннейший минимум - две команды.
Первая, CONVERT, запускает цикл измерения температуры, давления и влажности. При двухпроводном подключении на период работы этой команды необходимо обеспечить усиленную подтяжку линии данных/питания.
Вторая команда, READ_RAM, точно так же, как и в случае с DS18B20, позволяет прочитать значения, которые намерял сенсор.
Если прочитать RAM без запуска цикла измерения, либо если сенсор отсутствует, устройство вернет значения по умолчанию - 85°С, 768 мм рт.ст. и влажность 69%.
RAM (скречпад) содержит блок из 9 байт.
Байты 1, 2 - значение температуры в половинках градуса, знаковое целое
Байты 3, 4 - значение давления, в мм рт.ст., беззнаковое целое
Байт 5 - влажность, беззнаковое целое (или 0xFF для BMP280)
Байт 6 - флаг валидности данных: 0x01, если данные валидны, иначе 0x00
Байты 7, 8 - не используются
Байт 9 - контрольная сумма.
Все двухбайтовые значения отдаются в little-endian формате.
Размер скречпада в 9 байт выбран для возможности легкой адаптации кода, предназначенного для работы с DS18B20.
После чтения ROM, определив по семейству 0xDE, что это BME/BMP280, можно, пропустив этапы конфигурации DS-ки, сразу запускать конвертацию данных и чтение результата. (но нужно помнить, что DS-ка отдает температуру с точностью 1/16°, а данное устройство - с точностью 1/2°).
Особенности работы 1-Wire в данном устройстве
- Поскольку данное устройство - "костыль" между шинами I2C и 1-Wire, причем "костыль" неспециализированный, есть некоторые ограничения. Очень рекомендуется использовать его с трехпроводным подключением.
Если же все таки хочется попробовать использовать двухпроводное подключение - то очень желательно использовать резистор подтяжки не более 1 кОм. Так же следует учесть, что при двухпроводном подключении при подаче питания в линию должно пройти некоторое время, пока зарядится конденсатор С4. Кроме этого, происходит стартовая инициализация контроллера, поиск и опрос типа датчика. Т.е. в этот период устройство может пытаться потреблять от линии несколько миллиампер. Это может быть воспринято управляющим контроллером, как прижатие линии к земле или КЗ линии, поскольку время инициализации значительно больше типовых таймингов 1-Wire. Типовое время при подтяжке линии резистором 1кОм и емкости C4 в 47 мкФ - около 200 мс. - При работе с устройством пауза между двумя тайм-слотами (показанная цветом на диаграмме ниже) очень желательна не менее 4-5 мкс
Немножко фотографий
Готовое устройство на своем "рабочем" месте
Спасибо.Очень познавательно.Осмысливаю и пытаюсь найти применение.
ОтветитьУдалитьOneWire и это правильно, никакого эфира и батареек. Подал ну очень слабое питание, измерил и отключил.
ОтветитьУдалитьну очень/не очень, но несколько мА нужно.
Удалить