Мои вкусняхи

Сводный список записей блога

--->>>> Сводный список записей блога <<<<---

10 ноября 2024

BME280 и 1-Wire

 

Есть очень хороший (если не поддельный) датчик 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 мкс


Немножко фотографий

Плата в сборе




Готовое устройство на своем "рабочем" месте



3 комментария:

  1. Спасибо.Очень познавательно.Осмысливаю и пытаюсь найти применение.

    ОтветитьУдалить
  2. OneWire и это правильно, никакого эфира и батареек. Подал ну очень слабое питание, измерил и отключил.

    ОтветитьУдалить
    Ответы
    1. ну очень/не очень, но несколько мА нужно.

      Удалить

======= !!! ВНИМАНИЕ !!! ======================================================================
Гугл умный и боится спама. Поэтому иногда ваши комментарии Гугл отправляет мне на премодерацию. Отправлять или нет - решаю не я, а алгоритмы Гугла. Если ваш комментарий не появился сразу, значит я получу уведомление и опубликую ваш комментарий через некоторое время. Я стараюсь это делать достаточно оперативно.