Go Down

Topic: Oque há de errado com o codigo? não aparece os dados do GPS (Read 263 times) previous topic - next topic

Jose_Erivan

ola,
 Este código que retirei da internet, consiste em fazer a leitura do modulo GPS (NEO 6M) e enviar via mensagem de texto pelo modulo GSM  (SIM 800l), ambos conectado a um arduino  NANO, mas não esta aparecendo as coordenadas e quando pede para enviar só aparece longitude e latitude 0,0000 no telefone destinatário. Eu testei os dois módulos em separados e estão funcionando, bom é isso.  Obrigado e qualquer retorno sera bem-vindo. 
 

Code: [Select]

#include <SoftwareSerial.h>
#include <TinyGPS.h>
TinyGPS gps;
SoftwareSerial my(2, 3);
SoftwareSerial serialgps(4, 5);


int year;
byte month, day, hour, minute, second, hundredths;
unsigned long chars;
unsigned short sentences, failed_checksum;
float latitude, longitude;
int contLocalizacao = 0;

//V3 resumido
int ignicao = A1;
//int travas = A0;
const int BotaoSOS_1 = A2;

char info[400];
char ligarluz[] = "#1";
//char desligarluz[] = "#2";
char numero[13] = "";// inserir numero de telefone
String adminPDU = numero;
void setup()
{
  pinMode(ignicao, OUTPUT); digitalWrite(ignicao, HIGH);
 //pinMode(travas, OUTPUT); digitalWrite(travas, HIGH);
  pinMode(BotaoSOS_1, INPUT); 
 
  Serial.begin(9600);
  my.begin(4800);
  clear_SMS_Memory();
  Serial.println("SMS apagados");
  Serial.println("Inicio do Loop");
  my.println("AT+CMGF=1");
  Serial.println(adminPDU);
  delay(5000);
  enviaSMSlocalizacao("Inico do sistema\n");
}
void loop() //
{
  msgSOS();
  my.println("AT+CMGR=1");
  int index = 0;
  unsigned long startTime = millis();
  while (millis() < (startTime + 1000))
  {
    if (my.available() > 0) {
      info[index] = my.read();
    Serial.println("info[index]");
     Serial.print(info[index]);

      index++;
    }
  }
  if (String(info).indexOf("+CMGR:") > 0 && String(info).indexOf(",,0") < 0)
  {
    delay(5000);
    my.println("AT+CMGR=1");
    index = 0;
    startTime = millis();
    while (millis() < (startTime + 1000))
    {
      if (my.available() > 0) {
        info[index] = my.read();
        index++;
      }
    }
    Serial.println("//Mensagem Recebida:");
    Serial.println(String(info));
    Serial.println("//Fim da Mensagem\\");
    Serial.println("Mensagem do admin");
    if (String(info).indexOf(String(ligarluz)) > 0)
    { LigarLuz();
      Serial.println("DEBUG --- dentro do if 1");
    }
   
    my.println("AT+CMGD=1");
    delay(1000);
    while (my.available() > 0) my.read();
    Serial.println("Mensagem Apagada");
    memset( &info, 0, sizeof(info) );
  }
}

void LigarLuz()
{
  digitalWrite(ignicao, LOW);
  Serial.println("Entendido a mensagem");
  sequenciaGPS();
  delay(3000);
  my.begin(4800);
  delay(5000);
  enviaSMSlocalizacao("SXT achada\n");
  delay(2000); 
  Serial.println("\n\nSMS Enviado");
  clear_SMS_Memory();
  delay(5000);
}


void clear_SMS_Memory() {
  unsigned short i = 0;
  for (i = 0; i <= 30; i++) {
    my.print("AT+CMGD=");
    my.println(i);
    delay(100);
  }
  while (my.available() > 0) my.read();
}


void enviaSMSlocalizacao(String sms)
{
 Serial.println("Iniciando comunicacao...");
  my.print("AT+CMGF=1\r");
  delay(500);
  my.println("AT+CMGS=\"" + adminPDU + "\"\r"); // comando para envio
  delay(500);
  my.print("" + sms + ""); // texto para a mensagem
  my.print("Localizacao:"); // texto para a mensagem
  Serial.print("Localizacao:"); // texto para a mensagem
  my.print("\nwww.google.com.br/maps/place/");
  Serial.print("www.google.com.br/maps/place/");
  my.print(latitude, 5); // texto para a mensagem
  Serial.print(latitude, 5);
  my.print(","); // texto para a mensagem
  Serial.print(",");
  my.print(longitude, 5); // texto para a mensagem
  Serial.print(longitude, 5);
  my.println("\r"); // texto para a mensagem
  delay(500);
  my.println((char)26);//o código ASCII do ctrl + z é 26
}


void sequenciaGPS()
{
  Serial.println("\nAguardando dados do GPS...");
  serialgps.begin(9600);
  delay(20000); 
  while (serialgps.available())
  {
    int c = serialgps.read();
    if (gps.encode(c))
    {
      gps.f_get_position(&latitude, &longitude);
      Serial.print("Lat/Long: ");
      Serial.print(latitude, 5);
      Serial.print(", ");
      Serial.println(longitude, 5);
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
      Serial.print("Date: "); Serial.print(month, DEC); Serial.print("/");
      Serial.print(day, DEC); Serial.print("/"); Serial.print(year);
      Serial.print(" Time: "); Serial.print(hour, DEC); Serial.print(":");
      Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC);
      Serial.print("."); Serial.println(hundredths, DEC);
      Serial.print("Altitude (meters): "); Serial.println(gps.f_altitude());
      Serial.print("Course (degrees): "); Serial.println(gps.f_course());
      Serial.print("Speed(kmph): "); Serial.println(gps.f_speed_kmph());
      Serial.print("Satellites: "); Serial.println(gps.satellites());
      Serial.println();
      gps.stats(&chars, &sentences, &failed_checksum);
    }
  }
}

void msgSOS()
{
  int btSOS1 = digitalRead(BotaoSOS_1); 
  if (btSOS1 == 1)
  {
    sequenciaGPS();
    Serial.println("\nAdquirindo dados...");   
    my.begin(9600);
    delay(5000);
    enviaSMSlocalizacao("OBJETO FURTADO\n");
    delay(5000);   
    Serial.println("\nSMS enviado");
  }
 
}

bubulindo

Isto:

Code: [Select]

gps.f_get_position(&latitude, &longitude);



Talvez funcione melhor se for isto:

Code: [Select]

gps.get_position(&latitude, &longitude);



A função que estás a usar verifica se o receptor enviou uma string estranha em vez de latitude... Quanto tempo deixaste o sistema a funcionar?
Se adicionares mais uma variável à função get_position, ficas a saber a quantos milisegundos a resposta foi recebida do satélite e deverás saber se já tens a osição fixa ou não.

Já ligaste a porta série do GPS ao computador para ver se ele chega a adquirir a posição?

A longitude é um número que pareça razoável para onde estás?
This... is a hobby.

Jose_Erivan

Obrigado pelo retorno vou fazer a alteração, e quanto as peguntas,sim, por muito tempo, não, foi só ligado a um código singelo de GPS onde veio a funcionar, a terceira não ficou muito clara talvez seria se vieste a funcionar este numero seria o suficiente, acho que sim.
 A pergunta que tenho é se a declaração dessas quatro portas seriais não estaria de alguma forma conflitando?

bubulindo

Não ajuda teres portas série de software... principalmente se tiveres interrupções activadas, mas não me parece ser esse o problema aqui.

Eu sugeria colocares o receptor GPS ligado directamente a um computador ou sem a biblioteca tinyGPS e veres se os dados que saem estão correctos.
This... is a hobby.

Jose_Erivan

Bom, demorei mas fiz a alteração mas esta aparecendo o seguinte erro.

sketch_aug11a:149: error: no matching function for call to 'TinyGPS::get_position(float*, float*)'

       gps.get_position(&latitude, &longitude);

bubulindo

já experimentaste o gps sem o arduino para ver os dados que recebe?
This... is a hobby.

Go Up