Фреймворк WebIOPi, на котором построена наша система домашней автоматизации, поддерживает более 30 различных датчиков. К сожалению, поддержка некоторых популярных датчиков в нем отсутствует. Поэтому, давайте поговорим, как выполнить подключение к шине I2C датчиков, не поддерживаемых встроенными драйверами WebIOPi.
В системе домашней автоматизации применяются датчики DHT22, для работы которых используется сторонняя библиотека Adafruit_DHT. Так же с помощью библиотеки Minimal Modbus организована поддержка протокола Modbus RTU для последовательного интерфейса RS485.
Аналогично посредством библиотеки SMBus можно реализовать поддержку различных датчиков, работающих по шине I2C. В качестве примера рассмотрим подключение к шине I2C датчика давления и температурыMPL115A2, датчика температуры и влажности SHT21 и акселерометра MMA7660. Выбор указанных датчиков был обусловлен тем, что они имелись у меня в наличии и на их основе ранее были созданы некоторые девайсы, о которых рассказывалось на страницах нашего сайта.
Датчик MPL115A2 (рис.1) предназначен для измерения атмосферного давления и температуры. Обращаю ваше внимание, что в этом датчике измерение температуры носит вспомогательный характер и служит для точности измерения давления. Температура является не калиброванным параметром и производитель рекомендует использовать этот датчик только для контроля атмосферного давления. Я же со своей стороны отмечу, что точность измерения температуры довольно приемлемая и вполне подойдет для применения в бытовых условиях.
Рис. 1
Датчик MPL115A2 имеет довольно сложный алгоритм вычисления. Расчет компенсированного абсолютного давления производится с использованием полинома второй степени, в котором переменными являются измеренные значения давления и температуры. Остальные значения коэффициенты (их всего шесть) являются постоянными значениями и заносятся в датчик при его калибровке на заводе. Если вы захотите более подробно ознакомиться с алгоритмом вычислений, читайте статью Датчик давления MPL115A2. Здесь же только отмечу, что для корректной работы датчика обязательно наличие между выводом 2 и общим проводом конденсатора на 1 мкФ, а так же двух подтягивающих резисторов 10 кОм с выводов 4 и 5 на плюс питания 3,3 В.
Следующий датчик SHT21 (рис.2) является довольно точным измерителем температуры (от -40 до +125 градусов) и влажности (от 0 до 100%). Погрешность измерений датчика не превышает 2%.
Рис. 2
Датчик SHT21 обладает миниатюрными размерами 3х3 мм, выпускается в корпусе QFN и в зависимости от модификации, может иметь различный формат представления выходных данных – шина I2C, ШИМ, и аналоговый выход (SDM). Более подробную информацию о характеристиках SHT21 смотрите в статье Датчик температуры и влажности SHT21. Два в одном.
Акселерометр MMA7660 (рис.3) – это датчик, предназначенный для определения г движения объекта и измерение углов поворота или ориентации – т.е. положения в пространстве относительно трехмерной системы координат (X, Y, Z)
Рис. 3
Возможно, использование акселерометров в домашней автоматизации не так актуально, однако и им вполне можно найти применение. Например, в качестве датчика положения окон, жалюзи, заслонок вентиляции и т.д., в которых применение контактных датчиков не всегда есть возможность реализовать. Так же о некоторых вариантах использования акселерометров можно почитать в материалах Датчик наклона и Контроль наклона бура в СГБ.
Все рассмотренные выше датчики подключаются на шину I2C. На всякий случай напомню, что на этой шине в системе домашней автоматизации у нас уже используются часы реального времени DS1307, датчик давления и температуры BMP085 и датчик освещенности (люксметр) TSL2561.
Для работы с новыми датчиками сначала необходимо установить библиотеку SMBus:
sudo apt-get update
sudo apt-get install python3-smbus
sudo reboot
Снятие, вычисление и преобразование показаний с датчиков выполняется с помощью макросов, написанных на Python. Это соответственно макросы getMPL115, getSHT21,getMMA7660, которые можно найти в архиве (ссылка на архив в конце данной статьи). Для вызова определенных макросов и возврата полученных с датчиков данных на html страницу используются стандартные процедуры WebIOPi. В качестве примера ниже приводится процедура вызова макроса для акселерометра getMMA7660 (рис.4):
Рис. 4
Аналогичным образом можно получить данные и с остальных датчиков. Пример реализации страницы web-интерфейса с показаниями всех датчиков показан на рис.5