Регистратор температуры и влажности на Raspberry Pi с mySQL и Android
Собираем регистратор температуры и влажности на базе Raspberry Pi с использованием mySQL и Android-приложения для просмотра показаний.
Цели проекта
Получить данные о влажности и температуре с двух различных датчиков.
Записать полученные значения влажности и температуры в базу данных MySQL на удалённом веб-сервере.
Подключиться к веб-серверу через Android-приложение для отображения температуры.
Требуемое оборудование
Raspberry Pi Model A +,
Raspberry Pi 3 Model B,
Модем для мобильного интернета или иной способ подключения Raspberry Pi (используемого в роли датчика и веб-сервера) к сети Интернет.
DHT11,
DS18B20,
Смартфон Samsung (либо планшет на платформе Android),
Перфорированная плата, розетки и резисторы
Требуемое программное обеспечение
NOOBS, LAMPS, Python, phpMyAdmin
Android Studio с Kotlin
Python-скрипты написаны в WINGS 7.0, а PHP-файлы — в Sublime.
Для регистратора влажности и температуры мы задействуем датчики DHT11 и DS18B20. Поскольку DHT11 не способен измерять отрицательные температуры, дополнительно применяется DS18B20, который поддерживает работу с минусовыми значениями.
Вместо DHT11 можно использовать DHT22 — он аналогичен по функциональности и способен измерять температуру вплоть до -40 °C. Кроме того, мы разработаем Android-приложение для проверки влажности и температуры из любой точки.
Настройка сервера
На серверной стороне задействована Raspberry Pi 3 Model B. На ней развёрнута система NOOBS, а также установлен стек LAMP (Linux, Apache, MySql и PHP). В сети можно найти массу инструкций по установке LAMP на Raspberry Pi, так что останавливаться на этом подробно не будем.
Для создания базы данных я воспользовался phpMyAdmin и в этой базе создал следующую таблицу:
База данных получила имя db_Kajsa, а таблица — tbl_tempera. Датчик будет записывать данные в эту таблицу.
id |
Целое число, первичный ключ, автоинкремент |
timestamp |
Текст, точное время |
temperature |
Типы с плавающей точкой, в цельсиях |
humidity |
Типы с плавающей точкой, в процентах |
sensor |
Текст, имя датчика |
ip |
Текст, внешний IP-адрес датчика |
active |
Целое число, это либо ноль, либо единица.* |
* — при работе с базами данных рекомендуется не удалять записи, а скрывать их или помечать как неактивные.
Для добавления записей в таблицу создан PHP-файл, размещённый в корневой директории Apache-сервера. У меня три подобных датчика в разных местах.
Файл для вставки записей в базу данных называется add_temp.php. Данные передаются через параметры в URL. Python-скрипт на стороне датчика выполняет этот запрос:
http://my.domain.com/temperature/add_temp.php?temp=4.562&humi=95.0&time=2020-01-18-09:08:01&sensor=my_sensor&ip=xxx.xxx.xxx.xxx
Для передачи параметров в PHP-файл после расширения ставится знак вопроса, а отдельные параметры разделяются амперсандом. Разберём каждый из них:
temp=4.564: температура в градусах Цельсия
humi=95.0: влажность в процентах
time=2020-01-18-09:08:01: метка времени считывания показаний
sensor=my_sensor: название датчика — по сути, hostname Raspberry Pi
ip=xxx.xxx.xxx.xxx: внешний IP-адрес датчика
Эти параметры затем вставляются в таблицу tbl_teuration в базе данных.
Так как у меня три датчика, необходим механизм их различения. Для этого используется имя датчика. Сначала параметры извлекаются и присваиваются соответствующим переменным. Извлечение выглядит следующим образом:
# Получить данные из переменных, которые отправляются с файлом
$temperature = $_GET["temp"];
$humidity = $_GET["humi"];
$time = $_GET["time"];
$sensor = $_GET["sensor"];
$ip = $_GET["ip"];
$active = 1;
Далее на основании значения переменной $sensor выполняется конструкция switch:
# Операторы переключатели используют переменную $sensor из аргумента files,
# чтобы определить, какую базу данных использовать и какой датчик «общается» с сервером
switch ($sensor) {
case 'Kajsa':
$dbname = "db_Kajsa"; # Датчик на лодке
break;
case 'fortuna':
$dbname = "db_Fortuna"; # Квартира друга
break;
case 'home':
$dbname = "db_Home"; # Мой дом
break;
default:
# Здесь ничего нет
break;
}
Python-скрипт выполняет вставку данных следующим образом:
$sql = "INSERT INTO tbl_temperature (temperature, humidity, timestamp, sensor, ip, active) VALUES ('$temperature', '$humidity', '$time', '$sensor', '$ip', '$active')";
Весь исходный код приведён ниже и содержит подробные комментарии.
Настройка датчиков
Компоненты и датчики размещаются на перфорированной плате согласно схеме:
Мы задействуем не все GPIO-выводы Pi:
Подключитесь к Raspberry Pi, которая будет выполнять роль датчика, и выполните следующие команды:
sudo apt-get update
sudo apt-get install python3-pip
sudo python3 -m pip install --upgrade pip setuptools wheel
Данные команды установят последние версии pip3 и Python.
Raspberry Pi в роли датчика работает под управлением NOOBS с последней версией Python. Чтобы DHT11 взаимодействовал с Raspberry Pi, требуется установить программное обеспечение от AdaFruit. Сделать это можно одной командой:
sudo pip3 install Adafruit_DHT
Программа завершается после каждого выполнения, поэтому в crontab добавлена запись для запуска скрипта каждые две минуты.
*/2 * * * * python3 /home/pi/ds18b20_dht_mysql_v01.py >> /home/pi/ds18b20_dht_mysql_v01_LOG.txt 2>&1
Все сообщения записываются в лог-файл, что существенно упрощает диагностику неисправностей.
Настройка Android-приложения
Прежде всего убедитесь, что у вас установлена актуальная версия Android Studio с поддержкой Kotlin. Вот версия, которую я использую:
Приложение, которое мы будем создавать, довольно простое. Для отображения страницы с веб-сервера используется компонент WebView. Итоговый интерфейс будет выглядеть так:
Приложению необходим доступ к Интернету с соответствующими разрешениями. Их нужно указать в файле AndroidManifest.xml. Ключевое разрешение:
<uses-permission android:name="android.permission.INTERNET"/>
Начнём с размещения элементов управления: две кнопки, editText и WebView. Элементы именуются так:
btnShow
btnExit
ediText
WebView
Полный исходный код с подробными комментариями представлен ниже.
Исходный код
Полный исходный код и файлы проекта доступны для скачивания по ссылке:
Файлы на сервере:
add_temp.php
apk_top.php
apk_handler_app.php
apk_end.php
dbconfig.php
Файлы сенсора:
Python script .py
Исходные файлы Android Studio Kotlin:
activity_main.xml
AndroidManifest.xml
MainActivity.kt
Финальные фото устройства
Данное приложение не обладает развитой обработкой ошибок. Было бы полезно добавить дополнительные проверки. Что произойдёт, если один из датчиков выйдет из строя?
Стоит реализовать функцию, которая проверяет корректность данных, например, пять раз подряд. Если получить валидные показания не удаётся, датчик должен отправить уведомление по электронной почте владельцу. Также можно формировать еженедельные сводки с графиками, наглядно показывающими динамику температуры и влажности. Но это мы добавим в следующем уроке.
За урок мы благодарим Йенса Кристофферсена с сайта maker.pro.