Создаем регистратор температуры и влажности на основе 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
- DHT библиотека от Adafruit
- Android Studio с Kotlin
Скрипты Python написаны в WINGS 7.0, а файлы PHP написаны в Sublime.
Регистратор влажности и температуры мы создадим с использованием DHT11 и DS18B20. DHT11 не измеряет отрицательные градусы, поэтому также используется DS18B20, который заботится об отрицательных значениях.
Вы можете использовать DHT22, который аналогичен DHT11, и измеряет до -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. Данные передаются в качестве параметров в этот файл. Сценарий 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: имя датчика - фактически имя хоста 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, я выполняю выбор переключателя:
# Операторы переключатели используют переменную $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
Финальные фото устройства
Это программное обеспечение не очень хорошо справляется с ошибками. Хорошо бы добавить некоторые проверки. Что будет если один из датчиков перестанет работать?
У нас должна быть какая-то функция if для проверки данных пять раз. Если мы не можем получить какие-либо действительные данные, датчик должен отправить электронное письмо владельцу. Мы также можем составить еженедельную сводку с некоторыми графиками, которые визуально показывают нам температуру и влажность, более удобным для пользователя способом. Но это бы добавим в следующем уроке.
За урок мы благодарим Йенса Кристофферсена с сайта maker.pro.