Reloj GPS con Arduino
ARDUINO

Hay muchos satélites GPS alrededor de la Tierra que se usan para proporcionar la ubicación exacta de cualquier lugar. Junto con las coordenadas de ubicación (latitud y longitud), también proporcionan otros datos como la hora, la fecha, la altitud, el ángulo de rumbo, etc. Ya aprendimos a leer estos datos GPS del satélite usando Arduino. Así que vamos a construir un reloj GPS usando los datos de “hora y fecha” del satélite GPS. El reloj actualizado por GPS es muy preciso y proporciona los datos en tiempo real con precisión de milisegundos.
Componentes:
- Arduino Uno
- Módulo GPS
- LCD 16×2
- Cables de conexión
- Fuente de alimentación
Explicación del funcionamiento:
El módulo GPS envía los datos en formato NMEA; observa la salida de los datos GPS en la siguiente captura de pantalla. El formato NMEA consta de varias sentencias, de las cuales necesitamos una para extraer la fecha y la hora. Esta sentencia comienza con $GPRMC y contiene las coordenadas, la hora y otra información útil. Este $GPRMC se refiere a los datos GPS/Transit específicos mínimos recomendados, y la longitud de esta cadena es de unos 70 caracteres. Anteriormente extrajimos la cadena $GPGGA en el sistema de rastreo vehicular para encontrar las coordenadas de latitud y longitud. Aquí está la salida del GPS:

Y la cadena $GPRMC contiene principalmente velocidad, hora, fecha y posición
$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
| Identificador | Descripción |
| RMC | Sentencia mínima recomendada C |
| HHMMSS.SSS | Hora en formato horas, minutos, segundos y milisegundos. |
| A | Estado // A=activo y V=nulo |
| Latitude | Latitud 49 grados 16.45 min. Norte |
| N | Dirección N=Norte, S=Sur |
| Longitude | Longitud (coordenada) |
| E | Dirección E=Este, W=Oeste |
| Speed | velocidad en nudos |
| Angle | Ángulo de rumbo en grados |
| Date | FECHA en UTC |
| MV | Variación magnética |
| W | Dirección de la variación E/W |
| CMD (*6A) | Datos de checksum |
Podemos extraer la hora y la fecha de la cadena $GPRMC contando las comas de la cadena. Con la ayuda de Arduino y la programación, buscamos la cadena $GPRMC y la almacenamos en un arreglo; entonces la hora (formato de 24 horas) se puede encontrar después de una coma y la fecha después de nueve comas. La hora y la fecha se guardan luego en cadenas.
Un satélite GPS proporciona la hora y la fecha en tiempo universal coordinado (UTC), así que necesitamos convertirlas según corresponda. Para convertir a la hora de la India, hemos sumado 5:30 a la hora UTC, ya que la hora de la India está 5 horas y media por delante del UTC/GMT.
Diagrama del circuito:
Las conexiones del circuito del reloj GPS con Arduino son sencillas. El Arduino se usa para controlar todo el proceso: recibe los datos GPS del satélite a través del módulo GPS, extrae la fecha y la hora de la cadena $GPRMC y las muestra en la LCD.
Los pines de datos D4, D5, D6 y D7 de la LCD 16×2 se conectan a los pines 5, 4, 3 y 2 del Arduino, y los pines de comando RS y EN de la LCD se conectan a los pines 7 y 6 del Arduino respectivamente. El pin Tx del módulo receptor GPS se conecta al pin Rx 10 del Arduino. El pin de tierra (GND) del Arduino y del GPS se conectan entre sí. Aquí usamos el módulo GPS SKG13BL, que opera a una velocidad de 9800 bps. El Arduino también se configura a 9800 bps usando la función “Serial.begin(9800)”.

Explicación de la programación:
En la parte de programación primero incluimos las bibliotecas y definimos los pines para la LCD y la comunicación serial por software. También definimos algunas variables con arreglos para almacenar los datos. Al usar aquí la biblioteca Software Serial hemos habilitado la comunicación serial en los pines 10 y 11, haciéndolos Rx y Tx respectivamente. De forma predeterminada, los pines 0 y 1 del Arduino se usan para la comunicación serial, pero al usar la biblioteca SoftwareSerial podemos habilitar la comunicación serial en otros pines digitales del Arduino
#include<LiquidCrystal.h> LiquidCrystal lcd(7, 6, 5, 4, 3, 2); #include <SoftwareSerial.h> SoftwareSerial Serial1(10, 11); // RX, TX ... .... .... ....
Después inicializamos la comunicación serial y la LCD en la función setup y mostramos un mensaje de bienvenida en la LCD.
Luego extrajimos la hora y la fecha de la cadena recibida.
while(x<str_lenth)
{
if(str[x]==',')
comma++;
if(comma==1)
{
x++;
UTC_hour+=str[x++];
... ....
.... ....Y luego convertimos la hora y la fecha a decimal y las ajustamos a la hora de la India (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(); ... .... .... ....
Y finalmente la hora y la fecha se mostraron en la LCD usando la función lcd.print ; revisa el código completo a continuación.
#include<LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#include <SoftwareSerial.h>
SoftwareSerial Serial1(10, 11); // RX, TX
char str[70];
char *test=”$GPRMC”;
int temp,i;
void setup()
{
lcd.begin(16,2);
Serial1.begin(9600);
lcd.setCursor(0,0);
lcd.print(“GPS Updated Clock”);
lcd.setCursor(0,1);
lcd.print(” Circuit Digest “);
delay(300);
}
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+30;
if(Minut>59)
Minut-=60;
// UTC_ind_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 (Serial1.available()) //checking serial data from GPS
{
char inChar = (char)Serial1.read();
str[i]= inChar; //store data from GPS into str[]
i++;
if (i < 7)
{
if(str[i-1] != test[i-1]) //checking for $GPRMC sentence
{
i=0;
}
}
if(i>65)
{
temp=1;
break;
}
}
if(temp)
break;
}
}
Artículo traducido al español. Fuente original: Circuit Digest (por Saddam).