Estoy realizando un pequeño proyecto con un GPS que debe mostrar una serie de valores por pantalla, como por ejemplo la fecha, hora, latitud y longitud.
El problema es que en el caso de la fecha y la hora, el GPS muestra los datos de esta manera por defecto:
fecha: 03032014
hora: 173445.35
Me gustaría modificar esos valores para que sean más "vistosos" y facilitar su lectura en pantalla, por ejemplo:
fecha: 03/03/2014
hora: 17:34:45
¿Es esto posible? Adjunto el código que estoy usando:
#include <genieArduino.h> //Incluye la librería de la pantalla
#include <SoftwareSerial.h> //Incluye la librería del GPS
SoftwareSerial gpsSerial(10, 11); // TX, RX (RX not used)
const int sentenceSize = 80;
char sentence[sentenceSize];
int curso;
void setup()
{
genieBegin (GENIE_SERIAL, 9600); //Serial0 Comunicación con la pantalla
gpsSerial.begin(9600); //Comunicación con el GPS
}
void loop()
{
static int i = 0;
if (gpsSerial.available())
{
char ch = gpsSerial.read();
if (ch != '\n' && i < sentenceSize)
{
sentence[i] = ch;
i++;
}
else
{
sentence[i] = '\0';
i = 0;
displayGPS();
}
}
}
void displayGPS()
{
char field[20];
getField(field, 0);
if (strcmp(field, "$GPRMC") == 0)
{
getField(field, 9); // Fecha
genieWriteStr(0,field); //Comando para mostrar la fecha por pantalla en un string
getField(field, 1); // Hora
genieWriteStr(1,field); // Comando para mostrar la hora por pantalla en un string
getField(field, 3); // Latitud
genieWriteStr(2,field);
getField(field, 4); // N/S
genieWriteStr(3,field);
getField(field, 5); // Longitud
genieWriteStr(4,field);
getField(field, 6); // E/W
genieWriteStr(5,field);
}
void getField(char* buffer, int index)
{
int sentencePos = 0;
int fieldPos = 0;
int commaCount = 0;
while (sentencePos < sentenceSize)
{
if (sentence[sentencePos] == ',')
{
commaCount ++;
sentencePos ++;
}
if (commaCount == index)
{
buffer[fieldPos] = sentence[sentencePos];
fieldPos ++;
}
sentencePos ++;
}
buffer[fieldPos] = '\0';
}
He pensado en hacerlo así, pero no sé cómo incluir las tres variables dentro del genieWriteStr, que es un comando de la pantalla en el que se incluye el string que quieres que se muestre.
getField(field, 9); // La variable field es la que da el GPS con la fecha
String date = field;
String day = date.substring(0,2);
String month = date.substring(2,4);
String year = date.substring(4,8);
genieWriteStr(0, day"/"month"/"year);
Esa última línea del código da error. (el 0 representa el string en el que se va a almacenar en la pantalla las variables que se ponen después de la coma, en este caso day, month y year)
¿Alguna idea?
He estado investigando y el GPS manda el dato de la fecha en un char*, es decir, el 03042014 es una variable de tipo char*.
El comando genieWriteStr() sólo acepta variables de tipo char*, por lo que, una vez realizada la concatenación que me has comentado, hay que convertir ese string a char+ de nuevo. He probado con el comando toCharArray() y funciona.
getField(field, 9); // Date
String date = field;
String day = date.substring(0,2);
String month = date.substring(2,4);
String year = date.substring(4,8);
String fecha = (day+"/"+month+"/"+year);
char fecha1 [10];
fecha.toCharArray(fecha1,10);
genieWriteStr(0, fecha1);
Estoy haciendo lo mismo con el tiempo y parece que no funciona igual de bien. Creo que es un problema debido al tamaño del char array.
Este es el formato en el que me da la hora el GPS: 180546.000 y este el código que estoy usando
getField(field, 1); // Time
String time = field;
String time1 = time.substring(0,6); // Utilizo esto para eliminar el .000 sobrante de la hora
String hour = time1.substring(0,2);
String minute = time1.substring(2,4);
String second = time1.substring(4,6);
String hora = (hour+":"+minute+":"+second);
char hora1 [20];
hora.toCharArray(hora1, 20);
genieWriteStr(1, hora1);
De esta manera, la hora resultante debería ser 18:05:46. ¿Cuál es el tamaño exacto que debería tener el char hora1?