Оглавление:

Интеллектуальная распределенная система мониторинга погоды IoT с использованием NodeMCU: 11 шагов
Интеллектуальная распределенная система мониторинга погоды IoT с использованием NodeMCU: 11 шагов

Видео: Интеллектуальная распределенная система мониторинга погоды IoT с использованием NodeMCU: 11 шагов

Видео: Интеллектуальная распределенная система мониторинга погоды IoT с использованием NodeMCU: 11 шагов
Видео: Концепция "Умного" Дома 2024, Ноябрь
Anonim
Интеллектуальная распределенная система мониторинга погоды IoT с использованием NodeMCU
Интеллектуальная распределенная система мониторинга погоды IoT с использованием NodeMCU

Возможно, вы все знаете о традиционной метеостанции; но задумывались ли вы, как это работает на самом деле? Поскольку традиционные метеостанции являются дорогостоящими и громоздкими, плотность этих станций на единицу площади очень мала, что способствует неточности данных. Я объясню вам, как: предположим, что станция расположена в центре города, и это единственная станция, которая находится в радиусе 'x' метров, ее можно легко смещать, если поблизости присутствует какой-либо агент, вызывающий загрязнение. станции, показывающей всю зону радиуса «x» метров как загрязненную, поскольку эта единственная станция отвечает за определение погодных данных для всей области.

Чтобы решить эту проблему, необходимо увеличить плотность модулей, что возможно только в том случае, если модули дешевле и занимают меньшую площадь, чем существующий.

По этой причине предлагаемое мной решение является идеальным решением этой проблемы. Оно стоит менее 10 долларов и легко лежит на моей ладони.

Как это работает…

Этот проект состоит из 3 основных частей.

Сторона устройства:

Устройство представляет собой модуль IoT, показанный на рисунке, который отправляет данные о погоде на сервер каждые x интервалов времени. Данные включают в себя актуальные погодные данные, географическое положение модуля; т.е. его координаты, его MAC-адрес; чтобы однозначно идентифицировать устройство, версия прошивки, на которой оно работает. Сторона устройства состоит из N-модулей, распределенных по области, активно передающих данные серверу.

На стороне сервера:

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

Клиентская / Пользовательская сторона:

Это конечный пользователь, который запрашивает данные о погоде с сервера. Клиент отправляет текущее местоположение, и на основе местоположения сервер вычисляет расстояние между клиентом и всеми модулями и отправляет клиенту данные о погоде ближайшего модуля, что считается точным.

Запасы

  • NodeMCU (ESP8266-12E)
  • DHT11 (датчик влажности и температуры)
  • BMP180 (датчик давления и температуры)
  • MQ-135 (датчик индекса качества воздуха)
  • USB-кабель (для загрузки программы)
  • Источник питания 5 вольт
  • Конденсаторы (опционально: устанавливаются параллельно линии электропередачи)
  • Arduino IDE (для отладки и загрузки программы)
  • Приложение POSTMAN (необязательно: для отладки API)
  • Веб-сайт (для размещения серверов PHP и MySQL)

Шаг 1. Припаяйте все компоненты и загрузите программу в NodeMCU

Припаяйте все компоненты и загрузите программу в NodeMCU
Припаяйте все компоненты и загрузите программу в NodeMCU
Припаяйте все компоненты и загрузите программу в NodeMCU
Припаяйте все компоненты и загрузите программу в NodeMCU

Припаяйте все компоненты к NodeMCU, как показано на принципиальной схеме на печатной плате. Кроме того, припаяйте конденсатор параллельно линиям электропередач, так как скачки напряжения возникают во время активной передачи и приема данных.

После завершения пайки загрузите код из файла «code.c».

Примечание. Не забудьте заменить учетные данные своими учетными данными. Также поместите файл с именем "html_file.h" в папку эскиза arduino. Здесь можно найти все файлы заголовков, используемые в этом проекте.

Особенности кода:

Точка доступа: поскольку в массовом производстве сложно запрограммировать каждый модуль с учетными данными, модуль размещает веб-страницу при первой загрузке, чтобы принять учетные данные Wi-Fi, к которым модули должны подключаться, и сохраняет в EEPROM для последующего использования.

После настройки учетных данных NodeMCU проверяет учетные данные в EEPROM и подключается к учетным данным WiFi, присутствующим в EEPROM.

После успешного подключения к Wi-Fi NodeMCU начинает загружать данные на сервер каждые интервалы времени «x», данные включают данные о погоде, MAC-адрес модуля, версию прошивки, географическое положение устройства.

Обновление OTA: модуль также проверяет наличие новых обновлений прошивки каждый день в определенное время, указанное в коде. Эта функция полезна, поскольку ни один производитель не может продолжать и изменять программу отдельного модуля в случае, если необходимо внести какие-либо изменения.

Сторожевой таймер: у Atlast должен быть способ самовосстановления без какого-либо вмешательства человека, если он застрянет или выйдет из строя. Этого можно добиться с помощью сторожевого таймера. Это работает следующим образом: есть подпрограмма прерывания, которая запускается каждую секунду. ISR увеличивает счетчик каждый раз, когда он выполняется, и проверяет, достиг ли счетчик максимального количества. Когда счетчик достигает максимального значения, модуль сбрасывается, предполагая, что он разбился. При нормальной работе счетчик всегда сбрасывается до того, как достигнет максимального значения.

Шаг 2: настройка SQL Server

Настройка SQL Server
Настройка SQL Server

Настройка SQL Server также очень проста. Просто создайте базу данных на сервере SQL и импортируйте настройку, импортировав файл с именем «database_structure.txt». Вы можете найти файл на этом этапе. Поскольку инструкция не позволяет загружать файлы ".sql", я переименовал файл в ".txt".

Примечание. Переименуйте файл с «.txt» в «.sql».

Шаг 3: Настройка файлового сервера

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

Поскольку Instructable не позволяет загружать файлы PHP, я переименовал файлы в «.txt».

Примечание: переименуйте расширение файлов в «.php». Также не забудьте изменить учетные данные файла «config.php».

Просто загрузите файлы на сервер, и все готово.

Я дам вам краткую информацию о файлах PHP.

db_config.php:

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

db_connect:

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

insert.php:

NodeMCU вызывает этот файл PHP для загрузки данных на сервер с помощью метода GET. Этот файл также отвечает за хранение тех же данных на сервере SQL.

retrieve.php:

Пользователь / Клиент вызывает этот PHP с помощью метода GET. Сервер рассчитывает расстояние между пользователем и всеми модулями. Затем данные ближайшего модуля отправляются в качестве ответа клиенту в формате JSON / XML, который предпочитает клиент.

update.php:

Этот файл PHP вызывается модулем каждый день в определенное время, чтобы проверить, работает ли на модуле последняя версия прошивки. Просто поместите последний файл «.bin» на файловый сервер и укажите каталог файла в переменной файла.

Если поначалу такое количество файлов кажется пугающим, я включил пользовательскую документацию на следующем шаге.

Шаг 4: Пользовательская документация

Пользовательская документация
Пользовательская документация
Пользовательская документация
Пользовательская документация

Вступление:

Weather API предоставляет простой интерфейс для запроса данных о погоде для местоположений на поверхности земли. Вы запрашиваете информацию о погоде для конкретной пары широта / долгота с указанным выходным форматом. API возвращает температуру, влажность, давление и индекс качества воздуха, которые последний раз были записаны ближайшим модулем из запрошенного места.

Прежде чем вы начнете:

Этот документ предназначен для разработчиков веб-сайтов и мобильных устройств, которые хотят включить информацию о погоде в разрабатываемое приложение. Он знакомит с использованием API и справочными материалами по доступным параметрам.

Запросы данных о погоде:

Запросы API погоды строятся в виде строки URL. API возвращает данные о погоде для точки на Земле, заданной парой широта / долгота. Обратите внимание, что точность данных о погоде прямо пропорциональна плотности модулей, размещенных в области.

Запрос Weather API принимает следующую форму:

example.com/retrieve.php?lat=25.96446&lon=53.9443&format=json

Где выходной формат (формат) может быть одним из следующих значений:

  • JSON (рекомендуется), указывает вывод в нотации объектов JavaScript (JSON); или
  • XML указывает вывод в формате XML, заключенный в узел.

Параметры запроса:

Как правило, для всех URL-адресов параметры разделяются символом амперсанда (&). Список параметров и их возможные значения указаны ниже.

Обязательные параметры:

  • lat: обозначает широту местоположения для поиска. (например, широта = 19,56875)
  • lon: отображение долготы местоположения для поиска. (например, lon = 72,97568)

Дополнительные параметры:

формат: задает выходной формат ответа для данных о погоде. Это может быть JSON или XML. По умолчанию используется JSON. (например, format = json или format = xml)

Погодные реакции:

Для каждого действительного запроса служба часового пояса будет возвращать ответ в формате, указанном в URL-адресе запроса. Каждый ответ будет содержать следующие элементы:

  • успех: значение, указывающее статус ответа.

    • 0: отрицательно; указывает на неправильный формат запроса.
    • 1: утвердительный; указывает, что запрос был успешным.
  • message: строка, указывающая причину некорректности запроса. Доступно только при отрицательном статусе.
  • data: массив с несколькими погодными параметрами.

    • temp: данные о температуре.
    • гул: данные о наличии влажности.
    • прес: данные об абсолютном давлении.
    • aqi: настоящий индекс качества воздуха.

Примеры ответов обоих форматов можно увидеть на изображениях.

Шаг 5: Настройка модуля

Настройка модуля
Настройка модуля
Настройка модуля
Настройка модуля

Точка доступа создается, и веб-страница размещается на IP-адресе (по умолчанию: 192.168.4.1) для получения учетных данных от диспетчера устройств / пользователя при самой первой загрузке или если модуль не находит уже сохраненные учетные данные в EEPROM.

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

После того, как все данные введены, нажмите кнопку «ОТПРАВИТЬ», и все учетные данные будут записаны в EEPROM модуля.

Этот шаг очень важен, поскольку при массовом производстве модулей невозможно запрограммировать все модули с его точными данными о местоположении и учетными данными Wi-Fi. Кроме того, не рекомендуется жестко кодировать учетные данные в программе, поскольку, если нам вообще нужно переместить модуль в какое-то другое место или мы хотим изменить учетные данные WiFi, нам нужно будет перепрограммировать модуль. Чтобы избежать этих хлопот, реализована функция начальной настройки.

Шаг 6. Пришло время передать данные в облако

Пришло время передать данные в облако
Пришло время передать данные в облако
Пришло время передать данные в облако
Пришло время передать данные в облако

После того, как все предыдущие шаги выполнены, теперь пора позволить модулю загрузить данные на сервер. Он автоматически начнет загрузку после того, как вы сохраните учетные данные.

Он вызывает «insert.php» как вызов API с передачей всех параметров для отправки в методе GET.

Приведенный ниже фрагмент кода показывает, как обрабатываются параметры.

if (isset ($ _ GET ['temp']) && isset ($ _ GET ['hum']) && isset ($ _ GET ['pres']) && isset ($ _ GET ['aqi']) && isset ($ _ GET ['mac']) && isset ($ _ GET ['lat']) && isset ($ _ GET ['lon'])) 2. {3. // основная программа 4.}

Таким образом, все модули начинают выгружать данные.

Примечание. Уменьшите частоту загрузки в коде, если вы чувствуете, что сервер перегружен.

Шаг 7. Обновление по воздуху (OTA)

Обновление по воздуху (OTA)
Обновление по воздуху (OTA)

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

Чтобы проверить наличие нового обновления, модуль вызывает update.php, отправляя MAC-адрес в заголовке запроса. Затем сервер проверяет, есть ли для этого конкретного MAC-адреса какое-либо новое обновление, если да, то он отправляет двоичный файл последней прошивки в ответ.

Он также проверяет наличие всех необходимых заголовков, необходимых для базовой аутентификации модуля.

Шаг 8: Как пользователь / клиент может получить доступ к данным…

Как пользователь / клиент может получить доступ к данным…
Как пользователь / клиент может получить доступ к данным…
Как пользователь / клиент может получить доступ к данным…
Как пользователь / клиент может получить доступ к данным…
Как пользователь / клиент может получить доступ к данным…
Как пользователь / клиент может получить доступ к данным…

Получить доступ к данным с сервера довольно просто. Просто вызвав «retrieve.php», мы получим данные о погоде в ответ в формате JSON. После этого остается лишь проанализировать данные JSON для доступа к отдельным элементам. То же самое и с ответом XML. Пользователь всегда может указать предпочтительный формат ответа, с которым ему удобно работать. Если пользователь не указывает формат, по умолчанию используется формат JSON.

Образец запроса делается с помощью инструмента POSTMAN для проверки работы API.

Пример синтаксического анализа ответа JSON в javascript показан во фрагменте кода ниже.

var url = "https://example.com/retrieve.php?lat=19.044848&lon=72.8464373";function httpGet (theUrl) {var xmlHttp = new XMLHttpRequest (); xmlHttp.open («ПОЛУЧИТЬ», theUrl, false); // false для синхронного запроса xmlHttp.send (null); return xmlHttp.responseText; } var myVar = httpGet (URL); var obj = JSON.parse (myVar); document.getElementById ("aqi"). innerHTML = obj.data [0].aqi; document.getElementById ("температура"). innerHTML = Math.round (obj.data [0].temp) + "° C"; document.getElementById ("temp"). innerHTML = Math.round (obj.data [0].temp) + "° C"; document.getElementById («влажность»). innerHTML = Math.round (obj.data [0].hum) + «%»; document.getElementById ("давление"). innerHTML = Math.round (obj.data [0].pres) + "mb";

Исходный код примера HTML-страницы, анализирующей ответ JSON, доступен в конце этого шага.

Примечание. Измените расширение файла на «.html».

Шаг 9: Ограничения этого проекта

  • Проект использует GET для отправки данных; даже несмотря на то, что он не имеет дело с конфиденциальными данными, данными можно легко манипулировать, поскольку он не имеет никакого механизма для проверки подлинности источника, кроме проверки заголовков, которые можно легко изменить, и даже обычное устройство можно подделать казаться погодным модулем.
  • Поскольку модуль полностью полагается и зависит от другой точки доступа (WIFI) для отправки данных, которые в большинстве случаев будут принадлежать другим организациям. Если по какой-то причине точка доступа вообще не работает, модуль не сможет отправлять данные.
  • Несмотря на то, что проект построен для повышения точности существующей системы, датчик, доступный на рынке, менее точен, чем ожидалось, что в результате приводит к сбою его основной цели.
  • При планировании проекта я планировал включить режим, в котором сервер усредняет значение данных в зависимости от местоположения для исправления ошибок. Но после реализации этой функции я понял, что для перевода координат в географические регионы нужны сторонние API.

Шаг 10: Дальнейшие улучшения, которые можно внести в этот проект

  • Точность модуля может быть дополнительно повышена за счет специальной настройки датчиков для конкретной цели вместо использования универсального модуля, доступного на рынке.
  • Модуль можно модифицировать, чтобы он работал еще более независимо, используя специальный чип, который по беспроводной связи обменивается данными с вышками сотовой связи для отправки данных, что повышает отказоустойчивость.
  • Солнечная панель и аккумуляторная система могут использоваться в сочетании с режимом глубокого сна ESP, что повышает энергоэффективность и делает его более независимым от внешнего источника питания.
  • POST может использоваться для отправки данных с некоторым механизмом аутентификации, например с использованием циклических кодов для каждой передачи данных.
  • Вместо NodeMCU, который представляет собой макетную плату, мы можем использовать специальный микроконтроллер в массовом производстве, что не только снижает стоимость, но и позволяет наилучшим образом использовать системные ресурсы.
  • В сочетании с API геолокации Google и подключением к любому доступному открытому Wi-Fi модуль может работать даже без его настройки; готов к передаче данных с завода без каких-либо дополнительных настроек.

Шаг 11: Несколько слов для аудитории

Несколько слов для аудитории
Несколько слов для аудитории

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

Если вам нужна помощь в создании этого проекта или чего-то подобного, просто напишите мне на [email protected] или оставьте комментарий, как всегда. Я постараюсь помочь вам в меру своих возможностей.

Спасибо!!

Рекомендуемые: