Hola a todos.
Este es mi primer post y espero me puedan ayudar.
Estoy realizando un proyecto que consiste en la obtencion de datos de un gps Ublox NEO 6M y enviar estos datos por medio de xbee, al enviar un caracter de inicio. Para la obtencion de datos del gps uso la libreria TinyGPS++.
He logrado que al enviar la letra ‘s’ por el modulo xbee, se inicie la obtencion de datos del gps, ahora lo que requiero es que una vez iniciada la secuencia de obtencion de datos, al enviar otro caracter por xbee, una letra ‘a’ por ejemplo, ahora se active un led.
Mi problema es que no consigo que al enviar la letra ‘a’ se encienda el led.
La secuencia de obtencion de datos del gps la realizo con un ciclo do while infinito para que sea cnstante la obtencion y envio de los datos y pienso que dentro de este ciclo do while debe ir otra condicion para que al recibir ahora la letra ‘a’ se encienda el led pero no he logrado hacer eso. Adjunto mi codigo, espero que si alguien ve algun error en mi logica me pueda ayudar a resolverlo.
Muchas gracias a todos!
CÓDIGO:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3; //Declaración de los pines rx y tx para comunicacion serial del gps
static const uint32_t GPSBaud = 9600; //Declaración de velocidad de comunicacion para gps
// Declaración del gps
TinyGPSPlus gps;
// Declaracion de los pines de comunicacion serial para el gps
SoftwareSerial ss(RXPin, TXPin);
SoftwareSerial xb(6,5); //Declaración de los pines de comunicación serial para el xbee.
char inicio; //Caracter a enviar para iniciar con la transmisión de datos.
int val=0; //Valor a cambiar para crear el ciclo infinito while e imprimir constantemente los datos del gps
void setup()
{
xb.begin(9600);
ss.begin(GPSBaud);
pinMode(9,OUTPUT);
}
void loop()
{
xb.listen();
if(xb.available()>0)
{
char inicio = xb.read(); //Se lee el caracter enviado por el xbee
if(inicio == ‘s’)//Si el caracter es ‘s’ se entra en el ciclo do whie
{
val=1; //Se cambia el valor de val a 1 para que se inicie el ciclo infinto y así mandar constante mente los valores del gps
do{
printInt(gps.satellites.value(),gps.satellites.isValid(), 5);xb.print(",");
printFloat(gps.location.lat(),gps.location.isValid(),11,6);xb.print(",");
printFloat(gps.location.lng(),gps.location.isValid(),12,6);xb.print(",");
printDateTime(gps.date,gps.time);xb.print(",");
printFloat(gps.altitude.meters(),gps.altitude.isValid(),7,2);xb.print(",");
printFloat(gps.speed.mps(),gps.speed.isValid(),6,2);xb.print("&");
xb.println();
smartDelay(250);
if (inicio==‘a’)
{
digitalWrite(9,HIGH);
}
if (millis() > 5000 && gps.charsProcessed() < 10)
xb.println(F(“No GPS data received: check wiring”));
}
while(val=1); //Condición a evaluar que siempre es verdadera y el ciclo no para
}
}
}
//Funciones creadas para la obtención de los datos del gps
void smartDelay(unsigned long ms)
{
unsigned long start = millis();
ss.listen();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
void printFloat(float val, bool valid, int len, int prec)
{
if (!valid)
{
while (len-- > 1)
xb.print(’*’);
xb.print(’ ‘);
}
else
{
xb.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1); // . and -
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
xb.print(’ ');
}
smartDelay(0);
}
void printInt(unsigned long val, bool valid, int len)
{
char sz[32] = “*****************”;
if (valid)
sprintf(sz, “%ld”, val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz = ’ ';
-
if (len > 0)*
-
sz[len-1] = ’ ';*
-
xb.print(sz);*
-
smartDelay(0);*
}
void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{ -
if (!d.isValid())*
-
{*
_ xb.print(F("********** "));_ -
}*
-
else*
-
{*
-
char sz[32];*
-
sprintf(sz, “%02d/%02d/%02d ,”, d.month(), d.day(), d.year());*
-
xb.print(sz);*
-
}*
-
if (!t.isValid())*
-
{*
_ xb.print(F("******** "));_ -
}*
-
else*
-
{*
-
char sz[32];*
-
sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());*
-
xb.print(sz);*
-
}*
-
smartDelay(0);*
}
void printStr(const char *str, int len)
{ -
int slen = strlen(str);*
-
for (int i=0; i<len; ++i)*
_ xb.print(i<slen ? str : ’ ');_
* smartDelay(0);*
}
forum.ino (3.29 KB)