Рубрики
Проекты на ESP8266

Геозонирование с модулем GPS и NodeMCU ESP8266

В данной статье представлена простая демонстрация проекта геозонирования (Geo-fencing) с использованием GPS-модуля и NodeMCU ESP8266. Geo-fencing (геозонирование, геоограждение) — это виртуальная граница или забор, который окружает физический участок. Он образует барьер между этим участком и окружающей средой, как реальный забор. В отличие от физического забора, Geo-Fencing с NodeMCU ESP8266 может обнаруживать движение внутри виртуального забора. Он может быть любого размера или формы.

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

В этой статье мы создадим динамический веб-сервер на основе AJAX (асинхронный JavaScript и XML) для отслеживания цели. Виртуальный забор будет создан путем маркировки вершин многоугольника на картах Google. Алгоритм «точка в многоугольнике» будет использоваться для определения того, находится ли цель внутри забора или за его пределами.

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

Необходимые компоненты

В этом проекте геозонирования с помощью NodeMCU мы должны отправиться на поле для тестирования. Сделать это на уровне макетной платы — невыполнимая идея. Поэтому NodeMCU должен питаться от батареи. Я использовал одноэлементную батарею LiPo для питания оборудования. Я использовал TP4056 для безопасной зарядки и разрядки батареи.

  1. NodeMCU ESP8266 (купить на AliExpress).
  2. GPS-модуль Quectel L80 (купить на AliExpress).
  3. Модуль зарядного устройства аккумулятора TP4056 (купить на AliExpress).
  4. Аккумулятор емкостью 1000 мАч.
  5. Нажимной переключатель.
  6. Макетная плата.
  7. Соединительные провода/перемычки.

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

Алгоритм «точка в многоугольнике»

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

Предположим, что созданный пользователем забор представляет собой n-мерный многоугольник, и у нас есть координаты всех вершин многоугольника в формате Vn (xn , yn ). Пусть текущее местоположение точки отслеживания будет T (xt , yt ). Анимация ниже дает вам наглядное представление о том, как работает этот алгоритм.

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

Теперь давайте рассмотрим шаги для вычисления угла с помощью имеющихся у нас координат. Мы все знаем скалярное произведение двух векторов ( |ab| = |a|.|b|.cos(θ) ). Здесь пусть ‘ a ‘ будет вектором из точки отслеживания в вершину 1, а ‘ b ‘ будет вектором из точки отслеживания в вершину 2. Значение ‘ θ ‘ можно найти, оставив ‘ θ ‘ в одной части уравнения и перенеся оставшееся в другую.

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

Веб-сервер на базе AJAX

Мы создадим веб-сервер на основе AJAX для динамического мониторинга цели в реальном времени. Так чем же этот AJAX-сервер отличается от обычных веб-серверов? Давайте посмотрим на ответ на этот вопрос.

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

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

Взаимодействие Quectel L80 с NodeMCU

В одной из предыдущих статей мы обсуждали, как соединить датчик Quectel L80 GPS с Arduino Nano. Взаимодействие модуля L80 GPS с NodeMCU ESP8266 примерно такое же.

Перейдите по этой ссылке, чтобы прочитать предыдущую статью о взаимодействии Quectel L80 с Arduino.

Мы будем использовать аналогичную схему для разработки нашего проекта геозоны с помощью NodeMCU ESP8266.

Схема проекта

Схема проекта геозонирования на модуле GPS и NodeMCU ESP8266 представлена на следующем рисунке.

Подключения схемы просты. Поскольку Quectel L80 основан на UART, мы можем использовать программный последовательный порт, чтобы подключить контакты RX и TX Quectel L80 к любым цифровым контактам NodeMCU ESP8266.

Аккумулятор подключен к TP4056. Узел MCU получает питание от выхода TP4056 через коммутатор.

Вот как выглядит оборудование после подключения. Я также заклеил оборудование, чтобы оно было под рукой.

Я также сделал корпус, напечатанный на 3D-принтере. Вы можете скачать файл STL и файл GCode для 3D-печати.

Теперь с аппаратной частью все хорошо. Можно приступать к программной части.

Печатная плата для проекта

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

Файл Gerber для изготовления данной печатной платы вы можете скачать по следующей ссылке.

Исходный код программы

Вот программа для нашего проекта, которую следует загрузить на плату NodeMCU ESP8266.

Если вы работаете не с Arduino IDE, а с PlatformIO, вы можете клонировать этот репозиторий и начать загрузку кода в NodeMCU, введя «pio run –target upload» в PlatformIO CLI или выбрав опцию загрузки. Не забудьте поставить звездочку репозитория после клонирования :).

Веб-сервер на основе AJAX содержится в этом заголовочном файле. Если вы используете Arduino IDE, убедитесь, что этот заголовочный файл и файлы «.ino» находятся в одном каталоге. Если вы используете PlatformIO, просто клонируйте вышеупомянутый репозиторий.

Объяснение кода

Я использовал библиотеку TinyGPS++ для декодирования операторов NMEA, считываемых с Quectel L80. Библиотеку SoftwareSerial для создания виртуального последовательного порта. Библиотека ESP8266WebServer используется для создания веб-сервера на базе AJAX.

Функция «connectWifi()» позволяет NodeMCU подключиться к домашней точке доступа (AP). Переменная «WiFiConnectionMode» определяет режим подключения к AP. Если переменная установлена ​​на «0», устройство подключается к AP через интеллектуальную конфигурацию, а если переменная установлена ​​на «1», устройство подключается к AP, используя учетные данные AP, которые жестко закодированы в переменных «ssid», «password» внутри функции. Вы можете использовать приложение «EspTouch», которое доступно в магазине Google Play, если вы решите использовать NodeMCU в режиме мягкой конфигурации.

Функция «updateLatLon()» обновляет переменные широты, долготы, высоты, скорости и даты при каждом вызове функции.

Функция «pip()» обновляет переменную «targetStatus» всякий раз, когда она вызывается. Она реализует алгоритм «точка в многоугольнике» с использованием обновленных координат. Если цель находится внутри ограждения, переменная «targetStatus» устанавливается в «1», в противном случае — в «0».

«handleRoot()», «fenceSelect()» и «gps_data()» являются обработчиками. Эти обработчики предназначены для отправки соответствующих данных на клиентскую сторону при запросе. «handlerRoot()» предназначен для обработки корневой веб-страницы и отправки всей веб-страницы. «gps_data()» предназначен для обработки данных GPS, этот обработчик преобразует широту, долготу, количество спутников, дату, статус цели и кумулятивный/суммарный угол (θsum) в строку, разделенную «#». Обработчик «fenceSelect()» получает выбранную информацию о геозоне от веб-сервера.

Создание забора на картах Google и жесткое кодирование координат

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

Теперь жестко закодируйте широту и долготу забора в переменную fence, которая является трехмерным массивом. Третье измерение — для хранения координат различных гео-зон.

Тестирование работы проекта

Загрузите код, выбрав соответствующие настройки в IDE, которую вы используете (Arduino или PlatformIO). Если вы используете PlatformIO, после загрузки кода вы увидите что-то вроде нижеприведенного в PlatformIO CLI.

После этого откройте последовательный монитор. В нем вы должны увидеть примерно следующую картину.

Откройте этот IP-адрес в браузере. Теперь вы можете найти веб-сервер с пустыми значениями, как показано ниже.

Откройте карты Google и веб-сервер в режиме разделенного экрана, чтобы увидеть перемещение цели вместе с гео-зоной, а также ее статус на панели управления. Нижеприведенный gif показывает конечный результат.

На приведенном выше gif-изображении четко видна геозона. Когда точка привязки пересекает геозону, переменная статуса цели на панели инструментов обновляется до значения «вне» и наоборот. А также другие данные, такие как широта, долгота, количество подключенных спутников и дата, также можно увидеть на панели инструментов.

Вот как можно создать проект геозонирования с помощью платы NodeMCU ESP8266. Беспроводная версия проекта Geo Fecing может быть создана с использованием модуля LoRa.

Видео, демонстрирующее работу проекта

Ссылка на видео на YouTube

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *