Атмосферное давление и температуру в квартире измеряет датчик BMP180, датчик DS18B20 измеряет температуру наружного воздуха, еще один датчик DS18B20 (в металлическом корпусе) измеряет температуру батареи отопления. У меня нет возможности разместить датчик в метеобудке, поэтому датчик закреплен на стене дома на расстоянии около 5 см от нее. Защищен от проникновения дождя, снега и ветра, но нагревается солнцем в солнечную погоду. Из-за чего показывает температуру приблизительно на 10 градусов больше. Ночью и в пасмурную погоду, я считаю, показания правильные. Если у вас угловая квартира, то закрепите датчик на стороне дома, которая большую часть дня находится в тени. Лучше всего разместить его на теневой стороне дома. Тогда показания будут близки к реальной температуре воздуха. Датчик к батарее отопления крепится с помощью металлической мочалки в виде сетки. Она применяется для чистки металлической посуды. Тепловой контакт достаточно надежный.
На момент написания статьи на Raspberry Pi 3 использовалась Raspbian версии Linux raspberrypi 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux. Как уже писал в анонсе к статье, в интернете есть сообщения о том, что разработчик WebIOPi перешел на другую работу и забросил проект. Ранее в проекте для построения графиков параметров использовались скрипты с использованием WebIOPi. В Raspbian, начиная, кажется, с версии ядра 4.9 (kernel 4.9) скрипты на Python'е, использующие библиотеку webiopi, перестали работать. Прекратилась запись показаний датчиков в текстовые файлы. На замену пришлось скомбинировать свой скрипт, используя разные источники. Он не использует библиотеку webiopi, поэтому может работать независимо от WebIOPi. WebIOPi в данном проекте используется только для вывода текущих показаний датчиков (devices monitor) и как web-сервер.
Предупреждение. Не используйте Raspbian Stretch, на ней WebIOPi вообще не запускается. Найдите в Сети предыдущую версию. Все описанное относится к версии Raspbian Jessie.
Скачать Raspbian Jessie версия от 2016-05-27 архив ZIP 1.4 Gb
Raspbian Jessie и Stretch сейчас уже старые дистрибутивы, но вы их можете скачать по ссылке downloads.raspberrypi.org/raspbian/images/. Историю версий можно посмотреть по ссылке https://en.wikipedia.org/wiki/Raspberry_Pi_OS. При использовании старых дистрибутивов можно давать команду sudo apt update для обновления списка пакетов, но не давайте команду sudo apt upgrade для обновления пакетов - это может нарушить работу системы.
Схема соединений
Датчики DS18B20 могут питаться напряжением 3,0 - 5,5 Вольт. Подключите датчики к шине 5 Вольт, это повысит надежность измерений высоких и низких температур. Сопротивление резистора 4,7 - 10 кОм. Соедините датчики проводами достаточного сечения. Чем меньше сопротивление линии, тем надежнее работа датчиков. Контакт 7 разъема GPIO (GPIO 4 по нумерации BCM) предназначен для подключения шины 1-Wire.
Если BMP180 имеет 4 контакта, то контакт VIN подключите к шине +3.3V. Если 5 контактов, то контакт 3V3 подключите к шине +3.3V, контакт VIN оставьте свободным. Защитите BMP180 от попадания прямых солнечных лучей.
Как подключить BMP180, можно посмотреть в статье WebIOPi-0.7.1 и Raspberry Pi 3 - подключение датчика давления BMP180.
После сборки схемы сделайте доступными интерфейсы для работы датчиков. В терминале вводим команду sudo raspi-config и затем идем Interfacing Options. По очереди выбираем I2C, 1-Wire и SSH. На вопросы Would you like the ... interface to be enabled? выбираем ответ Да (Yes).
Перезагрузите микрокомпьютер - sudo reboot.
Установите библиотеку для работы с BMP180 командами
wget http://osoyoo.com/driver/Adafruit_Python_BMP.zip
unzip Adafruit_Python_BMP.zip
cd Adafruit_Python_BMP
sudo python setup.py install
Проверьте работу датчика:
cd examples
sudo python simpletest.py
Скрипт должен вывести температуру, давление и высоту над уровнем моря.
Удобно подключаться к Raspberry Pi по ssh. Тогда можно будет отключить монитор, клавиатуру, мышь и подключаться по локальной сети, используя Wi-Fi. Как настроить ssh, описано в статье Как подключиться к Raspberry Pi из Windows по SSH. Я подключаюсь по ssh с компьютера Linux Mint.
Теперь займитесь датчиками DS18B20. Подключите модули командами
sudo modprobe w1-gpio
sudo modprobe w1-therm
Добавьте строку dtoverlay=w1-gpio в файл /boot/config.txt командой sudo nano /boot/config.txt, если ее там нет:
Перезагрузите - sudo reboot.
Проверьте датчики. Дайте команды
ls /sys/bus/w1/devices
Вы должны увидеть каталоги с именами идентификаторов датчиков. Перейдите в каталог датчика:
cd /sys/bus/w1/devices/<ID_датчика>
Распечатайте файл w1_slave
cat w1_slave
В конце второй строки вы должны увидеть что-то наподобие t=28750. Если это так, значит датчик DS18B20 работает.
Установите фреймворк WebIOPi. Скачайте WebIOPi-0.7.1, например, с ресурса sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz/download.
Далее подразумевается, что скачанный архив находится в домашнем каталоге /home/pi.
Распакуйте архив командой
tar xvzf WebIOPi-0.7.1.tar.gz
Перейдите в каталог WebIOPi-0.7.1
cd WebIOPi-0.7.1
Для Raspbian с ядром 4.9 (kernel 4.9) или новее скачайте патч:
wget https://github.com/doublebind/raspi/blob/master/webiopi-pi2bplus.patch
Пропатчите исходники командой
patch -p1 -i webiopi-pi2bplus.patch
Запустите установку WebIOPi-0.7.1 командой
sudo ./setup.sh
Переустановка WebIOPi-0.7.1
Если потом по каким-либо причинам потребуется переустановить WebIOPi-0.7.1, то сделать это можно следующим образом.
Остановите сервис командой
sudo /etc/init.d/webiopi stop
Удалите каталог:
sudo rm -r -f WebIOPi-0.7.1
Снова распакуйте архив
tar xvzf WebIOPi-0.7.1.tar.gz
Пропатчите исходники нужным патчем и запустите установку командой:
sudo ./setup.sh
Проверьте или настройте заново файл /etc/webiopi/config.
После установки WebIOPi-0.7.1 надо отредактировать конфигуратор WebIOPi командой sudo nano /etc/webiopi/config. В секции [DEVICES] раскомментируйте или пропишите подключенные датчики. Естественно, идентификаторы датчиков вбейте свои.
В секции [HTTP] укажите место расположения проекта. Я расположил его в домашнем каталоге в папке examples. Можно разместить за пределами домашнего каталога, но тогда, скорей всего, при редактировании файлов и запуске программ придется использовать права суперпользователя, т.е. перед командой указывать sudo. Секцию [SCRIPTS] оставьте без изменений, т.е. закомментированной.
После редактирования перезапустите WebIOPi командой sudo /etc/init.d/webiopi restart.
Обычно автозапуск WebIOPi делают командой sudo update-rc.d webiopi defaults, но я не рекомендую вам делать так. В Raspberry Pi 3 часто приходилось делать рестарт WebIOPi и даже перезагружать систему. Лучше запуск WebIOPi прописать в /etc/rc.local. Тогда фреймворк надежно запускается после полной загрузки операционной системы.
Пропишите запуск WebIOPi, как показано на скриншоте, командой sudo nano /etc/rc.local и перезагрузите систему. В браузере на компьютере локальной сети введите IP адрес Raspberry Pi, порт 8000 и путь к devices-monitor, например 192.168.1.41:8000/app/devices-monitor. IP адрес можно посмотреть командой hostname -I. После ввода логина - webiopi и пароля - raspberry вы должны увидеть примерно следующее:
Возможна такая ошибка — ваш браузер вместо открытия страницы начинает поиск по этому адресу и выводит кучу сообщений о невозможности найти такой текст. Значит вам надо изменить настройки браузера. В настройках браузера отмените поиск по адресной строке. В Mozilla Firefox в разделе Поиск снимите галку "Использовать адресную строку для поиска и навигации". Теперь браузер должен открывать адрес, а не начинать поиск.
У меня для справки добавлено несколько строк. Вы можете сделать тоже самое, отредактировав index.html командой sudo nano /usr/share/webiopi/htdocs/app/devices-monitor/index.html
Вставьте пояснительные строки после заголовка <h1 ...> до тега <div ...>.
Символы <------> — это символы табуляции так отображаются в редакторе mcedit. Не обращайте на них внимания. В других редакторах табуляция отображается пробелами.
Кроме просмотра текущих показаний проект выводит на монитор графики атмосферного давления и температуры. Скрипт на Python'е с определенным интервалом (60 секунд) записывает показания датчиков в текстовые файлы данных. Интервал можете изменить по своему усмотрению в последней строчке скрипта. Библиотека dygraph-combined-dev.js на основании этих данных строит графики давления и температуры.
Скрипт temp_press.py не использует библиотеку webiopi, работает независимо. Запуск его также прописал в /etc/rc.local. Скрипт можно разместить в любом месте, но для удобства расположил его в папке /home/pi/examples/python. Главное - прописать в rc.local правильный путь для его запуска, например, так:
nohup /home/pi/examples/python/temp_press.py &
Первая часть скрипта (DS18B20) взята из книги Simon Monk [2], часть для BMP180 из скрипта Tony DiCola (simpletest.py), запись данных и графики параметров - ресурс electromost.com [3],[4]. Не забудьте в скрипте заменить идентификатор датчика на свой (подчеркнут). Я прописал датчик, который измеряет температуру наружного воздуха.
Строка pressure = pressure*0.75/100 - перевод Па в мм рт. столба.
Чтобы посмотреть графики, нужно в браузере ввести, например, 192.168.1.28:8000. После ввода логина и пароля загрузится файл /home/pi/examples/html/index.html:
Щелкнув мышкой по одной из картинок, вы загрузите из этой папки либо temp.html, либо press.html и, соответственно, будет построен график температуры или давления.
В интернете полно сервисов по мониторингу датчиков, но они могут быть временами недоступны или вообще прекратить работу. Например, тот же Weaved, который предлагается при установке WebIOPi. Гораздо надежнее предусмотреть мониторинг в собственном проекте, тогда вы ни от чего не будете зависеть.
Файлы данных даны для примера, удалите их и создайте свои, добавив в них по одной строчке Date,Temperature или Date,Pressure. Со временем в файлах накапливается много данных, построение графиков замедляется, браузер может даже выдать ошибку, поэтому устаревшие данные нужно удалять. Удобно это делать в редакторе mcedit - встроенном редакторе Midnight Commander (mc). Установите менеджер mc командой sudo apt install mc, перейдите в папку с данными и дайте команду, например, mcedit data_press.txt. Чтобы посмотреть последнюю строчку данных (для проверки работы скрипта), нажмите Ctrl+End. Если курсор находится в середине файла, то нажмите Ctrl+Home для перехода к началу файла. Поставьте курсор на первую строку данных, нажмите F3 и стрелку вниз. Строка будет выделена. Для ускорения процесса нажимайте Page Down. Дойдя до нужной даты, нажмите F8 (Удалить помеченный блок). Редактор выдаст сообщение о том, что блок слишком велик и восстановить его не удастся. Нажмите Продолжить. Блок будет удален. Для сохранения файла нажмите F2 и затем еще раз Сохранить. Редактор может выдать предупреждение - файл используется внешней программой, записать поверх? Нажмите Да. Для выхода из редактора нажмите два раза Esc.
Иногда в файлы данных может записаться сбойное значение - очень большое или очень маленькое, это исказит вид графика. Как удалить сбой, описано в конце статьи WebIOPi-0.7.1 и Raspberry Pi 3 - подключение датчика давления BMP180.
Если можно выделить диапазон значений, выход за пределы которого можно рассматривать как сбой, тогда можно использовать условный оператор.
Например, такой:
if (humidity <= 100.0) :
f = open('/home/pi/examples/html/data_humi.txt', 'a')
data_entry = "{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),"%.3f" % humidity)
f.write(data_entry)
f.close()
else:
f = open('/home/pi/examples/html/dht_err.txt', 'a')
data_entry = "{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),"%.3f" % humidity)
f.write(data_entry)
f.close()
Если значение влажности меньше или равно 100 процентам, то оно записывается в файл данных data_humi.txt. Если значение больше 100, то оно записывается в файл ошибок dht_err.txt. В файл данных data_humi.txt будут записаны только корректные значения и график не будет искажаться.
Можно использовать укороченный оператор, отбросив вторую половину, начинающуюся со слова else. Тогда ошибочные значения влажности будут игнорироваться.
Скачать файлы проекта
И последний, максимальный вариант проекта. Он, кроме текущих значений, выводит графики 4 параметров: температуры наружного воздуха, атмосферного давления, температуры и влажности в квартире.
Скрипт на Python'е пишет показания датчиков в 4 текстовых файла: data_18B20.txt, data_DHT.txt, data_humi.txt и data_press.txt. Как подключить и проверить датчик DHT22, читайте в статье Монитор температуры и влажности на DHT11 / DHT22 и WebIOPi в Raspberry Pi . Проект работает уже нескольких месяцев. Используйте корпус с вентилятором для охлаждения Raspberry Pi 3.
Скачать файлы макси проекта
На данный момент у вас есть доступ к монитору по локальной сети. Для доступа из интернета надо присвоить Raspberry Pi статический адрес, настроить в роутере проброс порта (port forwarding) и зарегистрировать домен на каком-нибудь бесплатном динамическом DNS сервисе. Как это сделать на примере роутера DIR-300, описано здесь. Подробно описано в статье Как получить доступ по интернету к датчикам в квартире.
Статья обновлена 18.02.2022 г.
Использованные ресурсы
1. https://iarduino.ru/lib/datasheet%20bmp180.pdf
2. Simon Monk Raspberry Pi Cookbook O’Reilly Media release 2014 p. 319
3. http://lock.3dn.ru/news/raspberry_pi_dlja_domashnej_avtomatizacii_shina_1_wire/2015-09-12-134
4. http://lock.3dn.ru/news/raspberry_pi_dlja_domashnej_avtomatizacii_grafiki_parametrov/2015-09-18-136
5. https://cdn-learn.adafruit.com/downloads/pdf/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing.pdf
6. https://www.raspberrypi.org/documentation/configuration/raspi-config.md
|