Рубрики
Схемы на Arduino

Отслеживание местоположения автомобиля на Google Maps с помощью Arduino, ESP8266 и GPS

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

А в этой статье мы рассмотрим более продвинутую версию этого проекта, в котором вы сможете отслеживать местоположение своего автомобиля на гугл картах (Google Maps). Для выполнения этой задачи мы будем передавать координаты автомобиля на локальный сервер, после чего вы должны будете открыть веб-страницу (webpage) на вашем компьютере или мобильном телефоне, в которой вы найдете ссылку на местоположение вашего автомобиля на Google Maps. Кликнув по этой ссылке, вы перейдете на Google Maps с отмеченными координатами вашего автомобиля. В этом проекте GPS модуль будет использоваться для получения значений координат, Wi-Fi модуль будет передавать данные на компьютер или мобильный телефон с помощью Wi-Fi, а плата Arduino будет управлять всеми этими процессами.

Принципы работы проекта

Чтобы отслеживать местоположение автомобиля нам необходимо получить его координаты с помощью GPS модуля. Далее мы должны передать эти координаты от GPS модуля в плату Arduino с помощью последовательного порта. После этого Arduino извлекает необходимые данные из данных, полученных от GPS модуля. Структурная схема работа устройства приведена на следующем рисунке.

Но перед этим Arduino должна передать ряд команд Wi-Fi модулю ESP8266 чтобы сконфигурировать его, подсоединиться к роутеру и получить IP адрес. После этого Arduino инициализирует GPS модуль для получения координат и показывает на ЖК дисплее сообщение ‘Page Refresh message’, которое будет означать что пользователь должен обновить веб-страницу. Когда пользователь обновит веб-страницу Arduino считывает координаты из GPS модуля и передает на веб-страницу (локальный сервер) новые данные по Wi-Fi, в которых будет содержаться ссылка на Google maps. Кликнув по этой ссылке пользователь перейдет на сайт Google Maps где красной точкой будет отмечено текущее местоположение его автомобиля на Google Maps. Более подробно весь этот процесс показан на видео в конце статьи.

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

  1. Плата Arduino Uno (купить на AliExpress).
  2. ЖК дисплей 16х2 (купить на AliExpress).
  3. Wi-Fi модуль ESP8266 (купить на AliExpress).
  4. GPS модуль (купить на AliExpress).
  5. Wi-Fi роутер.
  6. USB кабель.
  7. Источник питания.
  8. Компьютер (ноутбук).
  9. Макетная плата.
  10. Соединительные провода.

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема содержит плату Arduino Uno, GPS модуль и Wi-Fi модуль ESP8266. На ЖК дисплее будут показываться различные статусные сообщения. ЖК дисплей подключен к контактам 14-19 (A0-A5) платы Arduino.

Контакт Tx GPS модуля поключен к цифровому контакту 10 платы Arduino. С использованием Software Serial Library (библиотеки последовательной связи) мы можем задействовать последовательную связь на контактах 10 и 11 Arduino и сделать их соответственно контактами Rx и Tx последовательной связи. Контакт Rx GPS модуля оставим в свободном состоянии. По умолчанию, последовательная связь доступна на контактах 0 и 1 платы Arduino, но с использованием Software Serial Library мы сможем организовать последовательную связь на любых других цифровых контактах Arduino. Адаптер на 12 Вольт будет использоваться для питания GPS модуля. Ряд моментов об использовании GPS модуля совместно с Arduino можно прочитать в статье про считывание GPS данных с помощью персонального компьютера и Arduino Uno.

Контакты Vcc и GND модуля ESP8266 подключены к контактам 3.3V и GND платы Arduino, контакт CH_PD также подсоединен к 3.3V. Контакты Tx и Rx модуля ESP8266 непосредственно подсоединены к контактам 2 и 3 платы Arduino. Библиотека последовательного порта (Software Serial Library) используется чтобы осуществлять последовательную связь на контактах 2 и 3 Arduino. Также об использовании Wi-Fi модуля ESP8266 совместно с Arduino можно прочитать в статье про передачу данных от Arduino Uno на веб-страницу с помощью WiFi.

Внешний вид Wi-Fi модуля ESP8266 показан на следующем рисунке.

Модуль ESP8266 имеет 2 светодиода, один из которых красного цвета (для индикации подачи питания на плату), а второй синего цвета (для индикации процесса передачи данных). Синий светодиод мигает когда модуль ESP8266 передает какие-нибудь данные через свой контакт Tx. Не соединяйте ваш модуль ESP8266 с источником питания +5 Вольт иначе можете повредить модуль. В нашем проекте мы будем использовать скорость 9600 бод/с для последовательной связи.

Наглядно посмотреть процесс обмена данными в последовательном режиме между Wi-Fi модулем ESP8266 и платой Arduino вы можете в мониторе последовательной связи (Serial Monitor). Также более подробно эти процессы показаны в видео в конце статьи.

Преобразование GPS минут в десятичные координаты

GPS модуль получает координаты от спутников в формате минут (ddmm.mmmm), а для определения местоположения на Google Maps нам нужен десятичный формат координат, поэтому мы сначала должны осуществить преобразование координат из одного формата в другой.

Предположим, что мы получили координаты широты (Latitude) от GPS модуля в виде 2856.3465 (ddmm.mmmm). Первые две цифры здесь будут обозначать градусы, а оставшиеся цифры будут обозначать минуты. То есть мы будем иметь 28 градусов и 56.3465 минут. То есть 28 градусов нам нет необходимости конвертировать, а нам нужно конвертировать только минуты в десятичный формат при помощи деления значения минут на 60. Получаем формулу:

Decimal Degree Coordinate = Degree + Minute/60
Decimal Degree Coordinate = 28 + 56.3465/60
Decimal Degree Coordinate = 28 + 0.94
Decimal Degree Coordinate = 28.94

Аналогичные преобразования нужно произвести и для значения долготы (Longitude).

Эти преобразования мы в программе для Arduino будем делать с помощью следующего кода:

float minut= lat_minut.toFloat();
minut=minut/60;
float degree=lat_degree.toFloat();
latitude=degree+minut;
minut= long_minut.toFloat();
minut=minut/60;
degree=long_degree.toFloat();
logitude=degree+minut;

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

В программе мы будем использовать SerialSoftware library чтобы подключить ESP8266 и GPS модуль к Arduino. Также в программе необходимо инициализировать ряд контактов и задействовать последовательную связь со скоростью 9600 бод/с. А также подключить библиотеку для работы с ЖК дисплеем.

#include<SoftwareSerial.h>
SoftwareSerial Serial1(2,3); //make RX arduino line is pin 2, make TX arduino line is pin 3.
SoftwareSerial gps(10,11);
#include<LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);

После этого нам необходимо объявить ряд переменных и строк.

String webpage="";
int i=0,k=0;
int gps_status=0;
String name="<p>1. Name: Your Name </p>"; //22
String dob="<p>2. DOB: 12 feb 1993</p>"; //21
String number="<p>4. Vehicle No.: RJ05 XY 4201</p>";//29
String cordinat="<p>Coordinates:</p>"; //17
String latitude="";
String logitude="";
String gpsString="";
char *test="$GPGGA";

Далее мы должны запрограммировать процесс получения координат от GPS модуля.

void gpsEvent()
{
gpsString="";
while(1)
{
while (gps.available()>0)
{
char inChar = (char)gps.read();
gpsString+= inChar;
if (i < 7)
{
if(gpsString[i-1] != test[i-1])
{
i=0;
..... ....
..... .....

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

void coordinate2dec()
{
String lat_degree="";
for(i=18;i<20;i++)
lat_degree+=gpsString[i];

String lat_minut=»»;
for(i=20;i<28;i++)
lat_minut+=gpsString[i];
….. ….
….. …..

Также необходимо запрограммировать ряд функций для передачи команд на модуль ESP8266 для соединения его с сетью WiFi.

void connect_wifi(String cmd, int t)
{
int temp=0,i=0;
while(1)
{
Serial.println(cmd);
Serial1.println(cmd);
while(Serial1.available()>0)
..... ....
..... .....

Функция void show_coordinate() предназначена для показа координат на ЖК дисплее и мониторе последовательного порта (Serial Monitor), а функция void get_ip() предназначена для получения IP адреса.

Функция Void Send() предназначена для формирования строки с необходимой информацией для передачи ее на веб-страницу с использованием модуля ESP8266, а функция void sendwebdata() необходима для передачи строки с информацией на веб-страницу с использованием последовательной связи.

В функции void loop плата Arduino непрерывно ждет запроса на обновление страницы (Refreshing web page).

void loop()
{
k=0;
Serial.println("Please Refresh Ur Page");
lcd.setCursor(0,0);
lcd.print("Please Refresh ");
lcd.setCursor(0,1);
lcd.print("Your Web Page.. ");
while(k<1000)
..... ....
..... .....

Далее представлен полный текст программы.

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

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

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