Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Podr~mos hber hecho un progrm m~s enrevesdo pero quer~mos dejr clr l mner de trbjr con el m~dulo pr que prend~is desrrollr por vosotros mismos Vemos en un video el resultdo finl de.

Работа добавлена на сайт samzan.net:


Tutorial Arduino #0009 – Módulo GPS & Display i2C

5

20 mar 2012

Display i2C, Geoduino, GPS

by Pablo Murillo

# ARDUINO – Módulo GPS & Display i2C

Hola amig@s!

Bienvenidos a un nuevo tutorial Arduino, en este caso, el primero de la categoría expertos por la complejidad de programación que alberga, pero no os desaniméis! Estamos aquí para aprender!!

Podéis descargar los archivos necesarios compartiéndonos en las redes sociales!

Parte 1: ¿Que vamos a hacer?

En este tutorial Arduino, vamos a aprender a conectar los módulos GPS que fabrica LIBELIUM, a extraer y comprender las tramadas de datos que recibimos de los GPS y a tratar esa información para sacar por un display con bus i2C la latitud, longitud, altura y hora UTC.

Podríamos haber hecho un programa más enrevesado, pero queríamos dejar clara la manera de trabajar con el módulo para que aprendáis a desarrollar por vosotros mismos!


Veamos en un video el resultado final de este tutorial!

 

Hilo oficial de este proyecto en el foro de Arduino.cc AQUI

Material necesario para este tutorial:

  1.  1 x Arduino Uno
  2.  1 x Protoboard
  3.  1 x Módulo GPS 1037A o Módulo GPS 1080B
  4.  1 x Antena GPS interna o externa
  5.  1 x Display i2C
  6.  1 x Resistencia 220Ω
  7.  1 x Resistencia 10KΩ
  8.  1 x Diodo LED
  9.  1 x Juego de Cables

 

Parte 2: Diseñando el Hardware…

En este proyecto casi no necesitamos realizar ningún diseño de hardware, por lo que me centraré en explicar la manera de conectar cada uno de los módulos con nuestro Arduino.

Los módulos GPS

Como comentaba al principio, este tutorial sirve para los dos módulos GPS diseñados por LIBELIUM, así que veamos sus diferencias!

En primer lugar tenemos el módulo GPS 1037-A, el cual es modelo más económico, ya que tan solo utiliza el protocolo NMEA (National Marine Electronics Association) para transmitir los datos de posición.

Como veis, las conexiones son muy simples, tan solo tenemos la alimentación, y la conexión serie Rx (Recepción) y Tx (Transmisión) por la que circularán los datos.

En principio solo usaremos el Tx que transmitirá los datos hacia nuestro Arduino, pero podríamos usar el Rx para enviarle una trama al GPS y “dormirlo” mientras no lo utilicemos, algo fundamental si usamos pilas!! O también pre-establecer nuestra posición, altitud, fecha, para que el posicionamiento sea aún más rápido.

Como consejo, recomiendo aislar este módulo en alguna caja de plástico o similar y alejarlo de fuentes electromagnéticas, ya que es algo sensible.

El tiempo que puede tardar en ubicarse puede oscilar entre 5 y 8 minutos en función de las condiciones en las que estemos y el cielo abierto que tengamos a la vista.

Y la tramada recibida en nuestro Arduino sería parecida a la siguiente una vez ubicado:?

1

2

3

4

5

6

7

$GPGGA,142651.000,4138.39329,N,00053.28085,W,1,05,3.5,272.35,M,51.6,M,,*76

$GPVTG,0.0,T,,M,0.1,N,0.3,K*62

$GPGSA,A,3,10,08,07,02,04,,,,,,,,9.8,3.5,9.2*36

$GPGSV,3,1,10,13,49,047,,10,80,000,30,23,21,061,,16,07,043,*7E

$GPGSV,3,2,10,08,42,174,37,07,65,121,39,05,24,303,,02,51,277,35*7C

$GPGSV,3,3,10,04,52,213,41,120,71,269,,,,,,,,,*46

$GPGLL,4138.393,N,00053.281,W,142651.000,A*29

El otro tipo que he probado, es el módulo GPS 1080-B, a diferencia del anterior, este utiliza también el protocolo SIRF III.


Las conexiones Rx, Tx y alimentación son las mismas que en el anterior, en esta imagen podemos ver como conectar la antena al
GPS.

Este módulo es mucho más estable y rápido, además nos ofrece más datos que el anteriorpara nuestros programas, la trama recibida en nuestro Arduino sería parecida a la siguiente cuando está ubicado:

?

1

2

3

$GPGSV,3,1,11,12,60,232,37,15,58,167,36,18,26,255,32,09,70,357,*74

$GPGSV,3,2,11,27,64,057,,17,24,051,,25,19,232,21,22,18,299,*7D

$GPGSV,3,3,11,26,16,143,,14,05,317,,28,00,048,*4F

?

1

2

3

$GPRMC,183324.466,V,4138.0755,N,00055.5164,W,,,210312,,,N*63

$GPGGA,183325.466,4138.0818,N,00055.5159,W,0,03,,-51.6,M,51.6,M,,0000*72

$GPGSA,A,1,12,15,18,,,,,,,,,,,,*10

Lo he separado porque recibiremos 1 bloque como el de arriba $GPGSV por cada 5 como el de abajo.

Podríamos adentrarnos todo lo que quisiéramos en describir las tramadas, pero prefiero describir únicamente lo que vamos a utilizar en el programa y más adelante realizar otro tutorial, de todas maneras os dejo ESTE LINK para que indaguéis por vuestra cuenta, y recordar, si hacéis vuestros programas… compartirlo en el foro!

En primer lugar os muestro el significado de cada trama:

  1.  GPGGA -> Posicionamiento Global de Datos Fijos del Sistema
  2.  GPVTG -> Velocidad respecto al suelo
  3.  GPGSA -> GPS DOP (calidad de la señal) y satélites activos
  4.  GPGSV -> Información de cada satélite
  5.  GPGLL -> La posición geográfica, latitud / longitud
  6.  GPRMC-> Hora, fecha, posición, dirección y velocidad.

La trama que hemos usado para el programa es la GPGGA, ya que es común a los dos módulos y porta mucha información, la manera de interpretarla es la siguiente, teniendo en cuenta que la numeración, es la posición de la trama separada por comas:

$GPGGA,1,2,3,4,5,6,7,8,9,10,11,12,13,14*15

  1.  Hora UTC (Tiempo Universal Coordinado) en formato: hhmmss
  2.  Latitud en formato: ggmm.ssss
  3.  Orientación en latitud: N (norte) o S (sur)
  4.  Longitud en formato:gggmm.ssss
  5.  Orientación en longitud: E (este) o W (oeste)
  6.  Indicación de calidad GPS: 0=nula; 1=GPS fija
  7.  Número de satélites visibles por el receptor: nn
  8.  Dilución horizontal de posición: xx.x
  9.  Altitud de la antena por encima / por debajo del nivel del mar (geoidal): xxxxx.x
  10.  Unidades de altitud: M (metros)
  11.  Separación geoidal: xxx.x
  12.  Unidades de separación: M (metros)
  13.  Tiempo en segundos desde la última actualización:xx
  14.  ID de referencia de la estación
  15.  Checksum: *xx

 

Como podéis observar, el módulo 1080-B nos devuelve 5 veces por segundo la trama $GPRMC, que aunque no la hemos utilizado en este programa, os la dejo por si optáis por ese módulo ya que nos devuelve la velocidad y dirección con un gran refresco de datos, algo muy útil para tracking.

$GPRMC, 1,2,3,4,5,6,7,8,9,10,11,*12

  1.  Hora UTC (Tiempo Universal Coordinado) en formato: hhmmss.ss
  2.  Estado de los datos: A=Activo; V=nulo
  3.  Latitud en formato: ggmm.ssss
  4.  Orientación en latitud: N (norte) o S (sur)
  5.  Longitud en formato: gggmm.ssss
  6.  Orientación en longitud: E (este) o W (oeste)
  7.  Velocidad en nudos: xxx.x
  8.  Calidad de seguimiento en grados:xxx.x
  9.  Fecha UTC en formato: ddmmaa
  10.  Variación magnética en grados
  11.  Orientación de la variación: E (este) o W (oeste)
  12.  Checksum: *xx

Modos de conexión a nuestro Arduino

Podemos usar estos módulos de dos maneras diferentes:

  1.  Modo Gateway: Lo primero que debemos hacer es anular a Arduino ya que tan solo usaremos la placa como una pasarela entre el GPS y nuestro ordenador. Esto lo podemos hacer retirando el integrado o bien haciendo un puente entre GND y Reset, también debemos prestar atención a la manera de conectar los pines Rx y Tx, ya que no nos vamos a comunicar entre Arduino y el GPS, uniremos Tx con Tx y Rx con Rx de Arduino y el módulo, de esta manera, si abrimos el monitor de puerto serie de nuestro IDE Arduino, o cualquier otro monitor de puerto serie, y lo configuramos a una velocidad de 4800 baudios (la de transmisión de datos del módulo) podremos visualizar directamente las tramas que recibimos de los satélites:

 

  1.  Modo Normal: Este es el modo que lo vamos a conectar en nuestro proyecto, en este caso deberemos cruzar los Rx con los Tx para que se “comuniquen” Arduino y el módulo, ya que cuando uno “habla” el otro debe “escuchar” veremos como lo hemos conectado en el circuito final del proyecto.

 

Una vez visto los módulos GPS, mostraremos toda la información a través de un Display i2C, el cual nos va a permitir ahorrar una cantidad considerable de pines en comparación al que usábamos en ESTE EJEMPLO.

En realidad es el mismo display del ejemplo, salvo que lleva soldado en su parte posterior un interface que nos permite interactuar con él mediante un bus i2C.

Como la explicación del bus i2C se merece un tutorial por si solo, simplemente os diré que es un bus de comunicación en serie que solo requiere de una señal de reloj (SCL) y una señal de datos (SDA) aparte de la alimentación, por lo que con tan solo dos hilos podremos interactuar con el display activando incluso el backlight (retroiluminación).

La señal de reloj (SCL) deberemos conectarla al pin A5 en un Arduino UNO o al pin 21 en un Arduino MEGA y la señal de datos (SDA) deberá ir al pin A4 en un Arduino UNO o al pin 20 en un Arduino MEGA.

El resto del circuito que usaremos es simplemente un LED que nos indicará cuando ha obtenido ubicación y un pulsador con una resistencia Pull-Down para interactuar con el menú, si tenéis dudas acerca de esto os recomiendo leer antes estos tutoriales:

  1.  Resistencia Pulll-Down
  2.  Conectar un diodo LED

Veamos entonces el circuito final teniendo en cuenta que:

  1.  Pin 12: LED de estado de conexión con resistencia de 220Ω.
  2.  Pin 7: Rx que crearemos en Arduino conectado a Tx del módulo GPS
  3.  Pin 6: Tx que crearemos en Arduino conectado a Rx del módulo GPS
  4.  Pin 5: Pulsador para el menú con resistencia Pull-Down de 10KΩ.
  5.  Pin A5: Señal reloj (SCL) del Display i2C
  6.  Pin A4: Señal datos (SDA) del display i2C

 

Parte 3: Programando…

Este programa, es de los más complicados que hemos hecho hasta la fecha, pero no por ello vamos a desanimarnos!

Podréis encontrar todos los archivos de este proyecto para la descarga compartiéndonos en las redes sociales!

Y aquí tenéis el hilo de discusión en el foro oficial ESTE HILO DEL FORO si tenéis cualquier duda, sugerencia, o comentario.. Este es el lugar!!

Este programa, se ha hecho utilizando la librería LiquidCrystal_I2C en la versión 0023 de Arduino, estamos trabajando para adaptar la librería a la versión 1.0 del IDE Arduino, os avísaremos en cuanto la tengamos preparada, mientras, si no disponéis de la versión 023 de Arduino, podéis descargarla desde ESTE ENLACE.

En los archivos de descarga, observaréis una carpeta llamada LiquidCrystal_I2C, para instalar la librería, tan solo debéis copiar esa carpeta dentro de la carpeta librerías del directorio donde tengáis instalado vuestro IDE, si tenéis algún problema, comentarlo en el hilo de foro!!

En cuanto a los archivos del programa, veréis que hay cuatro archivos diferentes, pero en realidad es el mismo programa, podemos abrir cualquiera de ellos, que nos aparecerá algo parecido a la siguiente imagen:

Como podéis ver, cada uno de los archivos que había en la carpeta del sketch, se corresponde con una pestaña del programa, es una opción que nos permite el IDE de Arduino para estructurar y organizar mucho mejor nuestros programas.

Para crear una nueva pestaña en vuestro IDE, tan solo debéis pulsar la flecha situada más a la derecha a la altura de las pestañas y seleccionar New Tab.

Como este programa es algo extenso, me he esforzado al máximo en comentar cada una de las líneas de código por separado en el propio Sketch para comentar pestaña por pestaña aquellas cosas que no hayamos visto en anteriores tutoriales.

Pestaña principal GPS

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

/*

Tutorial # 0009 Arduino Academy

GPS + Display I2C

 

En este proyecto aprendemos a conectar un modulo GPS y

a tratar la informacion recibida para mostrar

en un display I2C la latitud, longitud, hora y altitud.

 

Este proyecto es de dominio público.

*/

 

 //Incluimos librerias

 #include <SoftwareSerial.h>        //Para crear un puerto Serie que trabaje con el GPS

 #include <LiquidCrystal_I2C.h>     //Para usar un display I2C

 #include <Wire.h>                  //La necesita la libreria LiquidCrystal_I2C.h

 

 //Declaramos las constantes

 #define txPin 6      //Pin Tx para conexion con el GPS

 #define rxPin 7      //Pin Rx para conexion con el GPS

 

 // Creamos un puerto serie para el GPS

 SoftwareSerial gps = SoftwareSerial(rxPin, txPin);   //Llamada a la libreria SoftwareSerial para configurar los pines RX TX

 

 //Creamos un objeto para el Display llamado lcd

 LiquidCrystal_I2C lcd(0x27,16,2);                    //Establece la dirección de memoria 0x27 (es la que mandan) para un display de 16 caracteres y 2 líneas

 

 //Variables del programa

 byte byteGPS = 0;              // Donde guardaremos cada byte que leamos del gps para mandarlos al array

 int i = 0;                     // Variable que utilizaremos como acumulador

 int Estado = 0;                // Guarda el estado de la conexion

 int menu = 1;                  // Para saber en que menu estamos

 int inPin = 5;                 // PIN del pulsador

 int value = 0;                 // Estado del pulsador de menu

 char TramaGPG[100];            // Array donde iremos almacenando los bytes leidos del GPS

 char *pch;                     // Creamos un puntero de tipo char

 char *GGA[15];                 // y un array de punteros de tipo char

 int sat = 0;                   // Variable para almacenar el numero de satelites

 

 //Setup del programa

 void setup()

   {

     Serial.begin(9600);        // Configuracion del puerto serie de arduino

     lcd.init();                // Inicializamos el LCD

     lcd.backlight();           // Encendemos la iluminacion trasera del LCD

     pinMode(12, OUTPUT);       // Configuramos el pin 12 para el LED de la placa

     digitalWrite(12, LOW);     // Apagamos el led hasta tener señal del satelite

     pinMode(inPin, INPUT);     // Inicializa el pin 5 como entrada digital

     inicio();                  // Llama a intro de LCD

     Serial.flush();            // Borramos el buffer del serial para evitar errores

     pinMode(rxPin, INPUT);     // Configuramos los pines del GPS para poder leer..

     pinMode(txPin, OUTPUT);    // y para poder escribir en el...

     gps.begin(4800);           // finalmente establecemos la velocidad de comunicacion con el GPS

   }

 

 //Loop del programa

 void loop()

   {

       value = digitalRead(inPin);    // leemos el estado del pulsador que tenemos en el circuito

 

       if(value==1)                   //COMPROBACION PARA PULSADOR DE MENU

           {                          // Si esta a 1 significa que esta pulsado, por lo que

             menu++;                  // sumamos 1 a la variable menu

             lcd.clear();             // Limpiamos el LCD para que al escribir no queden restos de la informacion anterior

             if (menu==3)

               {                      // Si el menu toma valor 3 significa que esta a final de los menus (solo hay dos)

                 menu=1;              // por lo que lo reiniciamos a 1

               }

           }

 

     //Preparamos todo para la lectura del puerto serie creado para el GPS

     memset(TramaGPG, 0, sizeof(TramaGPG));         // Inicializa a cero la cadena para eliminar restos no deseados de lecturas anteriores

     byteGPS = 0;                                   // Limpiamos el posible contenido

     byteGPS = gps.read();                          // Leemos el byte que tenemos en la entrada del puerto serie creado para el GPS

 

     //Buscamos la cadena deseada para empezar a guardarla en el array

     while(byteGPS != '$')

       {                                            // Mientras el byte que tengamos leido no sea igual a $

         byteGPS = gps.read();                      // leeremos el siguiente caracter

       }

 

     //Ya tenemos localizada la cadena, asi que la guardamos en un array

     i=1;                                           // inicializamos a uno el contador

     TramaGPG[0] = '$';                             // y colocamos el $ en la primera posicion de nuestra cadena de caracteres

 

     //Esto nos detecta hasta que dato queremos almacenar en el array, es decir, hasta * que nos indica el final de la cadena y nos llena el array.

     while(byteGPS != '*' )

       {                                            // Mientras el caracter leido no sea igual a *

         byteGPS = gps.read();                      // leeremos el siguiente caracter

         TramaGPG[i]=byteGPS;                       // y lo almacenaremos en la cadena de caracteres en la posicion que corresponda

         i++;                                       // e incrementamos en uno el contador

       }

 

     TramaGPG[i]='';                              // para evitar porblemas añadiremos nosotros manualmente el caracter de fin de linea

     cadena();                                      // Llamamos a la funcion que manipula nuestra cadena

   }

Empezando por el principio, tenemos las librerías que necesitamos para este proyecto:

?

1

2

3

#include <SoftwareSerial.h>        //Para crear un puerto Serie que trabaje con el GPS

#include <LiquidCrystal_I2C.h>     //Para usar un display I2C

#include <Wire.h>                  //La necesita la libreria LiquidCrystal_I2C.h

Arduino UNO tan solo tiene un puerto de comunicación serie asociado a los pines 0 y 1, el cual se realiza vía hardware con un chip UART (Universal Asynchronous Receiver – Transmitter) y es utilizado cuando activamos el monitor de puerto serie, por lo que nos hace falta un puerto seria más para comunicarnos con el GPS, para ello virtualizamos uno con esta librería, obviamente tiene alguna limitación en comparación al UART, como la velocidad máxima (9600 Baudios) o por ejemplo que no podemos realizar otras tareas mientras estamos escuchando por él, pero esto no es problema para nuestro programa.

La siguientes librerías son para utilizar el Display i2C como pone en los comentarios.

Lo siguiente que nos resulta nuevo es la manera de “crear” un puerto serie con la librería:

?

1

SoftwareSerial gps = SoftwareSerial(rxPin, txPin);

Con esta linea hemos creado un puerto serie llamado gps que usa las variables rxPin y txPin para la comunicación.

A continuación hacemos lo propio para nuestro display:

?

1

LiquidCrystal_I2C lcd(0x27,16,2);

Con esto le decimos la dirección de memoria a usar, que nos la da la info del display y sus características, 16 columnas por 2 filas.

La siguiente novedad es la definición de una variable como puntero, y un array de punteros:

?

1

2

char *pch;                     // Creamos un puntero de tipo char

char *GGA[15];                 // y un array de punteros de tipo char

Explicar que son los punteros es algo extenso, simplemente nos quedaremos con la idea que *pch lo usaremos como un francotirador que apunta a un objetivo (dirección de memoria), mientras no lo toquemos, como buen soldado, no lo va a perder de vista, y cuando lo necesitemos, nos dirá el contenido del objetivo al que está apuntando (contenido de la dirección de memoria).

Entre las siguientes lineas observamos:

memset(TramaGPG, 0, sizeof(TramaGPG));

Esto nos “setea” a cero todo el array TramaGPG para evitar restos no deseados de lecturas anteriores, y se corresponde a la siguiente sintaxis:

memset(cadena, 0, sizeof(cadena));

El resto de programa de esta pestaña es fácilmente comprensible con las lineas de comentarios que he colocado.

Como veréis, all final del todo llamamos a la función cadena(); así que pasemos a la siguiente pestaña para ver que nos alberga esa llamada:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

/*

 Esta funcion nos va a permitir identificar la trama que necesitamos

 para sacar los datos de longitud, latitud etc.. usados

 en el programa.

 

 Podeis crear vuestros propios filtros para para sacar los datos

 de otras tramas de una manera sencilla, tomando como base esta funcion.

 */

 

void cadena()

  {

   i=0;                                  // Inicializamos el contador

   memset(GGA, 0, sizeof(GGA));          // Limpiamos el array GGA introduciendo en el todo ceros

 

   pch = strtok (TramaGPG,",");          // Tokenizamos (troceamos) la cadena que tenemos en el array TramaGPG por las comas

                                         // y el primer intervalo lo guardamos en pch (puntero char)

 

   //Analizamos ese intervalo guardado en pch para ver si es la cadena que necesitamos

   if (strcmp(pch,"$GPGGA")==0)          // Si es la correcta, seguimos adelante

     {

       while (pch != NULL)               // Mientras el dato sea valido, lo aceptamos para llenar el array GGA

         {

           pch = strtok (NULL, ",");     // Pasamos al siguiente intervalo cortado de la cadena

           GGA[i]=pch;                   // Guardamos el valor de pch en el array GGA

           i++;                          // Incrementamos el contador/acumulador

         }

 

       representa(GGA,"$GPGGA");         // llamamos a la funcion que nos va a mostrar los datos, bien por serial o por LCD

                                         // a esta funcion se le pasan dos paramtros 1º el array de chars, 2º la cadena a comparar.

     }

 }

Este código es que que utilizamos para filtrar las tramas capturadas, está preparado para reaccionar únicamente cuando detectemos la trama GPGGA, pero sería fácilmente modificable para usar con cualquier otra trama que recibamos del gps, así que si vais a realizar vuestros propios proyectos os será muy sencillo.

Como novedades tenemos:

?

1

pch = strtok (TramaGPG,",");

Esto coge el array TramaGPG, lo separa en tokens, en este caso las comas de nuestra línea recibida del GPS, y deja apuntando a nuestro francotirador pch a la dirección de memoria del primer intervalo cortado para analizarlo luego en estas lineas:

?

1

2

3

4

5

6

7

8

9

10

if (strcmp(pch,"$GPGGA")==0)

   {

     while (pch != NULL)

       {

         pch = strtok (NULL, ",");     // Pasamos al siguiente intervalo cortado de la cadena

         GGA[i]=pch;                   // Guardamos el valor de pch en el array GGA

         i++;                          // Incrementamos el contador/acumulador

       }

     representa(GGA,"$GPGGA");

    }

Aquí analizamos que la cadena a la que apunta nuestro puntero sea igual a GPGGA gracias a la instrucción:

strcmp(pch,"$GPGGA")==0

Se coloca un “igual a cero” ya que cuando realiza la comparación reacciona de la siguiente manera:

  1.  Devuelve 0 si son iguales.
  2.  Devuelve menor que cero si cadena1 es menor que cadena2.
  3.  Devuelve mayor que cero si cadena1 es mayor que cadena2.

A continuación de decimos que compruebe que el contenido del intervalo de la cadena sea válido, y mintras esto sea así, vaya pasando de intervalo en intervalo, almacenando francotiradores que apuntan a esos intervalos en el array de punteros GGA.

Para finalizar, llamamos a la función representa pasándole un par de datos de referencia.

Así que veamos la pestaña representa al completo:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

  /*

  Esta funcion nos va a organizar los datos

  recibidos del gps, para imprimirlos

  en el LCD y en el monitor de puerto serie.

  */

 

void representa(char **GGAPrint, char *trama)                              // Capturamos los datos pasados a la funcion

{

  Estado = atoi(GGAPrint[5]);                                              // Transformamos el char que contiene el estado de la conexion a un entero

  sat = atoi(GGAPrint[6]);                                                 // Transformamos el char que contiene el numero de satelites a un entero

 

  if(trama=="$GPGGA" && Estado==1)                                         // Si la trama que tenemos es $GPGGA y el estado esta a 1 (conectado)

    {

      digitalWrite(12, HIGH);                                              // Indicamos que hay conexion satelite encendiendo el led

 

      //Imprimimos en el LCD

      if(menu==1)

        {                                                                  // Muestra toda la informacion de la pantalla correspondiente

          LongLat(GGAPrint[3],GGAPrint[4],GGAPrint[1],GGAPrint[2]);        // Impmrime latitud y longitud en display

        }

 

      if(menu==2)

        {

          altitud(GGAPrint[8],GGAPrint[9]);                                // Imprime altitud en el LCD

          reloj(GGAPrint[0]);                                              // Imprime la hora en formato UTC

        }

 

      //Ademas de imprimir en el LCD, sacamos los datos por el puerto serie de Arduino 

 

      Serial.println("");

      Serial.println("----------------------------------------------");

      Serial.print("Hora UTC -> ");

      Serial.println(GGAPrint[0]);

      Serial.print("Latitud -> ");

      Serial.print(GGAPrint[1]);

      Serial.println(GGAPrint[2]);

      Serial.print("Longitud -> ");

      Serial.print(GGAPrint[3]);

      Serial.println(GGAPrint[4]);

      Serial.print("Indicacion de calidad GPS: 0=nula; 1=GPS fija -> ");

      Serial.println(GGAPrint[5]);

      Serial.print("Numero de satelites visibles por el receptor -> ");

      Serial.println(sat);

      Serial.print("Dilucion horizontal de posicion -> ");

      Serial.println(GGAPrint[7]);

      Serial.print("Altitud de la antena por encima / por debajo del nivel del mar (geoidal) -> ");

      Serial.print(GGAPrint[8]);

      Serial.println(GGAPrint[9]);

      Serial.print("Separacion geoidal -> ");

      Serial.print(GGAPrint[10]);

      Serial.println(GGAPrint[11]);

      Serial.println("----------------------------------------------");

      Serial.println("");

 

    }

 

  else                                                                   // Si no ha conexion satelite

    {

     digitalWrite(12, LOW);                                              // Apagamos el led de conectado

     esperaGPS(sat);                                                     // llamamos a la funcion de LCD que representa el numero de satelites conectados..

     Serial.println("");                                                 // e imprimimos por el serial un banner con el numero de satelites conectados

     Serial.println("-----------------------------");

     Serial.print("|---Satelites visibles -->");

     Serial.print(sat);

     Serial.println(" |");

     Serial.println("|----Esperando ubicacion----|");

     Serial.println("-----------------------------");

     Serial.println("");

  }

}

Como vemos, la función requiere esos dos datos que le hemos pasado al llamarla y sobre los que trabajaremos:

?

1

void representa(char **GGAPrint, char *trama)

Siguiendo el desarrollo veremos la instrucción atoi que usamos para convertir datos de tipo char almacenados en el array, en enteros para poder trabajar con ellos de una manera más sencilla:

?

1

2

Estado = atoi(GGAPrint[5]);

sat = atoi(GGAPrint[6]);

El resto de esta pestaña nos imprime los datos que recibimos del GPS en el monitor de puerto serie y llama a las funciones que imprimen en nuestro display, almacenadas en la última pestaña de este programa, así que vayamos a ello!!

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

  /*

  Aqui almacenamos todos los menus y

  la manera de contruirlos

  para imprimirlos en el LCD

  */

 

//Banner inicial del LCD

void inicio()

  {

    lcd.clear();                      // borramos la pantalla para quitar basura anterior

    lcd.setCursor(0, 0);              // posicionamos el cursor

    lcd.print("Proyecto #0009");      // imprimimos la cadena

    lcd.setCursor(0, 1);              // posicionamos el cursor

    lcd.print("Arduino Academy");     // imprimimos la cadena

    delay(3000);                      // hacemos una pausa aunque el gps seguira conectando

    lcd.clear();                      // borramos la pantalla

    lcd.setCursor(0, 0);              // posicionamos el cursor

    lcd.print("Modulo GPS");          // imprimirmos la cadena

    lcd.setCursor(0, 1);              // posicionamos el cursor

    lcd.print("& Display I2C... ");   // imprimimos la cadena

    delay(3000);                      // hacemos una pausa aunque el gps seguira conectando

    lcd.clear();                      // borramos la pantalla

    lcd.setCursor(0, 0);              // posicionamos el cursor

    lcd.print("Iniciando....");       // imprimirmos la cadena

    lcd.blink();                      // dejamos el cursor parapadenando

    delay(4000);                      // hacemos una pausa aunque el gps seguira conectando

    lcd.clear();                      // borramos la pantalla para quitar basura anterior

  }

 

//Pantalla de espera del GPS mientras se conecta

void esperaGPS(int NumSat)

{

  lcd.setCursor(0, 0);                // posicionamos el cursor

  lcd.print("Esperando sat.  ");      // imprimirmos la cadena

  lcd.setCursor(0, 1);                // posicionamos el cursor

  lcd.print("Sat.Visibles->");        // imprimirmos la cadena

  lcd.setCursor(14, 1);               // posicionamos el cursor

  lcd.print(NumSat);                  // imprimimos la variable

}

 

//Menu 1 - Imprime la latitud y la longitud

void LongLat(char *Longitud, char *Brujula1, char *Latitud, char *Brujula2)    //Recogemos los parametros de la funcion

{

  lcd.setCursor(0, 0);              // posicionamos el cursor

  lcd.print("Lat->");               // imprimimos la cadena

  lcd.print(Latitud[0]);            // imprimimos el primer caracter de la cadena

  lcd.print(Latitud[1]);            // imprimimos el segundo caracter de la cadena

  lcd.print(".");                   // imprimirmos la cadena

  lcd.print(Latitud[2]);            // imprimimos el tercer caracter de la cadena

  lcd.print(Latitud[3]);            // imprimimos el cuarto caracter de la cadena

  lcd.print("'");                   // imprimirmos la cadena

  lcd.print(Latitud[5]);            // imprimimos el quinto caracter de la cadena

  lcd.print(Latitud[6]);            // imprimimos el sexto caracter de la cadena

  lcd.print(" ");                   // imprimirmos la cadena

  lcd.print(Brujula2);              // imprimimos la variable

  lcd.setCursor(0, 1);              // posicionamos el cursor

  lcd.print("Lon->");               // imprimirmos la cadena

  lcd.print(Longitud[1]);           // imprimimos el primer caracter de la cadena

  lcd.print(Longitud[2]);           // imprimimos el segundo caracter de la cadena

  lcd.print(".");                   // imprimirmos la cadena

  lcd.print(Longitud[3]);           // imprimimos el tercer caracter de la cadena

  lcd.print(Longitud[4]);           // imprimimos el cuarto caracter de la cadena

  lcd.print("'");                   // imprimirmos la cadena

  lcd.print(Longitud[6]);           // imprimimos el quinto caracter de la cadena

  lcd.print(Longitud[7]);           // imprimimos el sexto caracter de la cadena

  lcd.print(" ");                   // imprimirmos la cadena

  lcd.print(Brujula1);              // imprimimos la variable

  lcd.setCursor(15, 1);             // posicionamos el cursor

}

 

//Menu 2.1 que nos imprime la hora en el LCD

void reloj(char *hora)              //recogemos los parametros de la funcion

{

  lcd.setCursor(0, 1);              // posicionamos el cursor

  lcd.print("Hora-> ");             // imprimirmos la cadena

  lcd.print(hora[0]);               // imprimimos el primer caracter de la cadena

  lcd.print(hora[1]);               // imprimimos el segundo caracter de la cadena

  lcd.print(":");                   // imprimirmos la cadena

  lcd.print(hora[2]);               // imprimimos el tercer caracter de la cadena

  lcd.print(hora[3]);               // imprimimos el cuarto caracter de la cadena

  lcd.print(":");                   // imprimirmos la cadena

  lcd.print(hora[4]);               // imprimimos el quinto caracter de la cadena

  lcd.print(hora[5]);               // imprimimos el sexto caracter de la cadena

  lcd.setCursor(16, 1);             // posicionamos el cursor

}

 

//Menu 2.2 que nos imprime la altitud en el LCD

void altitud(char *altitud, char *unidades)  //recogemos los parametros de la funcion

{

  lcd.setCursor(0, 0);              // posicionamos el cursor

  lcd.print("Altitud->");           // imprimirmos la cadena

  lcd.print(altitud);               // imprimimos la variable

  lcd.print(unidades);              // imprimimos la variable

}

Como veis, esta última pestaña simplemente hace llamadas a datos para imprirlos en una secuencia determinada, y así obtener el resultado final en nuestro LCD.




1. интрузивы Любое интрузивное тело будучи окруженное вмещающими породами или рамой взаимодействуя с ними о
2. Лекция 7 Браузер вебобозреватель или интернетобозреватель ~ это программное обеспечение которое позво
3. Задание 1 1Дайте определение понятию Смета Ответ- Основной документ нормирующий стоимость строительст
4. і. Экономикалы~ м~ліметтер тізбегіне к~з ж~гіртер болса~ Германия ~аза~стан~а тауар шы~арушы мемлекеттер
5. тема наиболее активный рычаг государственного регулирования социальноэкономического развития инвестици
6. Остров Крит и его характерные особенности
7. Всеволод Юрьевич Большое Гнездо
8. Удачи тебе дорогая сказала мне Жизнь
9. Хождение игумена Даниила
10. Исследования транспортных Росийско-украинских проблем
11. 2 Март 3 4 5 6 7 8
12. политехнический колледж наименование среднего специального учебного заведения
13. Контрольная работа состоит из десяти вариантов.html
14. СибАДИ Аналитический отчет по маркетинговому исследованию рынка сотовых телеф
15. Дети любого возраста перенимают то что видят в лагере- стиль одежды причёску привычки вкусы ~ музыкальные
16. Любисток
17. Предпосылки для внедрения методов биотехнологии в животноводстве
18. Тема- Социально психологический портрет Черновола И
19. Расчет винта Расчет гребного винта осуществляется при помощи модуля Wint и заключается в опр
20. конфликтРассмотрение функций конфликта и особенностей их реализации в коллективе целесообразно начать с