GPS часы на Arduino Uno
Содержание
В настоящее время вокруг земли летает достаточно много GPS спутников, которые обеспечивают точное определение местоположения любой точки на Земле. Но вместе с координатами (широта и долгота) они передают и много других полезных данных, например, время, дату, высоту над уровнем моря, угол и т.д. Более подробно эти вещи мы уже рассматривали в статье про считывание GPS данных с помощью персонального компьютера и Arduino Uno, в этой же статье мы рассмотрим проектирование GPS часов на основе платы Arduino Uno, использующих данные о времени и дате, получаемые с GPS спутников. Эти GPS часы будут весьма точными и показывать дату и время с точностью до миллисекунды.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- GPS модуль (купить на AliExpress).
- Источник питания.
- Соединительные провода.
Принципы работы устройства
GPS модуль передает данные в NMEA формате, пример этих данных можно посмотреть на рисунке ниже. NMEA формат состоит из нескольких строк (предложений), из которых нам нужно будет извлечь только время и дату. Эти данные содержатся в строке $GPRMC, которая содержит время, дату, координаты и другую полезную информацию. Длина строки $GPRMC составляет примерно 70 символов. Мы уже рассматривали пример извлечения нужных нам GPS данных из строки $GPGGA в проекте определения местоположения автомобиля, здесь же мы будем извлекать данные из строки $GPRMC.
Строка $GPRMC, в основном, содержит скорость, время, дату и местоположение:
$GPRMC,123519.000,A, 7791.0381,N, 06727.4434,E,022.4,084.4,230394,003.1,W*6A
В следующей таблице представлен перевод (описание) данных GPS из строки $GPRMC.
Идентификатор | Описание |
RMC | Recommended Minimum sentence C |
HHMMSS.SSS | Время в формате: час минута секунда и миллисекунда |
A | Статус // A=active (активный) and V= void (пустой, недействительный) |
Latitude | Широта (координата) |
N | Направление: N=North (север), S=South (юг) |
Longitude | Долгота (координата) |
E | Направление: E= East (восток), W=West (запад) |
Speed | Скорость в узлах (1 узел= 1,87 км в час) |
Angle | Угол места в градусах |
Date | Временная отметка (дата в UTC, Universal Time Coordinated — всеобщее скоординированное время) |
MV | Магнитное возмущение |
W | Direction of variation E/W (направление изменения E/W) |
CMD (*6A) | Данные контрольной суммы |
В большинстве случаев эта строка ($GPRMC) используется для извлечения данных времени, даты и скорости.
Мы можем извлечь время и дату из строки $GPRMC при помощи подсчета запятых в этой строке. Таким образом, с помощью Arduino мы будем находить в GPS данных строку $GPRMC и сохранять ее в массиве, в котором время (в 24-часовом формате) может быть найдено после одной запятой, а дата – после 9 запятых. Время и дата потом сохраняются в соответствующих строках.
GPS спутники передают время и дату в формате UTC (Universal Time Coordinated — всеобщее скоординированное время), поэтому мы должны конвертировать его в местное время. В нашем проекте мы добавили к этому времени 5:30 чтобы получить время, соответствующее времени в Индии, вы для своего региона можете легко узнать соответствующую поправку.
Работа схемы
Схема устройства представлена на следующем рисунке.
Плата Arduino управляет всеми процессами на этой схеме: она принимает данные от GPS модуля, извлекает дату и время из строки $GPRMC и показывает их на экране ЖК дисплея.
Контакты данных ЖК дисплея D4, D5, D6, D7 подсоединены к контактам 5, 4 , 3, 2 Arduino, а контакты управления ЖК дисплея RS и EN подсоединены к контактам 7 и 6 Arduino. Контакт передачи Tx GPS модуля подсоединен к контакту Rx (pin 10) платы Arduino (мы этот контакт сделаем входом последовательного порта с помощью соответствующей бибблиотеки). Контакты земли GPS модуля и платы Arduino соединены вместе. В данной схеме мы использовали GPS модуль SKG13BL, функционирующий на скорости 9800 бод/с, плату Arduino (ее последовательный порт) также можно сконфигурировать на работу со скоростью 9800 бод/с с помощью команды “Serial.begin(9800)”.
Исходный код программы
В программе мы первым делом должны подключить необходимые библиотеки и инициализировать контакты для подключения ЖК дисплея и последовательной связи. Также необходимо инициализировать необходимые переменные и массивы для хранения данных. При помощи библиотеки для последовательной связи (Software Serial Library) мы можем осуществить последовательную связь на контактах 10 и 11 (мы будем использовать только 10-й) и сделать их выводами Rx и Tx соответственно. По умолчанию последовательная связь в плате Arduino доступна на ее контактах 0 и 1, но благодаря библиотеке для последовательной связи (Software Serial Library) мы дополнительно к этому можем реализовать последовательную связь и на контактах 10 и 11 Arduino.
#includeLiquidCrystal.h
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#include SoftwareSerial.h
SoftwareSerial Serial1(10, 11); // RX, TX
. .
. .
После этого мы инициализируем последовательную связь, ЖК дисплей и показываем приветственное сообщение на ЖК дисплее. Затем извлекаем время и дату из принятой строки.
Затем конвертируем время и дату в десятичный формат и приводим ее ко времени в Индии (UTC +5:30).
Источник: