Иван Иванов   5 марта в 01:27

Регистратор температуры и влажности на Raspberry Pi с mySQL и Android

Создаем регистратор температуры и влажности на основе Raspberry Pi, используя mySQL и Android-приложение для отслеживания показаний.

Цели проекта

  1. Считать влажность и температуру с двух разных датчиков.
  2. Добавить влажность и температуру в базу данных MySQL удаленного веб-сервера.
  3. Подключиться к веб-серверу с помощью приложения для Android, чтобы узнать температуру.

Требуемое оборудование

  1. Raspberry Pi Model A +,
  2. Raspberry Pi 3 Model B,
  3. Модем для мобильного интернета или другой способ подключения Raspberry Pi, который мы используем в качестве датчика и веб-сервера, к Интернету.
  4. DHT11,
  5. DS18B20,
  6. Мобильный телефон Samsung (или планшет под управлением Android),
  7. Перфорированная плата, розетки и резисторы

Требуемое программное обеспечение

  1. NOOBS, LAMPS, Python, phpMyAdmin
  2. DHT библиотека от Adafruit
  3. 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 для создания базы данных, и в этой базе данных я создал следующую таблицу:

Таблица MySql для проекта
Таблица MySql для проекта

Я назвал базу данных 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.