ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

MegaD-328 + I2C или подключение датчика давления BMP180

12/12/2015 19:50:01

В мире технологий часто бывает, что какие-то изобретения, разработки, открытия остаются незамеченными, неоцененными современниками и находят широкий отклик и популярность только спустя десятилетия. Разработанная в начале 80-х фирмой Philips (ныне NXP) шина данных I2C для связи между интегральными схемами получила общественное признание только в конце 90-х. А сегодня с ростом интереса широких масс к робототехнике, электронике, системам автоматизации, к которым относится и Умный Дом, шина данных I2C стала одним из основных стандартов для связи между разными электронными блоками. И если ранее использование I2C ограничивалось бытовой электроникой: телевизорами, плеерами, усилителями и т.д., то сегодня I2C применяется в том числе для подключения различных датчиков (температуры, влажности, давления, напряжения, освещенности/цвета), дальномеров, ЖК-дисплеев и так далее. Количество сенсоров, поддерживающих I2C, постоянно растет. А раз так, то возникает вопрос: а может ли контроллер MegaD-328 работать с шиной I2C? Попробуем ответить на этот вопрос.

Одним из преимуществ шины данных I2C является отсутствие минимальной скорости работы и каких либо жестких таймингов. Да, стандарт предусматривает две основных скорости работы: 100кГц и 400кГц. Но весь фокус в том, что больше нельзя, а вот меньше - сколько угодно. В то же время одним из основных преимуществ MegaD-328 является возможность свободного конфигурирования портов. И этих двух обстоятельств вполне достаточно, чтобы реализовать обмен информацией по шине данных I2C. Таким образом, сервер посредством MegaD-328 сможет получить данные с любого датчика, работающего по этому цифровому интерфейсу. Но давайте по порядку и на примере.

В системах домашней автоматизации (и, разумеется, не только там) ныне очень популярны датчики атмосферного давления BMP085 и BMP180 от известной немецкой фирмы Bosch. Крошечные, относительно дешевые и самое главное - весьма точные. Сейчас продаются как датчики отдельно, так и готовые платки со всей необходимой обвязкой. Поскольку мне не терпелось попробовать I2C в деле, то я решил не ждать из Китая готовую сборку, а купить датчик в ближайшем магазине и собрать обвязку на макетке.

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

Сегодня в специализированных Интернет-магазинах можно найти большое количество разнообразных готовых плат с датчиком BMP180. Все они будут работать с модулем MegaD-14-IN одинакого.

Для подключения датчика я использовал исполнительный модуль MegaD-14-IN. В отличие от датчиков DS18B20 или DHT22, которые подключаются тремя проводами (+3,3В, земля, шина данных), датчики, работающие по шине I2C, имеют четыре провода (питание, земля, линия SCL, линия SDA). То есть для подключения датчика требуется задействовать не один порт, а два. Конфигурационный джампер для данных портов должен быть установлен в нижнее положение. Тип порта NC. Да, не IN и не OUT, а именно NC. Объясняется это тем, что передача данных происходит в обе стороны и программа на сервере будет сама переключать режим работы порта. Прошивка MegaD-328 должна быть 3.38 beta5 и выше. Это важно.

Еще раз по подключению:

3,3В (он же +) подключается к клемме питания +3,3В
GND (он же -) подключается к клемме питания GND или к любой левой клемме порта.
SCL (белый кембрик) на картинке подключен к правой клемме порта P8
SDA (желтый кембрик) на картинке подключен к правой клемме порта P9

Поскольку в I2C нет ограничения на минимальную скорость работы, то я решил попробовать чисто программную реализацию на сервере. Я написал крохотную библиотеку на PHP, которая обеспечивает передачу отдельных битов данных посредством HTTP/GET-запросов. Такой подход позволяет: а) сэкономить память микроконтроллера, так как не требуется никакой специальной аппаратной поддержки на уровне прошивки; б) подключать линии данных (SCL, SDA) абсолютно к любым портам устройства. Минус у этого подхода тоже имеется: скорость обмена информацией по шине существенно уступает аппаратной реализации. Однако в абсолютных значениях это не столь важно. Опрос большинства датчиков будет занимать порядка 0,5-2 секунд, что совсем не критично, учитывая характер решаемой задачи.

Код программы, использующей библиотеку, очень простой

<?
define("SCL", "8");
define("SDA", "9");
define("MD", "http://192.168.0.14/sec/?");
require_once("mod_i2c_bmp180.php");
echo get_pressure();
?>

Вот и все! Достаточно только указать какие порты используются для подключения линий SCL, SDA, да IP-адрес устройства MegaD-328, к которому подключен датчик. При первом запуске программа загрузит на компьютер калибровочные коэффициенты для правильного расчета значения. Это займет несколько секунд. При последующих запусках данные с датчика считываются за 1,7 секунды.

Библиотека выдает результат уже в привычных нам миллиметрах ртутного столба. Да, помимо атмосферного давления можно также считать значение температуры. Для этого достаточно вызвать функцию get_temperature(). Подобным образом в систему можно подключить любые устройства, работающие по шине I2C, без какой-либо модификации аппаратной или программной части устройства.

А напоследок сравним между собой значения атмосферного давления, которые поступают от BMP180 и метеостанции WH-2080.

Зеленый график - BMP180, красный график - WH-2080. Анализируя результаты можно выделить два аспекта. Во-первых, форма графиков абсолютно идентична. Во-вторых, значения, полученные от WH-2080, ниже примерно на 0,5-0,8 мм рт. ст. Таким образом, оба датчика действительно реагируют на изменение атмосферного давления, но какой из них более точен судить не берусь, так как у меня нет эталонного прибора. Однако стоит заметить, что значения BMP180 больше соответствуют тем, которые выдают различные сервисы погоды, что косвенно может говорить о его большей точности в сравнении с метеостанцией.

Исходники I2C-PHP для MegaD-328

UPDATE: Преемник MegaD-328 контроллер MegaD-2561 поддерживает BMP180, BME180, BME280, BME680, HTU21D, SHT31 и массу других датчиков на аппаратном уровне, не требующем использование на сервере дополнительного ПО. А данное описание и библиотеку можно использовать в качестве примера для экспресс-интеграции в систему датчиков, пока еще не поддерживаемых контроллером MegaD-2561.

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2015-12-12 21:01:11 | THK
> Таким образом, оба датчика действительно реагируют на изменение атмосферного
> давления, но какой из них более точен судить не берусь, так как у меня нет
> эталонного прибора.

Для точной калибровки своего датчика давления использовал данные с сайта ближайшего аэропорта. Например вот:
/www.pogodaiklimat.ru/weather.php?id=27613
Данные обновляются каждые 3 часа, удобно использовать архив погоды аэропорта.


2015-12-12 22:14:57 | Andrey_B
THK, теоретически BMP180 - это калиброванный датчик. Не даром же там десяток калибровочных коэффициентов. Думаю, ему можно верить. Калибровать по аэропорту хорошо, если он близко. От меня до ближайшего гражданского аэродрома не менее 70 км... зато тихо. ;)


2015-12-13 07:47:41 | Денис
Отлично! Сделайте еще статью как сделать дистанционное управление телевизора и т.д! Цены не будет! Так же я понимаю можно и на диплей выводить инфу по этому протоколу ? да ?


2015-12-13 11:06:54 | Andrey_B
Денис, статью про управление бытовыми приборами через ИК сделаю, как только будет готов излучатель с импульсным усилением сигнала. Но вам, конечно, ничто не мешает попробовать работу с ИК и без статьи.
ЖК-дисплей, работающий по шине I2C, подключить можно. Есть только одна небольшая проблема. Если при обмене информацией с датчиком передается и принимается несколько байт, то обмен данных с ЖК дисплеем намного более объемный. Это означает, что данные на дисплее будут выводиться неспешно. Впрочем, учитывая характер и специфику применения таких дисплеев, наверное, это не столь критично. Я уже заказал подобный дисплей (правда OLED, а не LCD) и сообщу, когда получу какие-либо положительные результаты.


2016-06-10 22:43:13 | Владимир
А планируется аппаратная поддержка bmp180 ( так как реализовано для температурных датчиков)? без доп библиотек на сервере. Или возможно снимать показания get запросами без участия скриптов на сервере?


2016-06-11 16:15:52 | Andrey_B
Владимир, для MegaD-328 не планируется. Для MegaD-2561 пока не знаю. I2C-датчиков различных очень много. Если реализацию для каждого из них тащить в код прошивки, то это очень нерационально. Все равно эта информация нужна "серверу". А если есть в системе "сервер", то нет никаких сложностей в программной реализации.


2016-06-22 16:47:57 | Владимир
Интересно а с BMP280 заработает? (пишут что это замена BMP180)


2016-06-23 12:35:02 | Andrey_B
Владимир, не проверял. Но даже если не заработает, можно внести минимальные правки в скрипт. В прошивке изменения точно не потребуются.


2017-11-25 20:00:56 | Владимир
А на какое расстояние можно этот датчик относить от MegaD? Читал, что I2C не очень хорошо рассчитан на работу на расстоянии


2017-11-26 11:07:56 | Andrey_B
Владимир, у меня дома стабильно работают датчики HTU21D, которые также используют I2C шину, на расстоянии около 8 метров от контроллера. Сбоев нет. Думаю, 8 метров не предел.
Если вам не нужна температура, а только давление, то BMP180 можно и не выносить далеко от контроллера, так как атмосферное давление в одной плоскости везде одинаковое.


2018-01-19 14:03:18 | Олег
Здравствуйте, Andrey_B. Есть-ли возможность обмена данными между MegaD-328 и AtMega328p PU без сервера? У меня соединены две Ардуины между собой по I2C и с кучей периферии. Хочу объединить MegaD328 и свою старую систему.


2018-01-20 10:29:16 | Andrey_B
Олег, смотря что вы понимаете под "возможностью", а что под "обменом данными". Контроллеры MegaD-328, например, могут управлять выходами друг друга, вызывая URL, прописанный в поле Net входа.


2018-01-23 23:42:22 | Олег
Признаюсь, сглупил с вопросом из-за своей лени. Даже для себя по-началу наспех поставил задачу в очень абстрактной форме. Хотел подружить MegaD с сетью термометров на nrf24lo1+ на ардуине. Сейчас посидел, подумал, видимо надо писать эмулятор 1-wire, чтобы MegaD увидел ардуину, либо цеплять ethernet-контроллер к ардуине.


2020-08-19 14:13:23 | Вадим
Можно ли подключить датчик BMP180 к расширителю MegaD-16I-XT, который в свою очередь подключен к MegaD2561 ver2.3 на порты P30 и P31 (как в краткой инструкции). Если да, то каким образом? Как настраивать порты?


2020-08-19 19:01:23 | Andrey_B
Вадим, конечно же так нельзя. А кроме того, MegaD-16I-XT предназначен только для подключения кнопок, герконов, датчиков с выходом типа открытый коллектор.