Raspberry pi метеостанция своими руками

Vadim Axelrod

Чем занять Raspberry Pi

У многих из нас на полках пылится купленный однажды про запас Raspberry Pi.

Использовать в качестве десктопа или сервера слабый компьютер с очень медленным I/O — удовольствие не из приятных, хотя я и держал его некоторое время как CI сервер, тонкий клиент для RDP и даже запускал на нем полноценную IntelliJ IDEA (спойлер — она работает как часы, но максимально неторопливо).

А вот в качестве базы для мелких датчиков — прекрасно. Пусть Arduino правит бал в числе последователей, доступных плат и модулей. Зато у Rasberry Pi полноценный Linux и много больше мощности, а значит в выборе софта ограничений никаких. Большинство железа прекрасно себя чувствует на обеих платформах.

Датчики для множества простых и занимательных вещей, вроде освещенности, уровня воды, температуры, движения и даже алкоголя продаются в среднем по 150-600 рублей за штуку.

Для себя я собрал домашнюю метеостанцию с интерфейсом в Telegram, получив от этого неожиданно много фана.

Итак, сдуем пыль с малины.

Бот в помощь

Ходить по SSH на домашнюю Linux машину неудобно, небезопасно и требует много лишних телодвижений с сетью.

Бот же — идеальный вариант как для выставления интерфейса, так и для предоставления доступа к железу из закрытого сегмента сети:

Все просто. Одна большая кнопка «Сделать хорошо».

Заходите в гости! У меня дома прямо сейчас: http://telegram.me/i_am_at_home_bot.

Закупаемся

В моем случае используется высокоточный метеодатчик на сенсоре SHT3x-DIS, работающий на шине I²C в сборке от компании Амперка, собранный с удобной разводкой:

Гугление дает варианты покупки этого датчика и в виде голой платы — попрактикуйтесь в пайке ножек, если есть желание.

В варианте Амперки датчик приходит сразу с необходимой проводкой. Ничего, кроме самого датчика, в минимальном варианте покупать не нужно. Но если хочется собрать все аккуратнее, чем ворох проводов и голая плата — докупите Troyka #Структор.

Исходим из того, что Raspberry Pi у нас уже в наличии и на нем установлена Raspbian (полагаю, что и с другими дистрибутивами проблем быть не должно).

Если же Pi нет, но вдруг очень захотелось, можно докинуть в корзину прямо в Амперке:

На Яндекс.Маркете можно собрать необходимое чуть дешевле вместе с более симпатичным оригинальным корпусом и блоком питания, а также взять быструю microSD карту (советую не ниже UHS Speed Class 1).

Важно не сэкономить на блоке питания. Хотя Raspberry Pi может работать и от power bank, и от любой зарядки — при вполне обычных нагрузках ядро начнет регулярно ругаться на undervoltage.

Подключаем датчик

Из обязательной распиновки (и в сборке от Амперки) датчик имеет:

  • питание (04 DC Power 5v),
  • землю (06 Ground),
  • пин ввода/вывода данных (03 SDA),
  • пин тактирования шины (05 SCL).

В стандартной разводке Raspberry Pi датчик получится подключить двумя трехпроводными шлейфами, либо четырьмя одинарными проводами «мама-папа»:

Читать еще:  Arduino задержка без delay

В собранном виде:

Подключаемся к Pi по SSH и включаем шину I²C:

Проверяем корректность подключения

Копируем скрипт на Pi:

При правильном подключении получаем данные:

Создаем Telegram бота

Открываем Telegram и добавляем бота BotFather.

При создании нового бота необходимо выбрать ему имя и адрес, добавить в контакты и сохранить полученный Access Token вида:

Устанавливаем (или разрабатываем) необходимый софт

Для работы с железом на Raspberry Pi часто используют Python, но под все популярные языки программирования обязательно есть удобная библиотека для работы либо с GPIO конкретно Raspberry Pi, либо для работы с конкретной шиной (нам нужна I²C).

Особо отмечу Control Everything Community — замечательный сборник примеров работы с огромным числом различных чипов, притом сразу на нескольких популярных языках и под большинство популярных платформ помимо Rasbperry Pi.

Я разработал решение на Java с использованием:

  • Spring Boot — в представлении не нуждается (а если нуждается, то Java вам скорее всего совсем не близка)
  • Telegram Bot Java Library — удобная и простая библиотека для ботов
  • Pi4J :: Java I/O Library for Raspberry Pi — швейцарский нож для шин Raspberry Pi
  • Control Everything Community / SHT31 — работа с датчиком

1. Бинарник:

    Загружаем сборку и копируем на Raspberry Pi

Запускаем, подставив в параметры ранее полученный Access Token бота в Telegram:

Открываем Telegram и наслаждаемся!

2. Из исходников:

Копируем репозиторий с GitHub:

В src/main/resources/application.properties можно при желании сразу вставить нужный telegram.bot.token

Собираем, копируем и запускаем:

В качестве бонуса — в master ветке репозитория бот расширен поддержкой датчика углекислого газа.

Погодная станция готова, приятного использования!

Raspberry Pi 3 Model B – подключаем датчик атмосферного давления BMP180

Модули на основе сборки BMP180 от компании Bosсh на сегодняшний день, наверное, самые популярные датчики атмосферного давления и температуры с цифровым интерфейсом I2C. Кстати, это не обязательно может быть атмосферное давление. Можно измерить, например, давление в закрытой бутылке, накачанной воздухом, или в салоне самолета, летящего на высоте 10000 м. Поскольку атмосферное давление напрямую связано с высотой, с помощью датчика можно определить, на какой высоте над уровнем моря он находится. Давление также зависит и от температуры, так что измерения этих двух величин одним датчиком способствует максимально точному вычислению высоты.

Наличие интерфейса I2C делает весьма простой задачу подключения датчика к микроконтроллеру, который считывает данные, производит необходимые вычисления, индицирует результаты и управляет необходимыми исполнительными устройствами.

В данном материале мы рассмотрим, как подключить BMP180 к Raspberry Pi 3 Model B, получить и обработать результаты измерений. Мы попробуем выполнить управляющую программу на двух алгоритмических языках: С и Python.

BMP180 — датчик абсолютного давления (барометр), построенный по пьезорезистивной схеме. Датчик имеет низкий уровень шумов и высокую линейность, а также высокую скорость установки показаний. На кристалле находится MEMS-датчик (микромеханический датчик) в виде гибкой кремниевой мембраны, закрывающей камеру со стандартным давлением. На мембране расположены тензодатчики, которые включены по схеме моста, и изменяют своё сопротивление при изгибе мембраны. Изгиб мембраны зависит от разности между окружающим давлением и давлением в камере. Таким образом, выходной сигнал, снимаемый с тензомоста, зависит от давления окружающей среды. Так как параметры мембраны и резисторов зависят от температуры, то на кристалле расположен цифровой термометр, показания которого используются для компенсации данных барометра, но термометр может использоваться и самостоятельно. Данные о температуре, снятые с других датчиков, для компенсации использовать не рекомендуется. Термометр в датчике BMP180 расположен на самом измерительном кристалле, и он измеряет температуру чувствительного элемента — поэтому показания встроенного термометра наиболее близки к температуре барометра. Максимальная точность измерения давления составляет 2 Пa, поэтому, если использовать датчик BMP180 как барометрический высотомер, то соответствующая погрешность измерения высоты составит 17 см.

Читать еще:  Gnb industrial power официальный сайт

Технические характеристики датчика BMP180:

— напряжение питания: 1,62 В — 3,6 В.

— интерфейс подключения: I2C.

— точность: до 0,02 гПа (17 см).

— диапазон: 300 – 1100 гПа (от -500 м до 9000 м высоты).

— выходные данные: 16 бит, давление и температура

— разрешение по давлению: 0,01 гПа

— разрешение по температуре: 0,1° С

— размер платы без разъема: 12 х 14 мм

Интерфейс барометра BMP180 — I2C, что делает работу с ним простой и удобной. На модуле кроме самого датчика установлен линейный стабилизатор на микросхеме XC6206P332MR в корпусе SOT-23 (падение напряжения на стабилизаторе составляет всего 250 мВ, собственное потребление — 1 мкА.)

При эксплуатации барометра следует учитывать некоторые особенности.

  1. Помните, что BMP180 необходим доступ окружающего воздуха для измерения его давления, так что не стоит его укладывать в герметичный корпус. С другой стороны, воздействие быстро движущихся воздушных потоков или ветра могут вызвать кратковременные колебания давления, которые будут влиять ваши показания. Защитите устройство от сильных воздушных потоков.
  2. Точное значение температуры необходимо для измерения давления, поэтому старайтесь не подвергать устройство резким изменениям температуры, держите его подальше от нагревающихся деталей и других источников тепла.
  3. BMP180 чувствителен к влаге и не должен контактировать с водой.
  4. BMP180 чувствителен к свету, который может войти в устройство через маленькое отверстие в металлической крышке корпуса чипа. Для достижения максимальной точности следует оградить датчик от окружающего света.

Подключается датчик BMP180 с помощью всего четырех проводов: питание +3,3 В (или +5 В — VCC), земля (GND), SDA (data) и SCL (clock).

Соответственно, подключение к разъему GPIO Raspberry будет выглядеть следующим образом:

Теперь нужно убедиться, разрешен ли в Raspberry обмен по шине I2С (по умолчанию он запрещен), и, если нет, то разрешить. Предполагается, что в системе Raspbian установлены пакеты i2c-tools. Кстати, проверить, установлен ли конкретный пакет, можно набрав команду: aptitude show имя_пакета.

Читать еще:  Ersa паяльная станция цена

Если пакет не установлен (в третьей строке Рис.3 — State: not installed), установите его командой: sudo apt-get install i2c-tools.

Наберите в терминале команду: i2cdetect –y 1. Если в результате выполнения команды при подключенном датчике будет найдено подключение с адресом 77, значит, обмен разрешен, и датчик давления BMP180 подключен правильно.

Если ни одного адреса не отображается, то, скорее всего датчик не подключен, или подключен неправильно, или запрещен обмен по шине I2C.

Для того чтобы разрешить обмен выполните в терминале команды:

sudo nano /etc/modprobe.d/raspi-blacklist.conf

В данном файле (raspi-blacklist.conf) закомментируйте строчку (если она есть) blacklist i2c-bcm2708, добавив знак решетки # в начале строки. Сохраните изменения.

Добавьте модуль I2C в автозапуск системы. Команда редактирования:

sudo nano /etc/modules

В самый конец этого файла добавьте строчки i2c-dev и i2c-bcm2708. Сохраните файл.

Для проверки работоспособности выполните команду:

Загрузка, компиляция и запуск программы на языке C.

После проверки подключения загрузите с сайта masterkit.ru и разархивируйте в корневой каталог программу на языке C:

sudo tar zxvf bmp180-c.tar.gz

В результате в корневом каталоге появится папка bmp180-c с двумя файлами: bmp180.h и bmp180test.c. Теперь изменим рабочий каталог на bmp180-c и воспользуемся встроенным в OC Raspbian компилятором gcc для получения исполняемого файла:

sudo gcc -Wall -o bmp180 bmp180test.c -lwiringPi -lm

В папке bmp180-c появится исполняемый файл bmp180. Запустим его на выполнение:

Символы ./ указывают на то, что файл должен быть запущен именно из текущего каталога.

Запустить файл можно также из Файлового Менеджера (File Manager) операционной системы. Файл запускается на выполнение двойным кликом мыши по его иконке, при появлении диалогового окна следует выбрать Execute in Terminal.

В окно терминала каждую секунду выводятся температура, давление и высота.

Принципы расчета высоты и текущего давления на уровне моря основаны на следующих формулах:

— при измеренном давлении p и давлении на уровне моря p0, например, 1013.25hPa, высота в метрах может быть рассчитана при помощи так называемой международной барометрической формулы:

Согласно этой формуле, изменение давления Δp = 1hPa соответствует 8,43 м на уровне моря.

— при измеренном давлении p и абсолютной высоте можно рассчитать давление на уровне моря:

Разница в высоте Δaltitude = 10m соответствует изменению давления 1,2hPa на уровне моря.

Файл bmp180.h

#define BMP180_Address 0x77

#define BMP180_ULTRALOWPOWER 0

#define BMP180_STANDARD 1

#define BMP180_HIGHRES 2

#define BMP180_ULTRAHIGHRES 3

#define BMP180_CAL_AC1 0xAA //Calibration data (16 bits)

#define BMP180_CAL_AC2 0xAC //Calibration data (16 bits)

#define BMP180_CAL_AC3 0xAE //Calibration data (16 bits)

#define BMP180_CAL_AC4 0xB0 //Calibration data (16 bits)

#define BMP180_CAL_AC5 0xB2 //Calibration data (16 bits)

#define BMP180_CAL_AC6 0xB4 //Calibration data (16 bits)

#define BMP180_CAL_B1 0xB6 //Calibration data (16 bits)

#define BMP180_CAL_B2 0xB8 //Calibration data (16 bits)

#define BMP180_CAL_MB 0xBA //Calibration data (16 bits)

#define BMP180_CAL_MC 0xBC //Calibration data (16 bits)

#define BMP180_CAL_MD 0xBE //Calibration data (16 bits)

Ссылка на основную публикацию
Adblock
detector