GPS (Глобальная система позиционирования) становится все более популярной в наши дни благодаря ее функциональности и удобству применения в недорогих проектах. GPS – это не только данные о местоположении, но и другая полезная информация со спутников.

В этом обучающем проекте с Arduino мы создадим электронные цифровые часы исключительно на основе модуля GPS. Устройство собирает информацию со спутника в виде длинной строки длиной 70 символов и показывает только дату и время. В этой статье мы покажем вам, как извлечь точную дату и время из строки ($GPRMC), которая была получена с помощью модуля GPS.
Центральным вычислительным элементом данного проекта является плата Arduino Uno на основе микроконтроллера ATmega328. В качестве GPS модуля в данном случае применяется SIM808 EVB-V3.2 компании SIMCOM, который представляет собой высокоинтегрированный модуль с возможностями GSM/GPRS, GPS и Bluetooth. Также для отображения данных (время и день недели) используется буквенно-цифровой ЖК-дисплей 16X2. Схема подключения аппаратной части приведена далее:

Подключение компонентов очень простое, вывод GPS-модуля Tx подключается к выходу Rx (D0) платы Arduino Uno, а контакт Rx модуля заземлен, как показано на схеме. Земли платы Arduino Uno board и GPS-модуля должны быть подключены друг к другу. Дисплей подключен в соответствии с 4-битным режимом работы.
Ниже приведен код (скетч) для Arduino. Программная часть достаточно проста и понятна. Эта программа проверяет данные с GPS-приемника и извлекает только строку $GPRMC, которая содержит дату и время, и отображает ее на ЖК-дисплее.
#include<LiquidCrystal.h>
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char str[70];
char *test="$GPRMC";
int temp,i;
DFRobot_SIM808 sim808(&Serial);
void setup()
{
Serial.begin(9600);
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("GPS DigitalClock");
lcd.setCursor(0,1);
lcd.print("Best Engg. Proj.");
delay(300);
if( sim808.attachGPS())
Serial.println("Open the GPS power success");
else
Serial.println("Open the GPS power failure");
}
void loop()
{
serial1Event();
if (temp)
{
lcd.clear();
int str_lenth=i;
int x=0,comma=0;
String UTC_hour="";
String UTC_minut="";
String UTC_second="";
String UTC_date="";
String UTC_month="";
String UTC_year="";
String str1="";
while(x<str_lenth)
{
if(str[x]==',')
comma++;
if(comma==1)
{
x++;
UTC_hour+=str[x++];
UTC_hour+=str[x++];
UTC_minut+=str[x++];
UTC_minut+=str[x++];
UTC_second+=str[x++];
UTC_second+=str[x];
comma=2;
}
if(comma==10)
{
x++;
UTC_date+=str[x++];
UTC_date+=str[x++];
UTC_month+=str[x++];
UTC_month+=str[x++];
UTC_year+=str[x++];
UTC_year+=str[x];
}
x++;
}
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();
int Year=UTC_year.toInt();
int Hour=UTC_hourDec+5;// измените час в соответствии с вашим часовым поясом
if(Hour>23)
{
Hour-=24;
Date+=1;
}
int Minut=UTC_minutDec+45;// измените минуты в соответствии с вашим часовым поясом
if(Minut>59)
{
Minut-=60;
Hour+=1;
}
// UTC_Nepal_zone_time
lcd.clear();
lcd.print("Date: ");
lcd.print(Date);
lcd.print("/");
lcd.print(Month);
lcd.print("/");
lcd.print("20");
lcd.print(Year);
lcd.setCursor(0,1);
lcd.print("Time: ");
lcd.print(Hour);
lcd.print(":");
lcd.print(Minut);
lcd.print(":");
lcd.print(Second);
// delay(100);
temp=0;
// j=0;
i=0;
x=0;
str_lenth=0;
// k=0;
}
// delay(1000);
}
void serial1Event()
{
while(1)
{
while (Serial.available()) // проверка последовательных данных с GPS
{
char inChar = (char)Serial.read();
str[i]= inChar; // запись данных из GPS в str[]
i++;
if (i < 7)
{
if(str[i-1] != test[i-1]) // проверка строки $GPRMC
{
i=0;
}
}
if(i>65)
{
temp=1;
break;
}
}
if(temp)
break;
}
}
© digitrode.ru