Rastreador de veiculo- Arduino Ajuda

Então eu estou fazendo um rastreador e bloqueador de carro com Arduino, eu estou usando um modulo gprs e um outro modulo de gps

Os métodos do gprs estão funcionando também os métodos de gps estão funcionando o problema é que para o gps funcionar eu tenho que tirar a linha SerialGPRS.begin(9600); junto tirando as funções que usa a comunicação do gprs eu queria saber o por que?? é conflito entre biblioteca? ou conflito entre comunicação serial??

veja os módulos que estou usando

Esse é o gps

Esse é o gprs

// Informações do Modem GPRS
#include “SIM900.h”
#include “sms.h”
#include “SoftwareSerial.h”
#include “sms.h”
SMSGSM sms;
SoftwareSerial SerialGPRS(2,3);
boolean started=false;
char smsbuffer[160];
char Numero[14];
String PegaNumero;
int inc=10;
String ValorEnviar;
//-----------------------------------------------------------------
// Informações do GPS
#include <TinyGPS.h>
TinyGPS gps;
SoftwareSerial GpsSerial(8, 9);
//------------------------------------------------------------------
void setup(){
Serial.begin(9600);
GpsSerial.begin(57600);
Serial.println(TinyGPS::library_version());
SerialGPRS.begin(9600);
if(gsm.begin(9600)){
Serial.println("\nstatus=READY");
started=true;
}else{
Serial.println("\nstatus=IDLE");
}
if(started){
ReceberMensagem();
}
Serial.println(“Rastreador Iniciado”);
}

void loop(){
Gps();
}

void Gps(){
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (GpsSerial.available())
{
char c = GpsSerial.read();
if (gps.encode(c))
newData = true;
}
}
if (newData){
char buffer[5];
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6;
flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6;
String SFlat = dtostrf(flat, 1, 4, buffer);
String SFlon = dtostrf(flon, 1, 4, buffer);
ValorEnviar = "A posicao e : “+SFlat+” "+SFlon;
Serial.println("Imprimindo valor: "+ValorEnviar);
}else{
Serial.println(“Nao funciona”);
}

}

void EnviandoMensagem(){
PegaNumero = “”;
for(int i=0;i<14;i++){
PegaNumero = PegaNumero + Numero*;*

  • } *
  • delay(1000);*
  • SerialGPRS.print(“AT+CMGF=1\r”);*
  • delay(1000);*
  • SerialGPRS.print(“AT+CMGS=”"+PegaNumero+""\r");*
  • delay(1000);*
  • SerialGPRS.print(""+ValorEnviar+"\r");*
  • delay(1000);*
  • SerialGPRS.write(0x1A);*
  • delay(1000);*
  • Serial.println(“SMS Enviado com sucesso!”);*
  • delay(5000);*
  • ValorEnviar = “”;*
    }
    void ValidaMensagem(){
  • if(!strcmp(smsbuffer,“BloquearVeiculo”)){*
  • Gps();*
  • ValorEnviar = "O carro bloqueado a posicao e : ";*
  • EnviandoMensagem();*
  • delay(100);*
  • }else if (!strcmp(smsbuffer,“DesbloquearVeiculo”)){*
  • Gps();*
  • ValorEnviar = "O carro foi desbloqueado a posicao e : ";*
  • EnviandoMensagem();*
  • delay(100);*
  • }else if(!strcmp(smsbuffer,“A”)){*
  • Gps();*
  • EnviandoMensagem();*
  • delay(100);*
  • }*
  • DeletarMensagem();*
    }
    void ReceberMensagem(){
  • int pos=0;*
  • if(started){*
  • pos = sms.IsSMSPresent(SMS_ALL);*
  • if(pos){*
  • sms.GetSMS(pos,Numero,smsbuffer,100);*
  • ValidaMensagem();*
  • }*
  • }*
    }
    void DeletarMensagem(){
  • Serial.println(“deletando mensagem!”);*
  • Serial.println(“delsms”);*
  • for (int i=0; i<10; i++){*
  • int pos=sms.IsSMSPresent(SMS_ALL);*
  • if (pos!=0){*
  • Serial.print("\nFind SMS at the pos ");*
  • Serial.println(pos);*
  • if (sms.DeleteSMS(pos)==1){ *
  • Serial.print("\nDeleted SMS at the pos ");*
  • Serial.println(pos); *
  • }*
  • else{*
  • Serial.print("\nCant del SMS at the pos ");*
  • Serial.println(pos); *
  • }*
  • }*
  • }*
    }

Quando dizes que deixa de funcionar, importas-te de explicar melhor o que acontece?

Quando usas a softwareserial só podes receber dados de uma porta de cada vez... Não será esse o problema?

O mega, tem 4 portas série e neste caso poderia ser uma solução, caso tenhas um disponivel.

O método de gps funciona pois quando eu retiro essas linhas

// SerialGPRS.begin(9600); // Tiro essa linha //if(gsm.begin(9600)){ // E o principal é essa linha também // Serial.println("\nstatus=READY"); // started=true; // }else{ // Serial.println("\nstatus=IDLE"); // } // if(started){ // ReceberMensagem(); // }

me parece que é conflito em algo entende??

Eu descobrir o problema, mais não sei resolver, o problema é que o arduino não consegue ler o serial declarado do gps, quando o está no codigo esse trecho no método setup é como se fosse um conflito algo assim

GprsSerial.begin(9600); if(gsm.begin(9600)){ Serial.println("\nstatus=READY"); started=true; }else{ Serial.println("\nstatus=IDLE"); } if(started){ ReceberMensagem(); }

dentro do void setup

void setup() { SerialGps.begin(4800); Serial.begin(9600);

GprsSerial.begin(9600); if(gsm.begin(9600)){ Serial.println("\nstatus=READY"); started=true; }else{ Serial.println("\nstatus=IDLE"); } if(started){ ReceberMensagem(); } Serial.println("Rastreador Iniciado"); }

bubulindo: Quando usas a softwareserial só podes receber dados de uma porta de cada vez... Não será esse o problema?

Delays também são uma boa maneira de causar problemas no código... mas já pesquisaste isto que escrevi em cima??

Mais o eu leio o serial só do método gps e se estiver declarado isso no setup ele não funciona estranho??

void setup() { SerialGps.begin(4800); Serial.begin(9600);

GprsSerial.begin(9600); if(gsm.begin(9600)){ Serial.println("\nstatus=READY"); started=true; }else{ Serial.println("\nstatus=IDLE"); } if(started){ ReceberMensagem(); } Serial.println("Rastreador Iniciado"); }

um erro no codigo cria uma cascata de problemas, veja:

aqui cria os três seriais:

SerialGps.begin(4800); Serial.begin(9600); GprsSerial.begin(9600);

mas na hora de verificar esqueceu de mudar o nome da serial

if(gsm.begin(9600)){ Serial.println("\nstatus=READY"); started=true; }else{ Serial.println("\nstatus=IDLE"); }

logo a variavel started nunca é true, não executando nunca a função recebermensagens

if(gsm.begin(9600)){ // esse gsm.begin(9600) eu troco por GprsSerial.begin(9600) ??
Serial.println("\nstatus=READY");
started=true;
}else{
Serial.println("\nstatus=IDLE");
}

#include “SIM900.h”
#include “sms.h”
#include “SoftwareSerial.h”
SMSGSM sms;
SoftwareSerial SerialGps(8,9),SerialGprs(2,3);
#include <TinyGPS.h>
TinyGPS gps;
boolean started =false;
char smsbuffer[160];
char n[20];
int inc=10;
unsigned long chars;
unsigned short sentences, failed_checksum;
static void print_date(TinyGPS &gps);

void setup() {
Serial.begin(9600);
delay(1000);
Serial.println(“Iniciando…”);
delay(1000);
SerialGprs.begin(4800);
delay(1000);
gsm.begin(4800);
delay(1000);
SerialGps.begin(9600);
delay(1000);
// if(gsm.begin(4800)){
// started = true;
// Serial.println(“Iniciado…”);
// }else{
// Serial.println(“Erro…”);
// }
Serial.println(“Iniciado…”);
}

void loop() {

ReceberMensagem();

}

void ReceberMensagem(){
int pos=0;
if(started){
pos=sms.IsSMSPresent(SMS_ALL);
if(pos){
sms.GetSMS(pos,n,smsbuffer,100);
if(!strcmp(smsbuffer,“B”)){
Serial.println(“Recebeu a mensagem B”);
delay(100);
Gps();
}
if(!strcmp(smsbuffer,“L”)){
Serial.println(“Recebeu a mensagem L”);
delay(100);
Gps();
}
ExcluirMensagem();
}
}
}
void ExcluirMensagem(){
for (int i=0; i<10; i++){
int pos=sms.IsSMSPresent(SMS_ALL);
if (pos!=0){
Serial.print("\nFind SMS at the pos “);
Serial.println(pos);
if (sms.DeleteSMS(pos)==1){
Serial.print(”\nDeleted SMS at the pos “);
Serial.println(pos);
}else{
Serial.print(”\nCant del SMS at the pos ");
Serial.println(pos);
}
}
}
}

void EnviarMensagem(float lat, float longi){
delay(500);
SerialGprs.println(“AT+CMGF=1”);
delay(500);
SerialGprs.print(“AT+CMGS=”);
SerialGprs.write(byte(34));
SerialGprs.print(“99172841”);
SerialGprs.write(byte(34));
SerialGprs.println();
delay(500);
SerialGprs.print("Lat/Long: “);
SerialGprs.print(lat,5);
SerialGprs.print(”, ");
SerialGprs.println(longi,5);
SerialGprs.write(byte(26));
delay(5000);
Serial.println(“Enviado…”);
}

void Gps(){

bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
for (unsigned long start = millis(); millis() - start < 1000;){
while (SerialGps.available())
{
char c = SerialGps.read();
if (gps.encode(c))
newData = true;
}
}
if (newData){
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6;
flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6;
EnviarMensagem(flat,flon);
}

}

Para eu consegui pegar as coordenadas do gps, eu preciso deletar essas linhas do void

// if(gsm.begin(4800)){
// started = true;
// Serial.println(“Iniciado…”);
// }else{
// Serial.println(“Erro…”);
// }

se eu tirar do codigo eu consigo pegar as informações do gps, porém não consigo ler as informações enviada por sms por que???

fabio_h: um erro no codigo cria uma cascata de problemas, veja:

aqui cria os três seriais:

SerialGps.begin(4800); Serial.begin(9600); GprsSerial.begin(9600);

mas na hora de verificar esqueceu de mudar o nome da serial

if(gsm.begin(9600)){ Serial.println("\nstatus=READY"); started=true; }else{ Serial.println("\nstatus=IDLE"); }

logo a variavel started nunca é true, não executando nunca a função recebermensagens

No ultimo codigo que postou, apague a parte comentada e me diga quando a variavel "started" se torna true.

Mais a frente verá que só executa funcões vitais quando ela é true, revise o código...

#include “SIM900.h”
#include “sms.h”
#include “SoftwareSerial.h”
SMSGSM sms;
SoftwareSerial SerialGps(8,9),SerialGprs(2,3);
#include <TinyGPS.h>
TinyGPS gps;
char smsbuffer[160];
char n[20];
int inc=10;
unsigned long chars;
unsigned short sentences, failed_checksum;
static void print_date(TinyGPS &gps);

void setup() {
Serial.begin(9600);
Serial.println(“Gprs iniciado…”);
delay(5000);
SerialGps.begin(9600);
Serial.println(“Gps iniciado…”);
}

void loop() {
ReceberMensagem();
}

void ReceberMensagem(){
int pos=0;
pos=sms.IsSMSPresent(SMS_ALL);
if(pos){
sms.GetSMS(pos,n,smsbuffer,100);
if(!strcmp(smsbuffer,“B”)){
Serial.println(“Recebeu a mensagem B”);
delay(100);
Gps();
}
if(!strcmp(smsbuffer,“L”)){
Serial.println(“Recebeu a mensagem L”);
delay(100);
Gps();
}
ExcluirMensagem();
}
}
void ExcluirMensagem(){
for (int i=0; i<10; i++){
int pos=sms.IsSMSPresent(SMS_ALL);
if (pos!=0){
Serial.print("\nFind SMS at the pos “);
Serial.println(pos);
if (sms.DeleteSMS(pos)==1){
Serial.print(”\nDeleted SMS at the pos “);
Serial.println(pos);
}else{
Serial.print(”\nCant del SMS at the pos ");
Serial.println(pos);
}
}
}
}

void EnviarMensagem(float lat, float longi){
delay(500);
SerialGprs.println(“AT+CMGF=1”);
delay(500);
SerialGprs.print(“AT+CMGS=”);
SerialGprs.write(byte(34));
SerialGprs.print(“99172841”);
SerialGprs.write(byte(34));
SerialGprs.println();
delay(500);
SerialGprs.print("Lat/Long: “);
SerialGprs.print(lat,5);
SerialGprs.print(”, ");
SerialGprs.println(longi,5);
SerialGprs.write(byte(26));
delay(5000);
Serial.println(“Enviado…”);
}

void Gps(){

bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
for (unsigned long start = millis(); millis() - start < 1000;){
while (SerialGps.available())
{
char c = SerialGps.read();
if (gps.encode(c))
newData = true;
}
}
if (newData){
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6;
flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6;
EnviarMensagem(flat,flon);
}

}

Veja eu tirei a parte comentada e tirei o started

void ReceberMensagem(){
int pos=0;
// if(started){
pos=sms.IsSMSPresent(SMS_ALL);
if(pos){
sms.GetSMS(pos,n,smsbuffer,100);
if(!strcmp(smsbuffer,“B”)){
Serial.println(“Recebeu a mensagem B”);
delay(100);
Gps();
}
if(!strcmp(smsbuffer,“L”)){
Serial.println(“Recebeu a mensagem L”);
delay(100);
Gps();
}
ExcluirMensagem();
}
// }
}

agora não funciona o método receber mensagem veja como fica no console do Arduíno

Gprs iniciado…
Gps iniciado…

Find SMS at the pos -2

Cant del SMS at the pos -2

Find SMS at the pos -2

Cant del SMS at the pos -2

Por que?? ele fica assim? para poder receber a mensagem o gsm, tem que ter iniciado

Eu acho que é algum conflito?? não pode ser???

Eu abaixei outra versão da ide do Arduíno a 1.0.6 na hora de eu compilar o mesmo código com a mesma biblioteca olha

This report would have more information with "Show verbose output during compilation" enabled in File > Preferences. Arduino: 1.0.6 (Windows NT (unknown)), Board: "Arduino Uno" C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp: In constructor 'HWSerial::HWSerial()': C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp:4: error: 'Serial1' was not declared in this scope C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp: In member function 'void HWSerial::end()': C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp:12: error: 'Serial1' was not declared in this scope C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp: In member function 'virtual void HWSerial::begin(long int)': C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp:24: error: 'Serial1' was not declared in this scope C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp: In member function 'int HWSerial::peek()': C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp:28: error: 'Serial1' was not declared in this scope C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp: In member function 'virtual size_t HWSerial::write(uint8_t)': C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp:32: error: 'Serial1' was not declared in this scope C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp: In member function 'virtual int HWSerial::read()': C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp:36: error: 'Serial1' was not declared in this scope C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp: In member function 'virtual int HWSerial::available()': C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp:40: error: 'Serial1' was not declared in this scope C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp: In member function 'virtual void HWSerial::flush()': C:\Users\Gustavo\Desktop\arduino-1.0.6\libraries\GSMSHIELD_TDG\HWSerial.cpp:44: error: 'Serial1' was not declared in this scope

Tipo quando eu coloco

if(gsm.begin(9600)){
Serial.println("\nstatus=READY");
started=true;
}else{
Serial.println("\nstatus=IDLE");
}

o serial do gps fica sem passar informação não sei por que olha ele não entra nem no while

void Gps(){
unsigned long chars;
unsigned short sentences, failed;
for (unsigned long start = millis(); millis() - start < 1000;){
while (SerialGps.available()){
char c = SerialGps.read();
if (gps.encode(c)){
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6;
flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6;
Serial.println("Lat: ");
Serial.println(flat);
Serial.println("Long: ");
Serial.println(flon);
delay(1000);
}
}
delay(1000);
}
}

olha esse cara está com o mesmo problema meu

seu problema é maior do que parece, estive pesquisando porque tenho um sim900 aqui tb.

A biblioteca GSM por fazer parte do shield, tem a configuração dos pinos fixa, já que eles não mudam, e tambem implementa uma soft serial, mas não expoe os metodos para escrever/ler direto no modem, ao utilizar uma softserial a parte nos mesmos pinos, quebra a chamada da ISR da mudança logica no pino.

Por isso quando comenta a linha
gsm.begin(9600)
nehuma outra função funciona,

Já que escreveu parte dos comandos na unha, abandone de uma vez essas bibliotecas(sim900 e sms) e faça tudo por conta.

Para deletar todos sms:

AT+CMGDA=“DEL ALL”

Poderia me ajudar a fazer os métodos de ler mensagem,e excluir mensagem direto do sim, sem a biblioteca, pois não tenho noção de como fazer??

veja os comandos eu vou dar uma lida se eu conseguir eu posto aqui, mas eu quero ajuda a fazer os métodos de lersms e excluirsms por favor veja o pdf de comandos do shilder

http://elecfreaks.com/store/download/datasheet/rf/SIM900/SIM900_AT%20Command%20Manual_V1.03.pdf

Então acho que o problema não é biblioteca eu fiz esse código descobrir que não consigo pegar duas serias no arduino

include "SoftwareSerial.h"

SoftwareSerial ModuloGps(9,8); SoftwareSerial ModuloGprs(2,3);

void setup(){

Serial.begin(9600); ModuloGps.begin(9600); ModuloGprs.begin(9600);

}

void loop(){

if(ModuloGps.available()){ char c = ModuloGps.read(); Serial.print(c); }

}

Esse primeiro codigo não consigo pegar as informações do gps

já nesse segundo código eu consigo pegar as informações do gps

include "SoftwareSerial.h"

SoftwareSerial ModuloGps(9,8); SoftwareSerial ModuloGprs(2,3);

void setup(){

Serial.begin(9600); ModuloGps.begin(9600);

}

void loop(){

if(ModuloGps.available()){ char c = ModuloGps.read(); Serial.print(c); }

}

acho que não está suportando duas serias, mais eu li no site do arduino que o arduino é possivel pegar duas serias, será que é incompatibilidade de biblioteca serial do arduino???

Veja esse forum ele parece que está com o mesmo problema http://labdegaragem.com/forum/topics/ajuda-com-bibliotecas-gsm-e-softwareserial

SoftwareSerial Limitations:

The library has the following known limitations:

If using multiple software serial ports, only one can receive data at a time.