GPS часы на Arduino Uno

В настоящее время вокруг земли летает достаточно много GPS спутников, которые обеспечивают точное определение местоположения любой точки на Земле. Но вместе с координатами (широта и долгота) они передают и много других полезных данных, например, время, дату, высоту над уровнем моря, угол и т.д. Более подробно эти вещи мы уже рассматривали в статье про считывание GPS данных с помощью персонального компьютера и Arduino Uno, в этой же статье мы рассмотрим проектирование GPS часов на основе платы Arduino Uno, использующих данные о времени и дате, получаемые с GPS спутников. Эти GPS часы будут весьма точными и показывать дату и время с точностью до миллисекунды.

Внешний вид экрана GPS часов на Arduino Uno

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

Плата Arduino Uno
Источник питания
ЖК дисплей 16х2
GPS модуль
Соединительные провода

Принципы работы устройства

GPS модуль передает данные в NMEA формате, пример этих данных можно посмотреть на рисунке ниже. NMEA формат состоит из нескольких строк (предложений), из которых нам нужно будет извлечь только время и дату. Эти данные содержатся в строке $GPRMC, которая содержит время, дату, координаты и другую полезную информацию. Длина строки $GPRMC составляет примерно 70 символов. Мы уже рассматривали пример извлечения нужных нам GPS данных из строки $GPGGA в проекте определения местоположения автомобиля, здесь же мы будем извлекать данные из строки $GPRMC.

Пример GPS данных

Строка $GPRMC, в основном, содержит скорость, время, дату и местоположение:

$GPRMC,123519.000,A, 7791.0381,N, 06727.4434,E,022.4,084.4,230394,003.1,W*6A

$GPRMC,HHMMSS.SSS,A,latitude,N,longitude,E,speed,angle,date,MV,W,CMD

В следующей таблице представлен перевод (описание) данных 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 чтобы получить время, соответствующее времени в Индии, вы для своего региона можете легко узнать соответствующую поправку.

Работа схемы

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

Схема GPS часов на Arduino UnoПлата 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.

#include<LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#include <SoftwareSerial.h>
SoftwareSerial Serial1(10, 11); // RX, TX
... ....
.... ....

После этого мы инициализируем последовательную связь, ЖК дисплей и показываем приветственное сообщение на ЖК дисплее. Затем извлекаем время и дату из принятой строки.

while(x<str_lenth)
{
if(str[x]==',')
comma++;
if(comma==1)
{
x++;
UTC_hour+=str[x++];
... ....
.... ....

Затем конвертируем время и дату в десятичный формат и приводим ее ко времени в Индии (UTC +5:30).

int UTC_hourDec=UTC_hour.toInt();
int UTC_minutDec=UTC_minut.toInt();
int Second=UTC_second.toInt();
int Date=UTC_date.toInt();
int Month=UTC_month.toInt();
... ....
.... ....

После этого выводим дату и время на экран ЖК дисплея с помощью функции lcd.print. Далее представлен полный текст программы.

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

(1 голосов, оценка: 5,00 из 5)
Загрузка...
164 просмотров


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

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