Boa noite pessoal.
eu tenho um arduino mega e um modulo gm862 gps e estou tentando fazer um tracker
Meu problema é que eu só estou conseguindo ler respostas do modulo quando eu mando um comando para ele, eu sei que o modulo esta me mandando mensagens, pois ele faz isso quando recebe uma ligação e em outros momentos.
alguem tem uma ideia de como fazer para ler os comandos no loop? vou colocar o codigo que eu fiz até agora
const int ONOFFPIN = 4;
const int TIMEOUT = 1000;
const int BAUDRATE = 19200;
String resposta = "";
String serialBuffer = "";
String tempoUTC = "";
boolean SIMPronto = false;
boolean GPSPronto = false;
boolean Rastreando = false;
void setup(){
pinMode(ONOFFPIN, OUTPUT);
Serial.begin(BAUDRATE);
Serial3.begin(BAUDRATE);
if (!sendCommand("AT")){
ligaModulo();
}
ligaGPS();
}
void loop(){
byte serialIn = -1;
//aqui nao funciona
char inChar;
String buffer = "";
if (Serial3.available()){
Serial.println("passou");
inChar = Serial3.read();
buffer += inChar;
}
if (inChar == 13){
if (buffer.length() > 1){
Serial.println("\n\n!!!!!!!!!!!!!!!!!!!!!!!!>");
Serial.println(buffer.length());
Serial.print(buffer);
Serial.print("\n<!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
buffer = "";
}
} // nao fuinciona
if (Serial.available()){
serialIn = Serial.read();
if ((serialIn != 10) && (serialIn != 13)){
serialBuffer += char(serialIn);
}
}
if (serialIn == 13){
if (serialBuffer.length() > 1){
sendCommand(serialBuffer);
}
serialBuffer = "";
}
if (serialBuffer.length() == 1){
switch(serialIn){
case '1':
if (!sendCommand("AT#SHDN")){
ligaModulo();
}
break;
case 'g':
posicaoGPS();
break;
case 'r':
Serial.print("Resposta: ");
Serial.println(resposta);
break;
}
serialIn = -1;
}
if (millis() % 60000 == 0 && !GPSPronto && !Rastreando){
posicaoGPS();
delay(1000);
if (GPSPronto){
sendCommand("AT$GPSPS=2,1800");
}
}
}
void ligaModulo() {
Serial.println("switching on");
digitalWrite(ONOFFPIN, HIGH);
delay(2100);
digitalWrite(ONOFFPIN, LOW);
delay(1200);
Serial.println("done");
}
boolean sendCommand(String command){
long timeIsOut;
String buffer = "";
char inChar;
Serial3.print(command);
Serial3.print('\r');
timeIsOut = millis() + TIMEOUT;
buffer = "";
while (timeIsOut > millis()){
if (Serial3.available()){
inChar = Serial3.read();
buffer += inChar;
timeIsOut = millis() + TIMEOUT;
}
}
if (buffer.length() > 1){
Serial.print("\nResposta: ");
Serial.println(buffer);
Serial.println("--------------");
resposta = "";
resposta = getResponse(buffer);
if (buffer.endsWith("OK\r\n")){
return true;
}
else return false;
buffer = "";
}
else {
Serial.println("Comando: " + command);
Serial.println("Sem Resposta\n");
return false;
}
}
String getResponse(String buffer){
String response = "", substring = "";
int first = 0, last = 0;
if (buffer.length() > 0){
first = buffer.indexOf(": ");
last = buffer.indexOf("\nOK");
if (first > 0 && last > 0){
response = buffer.substring(first+2, last-3);
}
else if (last > 0){
response = buffer.substring(last+1, last+3);
}
else if (first > 0){
last = buffer.length() - 1;
response = buffer.substring(first+2, last);
}
else response = "";
return response;
}
}
//----------------------------------------FUNÇÕES DO GPS----------------------------------
void ligaGPS(){
Serial.println("Iniciando GPS...");
sendCommand("AT$GPSP?");
if (resposta == "0"){
Serial.println("Ligando GPS...");
sendCommand("AT$GPSP=1");
Serial.println("\nGPS Ligado");
}
else if (resposta == "1"){
Serial.println("GPS ja esta ligado");
}
sendCommand("AT$GPSS=19200");
Serial.println("Concluido");
Serial.println("-------------------------------------------------\n");
}
//Retorna a posição do GPS
void posicaoGPS(){
sendCommand("AT$GPSP?");
if (resposta == "1"){
sendCommand("AT$GPSACP");
}
else {
Serial.println("GPS esta desligado");
ligaGPS();
sendCommand("AT$GPSACP");
}
if (resposta.length() > 0){
separarCoordenadas();
}
}
void separarCoordenadas(){
String temp = "";
String coord[11] = "", lati = "", longi = "";
char x;
int pos = 0;
for (int i = 0; i < resposta.length(); i++){
x = resposta.charAt(i);
if (x != ','){
temp += x;
Serial.print(temp);
}
else{
coord[pos] = temp;
Serial.println("\n");
Serial.print(pos);
Serial.print(": ");
Serial.println(coord[pos]);
pos++;
temp = "";
}
if (i == resposta.length()-1){
coord[pos] = temp;
Serial.println("\n");
Serial.print(pos);
Serial.print(": ");
Serial.println(coord[pos]);
temp = "";
}
}
lati = coord[1];
longi = coord[2];
if (tempoUTC == coord[0]){
Serial.println("Nao obteve novo Fix");
}
tempoUTC = coord[0];
Serial.print("Fix: ");
Serial.println(coord[5]);
if (coord[5] != "0"){
GPSPronto == true;
//Converte Latitude
lati.replace(".", "");
String subLati = lati.substring(0,2) + ".";
lati.replace(lati.substring(0,2), subLati);
if (lati.endsWith("S")){
lati = "-" + lati;
lati.replace("S", "");
}
else lati.replace("N", "");
//Converte Longitude
longi.replace(".", "");
String subLongi = longi.substring(0,3) + ".";
longi.replace(longi.substring(0,3), subLongi);
if (longi.endsWith("W")){
longi = "-" + longi;
longi.replace("W", "");
}
else lati.replace("E", "");
Serial.println("-=-=-=-GPS-=-=-=-=-");
Serial.print("UTC: ");
Serial.println(coord[0]);
Serial.print("Latitude: ");
Serial.println(lati);
Serial.print("Longitude: ");
Serial.println(longi);
Serial.print("HDOP: ");
Serial.println(coord[3]);
Serial.print("Altitude: ");
Serial.println(coord[4]);
Serial.print("GPS Fix: ");
Serial.println(coord[5]);
Serial.print("COG: ");
Serial.println(coord[6]);
Serial.print("Velocidade(Km/H): ");
Serial.println(coord[7]);
Serial.print("Velocidade(Knots): ");
Serial.println(coord[8]);
Serial.print("Data: ");
Serial.println(coord[9]);
Serial.print("Num. Satelites em Uso: ");
Serial.println(coord[10]);
Serial.println("-=-=-=-GPS-=-=-=-=-");
}
else Serial.println("Nao foi pssivel travar a posicao");
}
apaguei umas partes do codigo pq nao coube no post