Опрос


Что для Вас Умный Дом?


Результаты

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

 

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



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



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

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


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


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


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


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


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


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


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

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