Продолжение. Начало здесь.

После проделанной работы у нас есть вполне работоспособная конструкция метеостанции. Но сейчас таких метеостанций пруд пруди, локальные поделки это уже не модно. У нас ведь интернет вещей.

Поэтому сегодня поговорим о том как осуществляется выход в интернет, приделаем к нашей метеостанции базу данных и веб-морду к ней.

Когда мы говорили о программном обеспечении сервера, то эти моменты были пропущены.

weather-remote-sensor-01

Напомню, что :

  • «клиент» — это удалённый, заоконный датчик, который передаёт данные на сервер по радиоканалу
  • «сервер» — это центральный, домашний блок, который принимает данные от клиента(ов), может общаться с интернет через WiFi и отсылать данные во внешнюю базу данных.

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

Постановка задачи для «вебки» :

  • принимать и хранить данные метеостанции : температура, влажность, атмосферное давление, напряжение питания
  • отображать эти данные
  • строить графики.

При этом нам понадобится хостинг с поддержкой Apache, PHP и MySQL с модулем mysqli. И этим условиям удовлетворяет практически любой хостинг на планете Земля. Либо вместо хостинга будет ваш компьютер играющий роль сервера, подключённый к домашнему сетевому маршрутизатору и имеющий выход в интернет.

Создание базы данных

Начнем с самого начала, а именно с проектирования и создания базы данных.

Базы данных это свой мир и изучать его можно долго, поэтому бегло коснёмся только тех вещей, которые нам непосредственно необходимы.

Все SQL скрипты находятся в каталоге weather-station/server/php-sql/

С чего начинается проектирование БД ? С логического и физического представления.

Логическое представление или схема базы данных:

  • таблица с данными DHT датчика температуры и влажности
  • таблица с данными BMP датчика давления и температуры
  • указанные таблицы не имеют связей между собой, точнее связи не нужны.

Физическая схема опирается на конкретную СУБД и типы данных. Проще разбирать на конкретном примере. SQL скрипт make_tables.sql раскрывает логическую и физическую схемы.

В каждой таблице должно быть поле типа

id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT

Имя поля может отличаться в разных БД, но смысл один — это уникальный идентификатор, ключ записи. На будущее, если вы видите базу данных в таблицах которой нет подобного счётчика, знайте, эту БД проектировал человек весьма далёкий от программирования, скорее всего гуманитарий.

Данные от однотипных датчиков храним в одной таблице, для датчиков другого типа создаём еще таблицу. Это чуть усложняет базу данных и PHP обвязку к ней, но это упрощает расширение или модификацию всей системы в дальнейшем.

В нашем проекте две таблицы. В таблице arduino_dht хранятся данные от датчика(ов) типа DHT (температура, влажность), в таблице arduino_bmp хранятся данные от датчика(ов) типа BMP (температура, давление). Если вы в будущем захотите иметь, например, датчик газов или детектор движения, то создаёте дополнительные таблицы. Если подключаете ещё один датчик типа DHT11 или DHT22, то создавать дополнительную таблицу не нужно, используете таблицу arduino_dht. Надеюсь принцип ясен : отдельная сущность — отдельная таблица.

Если в таблице будут храниться данные от несколько однотипных датчиков, то как же их различить? Для этого в каждой таблице вводится поле

idSensor INTEGER

Фактически это CLIENT_ADDRESS который мы прописывали в файле client/client.ino для каждого экземпляра удаленного датчика (клиента) и в server/server.ino для датчика, который подключен непосредственно к серверу.

В промышленных системах должна быть ещё одна таблица — соответствия idSensor и его словесного, человеко читаемого описания. Например, датчик с idSensor = 2 это «Температура, влажность в квартире» и т.д. Но в нашем проекте не будем усложнять, просто помните, что :

  • датчик с idSensor (или CLIENT_ADDRESS) равным 11 — это есть домашний датчик на сервере,
  • датчик с idSensor (или CLIENT_ADDRESS) равным 20 — это первый (в нашем проекте и единственный) заоконный датчик.
Читать ещё :   5 open source инструментов для домашней автоматизации

Далее. В таблицах хранятся следующие данные:

  • ipRemote — IP адрес метеостанции (сервера) с которого пришли данные, полезно для отладки и мониторинга,
  • dateCreate — дата время создания записи,
  • millis — полезно для отладки, это время в миллисекундах с момента начала выполнения скетча на Arduino,
  • temperature — температура,
  • humidity — влажность,
  • voltage — напряжение питания,
  • pressure — давление,
  • errors — количество ошибок (не используется). Задумывалось для хранения количества ошибок при передаче и т.п., чтобы можно было удаленно оценить состояние всей системы.

Как видим таблицы arduino_dht и arduino_bmp очень похожи, отличие только в полях pressure и humidity, и возникает желание свалить всё в одну кучу (таблицу). Но делать так не велит первая нормальная форма, множество начинающих программистов пытались её обойти, но ни у одного не получилось, и мы не будем. Это как отрицать закон всемирного тяготения, до поры до времени вполне может получиться.

«Подальше положишь — поближе возьмёшь» — главный принцип в программировании.

Таблица arduino_error_log полезна при отладке — это журнал ошибок и прочих системных сообщений.

Создание БД и её пользователя с правами описано в make_db.sql

Это делается один раз, имя БД и имя пользователя можете придумать свои. И что точно необходимо сделать — это задать свой пароль вместо ‘***PASSWORD***’.

PHP и веб-сервер

Все настройки веб-интерфейса хранятся в config.php. Измените его в соответствии с вашими настройками базы данных.

Задайте свой часовой пояс в формате PHP

date_default_timezone_set(‘Europe/Minsk’);

Все доступные часовые пояса описаны здесь.

Задайте свой секретный ключ для доступа (в виде числа) который должен совпадать с константой SOURCE_KEY из скетча server.ino

$access_key = ‘***KEY***’;

В нашем веб-сервере нет авторизации, входа по паролю, это усложнило бы всю конструкцию. Для прототипа это не нужно. Поэтому вся защита построена на файле robots.txt, отсутствии index.php и на этом секретном ключе для доступа. Это будет ваш приватный сайт, поэтому, я надеюсь, никаких ссылок на него вы не поставите, но даже в этом случае бывают «нежданчики».

Основной PHP скрипт weather.php принимает простой HTTP GET запрос с данными и сохраняет их в соответствующие таблицы базы данных. Если ключ $access_key не совпадает, то запрос будет отвергнут.

Скрипт weather-view.php используется для просмотра таблиц данных и содержит гиперссылки на остальные скрипты веб-интерфейса. Вызывайте его так

http://ваш хост/ваш путь/weather-view.php?k=ваш access_key

Например

http://yourhost/iot/weather-view.php?k=12345

weather-view.php выводит простые таблички, где надо помнить, что :

  • датчик с id 11 это домашний датчик на сервере,
  • датчик с id 20 это заоконный датчик.

Скрипт function.php содержит функции, общие для всех PHP скриптов.

Скрипт chart-dht.php отвечает за рисование графиков при помощи Google Charts. Вот, например, график питающего напряжения заоконного датчика. Напряжение повышается в солнечный день за счёт солнечной же батареи и затем блок питания на аккумуляторах постепенно разряжается.

voltmeter-graph

export-dht.php экспортирует данные из таблиц базы данных MySQL в файл формата CSV. Для дальнейшего импорта и анализа в электронных таблицах.

export-voltage.php экспортирует данные о напряжении питания заоконного датчика из базы данных MySQL в файл формата CSV. Полезно для отладки.

Читать ещё :   5 open source инструментов для домашней автоматизации

truncate.php очищает все таблицы, т.е. удаляет все наши данные. Полезно для отладки. На этот скрипт нет ссылок из weather-view.php, поэтому вызывать его надо по прямой ссылке в адресной строке браузера с указанием $access_key.

При приёме данных повсеместно используется функция mysqli_real_escape_string() для предотвращения попадания в БД некорректных значений.

В корень вашего сайта не забудьте положить robots.txt для предотвращения попадания в поисковые системы.

ESP8266, WiFi и передача данных

А вот теперь возвращаемся к скетчу server.ino, к той его части, которая соединяется с точкой доступа WiFi и отсылает данные на веб-сервер.

Как я уже писал, мне не удалось найти нормальную библиотеку для Arduino для управления модулем ESP8266 с помощью AT команд, пришлось «колхозить» самому.

Напомню так же, что вам придется прошить в ESP8266-01 прошивку определённой версии. И теперь когда всё готово, разберём как это работает.

Для доступа к веб серверу в скетче server.ino необходимо изменить вот эти константы

Не забудьте перезалить скетч!

В server.ino в функции void setup() сначала производится переключение ESP8266 в режим Station, т.е. он начинает работать как WiFi клиент

espSendCmd(«AT+CWMODE_CUR=1», «OK», 3000);

и далее следует подключение к точке доступа

espState = espConnectToWiFi();

Если подключения не происходит, то попытка повторяется (однократно)

Затем выбирается режим одиночного подключения TCP/IP

espSendCmd(«AT+CIPMUX=0», «OK», 2000);

При отсылке данных от датчиков типа DHT на вебсервер используется функция с указанием типа данных как «type=dht»

espSendData( «type=dht&t=»+ String(dhtData.temperature) +»&h=»+ String(dhtData.humidity) +»&v=»+ String(dhtData.voltage) + «&s=»+ String(CLIENT_ADDRESS) );

При отсылке данных от датчиков типа BMP на вебсервер используется та же функция с указанием типа данных как «type=bmp»

espSendData( «type=bmp&t=»+ String(temperature_bmp) +»&p=»+ String(pressure_bmp) + «&s=»+ String(CLIENT_ADDRESS) );

На вход функция espSendData() принимает строку HTTP GET запроса и отправляет её по назначению на веб-сервер.
Внутри себя espSendData() проверяет доступность ESP модуля, посылая ему команду «AT», далее проверяется подключение к WiFi и производится переподключение, если необходимо. Затем отправляются данные и соединение TCP закрывается.

Продолжение следует…

 

От автора

Если что непонятно — спрашивайте в комментариях.

Чтобы не пропустить следующую публикацию подписывайтесь на канал.

Проект находится в постоянном развитии, так что здесь были и будут ошибки и неточности. Я надеюсь, что вы мне укажете на них в комментариях.

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

Лицензия Creative Commons
Произведение «Метеостанция на Arduino от А до Я» созданное автором по имени tim4dev.com, публикуется на условиях лицензии Creative Commons «Attribution-NonCommercial-ShareAlike» («Атрибуция — Некоммерческое использование — На тех же условиях») 4.0 Всемирная.